From 4d807ce447764c4cc0b9ce4e497407cead0f5d8f Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 25 Oct 2026 23:50:22 +0000 Subject: [PATCH 1/6] docs(agents): record the image decision in the all-libraries plan The owner chose option B for question 1: a toolchain base image built on lock-file changes, private in the Artifact Registry repository next to the renderer image, rather than public on GHCR. Question 11 is settled by it, the status line names 1a and 1b as merged with #12404, and option A's description no longer claims an hour-long build on every change (true only without a layer cache). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WbjVqBweiXjUZKp626ZFWm --- agentic/specs/261024-agent-all-libraries.md | 41 +++++++++++++-------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/agentic/specs/261024-agent-all-libraries.md b/agentic/specs/261024-agent-all-libraries.md index 69eaaebae6c..1918d2a83c8 100644 --- a/agentic/specs/261024-agent-all-libraries.md +++ b/agentic/specs/261024-agent-all-libraries.md @@ -1,9 +1,9 @@ # Feature: "Use with my data" for all 15 catalogue libraries -> **Status (2026-10-25):** plan, in progress. Step 1a (the runtime seam) is open as -> PR #12404. Step 1b (plotnine and altair) is implemented on its branch and waits for -> 1a's merge; see "What 1b built" under step 1b. The deploy serves matplotlib and seaborn: -> plotnine and altair have runtimes after 1b, but `AGENT_LIBRARIES` keeps its default +> **Status (2026-10-25):** plan, in progress. Steps 1a (the runtime seam) and 1b +> (plotnine and altair) merged with PR #12404; see "What 1b built" under step 1b. Step 1c +> (pygal and lets-plot) is in progress. The deploy serves matplotlib and seaborn: +> plotnine and altair have runtimes, but `AGENT_LIBRARIES` keeps its default > `matplotlib,seaborn` until each one's matrix run passes. Every other library in this > document is planned, not shipped. @@ -144,8 +144,9 @@ What the code does today, and what has to change: three deny lists share. - `agents/renderer/toolchain.Dockerfile` (owner question 1): Ubuntu 24.04 with R from rocker's layout and Posit binaries, Python 3.14 managed by uv, Node 22, Playwright - Chromium, Julia 1.13 and the precompiled depot; published to GHCR by a workflow that - runs on changes to the lock files. + Chromium, Julia 1.13 and the precompiled depot; built by a Cloud Build trigger on + changes to the lock files and pushed to the private Artifact Registry repository + `anyplot` in `europe-west4`, next to the renderer image (owner question 1). - `agents/evals/fixtures/cases/--/` for the 13 libraries (generated). - `tests/unit/agents/code/test_profiles_*.py`, `tests/unit/agents/renderer/test_commands.py`, @@ -614,7 +615,7 @@ this plan: | `save` is banned as an attribute and a name, so altair's `chart.save`, plotnine's `plot.save` and bokeh's `save(p)` fail SECURITY today; altair's PIL block, the `plot-.html` saves and plotly's `include_plotlyjs='cdn'` need rules | Step 1 split into 1a (the seam, no behaviour change) and one PR per library pair, each with the eligibility sweep's numbers | | `RLIMIT_NPROC` counts threads; headless Chromium plus Node is past 64 | Measured: 77 tasks; `RLIMIT_NPROC` off for the JavaScript row | | Missed sites: `evals/matrix.py` preflight, `stress.py`, `ladder_lab.py`, the `pipeline.PythonRuntime` monkeypatch in `test_service_flow.py`; backends hold one runtime; `RENDER_P95_S` is the repair reserve | All in step 1a; backends resolve the runtime per job; the p95 is a runtime attribute | -| Image: pin the GHCR base by digest; Highcharts in a public image is a redistribution question; bake `fc-cache`, `XDG_CACHE_HOME=/tmp`; Julia offline flags; `libcairo2` for cairosvg; the `ci-image.yml` change filter | Steps 1c, 2, 5 and question 11 | +| Image: pin the base image by digest; Highcharts in a public image is a redistribution question; bake `fc-cache`, `XDG_CACHE_HOME=/tmp`; Julia offline flags; `libcairo2` for cairosvg; the `ci-image.yml` change filter | Steps 1c, 2, 5 and questions 1 and 11 (the base image is private, so it redistributes nothing) | | `render.mjs` takes the library from the file stem; MUI X imports are inlined by esbuild | `--library=` from the request against the closed set; a static-import allowlist for `.tsx` | | Deny lists are hygiene, not a boundary: `globalThis["fe"+"tch"]`, `[].constructor.constructor`, R `get("system")`, Julia `getfield(Base, Symbol(...))` pass any identifier list | The threat model is stated: the sandbox protects the service, the list protects the person who runs the export from accidental I/O by the model; the lists grew by the review's names, and Julia's `using`/`import` is an allowlist | | Order: R first as the smallest exec-mode pilot, then JavaScript, then plotly and bokeh on the proven Chromium path, then Julia | Adopted (question 3) | @@ -628,10 +629,20 @@ cold start under gVisor. Defaults apply until answered; each is marked where the plan uses it. 1. **Image layout.** (A) one `agents/renderer/Dockerfile` that builds every toolchain - (an hour-long build on each renderer change, a 20-minute CI job today), or (B) a - public toolchain base image on GHCR built by a workflow on lock-file changes, with - the renderer image `FROM` it (fast CI and deploys; everything in it is open source). - Default: B. + (fast only with a layer cache in CI and in Cloud Build, which builds the renderer + without one today, and with the layers ordered by how often they change; a cold + cache rebuilds every toolchain, and Julia's precompile alone took 18 minutes in the + spike), or (B) a toolchain base image built on lock-file changes, with the renderer + image `FROM` it by digest (fast CI and deploys). + **Decided (owner, 2026-10-25): B, with the base image private in Artifact Registry** + (the repository `anyplot` in `europe-west4`, where the renderer image already lives). + A Cloud Build trigger builds and pushes it with Cloud Build's own service account, and + the renderer's Cloud Build deploy pulls it the same way. The CI job `renderer-image` in + `ci-image.yml` pulls it through the Workload Identity Federation login that + `ci-tests.yml` already uses, which needs the Artifact Registry reader role on the + repository: an owner task when step 2 adds the base image. Not public on GHCR: a + public image is a redistribution (licence notices for everything in it, no + Highcharts), and its only gain was pulls without a credential. 2. **Base distribution.** R's binaries from Posit exist for Ubuntu, not Debian, so the toolchain image is Ubuntu 24.04 (rocker's R layout) with Python 3.14 managed by uv instead of `python:3.14-slim`. Default: yes. @@ -663,7 +674,7 @@ Defaults apply until answered; each is marked where the plan uses it. byte for byte the run form (agent-network.md, "Fencing and exported code"). Default: accept the deviation for these two libraries and document it there. 11. **Highcharts in a public toolchain image**: the free licence covers non-commercial - use, and a public GHCR image redistributes the bundle. Default: the image stays - private in Artifact Registry until decided (CI then needs a reader credential), or - Highcharts is installed in the renderer image's own layer from the lock file at - build time rather than shipped in the base. + use, and a public GHCR image redistributes the bundle. **Settled by question 1 + (2026-10-25):** the base image is private in Artifact Registry, so it redistributes + nothing, and Highcharts can live in it. Whether users' plots may use Highcharts stays + question 6. From 5cf6cd742cc14d21c778acc75e3a3ba475674ca3 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 26 Oct 2026 03:02:53 +0000 Subject: [PATCH 2/6] feat(agents): pygal and lets-plot through the Python runtime (plan step 1c, core) The runtime registry serves pygal and lets-plot next to matplotlib, seaborn, plotnine and altair. Save rules: pygal saves through render_to_png, render_to_file and cairosvg.svg2png (a keyword-only write_to=; libcairo writes the PNG with its own fopen, so the file rests on the static pin), lets-plot through ggsave with path="." (SaveRule.directory). SaveRule.canvas names each library's canvas rewrite. Validator: the pygal profile (pygal, cairosvg; cssselect2, tinycss2 and cairocffi unreachable; the css/js/defs config rule; svg2png's fetch keywords refused) and the lets-plot profile (geo_data, tilesets, livemap and the browser contexts denied; LetsPlot only as setup_html(); .props banned; a .format exemption for literal tooltip and label builder chains). In every profile a save name imported under another name or used other than as a call's func is refused, closing a route the shipped plotnine profile left open, and a match capture can no longer rebind a plotnine expression name. Normaliser: four library-agnostic guard rules (find_spec, try/finally, sys.modules deletion, import_module attributes); pygal's HTML writes become render_to_file or are dropped; lets-plot's star import is expanded from the static lets_plot.__all__ of 4.11.0, its export_ggsave alias renamed, path="." added and the lets-plot-images epilogue removed. Canvas rewrites: pygal's 4800x2700 and 3600x3600 charts save through svg2png at 3200x1800 and 2400x2400; lets-plot changes only scale= on the PNG save. Harness: cairosvg is imported before the guard is armed, and cssselect2's selector compiler joins CODE_BUILDERS. Renderer: the lets-plot row runs with its own RLIMIT_AS of 2048 MiB, Arrow's system allocator and a minimal fontconfig file (RuntimeCommand.rlimit_as_mb; sandbox_env and the local backend pass an in-process row's env). The image installs lib-pygal, lib-letsplot and libcairo2 and links DejaVu Sans; ci-image.yml renders a pygal and a lets-plot plot through the harness. Eligibility: pygal 208 of 325, lets-plot 284 of 325; plotnine 267 and altair 273 gain from the guard rules; matplotlib and seaborn unchanged. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WbjVqBweiXjUZKp626ZFWm --- .github/workflows/ci-image.yml | 111 +- agents/anyplot/code/letsplot_names.py | 233 +++ agents/anyplot/code/normalise.py | 1551 +++++++++++++++-- agents/anyplot/code/readiness.py | 27 +- agents/anyplot/code/regions.py | 100 +- agents/anyplot/code/validate.py | 548 +++++- agents/anyplot/render/harness.py | 50 +- agents/anyplot/render/runtimes/__init__.py | 14 +- agents/anyplot/render/runtimes/python.py | 23 +- agents/evals/eligibility.py | 4 +- agents/renderer/Dockerfile | 56 +- agents/renderer/commands.py | 39 +- agents/renderer/executor.py | 13 +- agents/renderer/fonts.conf | 11 + tests/unit/agents/code/conftest.py | 2 +- tests/unit/agents/code/test_letsplot_names.py | 34 + tests/unit/agents/code/test_normalise.py | 925 +++++++++- tests/unit/agents/code/test_readiness.py | 121 ++ tests/unit/agents/code/test_regions.py | 71 +- tests/unit/agents/code/test_validate.py | 642 ++++++- tests/unit/agents/renderer/test_commands.py | 39 + .../agents/renderer/test_language_rows.py | 50 + .../unit/agents/runtime/test_harness_guard.py | 157 +- tests/unit/agents/runtime/test_runtimes.py | 42 +- 24 files changed, 4630 insertions(+), 233 deletions(-) create mode 100644 agents/anyplot/code/letsplot_names.py create mode 100644 agents/renderer/fonts.conf create mode 100644 tests/unit/agents/code/test_letsplot_names.py diff --git a/.github/workflows/ci-image.yml b/.github/workflows/ci-image.yml index e593366e43e..2cc5c987bf7 100644 --- a/.github/workflows/ci-image.yml +++ b/.github/workflows/ci-image.yml @@ -503,9 +503,9 @@ jobs: runs-on: ubuntu-latest permissions: contents: read - # A cold build installs pandas, numpy, matplotlib, seaborn, plotnine and - # altair with vl-convert; 20 fails loudly instead of hanging on a slow - # package index. + # A cold build installs pandas, numpy, matplotlib, seaborn, plotnine, + # altair with vl-convert, pygal with cairosvg and lets-plot, plus libcairo + # from apt; 20 fails loudly instead of hanging on a slow package index. timeout-minutes: 20 steps: @@ -733,6 +733,107 @@ jobs: EOF tail -n 1 work-altair/harness.out + # pygal (step 1c of agentic/specs/261024-agent-all-libraries.md) runs in process with the + # seaborn step's flags, as its row of agents/renderer/commands.py keeps the Python + # defaults. Its PNG is cairosvg's: libcairo from the image's apt layer, loaded before the + # guard (warm_cairo in harness.py), and cssselect2's selector lambdas (CODE_BUILDERS). + # The HTML twin is the chart's SVG, written by render_to_file; pygal writes no probe. + - name: Render a pygal plot through the harness + if: steps.check.outputs.should_build == 'true' + run: | + set -euo pipefail + mkdir -p work-pygal + printf 'x,y\na,1\nb,3\nc,2\n' > work-pygal/data.csv + cat > work-pygal/plot.py <<'EOF' + import os + + import pandas as pd + import pygal + + THEME = os.environ["ANYPLOT_THEME"] + df = pd.read_csv("data.csv") + chart = pygal.Bar(width=3200, height=1800, title="pygal", x_title="x", y_title="y") + chart.x_labels = list(df["x"]) + chart.add("y", [float(value) for value in df["y"]]) + chart.render_to_png(f"plot-{THEME}.png") + chart.render_to_file(f"plot-{THEME}.html") + EOF + docker run --rm --network none --read-only --tmpfs /tmp \ + --cap-drop ALL --security-opt no-new-privileges --user "$(id -u):$(id -g)" \ + -v "$PWD/work-pygal:/work" -w /work \ + -e ANYPLOT_THEME=light -e MPLBACKEND=Agg -e MPLCONFIGDIR=/tmp/mpl -e ANYPLOT_MPL_SEED=/opt/mplconfig \ + -e HOME=/tmp -e PYTHONDONTWRITEBYTECODE=1 -e OPENBLAS_NUM_THREADS=1 -e OMP_NUM_THREADS=1 \ + -e ANYPLOT_RLIMIT_CPU_S=60 -e ANYPLOT_RLIMIT_FSIZE_MB=50 -e ANYPLOT_RLIMIT_AS_MB=1024 \ + anyplot-renderer:ci /app/.venv/bin/python -I -X disable-remote-debug /opt/anyplot/harness.py plot.py > work-pygal/harness.out + grep -qxF 'HARNESS {"event": "start"}' work-pygal/harness.out || { echo "::error::no HARNESS start line"; cat work-pygal/harness.out; exit 1; } + grep -q '^HARNESS {"event": "end"' work-pygal/harness.out || { echo "::error::no HARNESS end line"; cat work-pygal/harness.out; exit 1; } + python3 - <<'EOF' + import struct + png = open("work-pygal/plot-light.png", "rb").read() + assert png[:8] == b"\x89PNG\r\n\x1a\n", "not a PNG" + width, height = struct.unpack(">II", png[16:24]) + assert (width, height) == (3200, 1800), (width, height) + html = open("work-pygal/plot-light.html", encoding="utf-8").read() + assert "pygal-chart" in html, "plot-light.html holds no pygal chart" + print(f"OK: pygal plot-light.png {width}x{height}, {len(png)} bytes; plot-light.html {len(html)} characters") + EOF + tail -n 1 work-pygal/harness.out + + # lets-plot (step 1c) rasterises in its native bridge, which needs more address space + # than the Python default: its row of agents/renderer/commands.py sets RLIMIT_AS to + # 2048 MiB with Arrow's system allocator, and points the bridge's own fontconfig at the + # image's /opt/anyplot/fonts.conf. This run passes exactly that row's environment and + # limit (1024 MB aborts the export: "Out of memory trying to allocate"); every other + # flag is the seaborn step's. Without the fontconfig file every export writes + # "Fontconfig error" to stderr, which is the extra assert. No probe. + - name: Render a lets-plot plot through the harness + if: steps.check.outputs.should_build == 'true' + run: | + set -euo pipefail + mkdir -p work-letsplot + printf 'x,y\na,1\nb,3\nc,2\n' > work-letsplot/data.csv + cat > work-letsplot/plot.py <<'EOF' + import os + + import pandas as pd + from lets_plot import LetsPlot, aes, geom_bar, ggplot, ggsize, labs + from lets_plot.export import ggsave + + LetsPlot.setup_html() + + THEME = os.environ["ANYPLOT_THEME"] + df = pd.read_csv("data.csv") + plot = ggplot(df, aes(x="x", y="y")) + geom_bar(stat="identity") + labs(title="lets-plot") + ggsize(800, 450) + ggsave(plot, f"plot-{THEME}.png", path=".", scale=4) + ggsave(plot, f"plot-{THEME}.html", path=".") + EOF + docker run --rm --network none --read-only --tmpfs /tmp \ + --cap-drop ALL --security-opt no-new-privileges --user "$(id -u):$(id -g)" \ + -v "$PWD/work-letsplot:/work" -w /work \ + -e ANYPLOT_THEME=light -e MPLBACKEND=Agg -e MPLCONFIGDIR=/tmp/mpl -e ANYPLOT_MPL_SEED=/opt/mplconfig \ + -e ARROW_DEFAULT_MEMORY_POOL=system -e FONTCONFIG_FILE=/opt/anyplot/fonts.conf \ + -e HOME=/tmp -e PYTHONDONTWRITEBYTECODE=1 -e OPENBLAS_NUM_THREADS=1 -e OMP_NUM_THREADS=1 \ + -e ANYPLOT_RLIMIT_CPU_S=60 -e ANYPLOT_RLIMIT_FSIZE_MB=50 -e ANYPLOT_RLIMIT_AS_MB=2048 \ + anyplot-renderer:ci /app/.venv/bin/python -I -X disable-remote-debug /opt/anyplot/harness.py plot.py \ + > work-letsplot/harness.out 2> work-letsplot/harness.err \ + || { echo "::error::the lets-plot render failed"; cat work-letsplot/harness.out work-letsplot/harness.err; exit 1; } + grep -qxF 'HARNESS {"event": "start"}' work-letsplot/harness.out || { echo "::error::no HARNESS start line"; cat work-letsplot/harness.out; exit 1; } + grep -q '^HARNESS {"event": "end"' work-letsplot/harness.out || { echo "::error::no HARNESS end line"; cat work-letsplot/harness.out; exit 1; } + if grep -q 'Fontconfig error' work-letsplot/harness.err; then + echo "::error::lets-plot's fontconfig found no configuration"; cat work-letsplot/harness.err; exit 1 + fi + python3 - <<'EOF' + import struct + png = open("work-letsplot/plot-light.png", "rb").read() + assert png[:8] == b"\x89PNG\r\n\x1a\n", "not a PNG" + width, height = struct.unpack(">II", png[16:24]) + assert (width, height) == (3200, 1800), (width, height) + html = open("work-letsplot/plot-light.html", encoding="utf-8").read() + assert "data-lets-plot-script" in html, "plot-light.html holds no lets-plot chart" + print(f"OK: lets-plot plot-light.png {width}x{height}, {len(png)} bytes; plot-light.html {len(html)} characters") + EOF + tail -n 1 work-letsplot/harness.out + # The file conversion inside the image (harness.py --convert): every format the # page sends, with the image's slimmed pyarrow (owner decision of 2026-10-15), # its calamine and NumPy, the guard's preload, and the sandbox's environment. @@ -820,7 +921,8 @@ jobs: EOF # The numbers the font set costs, for the PR and the deploy notes: the image - # size, the base release, the installed files and their package versions. + # size, the base release, the installed files and their package versions, + # libcairo's apt layer (pygal) among them. - name: Image size, base release and installed fonts if: steps.check.outputs.should_build == 'true' run: | @@ -828,6 +930,7 @@ jobs: echo "image size: $(docker image inspect --format '{{.Size}}' anyplot-renderer:ci) bytes" docker run --rm anyplot-renderer:ci du -sh /app/.venv/lib/python3.14/site-packages/pyarrow docker run --rm anyplot-renderer:ci sh -c 'grep PRETTY_NAME /etc/os-release; cat /usr/share/doc/fonts-noto/versions.txt; ls -l /usr/share/fonts/noto; du -sh /usr/share/fonts/noto; head -n 5 /usr/share/doc/fonts-noto/fonts-noto-core.copyright' + docker run --rm anyplot-renderer:ci dpkg-query -W libcairo2 libfontconfig1 fontconfig-config fonts-dejavu-core fonts-dejavu-mono # Also after a failed assert, so the PNGs show what went wrong. - name: Upload the multi-script render diff --git a/agents/anyplot/code/letsplot_names.py b/agents/anyplot/code/letsplot_names.py new file mode 100644 index 00000000000..20cedd1100b --- /dev/null +++ b/agents/anyplot/code/letsplot_names.py @@ -0,0 +1,233 @@ +"""The names `from lets_plot import *` binds, as static data: `lets_plot.__all__` of lets-plot 4.11.0. + +The normaliser expands a catalogue file's star import into an explicit +`from lets_plot import (...)` (151 of the 325 lets-plot files use one, survey of +2026-10-26), so the SECURITY validator can see every name the code takes from the +package. It never imports lets_plot to learn the names: the agents image does not +install it, and importing a plotting library to rewrite text would run its import +side effects. The list has 210 entries and 209 distinct names (`layer_tooltips` is +listed twice). + +`tests/unit/agents/code/test_letsplot_names.py` pins the set against the installed +package wherever lets-plot is installed (the `lib-letsplot` extra), so a lets-plot +upgrade that adds or removes a name fails that test until the data is refreshed: + + uv run --extra lib-letsplot python -c "import lets_plot; print(sorted(set(lets_plot.__all__)))" + +Paste the printed names here, then update the version in this docstring. +""" + +LETS_PLOT_NAMES: frozenset[str] = frozenset( + { + "GGBunch", + "LetsPlot", + "aes", + "arrow", + "as_discrete", + "coord_cartesian", + "coord_fixed", + "coord_flip", + "coord_map", + "coord_polar", + "element_blank", + "element_geom", + "element_line", + "element_markdown", + "element_rect", + "element_text", + "expand_limits", + "facet_grid", + "facet_wrap", + "flavor_darcula", + "flavor_high_contrast_dark", + "flavor_high_contrast_light", + "flavor_solarized_dark", + "flavor_solarized_light", + "flavor_standard", + "font_family_info", + "font_metrics_adjustment", + "geom_abline", + "geom_area", + "geom_area_ridges", + "geom_band", + "geom_bar", + "geom_bin2d", + "geom_blank", + "geom_boxplot", + "geom_bracket", + "geom_bracket_dodge", + "geom_contour", + "geom_contourf", + "geom_count", + "geom_crossbar", + "geom_curve", + "geom_density", + "geom_density2d", + "geom_density2df", + "geom_dotplot", + "geom_errorbar", + "geom_freqpoly", + "geom_function", + "geom_hex", + "geom_histogram", + "geom_hline", + "geom_imshow", + "geom_jitter", + "geom_label", + "geom_label_repel", + "geom_line", + "geom_linerange", + "geom_livemap", + "geom_lollipop", + "geom_map", + "geom_path", + "geom_pie", + "geom_point", + "geom_pointdensity", + "geom_pointrange", + "geom_polygon", + "geom_qq", + "geom_qq2", + "geom_qq2_line", + "geom_qq_line", + "geom_raster", + "geom_rect", + "geom_ribbon", + "geom_segment", + "geom_sina", + "geom_smooth", + "geom_spoke", + "geom_step", + "geom_text", + "geom_text_repel", + "geom_tile", + "geom_violin", + "geom_vline", + "geom_ydotplot", + "ggbunch", + "ggdeck", + "gggrid", + "ggmarginal", + "ggplot", + "ggsave", + "ggsize", + "ggtb", + "ggtitle", + "guide_colorbar", + "guide_legend", + "guides", + "labs", + "layer", + "layer_key", + "layer_labels", + "layer_tooltips", + "lims", + "maptiles_lets_plot", + "maptiles_solid", + "maptiles_zxy", + "margin", + "position_dodge", + "position_dodgev", + "position_fill", + "position_jitter", + "position_jitterdodge", + "position_nudge", + "position_stack", + "sampling_group_random", + "sampling_group_systematic", + "sampling_pick", + "sampling_random", + "sampling_random_stratified", + "sampling_systematic", + "sampling_vertex_dp", + "sampling_vertex_vw", + "scale_alpha", + "scale_alpha_identity", + "scale_alpha_manual", + "scale_brewer", + "scale_cmapmpl", + "scale_color_brewer", + "scale_color_cmapmpl", + "scale_color_continuous", + "scale_color_discrete", + "scale_color_gradient", + "scale_color_gradient2", + "scale_color_gradientn", + "scale_color_grey", + "scale_color_hue", + "scale_color_identity", + "scale_color_manual", + "scale_color_viridis", + "scale_continuous", + "scale_discrete", + "scale_fill_brewer", + "scale_fill_cmapmpl", + "scale_fill_continuous", + "scale_fill_discrete", + "scale_fill_gradient", + "scale_fill_gradient2", + "scale_fill_gradientn", + "scale_fill_grey", + "scale_fill_hue", + "scale_fill_identity", + "scale_fill_manual", + "scale_fill_viridis", + "scale_gradient", + "scale_gradient2", + "scale_gradientn", + "scale_grey", + "scale_hue", + "scale_identity", + "scale_linetype_identity", + "scale_linetype_manual", + "scale_linewidth", + "scale_linewidth_identity", + "scale_manual", + "scale_shape", + "scale_shape_identity", + "scale_shape_manual", + "scale_size", + "scale_size_area", + "scale_size_identity", + "scale_size_manual", + "scale_stroke", + "scale_stroke_identity", + "scale_viridis", + "scale_x_continuous", + "scale_x_datetime", + "scale_x_discrete", + "scale_x_discrete_reversed", + "scale_x_log10", + "scale_x_log2", + "scale_x_reverse", + "scale_x_time", + "scale_y_continuous", + "scale_y_datetime", + "scale_y_discrete", + "scale_y_discrete_reversed", + "scale_y_log10", + "scale_y_log2", + "scale_y_reverse", + "scale_y_time", + "smooth_labels", + "stat_ecdf", + "stat_sum", + "stat_summary", + "stat_summary_bin", + "theme", + "theme_bw", + "theme_classic", + "theme_gray", + "theme_grey", + "theme_light", + "theme_minimal", + "theme_minimal2", + "theme_none", + "theme_void", + "xlab", + "xlim", + "ylab", + "ylim", + } +) +"""The 209 distinct names of `lets_plot.__all__` 4.11.0; modules are not among them, and `ggsave` is.""" diff --git a/agents/anyplot/code/normalise.py b/agents/anyplot/code/normalise.py index 6bff2b131ab..c01939283ad 100644 --- a/agents/anyplot/code/normalise.py +++ b/agents/anyplot/code/normalise.py @@ -1,81 +1,152 @@ """The normaliser: catalogue code in, code that renders the exact canvas out. `normalise(code, library=...)` serves every library with a save rule -(`regions.SAVE_RULES`: matplotlib, seaborn, plotnine, altair) and makes four rewrites, -each only when it applies: +(`regions.SAVE_RULES`: matplotlib, seaborn, plotnine, altair, pygal, letsplot) and makes +these rewrites, in the order `_steps` runs them, each only when it applies: 1. **Catalogue header and title.** The four-line module docstring that opens every catalogue file (lines `anyplot.ai`, `: `, `Library: ...`, - `Quality: ...`) and the blank lines after it go. Every string literal in the + `Quality: ...`) and the blank lines after it go first, also a second one right after + it (3 lets-plot files carry two, 2026-10-26). Every string literal in the catalogue title form, `[<descriptive> · ]<spec-id> · [<language> · ]<library> · anyplot.ai` (also with the legacy `pyplots.ai`, or with the descriptive part ended by - a newline), becomes `""`: it names the catalogue's spec and demo data, and the - catalogue title rule does not apply to user plots. The call that shows it stays, so - code that positions the title keeps working. A title the adapter wrote in its own - words does not have that form and stays, and so does a title built by an f-string. -2. **Save target.** A target that is a path whose file name is the theme f-string, + a newline), becomes `""` after the guards: it names the catalogue's spec and demo + data, and the catalogue title rule does not apply to user plots. The call that shows + it stays, so code that positions the title keeps working. A title the adapter wrote + in its own words does not have that form and stays, and so does a title built by an + f-string. +2. **lets-plot's imports** (letsplot only). `from lets_plot.export import ggsave as + export_ggsave` (17 catalogue files) becomes `... import ggsave` and every + `export_ggsave` becomes `ggsave`, so the save rule sees the save; when the file binds + either name another way, the alias stays with a note. `from lets_plot import *` (151 + files) becomes one parenthesised `from lets_plot import (...)` of exactly the names the + module looks up as globals and does not bind itself (`symtable`), taken from + `letsplot_names.LETS_PLOT_NAMES` without importing lets_plot, in ruff's + order-by-type. A second star import, a `global` statement or a lets-plot name read + before the file binds it leaves the star import in place with a note (0 catalogue + files, 2026-10-26). +3. **Save target.** A target that is a path whose file name is the theme f-string, such as `os.path.join(script_dir, f"plot-{THEME}.png")`, `OUT / f"plot-{THEME}.png"`, - or a module-level name assigned one of those (`output_path`), becomes the literal - `f"plot-{THEME}.png"` in every save call of the library's rule (`savefig`, plotnine's - `save` and `ggsave`, altair's `save`, also for its `f"plot-{THEME}.html"`), so the - file lands next to the run form. A single-theme target such as `"plot.png"` stays - (the readiness scan blocks it). -3. **`sys.path` guard and file paths.** A file named `matplotlib.py` or `seaborn.py` - shadows the installed package when run from its own directory, so 120 of 650 - catalogue files strip their directory from `sys.path` first. The run form is - `plot.py`, so the guard goes: every module-level statement that only changes - `sys.path` (an assignment to it, a `sys.path.*()` call, or an `if`, `for`, `while` or - `try` holding only such statements, private helper assignments and `pass`), whatever - `sys` is imported as. Then every module-level assignment that is no longer used and - only served the guard or computed a file location (from `__file__`, `os.path.*`, - `pathlib` or `os.getcwd()`, or from another such name) goes, repeated until none is - left, with the `del` of those names, the comment lines directly above every removed - statement, and each import (`sys`, `os as _os`, `pathlib`, ...) that only they used. - Three files load their modules through `NAME = importlib.import_module("dotted.name")`, - which becomes `import dotted.name as NAME`, and `import importlib` goes once unused. -4. **Canvas.** Every `savefig` loses `bbox_inches=` and `pad_inches=` (`"tight"` crops - the canvas by 30 to 50 px, the documented cause of the drift that the - `impl-review.yml` canvas gate catches), and the dpi is rescaled so that - `figsize * dpi` renders exactly 3200x1800 (16:9) or 2400x2400 (1:1). The figure size - stays; the target is the one the figure's aspect reaches, so `(8, 4.5)` and `(16, 9)` - map to 3200x1800 at dpi 400 and 200, `(6, 6)`, `(12, 12)` and `(16, 16)` to 2400x2400 at - dpi 400, 200 and 150. The new dpi is written on `savefig` (added when missing) and on - every literal `dpi=` of a figure creation call and `set_dpi(...)`, so code that - measures in pixels before saving sees the same dpi. An integer dpi is used when one - hits the target exactly; otherwise the shortest decimal that does (matplotlib - truncates `figsize * dpi` to whole pixels, so `(7, 7)` gets dpi 342.9). When no dpi - hits it exactly, because the aspect is a hair off (`(16, 9.05)`), the dpi renders one - side exactly and the other within the 16 px of the canvas gate (3200x1810); the - change line names the pixels and the offset, and `measure_canvas` and the readiness - scan report it as a `canvas:` note. The figure - size comes from the last literal `set_size_inches(w, h)` (seaborn grids), else from - the single literal `figsize=`. The canvas rewrite is all or nothing: when the figure - size is missing or not a literal, when its aspect reaches neither target within 16 px, - or when a savefig takes `**kwargs`, `bbox_inches` and the dpi stay as they are and a - note says why (`readiness.scan` reports it as a `canvas:` reason). The rewrite is - matplotlib's (`SaveRule.canvas`): plotnine sizes the canvas on its save (`width=`, - `height=`, `units=`, `dpi=`, 3200x1800 in most catalogue files) and altair through - its chart's `width` and `height` times `scale_factor`, padded by its PIL block, so - for those two the step only notes that the render relies on the R3 canvas gate. - -Each rewrite is checked with `ast.parse` and dropped with a note if it would not parse. + `f"{script_dir}/plot-{THEME}.png"`, or a module-level name assigned one of those + (`output_path`), becomes the literal `f"plot-{THEME}.png"` in every save call of the + library's rule (`savefig`, plotnine's `save` and `ggsave`, altair's `save`, pygal's + `render_to_png`, `render_to_file` and `svg2png`, lets-plot's `ggsave`, also for + `f"plot-{THEME}.html"` where the rule admits it), so the file lands next to the run + form. A single-theme target such as `"plot.png"` stays (the readiness scan blocks it). +4. **Save directory** (letsplot only). lets-plot's `ggsave` writes into + `./lets-plot-images` without `path=`, and the plot sandbox refuses the `os.mkdir`, so + every `ggsave` of a theme target gets `path="."` (31 PNG saves lack it) and a computed + `path=` (`str(_script_dir)`) or `path=None` becomes `"."`; another literal directory + stays with a note. The 25 catalogue files that then move, copy or delete what + lets-plot wrote there lose that epilogue: a module-level statement + without a save that mentions `"lets-plot-images"` (or a name bound to it or to a + `ggsave` return value), is made only of `if`, `for`, `try` (each `except` only + `pass`), expressions, assignments and `import shutil` or `pathlib`, and calls only + `EPILOGUE_CALLS` and `EPILOGUE_METHODS` goes, with the names bound to the directory and + an `import shutil` that nothing kept uses; `png_path = ggsave(...)` whose name only fed + the epilogue becomes the bare save. Any other statement that mentions the directory + stays with a note, and the SECURITY validator blocks the file. +5. **HTML and SVG writes** (pygal only). A module-level `with open(<f"plot-{THEME}.html" + or a path to it>, "wb" | "w") as f:` whose one statement writes `X.render()` (mode + `"wb"`), `X.render(is_unicode=True)` or `X.render().decode()` (mode `"w"`, UTF-8) + becomes `X.render_to_file(f"plot-{THEME}.html")`, which writes the same bytes (158 + catalogue files; the HTML and the PNG were byte-identical on all 156 that run, + 2026-10-25). Every other module-level `open()` write of the theme `.html` or `.svg` + file (a hand-built page, a post-processed SVG) and every `X.render_to_file(<theme + .svg>)` goes, unless the same target is named again elsewhere in the file, and so do + the module-level assignments that only fed a removed write, repeated until none is + left (never one that holds a save call). The SECURITY validator has no pinnable form + for an `open()` write, and the plot sandbox refuses `.svg` files. +6. **Guards.** A file named `matplotlib.py`, `seaborn.py` or `pygal.py` shadows the + installed package when run from its own directory, so many catalogue files strip + their directory from `sys.path` first. The run form is `plot.py`, so the guard goes, + in three steps. `X = importlib.util.find_spec("pkg")` followed by + `if X and X.origin != __file__:` whose branch holds only imports becomes those imports + (the branch the run form takes), and `X` goes once unused. A module-level `try:` of + imports only, with no `except` or `else`, whose `finally:` only changes `sys.path`, + becomes its imports. Then every module-level statement that only changes `sys.path` + or `sys.modules` (an assignment to `sys.path`, `sys.dont_write_bytecode = ...`, a + `sys.path.*()` or `sys.modules.*()` call, `del sys.modules[...]`, or an `if`, `for`, + `while` or `try` holding only such statements, private helper assignments and + `pass`), whatever `sys` is imported as, goes. Then every module-level assignment that + is no longer used and only served the guard, read `sys.path` (`_saved = sys.path[:]`) + or computed a file location (from `__file__`, `os.path.*`, `pathlib` or + `os.getcwd()`, or from another such name) goes, repeated until none is left, with the + `del` of those names, the comment lines directly above every removed statement, and + each import (`sys`, `os as _os`, `pathlib`, ...) that only they used. Files that load + their modules through `NAME = importlib.import_module("dotted.name")[.ATTR]`, also + after `from importlib import import_module`, get `import dotted.name as NAME` or + `from dotted.name import ATTR as NAME`, and the importlib import goes once unused. +7. **Canvas** (`SaveRule.canvas`), last: + * matplotlib and seaborn (`figure`): every `savefig` loses `bbox_inches=` and + `pad_inches=` (`"tight"` crops the canvas by 30 to 50 px, the documented cause of + the drift that the `impl-review.yml` canvas gate catches), and the dpi is rescaled + so that `figsize * dpi` renders exactly 3200x1800 (16:9) or 2400x2400 (1:1). The + figure size stays; the target is the one the figure's aspect reaches, so + `(8, 4.5)` and `(16, 9)` map to 3200x1800 at dpi 400 and 200, `(6, 6)`, `(12, 12)` + and `(16, 16)` to 2400x2400 at dpi 400, 200 and 150. The new dpi is written on + `savefig` (added when missing) and on every literal `dpi=` of a figure creation call + and `set_dpi(...)`, so code that measures in pixels before saving sees the same + dpi. An integer dpi is used when one hits the target exactly; otherwise the + shortest decimal that does (matplotlib truncates `figsize * dpi` to whole pixels, + so `(7, 7)` gets dpi 342.9). When no dpi hits it exactly, because the aspect is a + hair off (`(16, 9.05)`), the dpi renders one side exactly and the other within the + 16 px of the canvas gate (3200x1810); the change line names the pixels and the + offset, and `measure_canvas` and the readiness scan report it as a `canvas:` note. + The figure size comes from the last literal `set_size_inches(w, h)` (seaborn + grids), else from the single literal `figsize=`. The rewrite is all or nothing: + when the figure size is missing or not a literal, when its aspect reaches neither + target within 16 px, or when a savefig takes `**kwargs`, `bbox_inches` and the dpi + stay as they are and a note says why. + * pygal (`pygal`): the PNG is the chart's `width` x `height` (pygal's 800x600 when + neither is set), or the output size of a `cairosvg.svg2png` save. 98 catalogue + charts are 4800x2700 and 4 are 3600x3600 (files from May 2026), over R2's pixel cap. + A chart whose literal size has exactly the 16:9 or 1:1 aspect keeps its size, so the + layout stays, and its protected save renders the target instead: + `X.render_to_png(f"plot-{THEME}.png")` becomes `cairosvg.svg2png(bytestring= + X.render(), write_to=f"plot-{THEME}.png", output_width=3200, output_height=1800)` + (with `import cairosvg` added where the file lacks it), and an `svg2png` save gets + the two keywords. The chart is the one the save renders (traced through `render`, + `encode`, `decode`, `replace` and module-level names bound to them), else the + file's only chart; a computed size, another aspect or several charts leave the save + alone with a note. + * lets-plot (`letsplot`): only `scale=` on the protected PNG save changes, never + `ggsize` or `w`/`h`, so text and ticks keep their size relative to the plot. The + size is the literal `ggsize` in the saved plot's `+` chain, else the file's only + literal `ggsize` (when no grid is drawn), else lets-plot's 600x400; `gggrid` and + `ggbunch` without a `ggsize` of their own size themselves from their panels and are + left alone with a note. lets-plot renders `floor(size * scale)` (scale 2 by default, + 1 with `w`/`h` or `dpi=`; `w`/`h` in px, or in `unit` at `dpi`, 300 by default). + The scale is the shortest decimal that renders the target exactly, else one within + 16 px; when none does and the render is over R2's pixel cap, the shortest decimal + that fits it inside the nearer target (R3 pads the rest). + * plotnine and altair (None): plotnine sizes the canvas on its save (`width=`, + `height=`, `units=`, `dpi=`, 3200x1800 in most catalogue files) and altair through + its chart's `width` and `height` times `scale_factor`, padded by its PIL block, so + for those two the step only notes that the render relies on the R3 canvas gate. + +Each step is checked with `ast.parse` and dropped with a note if it would not parse. The result is idempotent: `normalise(normalise(x)) == normalise(x)`. """ import ast import math import re +import symtable +import textwrap from collections.abc import Callable from dataclasses import dataclass from fractions import Fraction from functools import partial +from .letsplot_names import LETS_PLOT_NAMES from .regions import ( HTML_SUFFIX, HTML_TARGET, PNG_SUFFIX, SAVE_RULES, STANDARD_TARGET, + THEME_NAME, Number, Regions, SavefigCall, @@ -99,10 +170,56 @@ SQUARE = (2400, 2400) TARGETS = (LANDSCAPE, SQUARE) TOLERANCE = 16 # px per axis, the impl-review.yml canvas gate +MAX_IMAGE_PIXELS = 3200 * 1800 * 2 +"""R2's pixel cap (`render.png.MAX_IMAGE_PIXELS`, pinned by a test): a larger PNG is refused outright.""" DEFAULT_DPI = 100 # matplotlib's figure.dpi; savefig.dpi defaults to the figure's DROPPED_SAVEFIG_KEYWORDS = ("bbox_inches", "pad_inches") HEADER_FIRST_LINE = "anyplot.ai" MAX_DPI_DECIMALS = 6 +SVG_SUFFIX = ".svg" + +PYGAL_DEFAULT_SIZE = (800, 600) # pygal's Config width and height +PYGAL_PASSTHROUGH = frozenset({"render", "encode", "decode", "replace"}) +"""Calls that hand on the chart's SVG unchanged in size, from `X.render()` to the bytes `svg2png` reads; no +catalogue file's `replace` on the SVG text touches its `viewBox` or a size (2026-10-26).""" +PYGAL_NOT_CHARTS = frozenset({"Config"}) +"""Capitalised names of the pygal module that are no chart class (`pygal.Config` carries settings).""" +CAIROSVG = "cairosvg" + +LETSPLOT_SAVE = "ggsave" +LETSPLOT_MODULES = frozenset({"lets_plot", "lets_plot.export"}) +LETSPLOT_IMAGES = "lets-plot-images" +LETSPLOT_GRIDS = frozenset({"gggrid", "ggbunch", "GGBunch"}) +LETSPLOT_DEFAULT_SIZE = (600, 400) # lets-plot's plot size without ggsize (probed 2026-10-26) +LETSPLOT_DEFAULT_DPI = 300 # ggsave's dpi for `w`/`h` in a physical unit +LETSPLOT_PER_INCH = {"in": Fraction(1), "cm": Fraction(100, 254), "mm": Fraction(10, 254)} +EPILOGUE_CALLS = frozenset( + { + "shutil.move", + "shutil.copy", + "shutil.copy2", + "shutil.copyfile", + "shutil.rmtree", + "os.rename", + "os.replace", + "os.remove", + "os.unlink", + "os.rmdir", + "os.listdir", + "os.path.exists", + "os.path.isfile", + "os.path.isdir", + "os.path.join", + "str", + "pathlib.Path", + } +) +"""The calls (resolved through the file's imports) a lets-plot-images epilogue may make: file moves, copies, +deletions, listings, existence tests and path joins (the 25 catalogue epilogues, 2026-10-26).""" +EPILOGUE_METHODS = frozenset({"exists", "glob", "iterdir", "is_file", "rename", "replace", "unlink", "rmdir"}) +"""The `pathlib.Path` methods an epilogue may call on any receiver.""" +EPILOGUE_MODULES = frozenset({"shutil", "pathlib"}) +"""The modules an epilogue may import inside itself; `import shutil` goes once nothing kept uses it.""" _MODULE_NAME = re.compile(r"[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*") _COMMA_GAP = re.compile(r"\s*,\s*") @@ -116,6 +233,8 @@ ) TextEdit = tuple[int, int, str] # replace code[start:end] with the text +StepResult = tuple[str, list[str], list[str]] # the code, the changes made, the notes on what was left alone +Step = Callable[[str], StepResult] @dataclass(frozen=True, slots=True) @@ -131,9 +250,12 @@ class Normalised: class Canvas: """The canvas a source renders, as far as its literals tell. - `pixels` is what matplotlib writes for `figsize` at `dpi`: each side truncated to - whole pixels, as `RendererAgg` does. `target` is the nearer of the two canvases - (the impl-review.yml rule). `note` is None exactly when `pixels == target`. + `pixels` is what the library writes: for matplotlib `figsize` at `dpi`, each side + truncated to whole pixels as `RendererAgg` does; for pygal the chart's size or the + `svg2png` output size, rounded as cairosvg does; for lets-plot the plot size times + the scale, floored. `figsize` and `dpi` are matplotlib's only. `target` is the nearer + of the two canvases (the impl-review.yml rule). `note` is None exactly when + `pixels == target`. """ figsize: tuple[Number, Number] | None @@ -163,14 +285,7 @@ def normalise_report(code: str, *, library: str) -> Normalised: return Normalised(code, (), (f"syntax: line {exc.lineno} does not parse; nothing was normalised",)) changes: list[str] = [] notes: list[str] = [] - steps: tuple[tuple[str, Callable[[str], tuple[str, list[str], list[str]]]], ...] = ( - ("header", _strip_header), - ("savefig target", partial(_rewrite_savefig_targets, library=library)), - ("sys.path guard", _strip_path_guard), - ("title", _strip_title), - ("canvas", partial(_normalise_canvas, library=library)), - ) - for name, step in steps: + for name, step in _steps(library): new_code, step_changes, step_notes = step(code) if new_code != code: try: @@ -184,6 +299,33 @@ def normalise_report(code: str, *, library: str) -> Normalised: return Normalised(code, tuple(changes), tuple(notes)) +def _steps(library: str) -> list[tuple[str, Step]]: + """The rewrites of the module docstring in the order they run; each library-specific one for its library only. + + lets-plot's alias rename runs before the save-target step, which matches calls by + the save name; its save directory runs after it, on the literal targets, and before + the guard, which then removes the file-location helpers that `path=` and the + epilogue used. pygal's HTML step also runs before the guard, which removes the + output-directory helpers of the writes it rewrote or dropped. + """ + steps: list[tuple[str, Step]] = [("header", _strip_header)] + if library == "letsplot": + steps += [("save alias", _rename_save_alias), ("star import", _expand_star_import)] + steps.append(("savefig target", partial(_rewrite_savefig_targets, library=library))) + if library == "letsplot": + steps += [("save directory", _letsplot_save_paths), ("save epilogue", _strip_letsplot_epilogue)] + if library == "pygal": + steps.append(("html", _pygal_html_writes)) + steps += [ + ("find_spec guard", _strip_find_spec_guard), + ("try guard", _hoist_try_guard), + ("sys.path guard", _strip_path_guard), + ("title", _strip_title), + ("canvas", partial(_normalise_canvas, library=library)), + ] + return steps + + # --- canvas ------------------------------------------------------------------------------ @@ -230,10 +372,16 @@ def effective_dpi(regions: Regions, call: SavefigCall) -> tuple[Number | None, s def measure_canvas(code: str, *, library: str = "matplotlib") -> Canvas: """The canvas `code` renders, judged from its literals; raises `SyntaxError` if it does not parse. - Only matplotlib's figure size times dpi can be read (`SaveRule.canvas`); for the other - libraries the canvas is a note that the render relies on the R3 gate. + matplotlib's figure size times dpi, pygal's chart or `svg2png` output size and + lets-plot's plot size times the save's scale can be read (`SaveRule.canvas`); for + plotnine and altair the canvas is a note that the render relies on the R3 gate. """ - if not save_rule(library).canvas: + kind = save_rule(library).canvas + if kind == "pygal": + return _measure_pygal(code) + if kind == "letsplot": + return _measure_letsplot(code) + if kind != "figure": return Canvas( None, None, None, None, f"{library} sizes its canvas on the save, not through a matplotlib figure" ) @@ -248,7 +396,7 @@ def measure_canvas(code: str, *, library: str = "matplotlib") -> Canvas: if dpi is None: return Canvas(size, None, None, None, dpi_source) pixels = _pixels(size, dpi) - target = min(TARGETS, key=lambda t: abs(pixels[0] - t[0]) + abs(pixels[1] - t[1])) + target = _nearest_target(pixels) for keyword in call.keywords: if keyword.name == "bbox_inches" and not (keyword.literal and keyword.value is None): note = f"savefig bbox_inches= at {keyword.span.lines()} crops the {pixels[0]}x{pixels[1]} canvas" @@ -270,6 +418,23 @@ def plan_dpi(size: tuple[Number, Number]) -> tuple[tuple[int, int], str] | str: width, height = float(size[0]), float(size[1]) if not (width > 0 and height > 0 and math.isfinite(width) and math.isfinite(height)): return f"figsize {_fmt_size(size)} is not a positive size" + plan = _plan_factor(size) + if plan is not None: + return plan[0], plan[1] + return ( + f"figsize {_fmt_size(size)} has aspect {width / height:.3f}; no dpi renders 3200x1800 (16:9) " + f"or 2400x2400 (1:1) within {TOLERANCE} px without changing the figure size" + ) + + +def _plan_factor(size: tuple[Number, Number]) -> tuple[tuple[int, int], str, bool] | None: + """The target, the factor literal that renders the positive `size` on it when truncated, and whether exactly. + + matplotlib's dpi and lets-plot's scale are such a factor. An exact hit is preferred + (an integer before a decimal); failing that, a factor that renders one side exactly + and the other within `TOLERANCE`. None when neither target is reached. + """ + width, height = float(size[0]), float(size[1]) ordered = sorted(TARGETS, key=lambda t: abs(math.log((width / height) / (t[0] / t[1])))) for target in ordered: @@ -282,7 +447,7 @@ def exact(d: float, t: tuple[int, int] = target) -> bool: high = min(Fraction(tw + 1) / Fraction(width), Fraction(th + 1) / Fraction(height)) literal = _nicest(low, high, exact) if literal is not None: - return target, literal + return target, literal, True for target in ordered: tw, th = target @@ -294,18 +459,18 @@ def near(d: float, t: tuple[int, int] = target) -> bool: for side, pixels in ((width, tw), (height, th)): literal = _nicest(Fraction(pixels) / Fraction(side), Fraction(pixels + 1) / Fraction(side), near) if literal is not None: - return target, literal - - return ( - f"figsize {_fmt_size(size)} has aspect {width / height:.3f}; no dpi renders 3200x1800 (16:9) " - f"or 2400x2400 (1:1) within {TOLERANCE} px without changing the figure size" - ) + return target, literal, False + return None def _pixels(size: tuple[Number, Number], dpi: float) -> tuple[int, int]: return int(float(size[0]) * dpi), int(float(size[1]) * dpi) +def _nearest_target(pixels: tuple[int, int]) -> tuple[int, int]: + return min(TARGETS, key=lambda t: abs(pixels[0] - t[0]) + abs(pixels[1] - t[1])) + + def _nicest(low: Fraction, high: Fraction, accept: Callable[[float], bool]) -> str | None: """The shortest decimal literal in `[low, high)` that `accept`s, an integer first.""" if low >= high: @@ -340,8 +505,13 @@ def _same_dpi(value: object, literal: str, size: tuple[Number, Number], target: return number is not None and (number == float(literal) or _pixels(size, number) == target) -def _normalise_canvas(code: str, *, library: str) -> tuple[str, list[str], list[str]]: - if not save_rule(library).canvas: +def _normalise_canvas(code: str, *, library: str) -> StepResult: + kind = save_rule(library).canvas + if kind == "pygal": + return _pygal_canvas(code) + if kind == "letsplot": + return _letsplot_canvas(code) + if kind != "figure": note = f"canvas: {library} sizes its canvas on the save, not through a matplotlib figure; nothing to rewrite" return code, [], [note] regions = find_regions(code, library=library) @@ -443,27 +613,481 @@ def _apply(code: str, edits: list[TextEdit]) -> str: return code -# --- header and sys.path guard ----------------------------------------------------------- +def _save_call(tree: ast.Module, index: SourceIndex, save: SavefigCall) -> ast.Call | None: + """The `ast.Call` of a save call `find_regions` reported.""" + for node in ast.walk(tree): + if isinstance(node, ast.Call) and node.lineno == save.span.first_line: + span = index.node_span(node) + if (span.start, span.end) == (save.span.start, save.span.end): + return node + return None + + +def _keyword_literal(keyword: ast.keyword) -> tuple[object, bool]: + try: + return ast.literal_eval(keyword.value), True + except ValueError, TypeError, SyntaxError, MemoryError, RecursionError: + return None, False + + +def _append_keywords(code: str, index: SourceIndex, call: ast.Call, text: str) -> TextEdit: + """The insertion of `, <text>` after the last argument of `call` (or `<text>` into an empty call).""" + items: list[ast.expr | ast.keyword] = [*call.args, *call.keywords] + if not items: + end = index.node_span(call).end - 1 + return end, end, text + last = max((index.node_span(item) for item in items), key=lambda span: span.end) + return last.end, last.end, f", {text}" -def _strip_header(code: str) -> tuple[str, list[str], list[str]]: +# --- pygal canvas ------------------------------------------------------------------------ + + +def _pygal_aliases(tree: ast.Module) -> set[str]: + return { + alias.asname or alias.name + for stmt in tree.body + if isinstance(stmt, ast.Import) + for alias in stmt.names + if alias.name == "pygal" + } + + +def _is_pygal_chart(node: ast.AST, aliases: set[str]) -> bool: + """`pygal.<Chart>(...)`: a call of a capitalised attribute of the pygal module other than `Config`.""" + if not (isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute)): + return False + owner, name = node.func.value, node.func.attr + return isinstance(owner, ast.Name) and owner.id in aliases and name[:1].isupper() and name not in PYGAL_NOT_CHARTS + + +def _last_assignment(body: list[ast.stmt], name: str, before: int) -> ast.expr | None: + """The value of the last module-level `name = ...` above line `before`.""" + values = [ + stmt.value + for stmt in body + if isinstance(stmt, ast.Assign) + and len(stmt.targets) == 1 + and isinstance(stmt.targets[0], ast.Name) + and stmt.targets[0].id == name + and stmt.lineno < before + ] + return values[-1] if values else None + + +def _pygal_size(tree: ast.Module, call: ast.Call, name: str) -> tuple[tuple[Number, Number] | None, str]: + """The size of the chart the PNG save renders and where it came from, or None and why not.""" + aliases = _pygal_aliases(tree) + node: ast.expr | None = None + if name == "render_to_png" and isinstance(call.func, ast.Attribute): + node = call.func.value + elif name == "svg2png": + node = next((kw.value for kw in call.keywords if kw.arg == "bytestring"), None) + seen: set[str] = set() + chart: ast.Call | None = None + while node is not None: + if _is_pygal_chart(node, aliases) and isinstance(node, ast.Call): + chart = node + break + if isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute) and node.func.attr in PYGAL_PASSTHROUGH: + node = node.func.value + elif isinstance(node, ast.Name) and node.id not in seen: + seen.add(node.id) + node = _last_assignment(tree.body, node.id, call.lineno) + else: + node = None + source = "the saved chart" + if chart is None: + charts = [node for node in ast.walk(tree) if _is_pygal_chart(node, aliases) and isinstance(node, ast.Call)] + if len(charts) != 1: + return None, f"{len(charts)} pygal charts in the file, none traced from the save at line {call.lineno}" + chart, source = charts[0], "the file's only chart" + if chart.args or any(kw.arg is None for kw in chart.keywords): + return None, f"the chart at line {chart.lineno} takes positional arguments or **kwargs" + sides: list[Number] = [] + for side, default in zip(("width", "height"), PYGAL_DEFAULT_SIZE, strict=True): + keyword = next((kw for kw in chart.keywords if kw.arg == side), None) + value = as_number(_keyword_literal(keyword)[0]) if keyword is not None else default + if value is None or value <= 0: + return None, f"the chart's {side}= at line {chart.lineno} is not a positive numeric literal" + sides.append(value) + return (sides[0], sides[1]), f"{source} at line {chart.lineno}" + + +def _pygal_pixels(call: ast.Call, name: str, size: tuple[Number, Number]) -> tuple[int, int] | str: + """The PNG size the save writes for a chart of `size` (cairosvg's `int(round(...))`), or why it is not known.""" + width, height = float(size[0]), float(size[1]) + if name != "svg2png": + return round(width), round(height) + values: dict[str, Number] = {} + for keyword in call.keywords: + if keyword.arg in ("output_width", "output_height", "scale"): + value = as_number(_keyword_literal(keyword)[0]) + if value is None: + return f"svg2png {keyword.arg}= at line {keyword.lineno} is not a numeric literal" + values[keyword.arg] = value + out_width, out_height = values.get("output_width"), values.get("output_height") + if out_width and out_height: + return round(out_width), round(out_height) + if out_width: + return round(out_width), round(height * out_width / width) + if out_height: + return round(width * out_height / height), round(out_height) + scale = values.get("scale", 1) + return round(width * scale), round(height * scale) + + +def _exact_target(size: tuple[Number, Number]) -> tuple[int, int] | None: + """The target whose aspect `size` has exactly: 16:9 or 1:1.""" + aspect = Fraction(size[0]) / Fraction(size[1]) + return next((target for target in TARGETS if aspect == Fraction(*target)), None) + + +def _measure_pygal(code: str) -> Canvas: + tree = ast.parse(code) + index = SourceIndex(code) + regions = find_regions(code, tree, library="pygal") + save = regions.savefig + call = _save_call(tree, index, save) if save is not None and save.standard_target else None + if save is None or call is None: + return Canvas(None, None, None, None, 'no module-level save of f"plot-{THEME}.png"') + size, source = _pygal_size(tree, call, save.name) + if size is None: + return Canvas(None, None, None, None, f"pygal canvas unknown: {source}") + pixels = _pygal_pixels(call, save.name, size) + if isinstance(pixels, str): + return Canvas(None, None, None, None, f"pygal canvas unknown: {pixels}") + target = _nearest_target(pixels) + if pixels == target: + return Canvas(None, None, pixels, target, None) + note = f"pygal renders {pixels[0]}x{pixels[1]} ({source}), target {target[0]}x{target[1]}" + return Canvas(None, None, pixels, target, note) + + +def _svg2png_callee(tree: ast.Module) -> str | None: + """How the file names cairosvg's `svg2png` (`cairosvg.svg2png`, `_cairosvg.svg2png`, `svg2png`), if it does.""" + for stmt in tree.body: + if isinstance(stmt, ast.Import): + for alias in stmt.names: + if alias.name == CAIROSVG: + return f"{alias.asname or alias.name}.svg2png" + elif isinstance(stmt, ast.ImportFrom) and stmt.module == CAIROSVG and stmt.level == 0: + for alias in stmt.names: + if alias.name == "svg2png": + return alias.asname or alias.name + return None + + +def _import_insertion(tree: ast.Module, index: SourceIndex, module: str) -> tuple[int, int]: + """Where `import <module>` goes, as `(offset, line)`: in isort order within the block that imports pygal. + + The block is the run of module-level imports on consecutive lines around the first + pygal import; the new line goes before the first straight import of a module that + sorts after it, else before the block's first from-import, else after the block. + """ + body = tree.body + imports = [stmt for stmt in body if isinstance(stmt, ast.Import | ast.ImportFrom)] + if not imports: + docstring = ( + body[0] if body and isinstance(body[0], ast.Expr) and isinstance(body[0].value, ast.Constant) else None + ) + line = (docstring.end_lineno or docstring.lineno) + 1 if docstring is not None else 1 + return index.line_start(min(line, index.line_count)), line + + def top(stmt: ast.Import | ast.ImportFrom) -> str: + name = stmt.names[0].name if isinstance(stmt, ast.Import) else stmt.module or "" + return name.split(".")[0].lower() + + anchor = next((stmt for stmt in imports if top(stmt) == "pygal"), imports[-1]) + position = body.index(anchor) + first = last = position + while first > 0 and isinstance(body[first - 1], ast.Import | ast.ImportFrom): + if (body[first - 1].end_lineno or 0) + 1 != body[first].lineno: + break + first -= 1 + while last + 1 < len(body) and isinstance(body[last + 1], ast.Import | ast.ImportFrom): + if (body[last].end_lineno or 0) + 1 != body[last + 1].lineno: + break + last += 1 + block = [stmt for stmt in body[first : last + 1] if isinstance(stmt, ast.Import | ast.ImportFrom)] + before: ast.Import | ast.ImportFrom | None = next( + (stmt for stmt in block if isinstance(stmt, ast.Import) and top(stmt) > module), None + ) + before = before or next((stmt for stmt in block if isinstance(stmt, ast.ImportFrom)), None) + if before is not None: + return index.line_start(before.lineno), before.lineno + end = block[-1].end_lineno or block[-1].lineno + return index.line_end(end), end + 1 + + +def _pygal_canvas(code: str) -> StepResult: tree = ast.parse(code) - if not tree.body: + index = SourceIndex(code) + regions = find_regions(code, tree, library="pygal") + save = regions.savefig + call = _save_call(tree, index, save) if save is not None and save.standard_target else None + if save is None or call is None: + return code, [], ['canvas: no module-level save of f"plot-{THEME}.png"; nothing to normalise'] + size, source = _pygal_size(tree, call, save.name) + if size is None: + return code, [], [f"canvas: {source}; the PNG size is left as it is"] + pixels = _pygal_pixels(call, save.name, size) + if isinstance(pixels, str): + return code, [], [f"canvas: {pixels}; the PNG size is left as it is"] + if pixels in TARGETS: return code, [], [] - first = tree.body[0] - if not ( - isinstance(first, ast.Expr) and isinstance(first.value, ast.Constant) and isinstance(first.value.value, str) - ): + chart = f"pygal chart {size[0]:g}x{size[1]:g} ({source})" + target = _exact_target(size) + if target is None: + return code, [], [f"canvas: {chart} has another aspect than 16:9 or 1:1; the PNG size is left as it is"] + tw, th = target + if save.has_splat: + return code, [], [f"canvas: the save at {save.span.lines()} takes *args or **kwargs; left unchanged"] + edits: list[TextEdit] = [] + changes: list[str] = [] + callee = _svg2png_callee(tree) + if save.name == "svg2png": + sizes = {"output_width": tw, "output_height": th} + for keyword in call.keywords: + if keyword.arg in sizes: + span = index.node_span(keyword.value) + edits.append((span.start, span.end, str(sizes.pop(keyword.arg)))) + added = [f"{name}={value}" for name, value in sizes.items()] + if added: + edits.append(_append_keywords(code, index, call, ", ".join(added))) + how = f"{save.func}(output_width={tw}, output_height={th})" + else: + receiver = call.func.value if isinstance(call.func, ast.Attribute) else None + extra = [kw for kw in call.keywords if kw.arg not in ("filename", "dpi")] + if receiver is None or dotted_name(receiver) is None or extra or len(call.args) > 1: + return code, [], [f"canvas: the {save.name} at {save.span.lines()} has another form; left unchanged"] + if callee is None: + callee = f"{CAIROSVG}.svg2png" + offset, line = _import_insertion(tree, index, CAIROSVG) + edits.append((offset, offset, f"import {CAIROSVG}{_newline(index, save.span.last_line) or '\n'}")) + changes.append(f"added import {CAIROSVG} at line {line}") + dpi = next((kw for kw in call.keywords if kw.arg == "dpi"), None) + dpi_text = "" if dpi is None else ", " + code[index.node_span(dpi).start : index.node_span(dpi).end] + receiver_text = code[index.node_span(receiver).start : index.node_span(receiver).end] + new_call = ( + f"{callee}(bytestring={receiver_text}.render(), write_to={STANDARD_TARGET}{dpi_text}, " + f"output_width={tw}, output_height={th})" + ) + span = index.node_span(call) + edits.append((span.start, span.end, new_call)) + how = f"{callee}(output_width={tw}, output_height={th}) in place of {save.name}" + changes.append(f"canvas: {chart} renders {pixels[0]}x{pixels[1]}; the save renders {tw}x{th} through {how}") + return _apply(code, edits), changes, [] + + +# --- lets-plot canvas -------------------------------------------------------------------- + + +def _is_ggsize(node: ast.AST) -> bool: + if not isinstance(node, ast.Call): + return False + func = node.func + return (isinstance(func, ast.Name) and func.id == "ggsize") or ( + isinstance(func, ast.Attribute) and func.attr == "ggsize" + ) + + +def _ggsize_value(call: ast.Call) -> tuple[Number, Number] | None: + if len(call.args) != 2 or call.keywords: + return None + values = [as_number(_literal_value(arg)) for arg in call.args] + if values[0] is None or values[1] is None or values[0] <= 0 or values[1] <= 0: + return None + return values[0], values[1] + + +def _literal_value(node: ast.expr) -> object: + try: + return ast.literal_eval(node) + except ValueError, TypeError, SyntaxError, MemoryError, RecursionError: + return None + + +def _callee_name(func: ast.expr) -> str | None: + """The last dotted component of a callee: `ggsave` for `ggsave(...)` and `lp.ggsave(...)`.""" + if isinstance(func, ast.Attribute): + return func.attr + return func.id if isinstance(func, ast.Name) else None + + +def _letsplot_plot_size(tree: ast.Module, call: ast.Call) -> tuple[tuple[Number, Number] | None, str]: + """The `ggsize` of the plot `call` saves and where it came from, or None and why not.""" + subject = call.args[0] if call.args else next((kw.value for kw in call.keywords if kw.arg == "plot"), None) + seen: set[str] = set() + value = subject + while value is not None: + if isinstance(value, ast.Name): + if value.id in seen: + break + seen.add(value.id) + value = _last_assignment(tree.body, value.id, call.lineno) + continue + sizes: list[ast.Call] = [] + root: ast.expr = value + while isinstance(root, ast.BinOp) and isinstance(root.op, ast.Add): + if _is_ggsize(root.right) and isinstance(root.right, ast.Call): + sizes.append(root.right) # the rightmost ggsize first: the last one added wins + root = root.left + if _is_ggsize(root) and isinstance(root, ast.Call): + sizes.append(root) + if sizes: + size = _ggsize_value(sizes[0]) + where = f"line {sizes[0].lineno}" + return (size, f"ggsize at {where}") if size else (None, f"ggsize at {where} is not two numeric literals") + if isinstance(root, ast.Call) and _callee_name(root.func) in LETSPLOT_GRIDS: + return None, f"{_callee_name(root.func)} at line {root.lineno} has no ggsize of its own" + value = root if isinstance(root, ast.Name) else None + literals = {_ggsize_value(node) for node in ast.walk(tree) if isinstance(node, ast.Call) and _is_ggsize(node)} + grids = any(isinstance(node, ast.Call) and _callee_name(node.func) in LETSPLOT_GRIDS for node in ast.walk(tree)) + if len(literals) == 1 and None not in literals: + size = literals.pop() + if size is not None: + return size, "the file's only ggsize" + if not literals and not grids: + return LETSPLOT_DEFAULT_SIZE, "lets-plot's default size" + sizes_text = f"{len(literals)} distinct ggsize value{'s' if len(literals) != 1 else ''}" + return None, f"no ggsize on the saved plot; the file has {sizes_text}{' and a grid' if grids else ''}" + + +def _letsplot_raster(tree: ast.Module, call: ast.Call) -> tuple[tuple[Fraction, Fraction], Number, str] | str: + """The raster size before `scale=`, the scale in effect and where the size came from; or why it is not known.""" + values: dict[str, object] = {} + for keyword in call.keywords: + if keyword.arg in ("scale", "w", "h", "unit", "dpi"): + value, literal = _keyword_literal(keyword) + if keyword.arg == "unit": + valid = isinstance(value, str) and (value in LETSPLOT_PER_INCH or value == "px") + else: + number = as_number(value) + valid = number is not None and number > 0 + if not literal or not valid: + return f"ggsave {keyword.arg}= at line {keyword.lineno} is not a literal lets-plot takes" + values[keyword.arg] = value + scale, dpi = as_number(values.get("scale")), as_number(values.get("dpi")) + width, height = as_number(values.get("w")), as_number(values.get("h")) + if (width is None) != (height is None): + return f"ggsave at line {call.lineno} sets only one of w= and h=" + if width is not None and height is not None: + unit = str(values.get("unit", "in")) + source = f"w={width:g}, h={height:g}, unit={unit}" + if unit == "px": + return (Fraction(width), Fraction(height)), scale or 1, source + resolution = dpi or LETSPLOT_DEFAULT_DPI + per_pixel = LETSPLOT_PER_INCH[unit] * Fraction(resolution) + size = (Fraction(width) * per_pixel, Fraction(height) * per_pixel) + return size, scale or 1, f"{source} at dpi {resolution:g}" + base, source = _letsplot_plot_size(tree, call) + if base is None: + return source + size = (Fraction(base[0]), Fraction(base[1])) + if dpi is not None: + factor = Fraction(dpi) / 96 + return (size[0] * factor, size[1] * factor), scale or 1, f"{base[0]:g}x{base[1]:g} ({source}) at dpi {dpi:g}" + return size, 2 if scale is None else scale, f"{base[0]:g}x{base[1]:g} ({source})" + + +def _letsplot_pixels(size: tuple[Fraction, Fraction], scale: float) -> tuple[int, int]: + """lets-plot's raster: each side times the scale, floored (formula probes of 2026-10-26).""" + return math.floor(float(size[0]) * scale), math.floor(float(size[1]) * scale) + + +def _letsplot_save(code: str) -> tuple[ast.Module, SourceIndex, SavefigCall, ast.Call] | str: + tree = ast.parse(code) + index = SourceIndex(code) + save = find_regions(code, tree, library="letsplot").savefig + call = _save_call(tree, index, save) if save is not None and save.standard_target else None + if save is None or call is None: + return 'no module-level ggsave of f"plot-{THEME}.png"' + return tree, index, save, call + + +def _measure_letsplot(code: str) -> Canvas: + found = _letsplot_save(code) + if isinstance(found, str): + return Canvas(None, None, None, None, found) + tree, _, _, call = found + raster = _letsplot_raster(tree, call) + if isinstance(raster, str): + return Canvas(None, None, None, None, f"lets-plot canvas unknown: {raster}") + size, scale, source = raster + pixels = _letsplot_pixels(size, float(scale)) + target = _nearest_target(pixels) + if pixels == target: + return Canvas(None, None, pixels, target, None) + note = f"lets-plot renders {pixels[0]}x{pixels[1]} from {source} at scale {scale:g}, target {target[0]}x{target[1]}" + return Canvas(None, None, pixels, target, note) + + +def _letsplot_canvas(code: str) -> StepResult: + found = _letsplot_save(code) + if isinstance(found, str): + return code, [], [f"canvas: {found}; nothing to normalise"] + tree, index, save, call = found + if save.has_splat: + return code, [], [f"canvas: the ggsave at {save.span.lines()} takes *args or **kwargs; left unchanged"] + raster = _letsplot_raster(tree, call) + if isinstance(raster, str): + return code, [], [f"canvas: {raster}; the render relies on the R3 canvas gate"] + size, scale, source = raster + pixels = _letsplot_pixels(size, float(scale)) + if pixels in TARGETS: return code, [], [] - text = first.value.value.strip() - if not text or text.splitlines()[0].strip() != HEADER_FIRST_LINE: + rendered = f"{source} at scale {scale:g} renders {pixels[0]}x{pixels[1]}" + plan = _plan_factor((float(size[0]), float(size[1]))) + if plan is not None: + target, literal, exact = plan + how = "" if exact else f", within {TOLERANCE} px of {target[0]}x{target[1]}" + else: + target = _nearest_target(pixels) + if pixels[0] * pixels[1] <= MAX_IMAGE_PIXELS: + note = f"canvas: {rendered}; no scale renders 3200x1800 or 2400x2400, so the render relies on the R3 gate" + return code, [], [note] + fit = min(Fraction(target[0]) / size[0], Fraction(target[1]) / size[1]) + literal = _nicest(fit * Fraction(999, 1000), fit, lambda _: True) or str(float(fit)) + how = f", inside {target[0]}x{target[1]} under R2's pixel cap" + keyword = next((kw for kw in call.keywords if kw.arg == "scale"), None) + if keyword is not None: + span = index.node_span(keyword.value) + edit: TextEdit = (span.start, span.end, literal) + else: + edit = _append_keywords(code, index, call, f"scale={literal}") + after = _letsplot_pixels(size, float(literal)) + change = f"canvas: {rendered}; scale={literal} renders {after[0]}x{after[1]}{how}" + return _apply(code, [edit]), [change], [] + + +# --- header and title -------------------------------------------------------------------- + + +def _is_header(stmt: ast.stmt) -> bool: + if not (isinstance(stmt, ast.Expr) and isinstance(stmt.value, ast.Constant) and isinstance(stmt.value.value, str)): + return False + text = stmt.value.value.strip() + return bool(text) and text.splitlines()[0].strip() == HEADER_FIRST_LINE + + +def _strip_header(code: str) -> StepResult: + """Every catalogue header that opens the file: 3 lets-plot files carry a second one (2026-10-26).""" + tree = ast.parse(code) + headers: list[ast.stmt] = [] + for stmt in tree.body: + if not _is_header(stmt): + break + headers.append(stmt) + if not headers: return code, [], [] - span = SourceIndex(code).lines_span(first) - new_code = _rewrite_lines(code, set(range(span.first_line, span.last_line + 1)), {}) - return new_code, [f"removed the catalogue header at {span.lines()}"], [] + index = SourceIndex(code) + spans = [index.lines_span(stmt) for stmt in headers] + lines = {line for span in spans for line in range(span.first_line, span.last_line + 1)} + return _rewrite_lines(code, lines, {}), [f"removed the catalogue header at {span.lines()}" for span in spans], [] -def _strip_title(code: str) -> tuple[str, list[str], list[str]]: +def _strip_title(code: str) -> StepResult: tree = ast.parse(code) in_fstrings = {id(part) for node in ast.walk(tree) if isinstance(node, ast.JoinedStr) for part in node.values} index = SourceIndex(code) @@ -484,10 +1108,561 @@ def _strip_title(code: str) -> tuple[str, list[str], list[str]]: return _apply(code, [(span.start, span.end, '""') for span in spans]), changes, [] +# --- lets-plot imports ------------------------------------------------------------------- + + +def _alias_span(index: SourceIndex, alias: ast.alias) -> tuple[int, int]: + end_line, end_col = alias.end_lineno or alias.lineno, alias.end_col_offset or alias.col_offset + return index.offset(alias.lineno, alias.col_offset), index.offset(end_line, end_col) + + +def _binding_sites(tree: ast.Module) -> list[tuple[str, int, ast.AST]]: + """Every place the file binds a name, in any scope: `(name, line, node)`.""" + sites: list[tuple[str, int, ast.AST]] = [] + for node in ast.walk(tree): + if isinstance(node, ast.Name) and not isinstance(node.ctx, ast.Load): + sites.append((node.id, node.lineno, node)) + elif isinstance(node, ast.arg): + sites.append((node.arg, node.lineno, node)) + elif isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef | ast.ClassDef): + sites.append((node.name, node.lineno, node)) + elif isinstance(node, ast.alias) and node.name != "*": + sites.append(((node.asname or node.name).split(".")[0], node.lineno, node)) + elif isinstance(node, ast.ExceptHandler | ast.MatchAs | ast.MatchStar) and node.name: + sites.append((node.name, node.lineno, node)) + elif isinstance(node, ast.MatchMapping) and node.rest: + sites.append((node.rest, node.lineno, node)) + elif isinstance(node, ast.Global | ast.Nonlocal): + sites.extend((name, node.lineno, node) for name in node.names) + return sites + + +def _rename_save_alias(code: str) -> StepResult: + """`from lets_plot.export import ggsave as export_ggsave` -> `... import ggsave`, every `export_ggsave` too.""" + tree = ast.parse(code) + saves = [ + alias + for node in ast.walk(tree) + if isinstance(node, ast.ImportFrom) and node.level == 0 and node.module in LETSPLOT_MODULES + for alias in node.names + if alias.name == LETSPLOT_SAVE + ] + renamed = [alias for alias in saves if alias.asname not in (None, LETSPLOT_SAVE)] + if not renamed: + return code, [], [] + names = {alias.asname for alias in renamed if alias.asname is not None} + clashes = sorted( + { + (name, line) + for name, line, node in _binding_sites(tree) + if name in names | {LETSPLOT_SAVE} and not any(node is alias for alias in saves) + } + ) + if clashes: + name, line = clashes[0] + note = f"save alias: {name} is also bound at line {line}; {', '.join(sorted(names))} left unchanged" + return code, [], [note] + index = SourceIndex(code) + edits: list[TextEdit] = [(*_alias_span(index, alias), LETSPLOT_SAVE) for alias in renamed] + uses = [node for node in ast.walk(tree) if isinstance(node, ast.Name) and node.id in names] + edits += [(index.node_span(node).start, index.node_span(node).end, LETSPLOT_SAVE) for node in uses] + changes = [ + f"import {LETSPLOT_SAVE} as {alias.asname} -> import {LETSPLOT_SAVE} at line {alias.lineno}" + for alias in renamed + ] + if uses: + changes.append( + f"{', '.join(sorted(names))} -> {LETSPLOT_SAVE} at line {', '.join(str(n.lineno) for n in uses)}" + ) + return _apply(code, edits), changes, [] + + +def _global_lookups(code: str) -> tuple[set[str], set[str]]: + """The names the module looks up as globals and the names its own scope binds, from `symtable`.""" + top = symtable.symtable(code, "plot.py", "exec") + bound = {s.get_name() for s in top.get_symbols() if s.is_assigned() or s.is_imported() or s.is_namespace()} + looked_up = {s.get_name() for s in top.get_symbols() if s.is_referenced()} + tables = list(top.get_children()) + while tables: + table = tables.pop() + tables.extend(table.get_children()) + looked_up |= {s.get_name() for s in table.get_symbols() if s.is_referenced() and s.is_global()} + return looked_up, bound + + +def _module_bindings(tree: ast.Module) -> dict[str, int]: + """The first line on which the module scope binds each name (nested function, class and lambda bodies aside).""" + first: dict[str, int] = {} + + def bind(name: str, line: int) -> None: + first[name] = min(first.get(name, line), line) + + nodes: list[ast.AST] = list(tree.body) + while nodes: + node = nodes.pop() + if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef | ast.ClassDef): + bind(node.name, node.lineno) + nodes.extend(node.decorator_list) + if isinstance(node, ast.ClassDef): + nodes.extend([*node.bases, *node.keywords]) + else: + nodes.extend([*node.args.defaults, *(d for d in node.args.kw_defaults if d is not None)]) + continue + if isinstance(node, ast.Lambda): + nodes.extend([*node.args.defaults, *(d for d in node.args.kw_defaults if d is not None)]) + continue + if isinstance(node, ast.ListComp | ast.SetComp | ast.DictComp | ast.GeneratorExp): + nodes.extend(n.target for n in ast.walk(node) if isinstance(n, ast.NamedExpr)) # `:=` binds outside + nodes.append(node.generators[0].iter) + continue + if isinstance(node, ast.Name) and not isinstance(node.ctx, ast.Load): + bind(node.id, node.lineno) + elif isinstance(node, ast.alias) and node.name != "*": + bind((node.asname or node.name).split(".")[0], node.lineno) + elif isinstance(node, ast.ExceptHandler | ast.MatchAs | ast.MatchStar) and node.name: + bind(node.name, node.lineno) + elif isinstance(node, ast.MatchMapping) and node.rest: + bind(node.rest, node.lineno) + nodes.extend(ast.iter_child_nodes(node)) + return first + + +def _import_order(name: str) -> tuple[int, str, str]: + """ruff's isort order-by-type: CONSTANT_CASE, then CamelCase, then the rest, case-insensitive within each.""" + group = 0 if name.isupper() and len(name) > 1 else 1 if name[:1].isupper() else 2 + return group, name.lower(), name + + +def _expand_star_import(code: str) -> StepResult: + """`from lets_plot import *` -> `from lets_plot import (...)` of the names the module takes from it.""" + tree = ast.parse(code) + stars = [ + node for node in ast.walk(tree) if isinstance(node, ast.ImportFrom) and any(a.name == "*" for a in node.names) + ] + lets_plot = [star for star in stars if star.module == "lets_plot" and star.level == 0] + if not lets_plot: + return code, [], [] + star = lets_plot[0] + where = f"the star import at line {star.lineno} stays" + if len(stars) > 1: + return code, [], [f"star import: the file has {len(stars)} star imports; {where}"] + if not any(star is stmt for stmt in tree.body): + return code, [], [f"star import: it is not a module-level statement; {where}"] + globals_ = [node.lineno for node in ast.walk(tree) if isinstance(node, ast.Global)] + if globals_: + return code, [], [f"star import: a global statement at line {globals_[0]}; {where}"] + try: + looked_up, bound = _global_lookups(code) + except SyntaxError as exc: + return code, [], [f"star import: symtable refuses line {exc.lineno}; {where}"] + first = _module_bindings(tree) + early = sorted( + { + node.id + for node in ast.walk(tree) + if isinstance(node, ast.Name) + and isinstance(node.ctx, ast.Load) + and node.id in LETS_PLOT_NAMES + and node.id in bound + and node.lineno < first.get(node.id, math.inf) + } + ) + if early: + return code, [], [f"star import: {', '.join(early)} is read before the file binds it; {where}"] + index = SourceIndex(code) + span = index.lines_span(star) + statement = index.node_span(star) + rest = code[statement.end : span.end].strip() + if code[span.start : statement.start].strip() or (rest and not rest.startswith("#")): + return code, [], [f"star import: it shares its line with other code; {where}"] + names = sorted((looked_up - bound) & LETS_PLOT_NAMES, key=_import_order) + if not names: + lines = set(range(span.first_line, span.last_line + 1)) + return _rewrite_lines(code, lines, {}), [f"removed the unused `from lets_plot import *` at {span.lines()}"], [] + newline = _newline(index, span.last_line) or "\n" + text = f"from lets_plot import ({newline}" + "".join(f" {name},{newline}" for name in names) + f"){newline}" + change = f"from lets_plot import * -> {len(names)} names at {span.lines()}" + return _rewrite_lines(code, set(), {span.first_line: (span.last_line, text)}), [change], [] + + +# --- lets-plot save directory ------------------------------------------------------------ + + +def _letsplot_save_paths(code: str) -> StepResult: + """`path="."` on every `ggsave` of a theme target; a computed `path=` becomes `"."`.""" + rule = save_rule("letsplot") + directory = f'"{rule.directory}"' + tree = ast.parse(code) + index = SourceIndex(code) + edits: list[TextEdit] = [] + changes: list[str] = [] + notes: list[str] = [] + for node in ast.walk(tree): + if not (isinstance(node, ast.Call) and _callee_name(node.func) in rule.names): + continue + name = _callee_name(node.func) or LETSPLOT_SAVE + target = save_target(node, rule, name) + if target is None or not (is_theme_target(target, PNG_SUFFIX) or is_theme_target(target, HTML_SUFFIX)): + continue + line = f"line {node.lineno}" + if any(kw.arg is None for kw in node.keywords): + notes.append(f"save directory: the {name} at {line} takes **kwargs; left unchanged") + continue + path = next((kw for kw in node.keywords if kw.arg == "path"), None) + if path is None: + anchor = next((kw for kw in node.keywords if kw.value is target), None) + end = index.node_span(anchor if anchor is not None else target).end + edits.append((end, end, f", path={directory}")) + changes.append(f"added path={directory} to {name} at {line}") + elif not isinstance(path.value, ast.Constant) or path.value.value is None: # None is lets-plot's default + span = index.node_span(path.value) + edits.append((span.start, span.end, directory)) + changes.append(f"{name} path={_WHITESPACE.sub(' ', code[span.start : span.end])} -> {directory} at {line}") + elif path.value.value != rule.directory: + notes.append(f"save directory: the {name} at {line} saves into path={path.value.value!r}; left unchanged") + if not edits: + return code, [], notes + return _apply(code, edits), changes, notes + + +def _import_targets(body: list[ast.stmt]) -> dict[str, str]: + """Local name -> the dotted module or object a module-level import binds it to.""" + targets: dict[str, str] = {} + for stmt in body: + if isinstance(stmt, ast.Import): + for alias in stmt.names: + if alias.asname: + targets[alias.asname] = alias.name + else: + targets[alias.name.split(".")[0]] = alias.name.split(".")[0] + elif isinstance(stmt, ast.ImportFrom) and stmt.module and stmt.level == 0: + for alias in stmt.names: + targets[alias.asname or alias.name] = f"{stmt.module}.{alias.name}" + return targets + + +def _resolved(func: ast.expr, imports: dict[str, str]) -> str | None: + name = dotted_name(func) + if name is None: + return None + head, _, rest = name.partition(".") + base = imports.get(head, head) + return f"{base}.{rest}" if rest else base + + +def _strip_letsplot_epilogue(code: str) -> StepResult: + """Remove what moves, copies or deletes the files lets-plot wrote into `./lets-plot-images`.""" + rule = save_rule("letsplot") + tree = ast.parse(code) + body = tree.body + imports = _import_targets(body) + + def has_save(node: ast.AST) -> bool: + return any(isinstance(n, ast.Call) and _callee_name(n.func) in rule.names for n in ast.walk(node)) + + def mentions(node: ast.AST, names: set[str]) -> bool: + return any( + (isinstance(n, ast.Constant) and isinstance(n.value, str) and LETSPLOT_IMAGES in n.value) + or (isinstance(n, ast.Name) and n.id in names) + for n in ast.walk(node) + ) + + def only_moves(stmt: ast.stmt) -> bool: + for node in ast.walk(stmt): + if isinstance(node, ast.Call): + method = node.func.attr if isinstance(node.func, ast.Attribute) else None + if _resolved(node.func, imports) not in EPILOGUE_CALLS and method not in EPILOGUE_METHODS: + return False + elif isinstance(node, ast.Import): + if not all(alias.name in EPILOGUE_MODULES for alias in node.names): + return False + elif isinstance(node, ast.ExceptHandler): + if not all(isinstance(inner, ast.Pass) for inner in node.body): + return False + elif isinstance(node, ast.stmt) and not isinstance( + node, ast.If | ast.For | ast.Try | ast.Expr | ast.Assign | ast.Pass + ): + return False + return True + + images: set[str] = set() # names bound to the directory or to a path inside it + returned: dict[str, ast.Assign] = {} # `png_path = ggsave(...)` + for stmt in body: + if isinstance(stmt, ast.Assign) and len(stmt.targets) == 1 and isinstance(stmt.targets[0], ast.Name): + name = stmt.targets[0].id + if isinstance(stmt.value, ast.Call) and _callee_name(stmt.value.func) in rule.names: + returned[name] = stmt + elif mentions(stmt.value, images) and only_moves(stmt): + images.add(name) + removed: set[int] = set() + epilogue: list[ast.stmt] = [] + for stmt in body: + if has_save(stmt) or _assigned(stmt) & images: + continue + if mentions(stmt, images | set(returned)) and only_moves(stmt): + removed.add(id(stmt)) + epilogue.append(stmt) + loads = {id(stmt): _loads(stmt) for stmt in body} + + def kept_loads(skip: ast.stmt | None = None) -> set[str]: + return set().union(*(loads[id(s)] for s in body if s is not skip and id(s) not in removed)) + + names_gone: list[ast.stmt] = [] + grown = True + while grown: # the directory names, once nothing kept reads them + grown = False + for stmt in body: + if id(stmt) in removed or not (_assigned(stmt) and _assigned(stmt) <= images): + continue + if not _assigned(stmt) & kept_loads(stmt): + removed.add(id(stmt)) + names_gone.append(stmt) + grown = True + unwrapped = [stmt for name, stmt in returned.items() if name not in kept_loads(stmt)] + imports_gone = [ + stmt + for stmt in body + if isinstance(stmt, ast.Import) + and all(alias.name == "shutil" for alias in stmt.names) + and not _import_bindings(stmt)[0] & kept_loads() + ] + removed.update(id(stmt) for stmt in imports_gone) + notes = [ + f"save epilogue: the statement at line {stmt.lineno} uses {LETSPLOT_IMAGES} in other ways; left in place" + for stmt in body + if id(stmt) not in removed and not has_save(stmt) and mentions(stmt, images) + ] + if not removed and not unwrapped: + return code, [], notes + + index = SourceIndex(code) + remove: set[int] = set() + changes: list[str] = [] + for stmt in body: + if id(stmt) not in removed: + continue + span = index.lines_span(stmt) + remove |= _with_comments(index, span) + if stmt in epilogue: + label = "the lets-plot-images epilogue" + elif stmt in imports_gone: + label = f"the unused `{ast.unparse(stmt)}`" + else: + label = f"the unused lets-plot-images name {', '.join(sorted(_assigned(stmt)))}" + changes.append(f"removed {label} at {span.lines()}") + replace: dict[int, tuple[int, str]] = {} + for stmt in unwrapped: + span = index.lines_span(stmt) + value = index.node_span(stmt.value) + replace[span.first_line] = (span.last_line, code[value.start : span.end]) + changes.append( + f"{ast.unparse(stmt.targets[0])} = {LETSPLOT_SAVE}(...) -> {LETSPLOT_SAVE}(...) at {span.lines()}" + ) + return _rewrite_lines(code, remove, replace), changes, notes + + +# --- pygal HTML and SVG writes ----------------------------------------------------------- + + +def _open_mode(call: ast.Call) -> str | None: + """The literal mode of an `open(...)` call, "r" when it has none, None when it is not a literal.""" + mode = call.args[1] if len(call.args) > 1 else next((kw.value for kw in call.keywords if kw.arg == "mode"), None) + if mode is None: + return "r" + return mode.value if isinstance(mode, ast.Constant) and isinstance(mode.value, str) else None + + +def _theme_path(node: ast.expr, suffix: str) -> bool: + return is_theme_target(node, suffix) or _theme_file_path(node, suffix) + + +def _is_call(node: ast.AST, attribute: str) -> bool: + return isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute) and node.func.attr == attribute + + +def _render_receiver(value: ast.expr, mode: str) -> ast.expr | None: + """`X` when `value` is what `X.render_to_file` writes in `mode`: `X.render()` for "wb", `X.render(is_unicode=True)` + or `X.render().decode(["utf-8"])` for "w"; `X` must be a name or a dotted name.""" + receiver: ast.expr | None = None + if mode == "wb" and _is_call(value, "render") and isinstance(value, ast.Call): + if not value.args and not value.keywords and isinstance(value.func, ast.Attribute): + receiver = value.func.value + elif mode == "w" and isinstance(value, ast.Call) and isinstance(value.func, ast.Attribute): + if value.func.attr == "render" and not value.args and len(value.keywords) == 1: + keyword = value.keywords[0] + if keyword.arg == "is_unicode" and isinstance(keyword.value, ast.Constant) and keyword.value.value is True: + receiver = value.func.value + elif value.func.attr == "decode" and not value.keywords and len(value.args) <= 1: + utf8 = not value.args or ( + isinstance(value.args[0], ast.Constant) and str(value.args[0].value).lower() in ("utf-8", "utf8") + ) + inner = value.func.value + if utf8 and _is_call(inner, "render") and isinstance(inner, ast.Call): + if not inner.args and not inner.keywords and isinstance(inner.func, ast.Attribute): + receiver = inner.func.value + return receiver if receiver is not None and dotted_name(receiver) is not None else None + + +def _pygal_html_writes(code: str) -> StepResult: + """`_pygal_html_once` until it changes nothing: a removed feeder can free a target that was named again.""" + changes: list[str] = [] + while True: + new_code, step_changes, notes = _pygal_html_once(code) + if new_code == code: + return code, changes, notes + try: + ast.parse(new_code) + except SyntaxError: + return code, changes, [*notes, "html: the rewrite would not parse; left unchanged"] + code = new_code + changes.extend(step_changes) + + +def _pygal_html_once(code: str) -> StepResult: + rule = save_rule("pygal") + tree = ast.parse(code) + index = SourceIndex(code) + remove: set[int] = set() + replace: dict[int, tuple[int, str]] = {} + changes: list[str] = [] + notes: list[str] = [] + dropped: list[ast.stmt] = [] + + def named_again(target: ast.expr, stmt: ast.stmt) -> bool: + text = ast.dump(target) + return any( + ast.dump(node) == text + for other in tree.body + if other is not stmt + for node in ast.walk(other) + if isinstance(node, ast.expr) + ) + + for stmt in tree.body: + span = index.lines_span(stmt) + if isinstance(stmt, ast.Expr) and _is_call(stmt.value, "render_to_file") and isinstance(stmt.value, ast.Call): + target = save_target(stmt.value, rule, "render_to_file") + if target is None or not _theme_path(target, SVG_SUFFIX): + continue + if named_again(target, stmt): + notes.append(f"html: the SVG save at {span.lines()} is read again elsewhere; left in place") + else: + remove |= _with_comments(index, span) + changes.append(f"removed the SVG save at {span.lines()}") + continue + write = _theme_write(stmt) + if write is None: + continue + target, suffix, mode, utf8, values = write + receiver = _render_receiver(values[0], mode) if suffix == HTML_SUFFIX and len(values) == 1 and utf8 else None + kind = suffix.removeprefix(".").upper() + if receiver is not None: + name = code[index.node_span(receiver).start : index.node_span(receiver).end] + indent = index.line_text(span.first_line)[: stmt.col_offset] + text = f"{indent}{name}.render_to_file({HTML_TARGET}){_newline(index, span.last_line)}" + replace[span.first_line] = (span.last_line, text) + changes.append(f"the HTML write through open() at {span.lines()} -> {name}.render_to_file({HTML_TARGET})") + elif not named_again(target, stmt): + remove |= _with_comments(index, span) + dropped.append(stmt) + changes.append(f"removed the {kind} write through open() at {span.lines()}") + else: + notes.append( + f"html: the {kind} write through open() at {span.lines()} is read again elsewhere; left in place" + ) + + # The module-level assignments that only fed a removed write (the page around the SVG), until none is left. + gone = {id(stmt) for stmt in dropped} + candidates = set().union(*(_loads(stmt) for stmt in dropped)) + grown = bool(dropped) + while grown: + grown = False + for stmt in tree.body: + if id(stmt) in gone or not isinstance(stmt, ast.Assign | ast.AugAssign): + continue + targets = stmt.targets if isinstance(stmt, ast.Assign) else [stmt.target] + if not all(isinstance(target, ast.Name) for target in targets): + continue + names = {target.id for target in targets if isinstance(target, ast.Name)} + if not names <= candidates or any( + _callee_name(n.func) in rule.names for n in ast.walk(stmt) if isinstance(n, ast.Call) + ): + continue + if names & set().union( + *(_loads(other) for other in tree.body if id(other) not in gone and other is not stmt) + ): + continue + gone.add(id(stmt)) + span = index.lines_span(stmt) + remove |= _with_comments(index, span) + candidates |= _loads(stmt) + changes.append(f"removed {', '.join(sorted(names))}, which only fed a removed write, at {span.lines()}") + grown = True + if not remove and not replace: + return code, [], notes + return _rewrite_lines(code, remove, replace), changes, notes + + +def _theme_write(stmt: ast.stmt) -> tuple[ast.expr, str, str, bool, list[ast.expr]] | None: + """`(target, suffix, mode, utf8, values)` for `with open(<theme .html or .svg path>, "w"|"wb") as f:` whose body + only writes to `f` (`values` are what it writes), else None.""" + if not (isinstance(stmt, ast.With) and len(stmt.items) == 1): + return None + item = stmt.items[0] + call = item.context_expr + if not (isinstance(call, ast.Call) and isinstance(call.func, ast.Name) and call.func.id == "open"): + return None + if not call.args or len(call.args) > 2 or any(kw.arg not in ("mode", "encoding") for kw in call.keywords): + return None + target = call.args[0] + suffix = next((suffix for suffix in (HTML_SUFFIX, SVG_SUFFIX) if _theme_path(target, suffix)), None) + mode = _open_mode(call) + handle = item.optional_vars.id if isinstance(item.optional_vars, ast.Name) else None + if suffix is None or mode not in ("w", "wb") or handle is None: + return None + values: list[ast.expr] = [] + for inner in stmt.body: + if not (isinstance(inner, ast.Expr) and _is_call(inner.value, "write") and isinstance(inner.value, ast.Call)): + return None + write = inner.value + if not (isinstance(write.func, ast.Attribute) and isinstance(write.func.value, ast.Name)): + return None + if write.func.value.id != handle or len(write.args) != 1 or write.keywords: + return None + values.append(write.args[0]) + encodings = [kw.value for kw in call.keywords if kw.arg == "encoding"] + utf8 = all(isinstance(e, ast.Constant) and str(e.value).lower() in ("utf-8", "utf8") for e in encodings) + return target, suffix, mode, utf8, values + + +# --- guards and file paths --------------------------------------------------------------- + + def _loads(node: ast.AST) -> set[str]: return {n.id for n in ast.walk(node) if isinstance(n, ast.Name) and isinstance(n.ctx, ast.Load)} +def _with_comments(index: SourceIndex, span: Span) -> set[int]: + """The lines of `span` and the comment lines directly above it.""" + lines = set(range(span.first_line, span.last_line + 1)) + line = span.first_line - 1 + while line >= 1 and index.line_text(line).lstrip().startswith("#"): + lines.add(line) + line -= 1 + return lines + + +def _sys_aliases(body: list[ast.stmt]) -> set[str]: + """The names `sys` is imported as.""" + return { + alias.asname or alias.name + for stmt in body + if isinstance(stmt, ast.Import) + for alias in stmt.names + if alias.name == "sys" + } + + def _is_sys_path(node: ast.expr, aliases: set[str]) -> bool: """`sys.path` (under any name `sys` is imported as) or a subscript of it.""" if isinstance(node, ast.Subscript): @@ -527,13 +1702,23 @@ def _binds(stmt: ast.stmt) -> set[str]: def _is_guard(stmt: ast.stmt, aliases: set[str]) -> bool: - """A statement that only changes `sys.path` or `sys.modules` (compound ones may hold private helpers and `pass`).""" + """A statement that only changes `sys.path` or `sys.modules` (compound ones may hold private helpers and `pass`). + + `del sys.modules[...]` and `sys.dont_write_bytecode = ...` serve the guard too + (pygal's indicator-rsi and plotnine's spiral-timeseries, 2026-10-26). + """ if isinstance(stmt, ast.Expr) and isinstance(stmt.value, ast.Call): callee = dotted_name(stmt.value.func) return callee is not None and any( callee.startswith((f"{alias}.path.", f"{alias}.modules.")) for alias in aliases ) + if isinstance(stmt, ast.Delete): + modules = {f"{alias}.modules" for alias in aliases} + return all(isinstance(t, ast.Subscript) and dotted_name(t.value) in modules for t in stmt.targets) if isinstance(stmt, ast.Assign): + flags = {f"{alias}.dont_write_bytecode" for alias in aliases} + if all(dotted_name(target) in flags for target in stmt.targets): + return True return all(_is_sys_path(target, aliases) for target in stmt.targets) if isinstance(stmt, ast.AugAssign): return _is_sys_path(stmt.target, aliases) @@ -575,7 +1760,9 @@ def _computes_path(stmt: ast.stmt, path_names: set[str], os_names: set[str], pat def _theme_file_path(node: ast.expr, suffix: str = PNG_SUFFIX) -> bool: - """A path whose file name is `f"plot-{THEME}<suffix>"`: `os.path.join(d, f)`, `d / f`, `str(d / f)`.""" + """A path whose file name is `f"plot-{THEME}<suffix>"`: `os.path.join(d, f)`, `d / f`, `str(d / f)`, `f"{d}/..."`.""" + if isinstance(node, ast.JoinedStr): + return _directory_fstring(node, suffix) if isinstance(node, ast.BinOp) and isinstance(node.op, ast.Div): return is_theme_target(node.right, suffix) if isinstance(node, ast.Call) and not node.keywords: @@ -587,7 +1774,28 @@ def _theme_file_path(node: ast.expr, suffix: str = PNG_SUFFIX) -> bool: return False -def _rewrite_savefig_targets(code: str, *, library: str) -> tuple[str, list[str], list[str]]: +def _directory_fstring(node: ast.JoinedStr, suffix: str) -> bool: + """`f"{d}/plot-{THEME}<suffix>"`: a formatted directory in front of the theme file name (lets-plot's + shap-summary, plotnine's candlestick-volume).""" + if len(node.values) < 4: + return False + *head, before, theme, tail = node.values + return ( + isinstance(before, ast.Constant) + and isinstance(before.value, str) + and before.value.endswith("/plot-") + and isinstance(theme, ast.FormattedValue) + and isinstance(theme.value, ast.Name) + and theme.value.id == THEME_NAME + and theme.conversion == -1 + and theme.format_spec is None + and isinstance(tail, ast.Constant) + and tail.value == suffix + and any(isinstance(part, ast.FormattedValue) for part in head) + ) + + +def _rewrite_savefig_targets(code: str, *, library: str) -> StepResult: rule = save_rule(library) suffixes = ( ((PNG_SUFFIX, STANDARD_TARGET), (HTML_SUFFIX, HTML_TARGET)) if rule.html else ((PNG_SUFFIX, STANDARD_TARGET),) @@ -626,19 +1834,118 @@ def _rewrite_savefig_targets(code: str, *, library: str) -> tuple[str, list[str] return _apply(code, edits), changes, [] -def _import_module_rewrite(stmt: ast.stmt) -> tuple[str, str] | None: - """`(module, name)` for `name = importlib.import_module("module")`.""" +def _find_spec_test(test: ast.expr) -> str | None: + """`X` for the test `X and X.origin != __file__` (or `X is not None and __file__ != X.origin`).""" + if not (isinstance(test, ast.BoolOp) and isinstance(test.op, ast.And) and len(test.values) == 2): + return None + present, origin = test.values + if ( + isinstance(present, ast.Compare) + and len(present.ops) == 1 + and isinstance(present.ops[0], ast.IsNot) + and isinstance(present.comparators[0], ast.Constant) + and present.comparators[0].value is None + ): + present = present.left + if not (isinstance(present, ast.Name) and isinstance(origin, ast.Compare) and len(origin.ops) == 1): + return None + if not isinstance(origin.ops[0], ast.NotEq): + return None + sides = {dotted_name(origin.left), dotted_name(origin.comparators[0])} + return present.id if sides == {f"{present.id}.origin", "__file__"} else None + + +def _dedented(code: str, index: SourceIndex, statements: list[ast.stmt]) -> str: + """The whole lines of `statements`, dedented to the module level.""" + first = index.lines_span(statements[0]).first_line + last = index.lines_span(statements[-1]).last_line + return textwrap.dedent(code[index.line_start(first) : index.line_end(last)]) + + +def _strip_find_spec_guard(code: str) -> StepResult: + """`X = importlib.util.find_spec("pkg")` and `if X and X.origin != __file__: <imports> else: ...` -> the imports.""" + tree = ast.parse(code) + body = tree.body + specs: dict[str, ast.Assign] = {} + for stmt in body: + if not (isinstance(stmt, ast.Assign) and len(stmt.targets) == 1 and isinstance(stmt.targets[0], ast.Name)): + continue + call = stmt.value + if isinstance(call, ast.Call) and dotted_name(call.func) == "importlib.util.find_spec": + specs[stmt.targets[0].id] = stmt + if not specs: + return code, [], [] + index = SourceIndex(code) + replace: dict[int, tuple[int, str]] = {} + hoisted: list[ast.If] = [] + changes: list[str] = [] + notes: list[str] = [] + for stmt in body: + if not isinstance(stmt, ast.If): + continue + name = _find_spec_test(stmt.test) + if name is None or name not in specs or specs[name].lineno > stmt.lineno: + continue + span = index.lines_span(stmt) + if not all(isinstance(inner, ast.Import | ast.ImportFrom) for inner in stmt.body): + notes.append(f"find_spec guard: the if at {span.lines()} holds more than imports; left in place") + continue + replace[span.first_line] = (span.last_line, _dedented(code, index, stmt.body)) + hoisted.append(stmt) + changes.append(f"replaced the find_spec guard at {span.lines()} with its imports") + remove: set[int] = set() + for name, assignment in specs.items(): + users = [stmt for stmt in body if stmt is not assignment and name in _loads(stmt)] + if users and all(any(user is stmt for stmt in hoisted) for user in users): + span = index.lines_span(assignment) + remove |= _with_comments(index, span) + changes.append(f"removed the unused find_spec result {name} at {span.lines()}") + if not replace: + return code, [], notes + return _rewrite_lines(code, remove, replace), changes, notes + + +def _hoist_try_guard(code: str) -> StepResult: + """A module-level `try:` of imports only whose `finally:` only changes `sys.path` -> its imports.""" + tree = ast.parse(code) + aliases = _sys_aliases(tree.body) + if not aliases: + return code, [], [] + index = SourceIndex(code) + replace: dict[int, tuple[int, str]] = {} + changes: list[str] = [] + for stmt in tree.body: + if not (isinstance(stmt, ast.Try) and stmt.finalbody and not stmt.handlers and not stmt.orelse): + continue + if not all(isinstance(inner, ast.Import | ast.ImportFrom) for inner in stmt.body): + continue + if not all(_is_guard(inner, aliases) for inner in stmt.finalbody): + continue + span = index.lines_span(stmt) + replace[span.first_line] = (span.last_line, _dedented(code, index, stmt.body)) + changes.append(f"replaced the try/finally sys.path guard at {span.lines()} with its imports") + if not replace: + return code, [], [] + return _rewrite_lines(code, set(), replace), changes, [] + + +def _import_module_rewrite(stmt: ast.stmt, callees: set[str]) -> str | None: + """The import for `NAME = importlib.import_module("module")[.ATTR]` (`callees` name `import_module`), or None.""" if not (isinstance(stmt, ast.Assign) and len(stmt.targets) == 1 and isinstance(stmt.targets[0], ast.Name)): return None - call = stmt.value - if not (isinstance(call, ast.Call) and dotted_name(call.func) == "importlib.import_module"): + name, call, attribute = stmt.targets[0].id, stmt.value, None + if isinstance(stmt.value, ast.Attribute): + call, attribute = stmt.value.value, stmt.value.attr + if not (isinstance(call, ast.Call) and dotted_name(call.func) in callees): return None if len(call.args) != 1 or call.keywords or not isinstance(call.args[0], ast.Constant): return None module = call.args[0].value if not isinstance(module, str) or not _MODULE_NAME.fullmatch(module): return None - return module, stmt.targets[0].id + if attribute is None: + return f"import {module}" if module == name else f"import {module} as {name}" + return f"from {module} import {attribute}" + ("" if attribute == name else f" as {name}") def _import_bindings(stmt: ast.Import | ast.ImportFrom) -> tuple[set[str], set[str]]: @@ -649,17 +1956,20 @@ def _import_bindings(stmt: ast.Import | ast.ImportFrom) -> tuple[set[str], set[s return {alias.asname or alias.name for alias in stmt.names}, {(stmt.module or "").split(".")[0]} -def _strip_path_guard(code: str) -> tuple[str, list[str], list[str]]: +def _strip_path_guard(code: str) -> StepResult: tree = ast.parse(code) body = tree.body - sys_aliases = { + sys_aliases = _sys_aliases(body) + import_module = {"importlib.import_module"} | { alias.asname or alias.name for stmt in body - if isinstance(stmt, ast.Import) + if isinstance(stmt, ast.ImportFrom) and stmt.module == "importlib" and stmt.level == 0 for alias in stmt.names - if alias.name == "sys" + if alias.name == "import_module" + } + rewrites = { + id(stmt): rewrite for stmt in body if (rewrite := _import_module_rewrite(stmt, import_module)) is not None } - rewrites = {id(stmt): rewrite for stmt in body if (rewrite := _import_module_rewrite(stmt)) is not None} loads = {id(stmt): _loads(stmt) for stmt in body} os_names, pathlib_names = _module_aliases(body, "os"), _module_aliases(body, "pathlib") @@ -689,11 +1999,13 @@ def _strip_path_guard(code: str) -> tuple[str, list[str], list[str]]: removed = {id(stmt) for stmt in guard} guard_loads: set[str] = set().union(*(loads[id(stmt)] for stmt in guard)) grown = True - while grown: # dead helpers of the guard and dead file-location assignments, until none is left + while grown: # dead helpers of the guard, dead sys.path snapshots and dead file-location assignments grown = False for stmt in body: names = _binds(stmt) - if id(stmt) in removed or not names or not (names <= guard_loads or names <= path_names): + if id(stmt) in removed or not names: + continue + if not (names <= guard_loads or names <= path_names or _mentions_sys_path(stmt, sys_aliases)): continue used = any( names & loads[id(other)] @@ -737,28 +2049,24 @@ def _strip_path_guard(code: str) -> tuple[str, list[str], list[str]]: if id(stmt) not in removed: continue span = index.lines_span(stmt) - remove.update(range(span.first_line, span.last_line + 1)) - line = span.first_line - 1 - while line >= 1 and index.line_text(line).lstrip().startswith("#"): - remove.add(line) - line -= 1 + remove |= _with_comments(index, span) if stmt in guard: label = "the sys.path guard" elif stmt in imports or isinstance(stmt, ast.Delete): label = f"the unused `{ast.unparse(stmt)}`" + elif _mentions_sys_path(stmt, sys_aliases): + label = "an unused sys.path snapshot" else: label = "an unused file-path helper" changes.append(f"removed {label} at {span.lines()}") for stmt in body: - rewrite = rewrites.get(id(stmt)) - if rewrite is None or id(stmt) in removed: + statement = rewrites.get(id(stmt)) + if statement is None or id(stmt) in removed: continue - module, name = rewrite span = index.lines_span(stmt) - statement = f"import {module}" if module == name else f"import {module} as {name}" replace[span.first_line] = (span.last_line, statement + _newline(index, span.last_line)) - changes.append(f"{name} = importlib.import_module({module!r}) -> {statement} at {span.lines()}") + changes.append(f"{ast.unparse(stmt)} -> {statement} at {span.lines()}") notes: list[str] = [] leftover = [stmt for stmt in body if id(stmt) not in removed and _mentions_sys_path(stmt, sys_aliases)] @@ -779,7 +2087,8 @@ def _rewrite_lines(code: str, remove: set[int], replace: dict[int, tuple[int, st """Drop and replace whole lines, then trim blank lines where the removed lines were. At each removal point the blank lines around it shrink to two (PEP 8 between - module-level statements), or to none at the start of the file. + module-level statements), or to none at the start or the end of the file (pygal's + and lets-plot's files end on the writes the normaliser removes). """ index = SourceIndex(code) out: list[str] = [] @@ -801,19 +2110,21 @@ def _rewrite_lines(code: str, remove: set[int], replace: dict[int, tuple[int, st def blank(text: str) -> bool: return bool(text) and not text.strip() + limit = len(out) for join in reversed(joins): + join = min(join, limit) # the blank lines up to a later removal point may have gone with it before = 0 while join - before - 1 >= 0 and blank(out[join - before - 1]): before += 1 after = 0 while join + after < len(out) and blank(out[join + after]): after += 1 - allowed = 0 if join - before == 0 else 2 + at_end = not "".join(out[join + after :]) + allowed = 0 if join - before == 0 or at_end else 2 excess = before + after - allowed - if excess <= 0: - continue - cut_after = min(after, excess) - cut_before = excess - cut_after + cut_after = min(after, max(excess, 0)) + cut_before = max(excess, 0) - cut_after del out[join : join + cut_after] del out[join - cut_before : join] + limit = join - cut_before return "".join(out) diff --git a/agents/anyplot/code/readiness.py b/agents/anyplot/code/readiness.py index 0a93f290876..4f390f726bd 100644 --- a/agents/anyplot/code/readiness.py +++ b/agents/anyplot/code/readiness.py @@ -8,11 +8,17 @@ validator reports findings or fails (`security: <rule> ...`, quoting the validator's rule ids; it is asked only for a library with a normaliser); there is no module-level `THEME = os.getenv("ANYPLOT_THEME", ...)` (`no-theme`); or a save call of the library's rule (`regions.SAVE_RULES`: `savefig`, - plotnine's `save` and `ggsave`, altair's `save`) writes anywhere but `f"plot-{THEME}.png"` - (altair also `f"plot-{THEME}.html"`), or the last save of the PNG is missing or not a + plotnine's `save` and `ggsave`, altair's `save`, pygal's `render_to_png`, + `render_to_file` and `svg2png`, lets-plot's `ggsave`) writes anywhere but + `f"plot-{THEME}.png"` (altair, pygal and lets-plot also `f"plot-{THEME}.html"`), a + save of a library with a save directory (`SaveRule.directory`: lets-plot's + `path="."`) does not pass it, or the last save of the PNG is missing or not a module-level statement (`savefig-target`; a plain string such as `"plot.png"` is reported as a single-theme target). Every blocking reason is listed; `hints` stays - empty. + empty. What the normaliser leaves in place reaches the scan this way: a lets-plot + star import or save alias it could not rewrite, a pygal `open()` write it kept and + a guard it did not strip are SECURITY findings; a pygal theme `.svg` save it kept is + a `savefig-target`. * `coupled`: eligible, but the code holds literals that only fit the catalogue's own data. Each category becomes one hint for the adapter (a `Note` of at most 300 characters that names the lines) and one `reasons` entry (`limits: 3 lines`). @@ -54,9 +60,12 @@ profile bans importing it, so such code is already blocked. `reasons` can also carry one `canvas:` entry for any status that is not blocked: the -normaliser could not put the canvas on 3200x1800 or 2400x2400 (the figure size is -not a literal or has another aspect), so the render relies on the R3 canvas gate and -its padding fallback. It does not change the status. +normaliser could not put the canvas on 3200x1800 or 2400x2400 (`normalise.measure_canvas`: +matplotlib's figure size is not a literal or has another aspect, a pygal chart's size is +computed or not 16:9 or 1:1, a lets-plot grid has no `ggsize` of its own or no scale +reaches either canvas; plotnine and altair size their canvas on the save, which the +normaliser does not read), so the render relies on the R3 canvas gate and its padding +fallback. It does not change the status. The 13 map specs are the specs tagged both `plot_type: map` and `data_type: geospatial` in their `specification.yaml`: bubble-map-geographic, @@ -227,6 +236,12 @@ def scan(normalised_code: str, *, spec_id: str, library: str, enabled_libraries: else: target = _snippet(call.target or "no file argument") blocked.append(f'savefig-target: {call.name} saves to {target} at {where}, not f"plot-{{THEME}}.png"') + if rule.directory is not None: + directory = f'path="{rule.directory}"' + for call in regions.savefig_calls: + path = next((keyword for keyword in call.keywords if keyword.name == "path"), None) + if path is None or not (path.literal and path.value == rule.directory): + blocked.append(f"savefig-target: {call.name} at {call.span.lines()} does not save with {directory}") if not regions.savefig_calls: blocked.append(f"savefig-target: no {rule.verb} call") elif regions.savefig is None: diff --git a/agents/anyplot/code/regions.py b/agents/anyplot/code/regions.py index 737acd8f887..97be3a47dae 100644 --- a/agents/anyplot/code/regions.py +++ b/agents/anyplot/code/regions.py @@ -22,12 +22,16 @@ `ggsave(plot, f"plot-{THEME}.png", ...)` for plotnine (the file is the second positional of `ggsave`), `chart.save(f"plot-{THEME}.png", scale_factor=4.0)` for altair, whose files also save `f"plot-{THEME}.html"` and reopen the PNG with PIL to - pad it (`_canvas.save(f"plot-{THEME}.png")`). Every call of the library's save names - is a save call; the protected final one is the last module-level statement among - those that write the PNG; + pad it (`_canvas.save(f"plot-{THEME}.png")`), `chart.render_to_png(f"plot-{THEME}.png")` + or `cairosvg.svg2png(bytestring=..., write_to=f"plot-{THEME}.png")` for pygal (with + `chart.render_to_file(f"plot-{THEME}.html")`), and + `ggsave(plot, f"plot-{THEME}.png", path=".", scale=2)` for lets-plot (with the HTML + save). Every call of the library's save names is a save call; the protected final one + is the last module-level statement among those that write the PNG; * the canvas: `figsize=` and `dpi=` on the figure creation call (`plt.subplots`, `plt.figure`, `plt.subplot_mosaic`, `sns.clustermap`), `set_size_inches` and - `set_dpi` on the figure of a seaborn grid, and `dpi=` on savefig; + `set_dpi` on the figure of a seaborn grid, and `dpi=` on savefig (the other libraries + size their canvas elsewhere, `SaveRule.canvas`); * in an adapted working form, the placeholder statement `df = load_user_data()`. Lines are 1-based and inclusive; offsets are 0-based character offsets into the @@ -64,6 +68,9 @@ RegionKind = Literal["theme", "theme_token", "placeholder", "savefig"] SizeMethod = Literal["set_size_inches", "set_dpi"] +CanvasRewrite = Literal["figure", "pygal", "letsplot"] +"""How the normaliser sets a library's canvas: matplotlib's figure size times dpi (`figure`), pygal's chart size +through the PNG save's output size (`pygal`), lets-plot's `scale=` on the PNG save (`letsplot`).""" Number = int | float @@ -73,20 +80,25 @@ class SaveRule: `names` are the callee names (the last dotted component) that save the plot; the file is the positional at `positions[name]` (0 unless listed) or one of - `target_keywords`. `keywords[name]` lists the keywords a save may take, None for any - (matplotlib's `savefig`, whose settings the validator checks one by one). `html` - admits a second save of exactly `f"plot-{THEME}.html"` next to the PNG, `reopens` - a `.open(...)` of the PNG (altair's PIL padding block), and `canvas` says whether the - normaliser's matplotlib canvas rewrite (figure size times dpi) applies. + `target_keywords`; a name in `keyword_only` takes its file by keyword alone + (`cairosvg.svg2png`, whose first positional is the SVG). `keywords[name]` lists the + keywords a save may take, None for any (matplotlib's `savefig`, whose settings the + validator checks one by one). `html` admits a second save of exactly + `f"plot-{THEME}.html"` next to the PNG, `reopens` a `.open(...)` of the PNG (altair's + PIL padding block), `directory` the one literal every save passes as `path=` + (lets-plot, whose `ggsave` writes into `./lets-plot-images` without it), and `canvas` + names the normaliser's canvas rewrite for the library, None where it has none yet. """ names: frozenset[str] target_keywords: frozenset[str] positions: Mapping[str, int] = field(default_factory=lambda: MappingProxyType({})) keywords: Mapping[str, frozenset[str] | None] = field(default_factory=lambda: MappingProxyType({})) + keyword_only: frozenset[str] = frozenset() html: bool = False reopens: bool = False - canvas: bool = True + directory: str | None = None + canvas: CanvasRewrite | None = "figure" @property def verb(self) -> str: @@ -94,6 +106,9 @@ def verb(self) -> str: return "savefig" if "savefig" in self.names and len(self.names) == 1 else "save" def target_position(self, name: str) -> int: + """The position of the file argument of `name`; -1 for a save that takes its file by keyword only.""" + if name in self.keyword_only: + return -1 return self.positions.get(name, 0) def allowed_keywords(self, name: str) -> frozenset[str] | None: @@ -107,6 +122,38 @@ def allowed_keywords(self, name: str) -> frozenset[str] | None: """`Chart.save(fp, format, override_data_transformer, scale_factor, mode, vegalite_version, vega_version, vegaembed_version, embed_options, json_kwds, webdriver, engine, inline, **kwargs)`: the size and the HTML embedding only; `webdriver=` and `engine=` choose how the PNG is made and stay with altair's default, vl-convert in process.""" +_PYGAL_SVG2PNG_KEYWORDS = frozenset( + { + "bytestring", + "write_to", + "dpi", + "scale", + "output_width", + "output_height", + "parent_width", + "parent_height", + "background_color", + "negate_colors", + "invert_images", + } +) +"""`cairosvg.svg2png(bytestring, *, file_obj, url, dpi, parent_width, parent_height, scale, unsafe, +background_color, negate_colors, invert_images, write_to, output_width, output_height)` without `url=` and +`file_obj=`, which read the main input through cairosvg's unrestricted fetcher (any path, any URL), and `unsafe=` +(external entities and hrefs).""" +_PYGAL_SAVE_KEYWORDS: Mapping[str, frozenset[str] | None] = MappingProxyType( + { + # `render_to_png(filename=None, dpi=72, **kwargs)` and `render_to_file(filename, **kwargs)` hand their + # `**kwargs` to `render()` and from there into the chart's config (`css=`, `js=`, `defs=`), so a save takes + # none of them. + "render_to_png": frozenset({"filename", "dpi"}), + "render_to_file": frozenset({"filename"}), + "svg2png": _PYGAL_SVG2PNG_KEYWORDS, + } +) +_LETSPLOT_SAVE_KEYWORDS = frozenset({"filename", "path", "scale", "w", "h", "unit", "dpi"}) +"""`ggsave(plot, filename, *, path=None, iframe=True, scale=None, w=None, h=None, unit=None, dpi=None)`: the file, the +directory (`SaveRule.directory`) and the raster size; `iframe=` shapes only the HTML and no catalogue file passes it.""" _MATPLOTLIB_SAVE = SaveRule(names=frozenset({"savefig"}), target_keywords=frozenset({"fname"})) SAVE_RULES: Mapping[str, SaveRule] = MappingProxyType( { @@ -118,7 +165,7 @@ def allowed_keywords(self, name: str) -> frozenset[str] | None: target_keywords=frozenset({"filename", "fname"}), positions=MappingProxyType({"ggsave": 1}), keywords=MappingProxyType({"save": _PLOTNINE_SAVE_KEYWORDS, "ggsave": _PLOTNINE_SAVE_KEYWORDS}), - canvas=False, + canvas=None, ), "altair": SaveRule( names=frozenset({"save"}), @@ -126,7 +173,30 @@ def allowed_keywords(self, name: str) -> frozenset[str] | None: keywords=MappingProxyType({"save": _ALTAIR_SAVE_KEYWORDS}), html=True, reopens=True, - canvas=False, + canvas=None, + ), + # `chart.render_to_png(f"plot-{THEME}.png")` (220 of 325 catalogue files end on it), + # `cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png", ...)` (92) and + # `chart.render_to_file(f"plot-{THEME}.html")`. libcairo writes the PNG with its own `fopen`, which the + # harness's audit hook never sees, so the file rests on this rule alone (survey of 2026-10-24). + "pygal": SaveRule( + names=frozenset({"render_to_png", "render_to_file", "svg2png"}), + target_keywords=frozenset({"filename", "write_to"}), + keywords=_PYGAL_SAVE_KEYWORDS, + keyword_only=frozenset({"svg2png"}), + html=True, + canvas="pygal", + ), + # `ggsave(plot, f"plot-{THEME}.png", path=".", scale=4)` and the same call for the HTML, in every one of the + # 325 catalogue files; the file is the second positional or `filename=`. + "letsplot": SaveRule( + names=frozenset({"ggsave"}), + target_keywords=frozenset({"filename"}), + positions=MappingProxyType({"ggsave": 1}), + keywords=MappingProxyType({"ggsave": _LETSPLOT_SAVE_KEYWORDS}), + html=True, + directory=".", + canvas="letsplot", ), } ) @@ -429,7 +499,11 @@ def is_standard_target(node: ast.expr) -> bool: def save_target(call: ast.Call, rule: SaveRule, name: str) -> ast.expr | None: """The file argument of the save call `name` under `rule`: its positional, else one of the rule's keywords.""" position = rule.target_position(name) - if len(call.args) > position and not any(isinstance(arg, ast.Starred) for arg in call.args[: position + 1]): + if ( + position >= 0 + and len(call.args) > position + and not any(isinstance(arg, ast.Starred) for arg in call.args[: position + 1]) + ): return call.args[position] return next((kw.value for kw in call.keywords if kw.arg in rule.target_keywords), None) diff --git a/agents/anyplot/code/validate.py b/agents/anyplot/code/validate.py index 0710c218edf..c54484fea73 100644 --- a/agents/anyplot/code/validate.py +++ b/agents/anyplot/code/validate.py @@ -6,8 +6,8 @@ one only the compiler reports, such as a module-level `return`), an oversize file or a string that is not UTF-8 text is itself a `Finding`. Only `library` makes `validate_security` raise `ValueError`: an id outside the catalogue, or a catalogue -library without a profile yet (`LIBRARY_IMPORTS`: matplotlib, seaborn, plotnine and -altair), because that is a caller bug, not a property of the code. +library without a profile yet (`LIBRARY_IMPORTS`: matplotlib, seaborn, plotnine, altair, +pygal and letsplot), because that is a caller bug, not a property of the code. The validator is one guardrail layer, not the boundary: the sandbox (no egress, read-only root, no environment) and the loader substitution are the others. Its job is to make the @@ -32,7 +32,29 @@ `alt.limit_rows` hands out, whose `.implementation.to_native_namespace()` is the pyarrow module; VegaFusion's `transformed_data`; and plotnine's `.environment`, the captured namespace every plot carries, whose `.namespace["os"]` is the `os` module as a value. - The four extra scipy modules, + pygal gets `pygal` and `cairosvg` (its PNG writer, which 98 catalogue files import + directly), lets-plot gets `lets_plot` (surveys of 2026-10-24, drafts and spikes of + 2026-10-26, `agentic/specs/261024-agent-all-libraries.md`, step 1c); `xml.etree`, PIL + and cairocffi stay out of pygal's surface and PIL out of lets-plot's, so the catalogue + files that post-process the SVG or composite the PNG stay blocked. libcairo writes + pygal's PNG with its own `fopen`, which the render guard never sees, so the closures + matter more there: cairosvg's modules that read any path or URL or write any file + (`parser`, `surface`, `url`, `image`, `css`, `features`, `test_api`, the re-exported + `Path` and the `ROOT` instance, banned on their module in `MODULE_ESCAPES`), cairocffi + reached as `.cairo` with its `ffi`, `dlopen` and file surfaces, cairosvg's other + writers (`svg2pdf`, `svg2ps`, `svg2eps`, `svg2svg`, `SURFACES`) and fetchers, and + pygal's renderers that open a browser or hand out the live tree, its `getattr` by + string (`cut`), its `str.format` (`template`) and its config merge (`_update`), all in + pygal's `LIBRARY_BANS`; `etree`, pygal's ElementTree proxy, is banned on every + receiver (`UNSAFE_SUBMODULES`), and so are `cssselect2`, `tinycss2`, `webencodings` and + `cairocffi` (`ESCAPE_ATTRIBUTES`): cssselect2 `eval`s the selectors it compiles, and a + forged token object handed to its compiler reaches an unquoted slot of that code (the + pygal spike of 2026-10-26). lets-plot's geocoding, map tiles, settings and browser + launcher are denied imports and banned submodules, its writers (`to_png`, `to_svg`, + `to_pdf`), browser hook (`setup_show_ext`), import-by-name proxy (`LazyModule`) and + geocoders are `UNSAFE_HELPERS`, the proxies it hands out (`png`, `palettable`, + `geopandas`) `ESCAPE_ATTRIBUTES`, and `LetsPlot.set`, `LetsPlot.setup_show_ext` and + `lets_plot.cfg` `MODULE_ESCAPES`. The four extra scipy modules, `statsmodels.graphics` and the toolkits were admitted after the readiness sweep showed them behind most of the catalogue's benign import blocks; each was walked for file or network helpers and has none. The pure computing modules of the standard library @@ -109,7 +131,8 @@ URLs; `.io` and `ExcelWriter` are added for `pandas.io.common.get_handle` and the Excel writer, and `open_memmap`, `imsave`, `to_filehandle`, `open_file_cm`, `rc_params_from_file` and the rarer pandas writers for the remaining file paths of - numpy, matplotlib and pandas; the design's list names none of them. + numpy, matplotlib and pandas; the design's list names none of them. The one exception + is lets-plot's spec builders ("lets-plot" below). * **Import paths are checked component by component** against the same name sets, so an alias cannot drop a banned component: `import pandas.io.common as common` and `import numpy.lib.format as fmt` are findings although `common.get_handle` and @@ -133,21 +156,39 @@ * **URL literals** match `http://`, `https://`, `ftp://`, and `file:`/`data:` followed by a non-space character, case-insensitively and at a word boundary, so a subtitle "Source data: 2024 survey" or the word "profile:" passes while `data:image/png;...` - and `file:///etc/passwd` do not. + and `file:///etc/passwd` do not. pygal's profile lets two kinds pass: the SVG and XLink + namespace names, exactly `http://www.w3.org/2000/svg` and + `http://www.w3.org/1999/xlink`, also in Clark notation (`{...}rect`), followed by a + quote, `}`, whitespace or the end of the string (an XML parser compares them and never + fetches them; 31 catalogue files write or match SVG markup), and pygal's own + stylesheets in a `css=` list ("pygal's config" below). * **The save (`savefig-target`).** Every call of a save name (`regions.SAVE_NAMES`: - `savefig`, `save`, `ggsave`), not only the last, is checked against the library's save - rule (`regions.SAVE_RULES`). A name the rule does not list is a `banned-call` (`np.save` - with matplotlib, `fig.savefig` with altair). The file argument (the rule's positional, - `fname=`, `filename=` or `fp=`; `ggsave` takes the plot first and the file second) must - be exactly the f-string `f"plot-{THEME}.png"`, for altair also `f"plot-{THEME}.html"`, - the second file its catalogue writes; `format=` is absent or the file's own type; there - are no `**arguments`; and plotnine's `save` and `ggsave` and altair's `save` take only - the keywords the rule lists (the size, the dpi, altair's `scale_factor`), so `path=`, - which joins a directory, `webdriver=` and `engine=`, which choose how altair makes the - PNG, are findings. A file without a save of the PNG is a finding too; a second save - writing elsewhere is never wanted. A save name may only be called where it is named + `savefig`, `save`, `ggsave`, `render_to_png`, `render_to_file`, `svg2png`), not only the + last, is checked against the library's save rule (`regions.SAVE_RULES`). A name the rule + does not list is a `banned-call` (`np.save` with matplotlib, `fig.savefig` with altair, + PIL's `.save` with pygal). The file argument (the rule's positional, `fname=`, + `filename=`, `fp=` or `write_to=`; `ggsave` takes the plot first and the file second, + `cairosvg.svg2png` takes every argument by keyword) must be exactly the f-string + `f"plot-{THEME}.png"`, for altair, pygal and lets-plot also `f"plot-{THEME}.html"`, + the second file their catalogues write; `format=` is absent or the file's own type; + there are no `**arguments`; and the saves of plotnine, altair, pygal and lets-plot take + only the keywords the rule lists (the size, the dpi, altair's `scale_factor`, svg2png's + input and output size), so `path=` with plotnine, which joins a directory, `webdriver=` + and `engine=`, which choose how altair makes the PNG, a pygal save's chart options and + svg2png's `url=`, `file_obj=` and `unsafe=`, which read any path or URL, are findings. + lets-plot's `ggsave` passes exactly `path="."` (`SaveRule.directory`): without it, + lets-plot writes into a `lets-plot-images` directory it creates. A file without a save + of the PNG is a finding too, and so is a save without a file (pygal's + `render_to_png()` returns bytes) or with a file object; a second save writing + elsewhere is never wanted. A save name may only be called where it is named (`f = plot.save; f("x")` would hide the target), and so may `.open`, which only altair's rule admits, on the PNG (the PIL block reopens it: `Image.open(f"plot-{THEME}.png")`). + A save name is never imported under another name (`from plotnine import ggsave as + keep`), nothing is imported under a save name, and a bare save name is only ever the + callee of a call (`g = ggsave`, `[ggsave][0](...)` and `partial(ggsave, plot)` are + `banned-call` findings in every profile): the rule matches calls by their callee's + name, so a save reached under another name would write anywhere (the lets-plot draft + of 2026-10-26 showed it in the plotnine profile). * **Expression strings (plotnine).** plotnine compiles and evaluates a string that is not a column name wherever it takes an aesthetic or a facet (`aes`, `after_stat`, `after_scale`, `stage`, `facet_wrap`, `facet_grid`, `qplot`), with real builtins and the @@ -168,6 +209,37 @@ string to patsy, which `exec`s Python while it parses, and the render guard refuses that. The guard lets plotnine's `Environment.eval` run the walked strings (`harness.CODE_BUILDERS`); what they reach stays under the guard. +* **pygal's config.** A `css` or `js` entry that starts with `file://` is read from any + path and inlined into the SVG, any other entry but `inline:...` becomes a stylesheet or + script the HTML fetches, `defs` is raw SVG markup, and a `googlefont:` font makes the + SVG load Google Fonts (pygal 3.1.3, surveyed 2026-10-24). So `js=` takes only an empty + list or tuple (30 catalogue files pass `js=[]`), `css=` takes a list or tuple of + `inline:` texts (a string or an f-string whose text starts with it) and pygal's own + `file://style.css`, `file://graph.css` and `file://base.css`, `defs` is refused, all + three as keywords on any call and as `.css = [...]` and `.js = [...]` assignments; a + list or a text may be a name bound once at module level, used nowhere but where the + rule reads it. The attributes are never read, augmented, subscripted or deleted, so a + list cannot change after the check (`chart.css += [...]`, `chart.css.append(...)`), and + every `**` argument is a dict literal with string keys, or a name bound once at module + level to one and used only as `**name` (3 catalogue files share their chart options + that way), whose `css`, `js` and `defs` keys are checked the same way. A string that + contains `googlefont:` is a `url-literal`. Findings are `banned-keyword` for a value and + `banned-attribute` for an attribute. +* **lets-plot.** `LetsPlot` is used only as `LetsPlot.setup_html()` without arguments + (every one of the 325 catalogue files; `set` points the HTML's script at any URL and + `setup_show_ext` starts a browser), and `.props`, which hands out a layer's spec dict + for rewriting after the check (an image layer's `href` included), is banned in its + profile (`LIBRARY_BANS`; the spike of 2026-10-26). The `.format` ban has one exception + here: lets-plot's tooltip and label builders set a field's format with `.format(field, + format)` (128 uses in 59 catalogue files), so `.format` passes when its receiver is a + chain of builder method calls (`LETSPLOT_BUILDER_METHODS`, each of which returns the + builder) rooted in a call of `layer_tooltips`, `layer_labels` or `smooth_labels` + imported with `from lets_plot import ...`, bound nowhere else and never assigned as an + attribute (`lets_plot.layer_tooltips = str` before the import), and when it takes only + string literals (positional, or `field=` and `format=`). `"{0}".format(...)`, a builder + bound to a name (`tt = layer_tooltips(); tt.format(...)`) and a builder name bound + twice stay findings. The `format=` keyword (`scale_y_continuous(format=...)`) is + no attribute and passes everywhere. * **`type()`** is allowed with exactly one plain positional argument; anything else (three arguments, starred arguments, keywords) is the class-creating form. * **String method names.** pandas resolves `df.agg("to_csv")`, `df.apply("eval")` and @@ -235,7 +307,8 @@ Rule ids: `size`, `encoding`, `syntax`, `banned-import` (with `Finding.module`), `star-import`, `relative-import`, `os-use`, `module-value`, `banned-name`, `banned-call`, `banned-attribute`, `banned-keyword`, `rc-key`, `dunder`, `banned-statement`, `url-literal`, `string-length`, `savefig-target` -(SECURITY; DATA without `savefig-target`; a plotnine expression string's finding keeps the id of the rule it broke); +(SECURITY; DATA without `savefig-target`; a plotnine expression string's finding keeps the id of the rule it broke; +pygal's config and lets-plot's rules use the ids above); `placeholder-count`, `placeholder-use`, `rng`, `literal-data`, `palette-prefix` (ADAPTATION); `data-frame` (DATA). Findings are sorted by line; messages never echo more than about 60 characters of code and never echo string literal contents. @@ -247,7 +320,7 @@ import re import sys from collections import defaultdict -from collections.abc import Container, Iterable +from collections.abc import Callable, Container, Iterable from dataclasses import dataclass from typing import Literal, TypeVar @@ -381,6 +454,14 @@ "altair.utils.execeval", "altair.utils.server", "altair.utils.html", + # lets-plot (survey of 2026-10-24): `geo_data` geocodes over urllib, `tilesets`, `settings_utils` and the + # livemap geom put tile and geocoder URLs into the spec, `frontend_context` writes a temporary HTML file and + # starts a browser. + "lets_plot.geo_data", + "lets_plot.tilesets", + "lets_plot.settings_utils", + "lets_plot.frontend_context", + "lets_plot.plot.geom_livemap_", } ) # The three toolkits ship with matplotlib and do no I/O. Third-party plotting helpers @@ -392,13 +473,19 @@ # One profile per Python library with a save rule (`regions.SAVE_RULES`): plotnine draws # with matplotlib (5 catalogue files import it directly) and scales with mizani; altair's # catalogue pads the PNG with `PIL.Image` (the module, not the package: `ImageDraw`, -# `ImageFont` and the rest stay out). The other Python libraries (plotly, bokeh, pygal, -# lets-plot) have no profile yet and raise `ValueError`. +# `ImageFont` and the rest stay out); pygal renders its PNG through cairosvg, which 98 +# catalogue files also import directly (`cairocffi`, `PIL`, `xml.etree` and matplotlib stay +# out, and so do the 23 catalogue files that subclass pygal's `Graph`: a class definition +# is refused in every profile); lets-plot needs nothing else (no catalogue file imports +# matplotlib with it; the 4 that draw on the PNG with PIL stay out). The other Python +# libraries (plotly, bokeh) have no profile yet and raise `ValueError`. LIBRARY_IMPORTS: dict[str, frozenset[str]] = { "matplotlib": _MATPLOTLIB_STACK, "seaborn": _MATPLOTLIB_STACK | {"seaborn"}, "plotnine": _MATPLOTLIB_STACK | {"plotnine", "mizani"}, "altair": frozenset({"altair", "PIL.Image"}), + "pygal": frozenset({"pygal", "cairosvg"}), + "letsplot": frozenset({"lets_plot"}), } # The DATA profile: no plotting stack, no sklearn (its `datasets` fetch over the network) and # no statsmodels (`statsmodels.api.datasets` and `webuse` read files and URLs). The standard @@ -706,6 +793,18 @@ "vl_convert", "pyarrow", "polars", + # cairosvg's `css` and `parser` hand out cssselect2, whose selector compiler `eval`s the code it builds: a + # forged token object reaches an unquoted slot of it (the pygal spike of 2026-10-26); tinycss2 and + # webencodings are its parser, cairocffi the C binding behind `.cairo` (survey of 2026-10-24). + "cssselect2", + "tinycss2", + "webencodings", + "cairocffi", + # lets-plot's `LazyModule` proxies import their module by name on the first attribute access: + # `geom_imshow_.png.Reader(filename=...)` reads any file (survey of 2026-10-24, its refute pass). + "geopandas", + "png", + "palettable", } ) UNSAFE_SUBMODULES: frozenset[str] = frozenset( @@ -737,13 +836,24 @@ "server", # altair.utils.server opens a port and a browser; the attribute is the stdlib http.server "html", # altair.utils.html: Jinja templates built from text (`environment.from_string`) "jupyter", # altair.jupyter re-exports importlib's `find_spec` + # pygal and cairosvg (surveys of 2026-10-24): pygal's ElementTree proxy, re-exported as `pygal.svg.etree` and + # `pygal.graph.map.etree` (`parse`, `ElementTree(root).write(path)`); cairosvg's pytest module. + "etree", + "test_api", + # lets-plot (survey of 2026-10-24): the browser launcher, geocoding, tile and geocoder URLs, the livemap geom. + "frontend_context", + "geo_data", + "settings_utils", + "tilesets", + "geom_livemap_", } ) """Submodules of the allowed packages that test, build, start processes, run LaTeX or import by name (validator review of 2026-10-14: `np.testing.measure` compiles and execs its string). Banned like `ESCAPE_ATTRIBUTES`: as an attribute on any object, as a `from` import and as an import path component below its root. A test pins that every -public first-level submodule of numpy, pandas, matplotlib, seaborn and scikit-learn is either reviewed as safe or -in this set, so a library upgrade that adds one fails until someone looks at it.""" +public first-level submodule of numpy, pandas, matplotlib, seaborn, scikit-learn and the plotting libraries is +either reviewed as safe or banned by name (here, or on its own module in `MODULE_ESCAPES`), so a library upgrade +that adds one fails until someone looks at it.""" UNSAFE_HELPERS: frozenset[str] = frozenset( { "test", # np.test, pd.test, mpl.test, scipy's and statsmodels' `test()` run pytest @@ -836,6 +946,33 @@ "namespaces", "qplot", "from_formula", + # lets-plot (survey of 2026-10-24): the writers next to `ggsave` (`to_html` is in `BANNED_IO`, `show` in + # `BANNED_ATTRIBUTES`), the browser hook and its page context, import by name (`LazyModule("subprocess")`), + # the livemap geom and its tile configs, the geocoders and the requests they send, and `pkgutil.extend_path` + # left on the package root. No catalogue file of another library uses any of these names. + "to_png", + "to_svg", + "to_pdf", + "setup_show_ext", + "WebBrHtmlPageContext", + "LazyModule", + "geom_livemap", + "maptiles_zxy", + "maptiles_lets_plot", + "maptiles_solid", + "maptiles_chessboard", + "geocoding_service", + "geocode", + "geocode_cities", + "geocode_counties", + "geocode_states", + "geocode_countries", + "reverse_geocode", + "get_geocodes", + "get_centroids", + "get_boundaries", + "get_limits", + "extend_path", } ) """Public functions and classes of the allowed modules that exec, start a process, import by name, fetch or write @@ -857,6 +994,26 @@ "altair.vegalite.v6.display.Path", "altair.version", "mizani.version", + # cairosvg (surveys of 2026-10-24): `parser` reads the main input from any path or URL with an unrestricted + # fetcher, `surface` writes any path through libcairo and hands out cairocffi, `url` is urlopen, `image` + # hands out PIL's `Image` and `ImageOps`, `css` cssselect2, `features` the locale module, `test_api` runs + # pytest; `Path` is pathlib's class and `ROOT` a `Path` instance (the package directory). Each name is + # plausible elsewhere (`matplotlib.image`, `matplotlib.path.Path`, a `url` column). + "cairosvg.Path", + "cairosvg.ROOT", + "cairosvg.parser", + "cairosvg.surface", + "cairosvg.url", + "cairosvg.image", + "cairosvg.css", + "cairosvg.features", + "cairosvg.test_api", + # lets-plot: `LetsPlot.set` points the HTML's script and the geocoder at any URL, `setup_show_ext` installs + # the browser launcher, `cfg` is the private configuration module under a public name (the survey's refute + # pass: banned by path, because `cfg` is a common name). + "lets_plot.LetsPlot.set", + "lets_plot.LetsPlot.setup_show_ext", + "lets_plot.cfg", } ) """Escapes banned only on their own module, because the bare name is plausible data: `calendar.main` @@ -884,6 +1041,7 @@ "vl_convert": "altair writes the PNG itself through chart.save(); import nothing from vl_convert", "plotnine.data": _DATA_FROM_DF, "altair.datasets": _DATA_FROM_DF, + "lets_plot.geo_data": _DATA_FROM_DF, } """What a `banned-import` repair line suggests instead, by module path or its longest known prefix.""" DEFAULT_IMPORT_ALTERNATIVE = ( @@ -901,6 +1059,10 @@ "qrcode", "squarify", "wordcloud", + "pygal_maps_world", + "cairocffi", + "cssselect2", + "tinycss2", "altair", "bokeh", "highcharts_core", @@ -961,7 +1123,9 @@ _RC_FILE_READERS = frozenset({"rc_context", "theme_matplotlib"}) """`rc_context(rc, fname)` and plotnine's `theme_matplotlib(rc, fname)` load every setting from the file `fname` names (`rc_params_from_file`), whose keys the string rule never sees: no second positional, no `fname=`.""" -BANNED_KEYWORDS = frozenset({"usetex", "backend", "memory", "temp_folder", "cachedir", "formula", "url"}) +BANNED_KEYWORDS = frozenset( + {"usetex", "backend", "memory", "temp_folder", "cachedir", "formula", "url", "file_obj", "unsafe", "url_fetcher"} +) """Keyword arguments banned on any call: `usetex=True` sends a text through LaTeX (`ax.text`, `TextPath`, `plt.rc`), `backend=` imports a backend module by name (`savefig(backend="module://...")`). `memory=` is a joblib cache directory that scikit-learn writes fitted steps to (`Pipeline`, `make_pipeline`, `AgglomerativeClustering`, @@ -974,14 +1138,67 @@ `exec`s Python while it parses it; the render guard refuses that `exec`, so the keyword is refused first (no matplotlib or seaborn catalogue file uses it). `url=` names an image mark's href in altair (`encode(url=...)`, `MarkDef(url=...)`), which vl_convert reads from disk for a `file://` value, and matplotlib artists' SVG hyperlink, -which a PNG never carries (one catalogue file, altair's image mark, uses it).""" +which a PNG never carries (one catalogue file, altair's image mark, uses it); cairosvg's `svg2png` reads its main +input from any path or URL with `url=` (2 pygal catalogue files) and from a file object with `file_obj=`, +`unsafe=True` lets the SVG's entities and hrefs read files and fetch, and `url_fetcher=` replaces the fetcher that +keeps hrefs to `data:` URLs (survey of 2026-10-24; no catalogue file passes any of the three).""" LIBRARY_BANS: dict[str, frozenset[str]] = { # `Chart.from_dict` and `from_json` build a chart from a spec the string rules cannot read (an image mark with # a `file://` href); pandas' `DataFrame.from_dict` is ordinary with the other libraries, so the ban is altair's. # `data_transformers.enable("json")` and `enable("csv", filename=...)` make every save write the chart's data # to a file, and `.register(name, fn)` with `.enable(name)` is the plugin hook of every altair registry # (renderers, themes, compilers); the catalogue only calls `data_transformers.disable_max_rows()`. - "altair": frozenset({"from_dict", "from_json", "enable", "register"}) + "altair": frozenset({"from_dict", "from_json", "enable", "register"}), + # pygal and cairosvg (surveys of 2026-10-24, the pygal draft of 2026-10-26): pygal's renderers that open a + # browser or import pyquery, lxml, flask or django, and the live ElementTree (`render_tree`, `add_xml_filter`, + # `xml_filters`); `pygal.util.cut`, an unchecked `getattr` by string (`cut([obj], "ctypes")`), and `template`, + # `str.format` on a caller string; the plugin entry points and their import hook; `Config._update`, which merges + # any dict into a chart's options past the `css`/`js` rule. cairosvg's other writers and its surfaces, which + # libcairo opens natively, its parser and fetchers; cairocffi as `.cairo`, its `ffi`, `dlopen` and + # `find_library` (which runs ldconfig and gcc), the pycairo shim and the file readers and writers of its + # surfaces. `cut` is pandas' binning function with the other libraries, the rest are plausible names there. + "pygal": frozenset( + { + "render_in_browser", + "render_pyquery", + "render_table", + "render_response", + "render_django_response", + "render_tree", + "add_xml_filter", + "xml_filters", + "cut", + "template", + "entry_points", + "PluginImportFixer", + "_update", + "svg2pdf", + "svg2ps", + "svg2eps", + "svg2svg", + "SURFACES", + "Tree", + "fetch", + "safe_fetch", + "read_url", + "fetch_url", + "cairo", + "ffi", + "dlopen", + "find_library", + "install_as_pycairo", + "write_to_png", + "create_from_png", + "PDFSurface", + "PSSurface", + "SVGSurface", + "PNGSurface", + "EPSSurface", + } + ), + # `LayerSpec.props()` hands out the spec's own dict, so code could rewrite a field the native bridge reads (an + # image layer's `href`) after the check (the lets-plot spike of 2026-10-26); `props` is a plausible name elsewhere. + "letsplot": frozenset({"props"}), } """Names banned as attributes and `from` imports in one library's profile only, like `UNSAFE_HELPERS` there.""" _STRING_DISPATCH_METHODS = frozenset({"agg", "aggregate", "apply", "transform", "applymap"}) @@ -995,6 +1212,37 @@ """The profiles that check `EXPRESSION_CALLS`.""" _FORMULA_SPLIT = re.compile(r"[~+]") """A facet formula's sides and terms (`"pane ~ ."`, `"a + b ~ c"`), which plotnine evaluates one by one.""" +PYGAL_CONFIG_KEYS = frozenset({"css", "js", "defs"}) +"""pygal's chart options that read files or embed markup (module docstring, "pygal's config").""" +PYGAL_PACKAGE_CSS = frozenset({"file://style.css", "file://graph.css", "file://base.css"}) +"""pygal's own stylesheets (`Config.css` defaults and `base.css`), which a `css=` list repeats before its `inline:` +rules (14 catalogue files); pygal reads them from its package's `css` directory.""" +_INLINE_CSS = "inline:" +_GOOGLE_FONT = "googlefont:" +_SVG_NAMESPACE = re.compile(r"\{?http://www\.w3\.org/(?:2000/svg|1999/xlink)(?=[\"'}\s]|$)") +"""The SVG and XLink namespace names, also in Clark notation (`{...}rect`), followed by a quote, `}`, whitespace or the +end; an XML parser compares them and never fetches them, so pygal's URL rule drops them before it looks.""" +LETSPLOT_BUILDERS = frozenset({"lets_plot.layer_tooltips", "lets_plot.layer_labels", "lets_plot.smooth_labels"}) +"""lets-plot's tooltip and label builders, whose `.format(field, format)` sets a spec field (module docstring).""" +LETSPLOT_BUILDER_METHODS = frozenset( + { + "line", + "format", + "title", + "anchor", + "min_width", + "disable_splitting", + "color", + "size", + "inherit_color", + "eq", + "label_x", + "label_y", + } +) +"""The builders' methods, each of which returns the builder itself (lets-plot 4.11.0, `plot/tooltip.py` and +`plot/annotation.py`), so a chain of them never reaches a string's `format`.""" +_LETSPLOT_OBJECT = "lets_plot.LetsPlot" _DIRECT_CALL_ONLY = SAVE_NAMES | {"open"} """Attributes that may only be called where they are named, so the save rule sees their target.""" # Methods that return text without a target and write to one given as `buf`, with the position of @@ -1226,6 +1474,16 @@ def _is_none(node: ast.expr) -> bool: return isinstance(node, ast.Constant) and node.value is None +def _is_text(node: ast.expr) -> bool: + return isinstance(node, ast.Constant) and isinstance(node.value, str) + + +def _is_inline_css(node: ast.expr) -> bool: + """A pygal `css` entry that pygal inlines as CSS text: a string or an f-string whose literal start is `inline:`.""" + head = node.values[0] if isinstance(node, ast.JoinedStr) and node.values else node + return isinstance(head, ast.Constant) and isinstance(head.value, str) and head.value.startswith(_INLINE_CSS) + + def _text(node: ast.Constant) -> str | None: """The textual content of a string or bytes literal, or None for other constants.""" if isinstance(node.value, str): @@ -1361,6 +1619,10 @@ def __init__(self, tree: ast.Module, *, data: bool = False) -> None: self.parents[child] = node self.findings: list[Finding] = [] self.os_names: set[str] = set() + self.library = "" + """The profile's library id; empty in the DATA profile.""" + self.url_exempt: set[ast.AST] = set() + """String literals the URL rule lets pass: pygal's own stylesheets in a `css=` list (`_check_pygal_config`).""" self.allowed_imports: frozenset[str] = frozenset() self.library_bans: frozenset[str] = frozenset() """`LIBRARY_BANS` of the profile's library: banned as attributes and `from` imports in this scan.""" @@ -1449,6 +1711,7 @@ def _is_call_receiver(self, node: ast.AST, methods: frozenset[str]) -> bool: # -- SECURITY ------------------------------------------------------------------------ def security(self, library: str, allowed_imports: frozenset[str], rule: SaveRule) -> None: + self.library = library self.library_bans = LIBRARY_BANS.get(library, frozenset()) self.library_imports = LIBRARY_IMPORTS.get(library, frozenset()) self._check_imports(library, allowed_imports, rule) @@ -1462,8 +1725,13 @@ def security(self, library: str, allowed_imports: frozenset[str], rule: SaveRule self._check_settings() self._check_buffer_writers() self._check_statements() + if library == "pygal": + self._check_pygal_config() # before the strings: it marks pygal's own stylesheets for the URL rule + if library == "letsplot": + self._check_letsplot_object() self._check_strings() self._check_save(rule) + self._check_save_names() if library in EXPRESSION_LIBRARIES: self._check_expression_strings() @@ -1485,6 +1753,7 @@ def data(self, allowed_imports: frozenset[str]) -> None: self._check_buffer_writers() self._check_statements() self._check_save(None) + self._check_save_names() self._check_strings() self._check_data_frame() self._check_data_literals() @@ -1706,6 +1975,8 @@ def _check_attributes(self) -> None: for attribute in self.of(ast.Attribute): if _DUNDER_NAME.match(attribute.attr): self.add("dunder", f"dunder attribute '.{attribute.attr}' is not allowed", attribute) + elif attribute.attr == "format" and self.library == "letsplot" and self._is_builder_format(attribute): + continue # lets-plot's tooltip and label builders (module docstring, "lets-plot") elif ( attribute.attr in BANNED_ATTRIBUTES or attribute.attr in _ANY_RECEIVER_ESCAPES @@ -1940,7 +2211,11 @@ def _check_strings(self) -> None: self.add("string-length", message, constant) if _DUNDER_IN_TEXT.search(text): self.add("dunder", "string literal contains a dunder identifier", constant) - if _URL_IN_TEXT.search(text): + pygal = self.library == "pygal" + if pygal and isinstance(constant.value, str) and _GOOGLE_FONT in text: + self.add("url-literal", "string literal names a Google font, which the chart fetches", constant) + urls = _SVG_NAMESPACE.sub("", text) if pygal else text + if _URL_IN_TEXT.search(urls) and constant not in self.url_exempt: hint = f" → {DATA_IO_MESSAGE}" if self.data_profile else "" self.add("url-literal", f"string literal contains a URL or a file:/data: scheme{hint}", constant) if isinstance(constant.value, str) and _is_unsafe_setting(text): @@ -1992,9 +2267,18 @@ def _check_save_call(self, call: ast.Call, rule: SaveRule, name: str) -> bool: if not (png or html): files = 'f"plot-{THEME}.png"' + (' or f"plot-{THEME}.html"' if rule.html else "") self.add("savefig-target", f"{name} target must be exactly {files}", call) - if len(call.args) > rule.target_position(name) + 1: + position = rule.target_position(name) + if position < 0 and call.args: + # `svg2png(bytestring, ...)`: the keyword-only save names its file with `write_to=` alone. + self.add("savefig-target", f"{name} takes every argument by keyword", call) + elif len(call.args) > position + 1: # `plot.save(f, None, "/tmp")` is `path=`, `plot.save(f, "pgf")` is `format=`, by position. self.add("savefig-target", f"{name} takes only the file by position; the rest go by keyword", call) + if rule.directory is not None: + # lets-plot's `ggsave` writes into `./lets-plot-images`, which it creates, unless `path=` names a directory. + directory = next((keyword.value for keyword in call.keywords if keyword.arg == "path"), None) + if not (isinstance(directory, ast.Constant) and directory.value == rule.directory): + self.add("savefig-target", f'{name} must save with path="{rule.directory}"', call) allowed = rule.allowed_keywords(name) for keyword in call.keywords: # `format="ps"` with a distiller or `format="pgf"` would start Ghostscript or LaTeX, whatever the name. @@ -2010,6 +2294,28 @@ def _check_save_call(self, call: ast.Call, rule: SaveRule, name: str) -> bool: self.add("savefig-target", f"{name} takes no *arguments", call) return png + def _check_save_names(self) -> None: + """A save name keeps its own name and is reached only by calling it (module docstring, "The save"). + + The save rule finds a save by its callee's name, so `from plotnine import ggsave as keep`, `g = ggsave`, + `[ggsave][0](...)` and `partial(ggsave, plot)` would each write wherever their arguments say; `.save` and the + other save attributes have the same rule in `_check_attributes`. + """ + for from_node in self.of(ast.ImportFrom): + for alias in from_node.names: + bound = alias.asname or alias.name + if bound == alias.name: + continue + if alias.name in SAVE_NAMES: + self.add("banned-call", f"'{alias.name}' may only be imported under its own name", alias) + elif bound in SAVE_NAMES: + self.add("banned-call", f"nothing may be imported under the save name '{bound}'", alias) + for name in self.of(ast.Name): + if name.id in SAVE_NAMES and isinstance(name.ctx, ast.Load): + parent = self.parents.get(name) + if not (isinstance(parent, ast.Call) and parent.func is name): + self.add("banned-call", f"'{name.id}' may only be called directly", name) + def _check_expression_strings(self) -> None: """plotnine's expression arguments: literals the walk can read, each string walked as code (module docstring, "Expression strings").""" @@ -2063,16 +2369,50 @@ def _check_expression_argument(self, node: ast.expr, name: str) -> None: def _module_string(self, variable: str) -> ast.Constant | None: """The string literal a module-level `variable = "..."` binds, when nothing else binds `variable`.""" - stores = [name for name in self.of(ast.Name) if name.id == variable and isinstance(name.ctx, ast.Store)] - if len(stores) != 1 or any(parameter.arg == variable for parameter in self.of(ast.arg)): + value = self._module_value(variable) + return value if isinstance(value, ast.Constant) and isinstance(value.value, str) else None + + def _module_value(self, variable: str, read: Callable[[ast.Name], bool] | None = None) -> ast.expr | None: + """The value a module-level `variable = value` binds, when nothing else in the file binds `variable`; with + `read`, only when every read of the name passes it too (a list or a dict nothing can change after the check). + """ + if self._bindings(variable) != 1: return None - for stmt in self.tree.body: - target = _single_name_target(stmt) - if isinstance(stmt, ast.Assign) and target is not None and target.id == variable: - value = stmt.value - return value if isinstance(value, ast.Constant) and isinstance(value.value, str) else None + for statement in self.tree.body: + target = _single_name_target(statement) + if not isinstance(statement, ast.Assign | ast.AnnAssign) or target is None or target.id != variable: + continue + reads = [name for name in self.of(ast.Name) if name.id == variable and isinstance(name.ctx, ast.Load)] + if read is not None and not all(read(name) for name in reads): + return None + return statement.value return None + def _bindings(self, variable: str) -> int: + """How many places bind `variable`: a store or a deletion of the name, a parameter, an import, a function or + class name, an exception or `match` capture, a type parameter. A `case x:` would rebind a name the walk + checked as a literal (`match "open('x')": case COLUMN: ...`), so every kind counts.""" + count = sum(1 for name in self.of(ast.Name) if name.id == variable and not isinstance(name.ctx, ast.Load)) + count += sum(1 for parameter in self.of(ast.arg) if parameter.arg == variable) + imports: list[ast.Import | ast.ImportFrom] = [*self.of(ast.Import), *self.of(ast.ImportFrom)] + count += sum( + 1 for node in imports for alias in node.names if (alias.asname or alias.name.split(".")[0]) == variable + ) + named: list[ast.AST] = [ + *self.of(ast.FunctionDef), + *self.of(ast.AsyncFunctionDef), + *self.of(ast.ClassDef), + *self.of(ast.ExceptHandler), + *self.of(ast.MatchAs), + *self.of(ast.MatchStar), + *self.of(ast.TypeVar), + *self.of(ast.ParamSpec), + *self.of(ast.TypeVarTuple), + ] + count += sum(1 for node in named if getattr(node, "name", None) == variable) + count += sum(1 for node in self.of(ast.MatchMapping) if node.rest == variable) + return count + def _check_expression(self, text: str, call_name: str, node: ast.Constant) -> None: """One expression string: every parsable term walked with this profile's name, attribute, call, save and buffer-writer rules. A bare identifier and a text that does not parse are column names plotnine looks up.""" @@ -2101,11 +2441,151 @@ def _check_expression(self, text: str, call_name: str, node: ast.Constant) -> No inner._check_statements() inner._check_strings() inner._check_save(None) + inner._check_save_names() # `aes(x="(lambda g: g(p, 'x.pdf'))(ggsave)")` reaches the plot's namespace for finding in inner.findings: self.add(finding.rule, f"in the {call_name} expression: {finding.message}", node) if term == text: break # the whole string parsed: its terms are already in it + # -- pygal and lets-plot ------------------------------------------------------------- + + def _check_pygal_config(self) -> None: + """pygal's `css`, `js` and `defs` options as keywords, `**` arguments and attributes (module docstring, + "pygal's config").""" + for keyword in self.of(ast.keyword): + if keyword.arg in PYGAL_CONFIG_KEYS: + self._check_pygal_option(keyword.arg, keyword.value, keyword) + elif keyword.arg is None: + self._check_pygal_options(keyword) + for attribute in self.of(ast.Attribute): + if attribute.attr not in PYGAL_CONFIG_KEYS: + continue + parent = self.parents.get(attribute) + if attribute.attr == "defs": + self.add("banned-attribute", "'.defs' is not allowed: it is raw SVG markup", attribute) + elif ( + isinstance(attribute.ctx, ast.Store) + and isinstance(parent, ast.Assign) + and len(parent.targets) == 1 + and parent.targets[0] is attribute + ): + self._check_pygal_option(attribute.attr, parent.value, parent) + else: + # `chart.css += [...]`, `chart.css.append(...)`, `chart.css[0] = ...` or `x = chart.css`: the list + # would change after the check. + message = f"'.{attribute.attr}' may only be assigned a whole list, as in .{attribute.attr} = [...]" + self.add("banned-attribute", message, attribute) + + def _check_pygal_option(self, key: str, value: ast.expr, node: ast.AST) -> None: + """One `css`, `js` or `defs` value: `defs` never, `js` an empty list, `css` a list of `inline:` texts and + pygal's own stylesheets, which the URL rule then lets pass.""" + if key == "defs": + self.add("banned-keyword", "the keyword 'defs=' is not allowed: it is raw SVG markup", node) + return + if isinstance(value, ast.Name): + value = self._module_value(value.id, self._is_option_read) or value + if not isinstance(value, ast.List | ast.Tuple): + self.add("banned-keyword", f"{key}= takes a list literal, or a name bound once to one", node) + return + if key == "js": + if value.elts: + self.add("banned-keyword", "js= takes only [] (an entry is a script file read or fetched)", node) + return + for item in value.elts: + if isinstance(item, ast.Name): + item = self._module_value(item.id) or item + if isinstance(item, ast.Constant) and item.value in PYGAL_PACKAGE_CSS: + self.url_exempt.add(item) + elif not _is_inline_css(item): + message = "css= takes only 'inline:...' texts and pygal's own file://style.css, graph.css and base.css" + self.add("banned-keyword", message, node) + + def _is_option_read(self, name: ast.Name) -> bool: + """`name` is read only where the config rule checks it: as a `css=` or `js=` value, or assigned to `.css` or + `.js`.""" + parent = self.parents.get(name) + if isinstance(parent, ast.keyword): + return parent.arg in ("css", "js") + return ( + isinstance(parent, ast.Assign) + and parent.value is name + and len(parent.targets) == 1 + and isinstance(parent.targets[0], ast.Attribute) + and parent.targets[0].attr in ("css", "js") + ) + + def _check_pygal_options(self, keyword: ast.keyword) -> None: + """A `**` argument: a dict literal with string keys, or a name bound once at module level to one and used only + as `**name`, whose `css`, `js` and `defs` keys are checked like keywords.""" + value: ast.expr | None = keyword.value + if isinstance(value, ast.Name): + value = self._module_value(value.id, self._is_unpacked) + if not ( + isinstance(value, ast.Dict) + and all(isinstance(key, ast.Constant) and isinstance(key.value, str) for key in value.keys) + ): + message = "** takes only a dict literal with string keys, or a name bound once to one and only unpacked" + self.add("banned-keyword", message, keyword) + return + for key, item in zip(value.keys, value.values, strict=True): + if isinstance(key, ast.Constant) and key.value in PYGAL_CONFIG_KEYS: + self._check_pygal_option(key.value, item, key) + + def _is_unpacked(self, name: ast.Name) -> bool: + parent = self.parents.get(name) + return isinstance(parent, ast.keyword) and parent.arg is None + + def _check_letsplot_object(self) -> None: + """`LetsPlot` only as `LetsPlot.setup_html()` without arguments (module docstring, "lets-plot").""" + nodes: list[ast.Name | ast.Attribute] = [*self.of(ast.Name), *self.of(ast.Attribute)] + for node in nodes: + if not isinstance(node.ctx, ast.Load) or self.resolve(node) != _LETSPLOT_OBJECT: + continue + attribute = self.parents.get(node) + call = self.parents.get(attribute) if attribute is not None else None + if not ( + isinstance(attribute, ast.Attribute) + and attribute.value is node + and attribute.attr == "setup_html" + and isinstance(call, ast.Call) + and call.func is attribute + and not call.args + and not call.keywords + ): + self.add("banned-call", "LetsPlot may only be used as LetsPlot.setup_html(), without arguments", node) + + def _is_builder_format(self, attribute: ast.Attribute) -> bool: + """`layer_tooltips().line("@x").format("@x", ".1f")`: `.format` called with string literals on a chain of + builder methods rooted in a call of a lets-plot builder bound only by its `from` import.""" + call = self.parents.get(attribute) + if not (isinstance(call, ast.Call) and call.func is attribute): + return False + if not all(_is_text(argument) for argument in call.args): + return False + if not all(keyword.arg in ("field", "format") and _is_text(keyword.value) for keyword in call.keywords): + return False + node = attribute.value + while isinstance(node, ast.Call): + func = node.func + if isinstance(func, ast.Attribute) and func.attr in LETSPLOT_BUILDER_METHODS: + node = func.value + continue + return isinstance(func, ast.Name) and self._is_builder_name(func.id) + return False + + def _is_builder_name(self, variable: str) -> bool: + """`variable` is bound once, by `from lets_plot import layer_tooltips [as variable]` or another builder, and + no attribute of that name is ever assigned: `lets_plot.layer_tooltips = str` before the import would hand the + import another callable.""" + if self._bindings(variable) != 1: + return False + for node in self.of(ast.ImportFrom): + for alias in node.names if node.module and not node.level else []: + if f"{node.module}.{alias.name}" in LETSPLOT_BUILDERS and (alias.asname or alias.name) == variable: + stores = self.of(ast.Attribute) + return not any(store.attr == alias.name and not isinstance(store.ctx, ast.Load) for store in stores) + return False + # -- ADAPTATION ---------------------------------------------------------------------- def adaptation(self, original_palette: list[str]) -> None: diff --git a/agents/anyplot/render/harness.py b/agents/anyplot/render/harness.py index 70039e080c6..aba3cfd96c5 100644 --- a/agents/anyplot/render/harness.py +++ b/agents/anyplot/render/harness.py @@ -50,7 +50,9 @@ 5. compiles the plot file and runs it as `__main__` (`run_plot`, which `runpy.run_path` did before) under `PlotGuard`, an audit hook armed just before: from there on the interpreter refuses every `exec` but the plot's own run, the module bodies of an import - and `CODE_BUILDERS` (`namedtuple`, dataclasses, scipy's distributions), a code object or + and `CODE_BUILDERS` (`namedtuple`, dataclasses, scipy's distributions, plotnine's + expression strings, and cssselect2's selector compiler, which pygal's PNG export runs for + every CSS rule of the chart), a code object or function built by hand or a `__code__` assignment, every `open` that writes anything but `plot-<theme>.png`, `probe-<theme>.json` and `plot-<theme>.html` (altair's second file, which stays in the sandbox), `subprocess.*`, `os.system`, `os.exec*`, @@ -355,6 +357,7 @@ ("dataclasses.py", "add_fns_to_class"), ("scipy/stats/_distn_infrastructure.py", "_attach_argparser_methods"), ("plotnine/mapping/_env.py", "eval"), + ("cssselect2/compiler.py", "__init__"), } ) """The `(file suffix, function)` pairs whose `exec` and `compile` both guards let through when they call them: each @@ -366,7 +369,19 @@ is not a column name (`aes(fill="factor(g)")`, 7 of 273 eligible catalogue files, and the adapter's habit). The validator admits those strings only as literals it walked as code with every rule of the profile (`validate.EXPRESSION_CALLS`), and whatever the evaluated code reaches (writes, processes, sockets, frames) stays -refused here; patsy's `exec` behind `formula=` has no entry, the keyword is a validator finding.""" +refused here; patsy's `exec` behind `formula=` has no entry, the keyword is a validator finding. cssselect2's +`CompiledSelector.__init__` turns every CSS selector of an SVG `<style>` block into one `eval("lambda el: ...")` +(87 per pygal chart: cairosvg's `css.parse_stylesheets`, which `render_to_png` and `svg2png` run on the chart's +own stylesheet and on anything the plot adds through `Style`, `css=["inline:..."]` or `defs=`). The source is built +from the parsed selector tree: every string the CSS text controls (type, class, id, attribute name and value, +namespace, `:lang()` argument) is interpolated with `repr`, the only other values are the two integers of an `An+B` +argument (`tinycss2.nth.parse_nth`), and every other token raises `SelectorError`. The spike of 2026-10-26 fed 339 +selectors with quotes, backslashes, CSS escapes, newlines, `{`/`}` and Python text to the compiler, and the same +payloads through every pygal channel, and read the generated source back with `ast`: it compares `el`'s name, +classes, id, attributes and `lang`, nothing else. Only Python objects handed to `compile_selector_list` in place of +tokens (a forged `dimension` token whose `int_value` is a string) reach an unquoted slot; the validator admits neither +`cssselect2` nor `tinycss2` nor `cairosvg.css`/`cairosvg.parser`, and a lambda the compiler built runs under the same +guard as the plot (no write, process, socket or frame).""" IMPORT_FRAME_FILES = ("<frozen importlib._bootstrap>", "<frozen importlib._bootstrap_external>") """The files of the frames that run an import. The plot guard lets an `exec` through when, walking up from its caller, it meets one of these frames before a frame of the plot: a module body the plot imports runs (and builds code: scipy's @@ -1929,6 +1944,32 @@ def warm_scikit_learn(source): pass +def warm_cairo(source): + """Import cairosvg before the plot guard is armed, when the plot names pygal or cairosvg. + + pygal's `render_to_png` imports cairosvg lazily, and cairosvg's import loads libcairo through + cairocffi, which first asks `ctypes.util.find_library` for three library names: each runs + `ldconfig -p`, then `gcc` through a temporary file and `ld` where they are installed. On the + spike's developer machine (Python 3.14.6) `ctypes.util`'s own module body also opens libc + (`ctypes.dlopen`), which the guard refuses, so every pygal render failed there (2026-10-24). + In the renderer image (Python 3.14.9, no compiler) the import raises no `ctypes.dlopen`, + `find_library` swallows the refused `ldconfig` as an `OSError`, and cairocffi then opens + `libcairo.so.2` by name; the import here keeps a render from depending on refused process + starts, at no cost the measurement could tell from noise (five renders each way, 2026-10-26). + cffi's `dlopen` and its calls into libcairo raise no audit event, so the one import serves the + render. A missing package (a developer machine without the `lib-pygal` extra, or without + libcairo) is skipped, and the plot's own `import cairosvg` reports it under the guard. + """ + if b"pygal" not in source and b"cairosvg" not in source: + return + import importlib + + try: + importlib.import_module("cairosvg") + except Exception: + pass + + def hide_frames(): """Replace the two stdlib helpers that hand out their caller's frame, before the plot guard is armed. @@ -1972,7 +2013,9 @@ def run_plot(path, guard): that code object run once: every other `exec` the plot reaches is refused. `ctypes` is loaded first, because its import opens a library (`ctypes.dlopen`) and numpy, pandas and matplotlib reach it lazily; `warm_scikit_learn` runs the process lookups scikit-learn - would otherwise make under the guard. No bytecode is written: the guard refuses the writes. + would otherwise make under the guard, and `warm_cairo` imports cairosvg (libcairo through + cairocffi, with the same `ldconfig` lookups) when the plot names pygal or cairosvg. No + bytecode is written: the guard refuses the writes. The plot's frames carry the path as given, as under `runpy`, so a traceback still names `plot.py`. """ @@ -1984,6 +2027,7 @@ def run_plot(path, guard): source = handle.read() code = compile(source, path, "exec", dont_inherit=True) warm_scikit_learn(source) + warm_cairo(source) hide_frames() namespace = { "__name__": "__main__", diff --git a/agents/anyplot/render/runtimes/__init__.py b/agents/anyplot/render/runtimes/__init__.py index 6a50407f511..1abc63166d0 100644 --- a/agents/anyplot/render/runtimes/__init__.py +++ b/agents/anyplot/render/runtimes/__init__.py @@ -9,12 +9,12 @@ serves; the settings refuse any other library in `AGENT_LIBRARIES`, and the readiness scan blocks it as `unsupported-library`. -`PythonRuntime` serves matplotlib, seaborn, plotnine and altair: each has a save rule -(`code.regions.SAVE_RULES`) and a validator profile (`code.validate.LIBRARY_IMPORTS`), -and the renderer image installs it. A later language adds a runtime module here and its -libraries to `RUNTIME_LIBRARIES`; a later Python library (pygal, lets-plot) adds its -validator profile and save rule to the Python code modules and its id to -`PYTHON_LIBRARIES` (`agentic/specs/261024-agent-all-libraries.md`). +`PythonRuntime` serves matplotlib, seaborn, plotnine, altair, pygal and lets-plot +(`letsplot`): each has a save rule (`code.regions.SAVE_RULES`) and a validator profile +(`code.validate.LIBRARY_IMPORTS`), and the renderer image installs it. A later language +adds a runtime module here and its libraries to `RUNTIME_LIBRARIES`; a later Python +library (plotly, bokeh) adds its validator profile and save rule to the Python code +modules and its id to `PYTHON_LIBRARIES` (`agentic/specs/261024-agent-all-libraries.md`). """ from collections.abc import Callable @@ -25,7 +25,7 @@ from .python import PythonRuntime -PYTHON_LIBRARIES: frozenset[str] = frozenset({"matplotlib", "seaborn", "plotnine", "altair"}) +PYTHON_LIBRARIES: frozenset[str] = frozenset({"matplotlib", "seaborn", "plotnine", "altair", "pygal", "letsplot"}) """The Python libraries with a complete runtime profile (`code.normalise.SUPPORTED_LIBRARIES`, pinned equal).""" RUNTIME_LIBRARIES: frozenset[str] = PYTHON_LIBRARIES diff --git a/agents/anyplot/render/runtimes/python.py b/agents/anyplot/render/runtimes/python.py index 9e1e5783776..e49683cfe64 100644 --- a/agents/anyplot/render/runtimes/python.py +++ b/agents/anyplot/render/runtimes/python.py @@ -1,13 +1,16 @@ -"""The Python runtime: matplotlib, seaborn, plotnine and altair (`runtimes.PYTHON_LIBRARIES`). +"""The Python runtime: matplotlib, seaborn, plotnine, altair, pygal and lets-plot (`runtimes.PYTHON_LIBRARIES`). The command is the catalogue's CI render command (`MPLBACKEND=Agg ANYPLOT_THEME=<theme> python plot.py`) with the isolated interpreter (no remote debugging either, `harness.INTERPRETER_FLAGS`) and the probe harness in front. The environment is complete, never inherited: the theme, the Agg backend, a writable matplotlib cache and `HOME` under `/tmp` (the root filesystem is -read-only), and the harness's resource limits. The library picks the code conventions +read-only), the harness's resource limits, and the library's row of the renderer's command +table (`agents/renderer/commands.py`): its own environment and its own `RLIMIT_AS` where it +has one (lets-plot), as the renderer's `sandbox_env` passes them. The library picks the code conventions (`regions.SAVE_RULES`: the save call, altair's second `plot-<theme>.html` file and its PIL padding) and the validator profile; plotnine draws through matplotlib and so gets a -probe, altair renders in vl-convert's V8 and gets none (the host gates still run). +probe, altair renders in vl-convert's V8, pygal through cairosvg and lets-plot in its native +bridge, and none of those three writes one (the host gates still run). `normalise`, `loader_block`, `validate` and the rest (`regions`, `readiness`, `security`, `adaptation`, `apply_plan`, `restore_protected`, `new_literals`, `error_summary`, `export`) @@ -19,6 +22,7 @@ from pathlib import Path from typing import Any +from agents.renderer.commands import command_for from agents.renderer.wire import run_cpu_seconds from ...code.edits import AppliedPlan, apply_plan, new_literals, restore_protected @@ -52,7 +56,8 @@ class PythonRuntime: - """Python plot code (matplotlib, seaborn, plotnine, altair), run as `plot.py` under the probe harness.""" + """Python plot code (matplotlib, seaborn, plotnine, altair, pygal, lets-plot), run as `plot.py` under the probe + harness.""" language = "python" file_name = "plot.py" @@ -83,17 +88,25 @@ def command(self, theme: Theme) -> list[str]: return [self.python, *INTERPRETER_FLAGS, self.harness, self.file_name] def env(self, theme: Theme) -> dict[str, str]: - return { + """A render's environment. The library's command row adds its own variables after the matplotlib settings + and its own address-space limit, as the renderer's `sandbox_env` does; a render here otherwise keeps no + `RLIMIT_AS`, so a row without a limit of its own gets none.""" + row = command_for(self.language, self.library) + env = { "ANYPLOT_THEME": theme, "MPLBACKEND": "Agg", "MPLCONFIGDIR": self.mplconfig, # The renderer image's baked font cache; the harness copies it into # MPLCONFIGDIR and skips the copy where the directory does not exist. "ANYPLOT_MPL_SEED": MPL_SEED, + **row.env, "HOME": "/tmp", "PYTHONDONTWRITEBYTECODE": "1", "ANYPLOT_RLIMIT_CPU_S": str(self.cpu_seconds), } + if row.rlimit_as_mb is not None: + env["ANYPLOT_RLIMIT_AS_MB"] = str(row.rlimit_as_mb) + return env def data_command(self) -> list[str]: return [self.python, *INTERPRETER_FLAGS, self.harness, DATA_FLAG, DATA_FILE_NAME] diff --git a/agents/evals/eligibility.py b/agents/evals/eligibility.py index 9a7dcdba516..456056854c5 100644 --- a/agents/evals/eligibility.py +++ b/agents/evals/eligibility.py @@ -36,7 +36,7 @@ EVALS_DIR = Path(__file__).resolve().parent REPO_ROOT = EVALS_DIR.parents[1] DEFAULT_OUT = EVALS_DIR / "reports" -LIBRARIES: tuple[str, ...] = ("matplotlib", "seaborn", "plotnine", "altair") +LIBRARIES: tuple[str, ...] = ("matplotlib", "seaborn", "plotnine", "altair", "pygal", "letsplot") """The Python libraries with a code profile (`render.runtimes.PYTHON_LIBRARIES`, pinned by a test), in sweep order.""" STATUSES: tuple[str, ...] = ("clean", "coupled", "blocked", "error") _SECURITY_RULE = re.compile(r"^security: ([a-z][a-z0-9-]*)(?: at line \d+)?:") @@ -134,7 +134,7 @@ def markdown(result: dict[str, Any], date: str) -> str: def main(argv: list[str] | None = None) -> int: parser = argparse.ArgumentParser( prog="python -m agents.evals.eligibility", - description="Count the catalogue's Python files (matplotlib, seaborn, plotnine, altair) the agent network can adapt.", + description="Count the catalogue's Python files with a code profile that the agent network can adapt.", ) parser.add_argument("--plots", type=Path, default=REPO_ROOT / "plots", help="the catalogue directory (plots/)") parser.add_argument("--out", type=Path, default=DEFAULT_OUT, help="output directory (agents/evals/reports)") diff --git a/agents/renderer/Dockerfile b/agents/renderer/Dockerfile index 862303cd820..3cf59b8b2dc 100644 --- a/agents/renderer/Dockerfile +++ b/agents/renderer/Dockerfile @@ -32,11 +32,15 @@ ENV UV_PYTHON_DOWNLOADS=never COPY pyproject.toml uv.lock README.md ./ # The base dependencies carry the service (fastapi, uvicorn, pydantic-settings) and -# the four `lib-*` extras carry the Python plotting stack the harness runs in process: +# the six `lib-*` extras carry the Python plotting stack the harness runs in process: # matplotlib and seaborn (phase 1), plotnine and altair (step 1b of -# agentic/specs/261024-agent-all-libraries.md). altair renders through vl-convert, -# a self-contained binary (V8 and resvg) that needs no browser and no system -# library; its fonts are set up in the runtime stage below. No ADK: nothing in +# agentic/specs/261024-agent-all-libraries.md), pygal and lets-plot (step 1c). +# altair renders through vl-convert, a self-contained binary (V8 and resvg) that +# needs no browser and no system library. pygal's PNG export is cairosvg, which +# loads libcairo through cairocffi: the runtime stage installs `libcairo2`. +# lets-plot rasterises in its own native bridge (Kotlin/Native with ImageMagick +# and fontconfig linked in), which needs only the libraries the slim image has. +# Their fonts are set up in the runtime stage below. No ADK: nothing in # the renderer imports it. `--no-install-project` keeps the project itself out # of the venv, so a sandbox's interpreter finds no anyplot package on its path; # the service imports `agents.renderer` from the working directory, which @@ -44,7 +48,7 @@ COPY pyproject.toml uv.lock README.md ./ # The `convert` extra (python-calamine, pyarrow) is the file conversion's readers # (`harness.py --convert`, agents/anyplot/render/convert.py). RUN uv venv && uv sync --frozen --no-install-project --extra lib-matplotlib --extra lib-seaborn \ - --extra lib-plotnine --extra lib-altair --extra convert + --extra lib-plotnine --extra lib-altair --extra lib-pygal --extra lib-letsplot --extra convert # pyarrow ships far more than the converter reads (owner decision of 2026-10-15: slim it). # The conversion needs the core, compute, IPC, Feather and Parquet; it never touches @@ -118,6 +122,18 @@ FROM python:3.14-slim WORKDIR /app +# libcairo for cairosvg, pygal's PNG export (cairocffi finds it with `ldconfig -p`; +# the harness loads it before the plot guard is armed, `warm_cairo`). Without the +# recommends it brings libfontconfig1, fontconfig-config (which writes +# /etc/fonts/fonts.conf), fonts-dejavu-core and fonts-dejavu-mono (DejaVu Sans, +# Serif and Sans Mono, Regular and Bold, under /usr/share/fonts/truetype/dejavu), +# libfreetype6, libpixman-1-0, libpng16-16t64 and the X11 client libraries +# cairo links. No `fontconfig` package, so no `fc-list` for matplotlib to call. +# DL3008 is declined for the reason the `fonts` stage gives. +# hadolint ignore=DL3008 +RUN apt-get update && apt-get install -y --no-install-recommends libcairo2 \ + && rm -rf /var/lib/apt/lists/* + COPY --from=builder /app/.venv ./.venv # Only the renderer package and the package marker of `agents/`: the rest of @@ -135,21 +151,35 @@ COPY agents/anyplot/render/convert.py /opt/anyplot/convert.py COPY --from=fonts /fonts/noto /usr/share/fonts/noto COPY --from=fonts /fonts/doc /usr/share/doc/fonts-noto -# vl-convert (altair) needs no fontconfig: with no /etc/fonts/fonts.conf it scans -# /usr/share/fonts, so the fallback fonts above reach it too, and it carries -# Liberation Sans for `sans-serif`. `serif` and `monospace` (7 catalogue altair -# files) resolve only to DejaVu Serif and DejaVu Sans Mono and draw no text at all -# without them (measured 2026-10-25). matplotlib ships both, so they are linked -# here, not copied: no new font file and no size. matplotlib still resolves every -# family to its own mpl-data copy. `ls -L` fails the build on a dangling link. +# vl-convert (altair) scans /usr/share/fonts, so the fallback fonts above reach it +# too, and it carries Liberation Sans for `sans-serif`. `serif` and `monospace` (7 +# catalogue altair files) resolve only to DejaVu Serif and DejaVu Sans Mono and draw +# no text at all without them (measured 2026-10-25). lets-plot's bridge draws its +# default text in DejaVu Sans and falls back to a Noto Sans face without it; with +# it, a render in this image is byte-identical to one on a developer machine +# (spike of 2026-10-26). matplotlib ships all three families in four styles, so +# they are linked here, not copied: no new font file and no size. matplotlib still +# resolves every family to its own mpl-data copy, which comes first in its font +# list: Debian's builds of the Regular and Bold faces that libcairo2 brings (other +# bytes, same names) changed none of ci-image.yml's seaborn, plotnine, altair and +# multi-script renders against the image without them (2026-10-26). `ls -L` fails +# the build on a dangling link. RUN d=/app/.venv/lib/python3.14/site-packages/matplotlib/mpl-data/fonts/ttf \ && mkdir -p /usr/share/fonts/dejavu \ - && for f in DejaVuSerif DejaVuSerif-Bold DejaVuSerif-Italic DejaVuSerif-BoldItalic \ + && for f in DejaVuSans DejaVuSans-Bold DejaVuSans-Oblique DejaVuSans-BoldOblique \ + DejaVuSerif DejaVuSerif-Bold DejaVuSerif-Italic DejaVuSerif-BoldItalic \ DejaVuSansMono DejaVuSansMono-Bold DejaVuSansMono-Oblique DejaVuSansMono-BoldOblique; do \ ln -s "$d/$f.ttf" "/usr/share/fonts/dejavu/$f.ttf"; \ done \ && ls -L /usr/share/fonts/dejavu/*.ttf > /dev/null +# lets-plot's bridge links its own fontconfig, which finds no configuration in this +# image's layout and writes "Fontconfig error: Cannot load default config file" to +# stderr on every export. Its command row points FONTCONFIG_FILE here +# (agents/renderer/commands.py): one <dir> and no <cachedir>, so it scans the fonts +# above and never writes a cache (the root filesystem is read-only anyway). +COPY agents/renderer/fonts.conf /opt/anyplot/fonts.conf + # Bake the matplotlib font cache. A sandbox starts with an empty private /tmp, and # the harness copies this directory into MPLCONFIGDIR=/tmp/mpl before matplotlib # loads (spike S: faster than rebuilding the cache in every render). The same diff --git a/agents/renderer/commands.py b/agents/renderer/commands.py index f12a5a721b5..41f818d3ed6 100644 --- a/agents/renderer/commands.py +++ b/agents/renderer/commands.py @@ -26,7 +26,12 @@ and for altair's Python row (vl-convert embeds V8); one Chromium render runs seven processes with 77 tasks (spike of 2026-10-24), so `RLIMIT_NPROC` is off for the JavaScript row alone; the `MemAvailable` watchdog, `RLIMIT_CPU`, `RLIMIT_FSIZE` and the -byte budget remain. +byte budget remain. lets-plot's Python row keeps a bound of its own instead +(`rlimit_as_mb`, 2048 MiB, with Arrow's system allocator in its environment), because +its native rasteriser needs more than the configured 1 GiB but a runaway scale must +still stop (spike of 2026-10-26). An in-process row's environment and limit reach the +sandbox like an exec-mode row's (`executor.sandbox_env`) and the local Docker backend +(`PythonRuntime.env`). `render_p95_s` is what the agents' pipeline reserves for a repair attempt's render when it checks its soft deadline. @@ -86,6 +91,9 @@ """The precompiled depot; a sandbox stacks a writable `/tmp/depot` in front of it.""" JULIA_CPU_TARGET = "generic;sandybridge,-xsaveopt,clone_all;haswell,-rdrnd,base(1)" """The CPU target the depot was precompiled for; the same value at run time, or Julia recompiles.""" +FONTCONFIG_FILE = "/opt/anyplot/fonts.conf" +"""The image's minimal fontconfig file (`agents/renderer/fonts.conf`: one font directory, no cache directory) for +the fontconfig that lets-plot's native bridge links, which finds no configuration of its own in the image.""" @dataclass(frozen=True) @@ -103,11 +111,19 @@ class RuntimeCommand: """Binaries the image must carry on `SANDBOX_PATH` for the row to run.""" rlimit_as: bool = True """Whether the configured `RLIMIT_AS` applies; off where the runtime reserves address space it never uses.""" + rlimit_as_mb: int | None = None + """The row's own `RLIMIT_AS` in MiB, in place of the configured one, where the runtime needs more address space + than the configured limit gives yet still a bound; None keeps the configured one. The renderer's switch still + rules: a configured limit of 0 (off) keeps the row unlimited too.""" rlimit_nproc: bool = True """Whether the configured `RLIMIT_NPROC` applies; off where one render runs more tasks than its value.""" render_p95_s: float = 15.0 """Seconds a repair attempt's render is budgeted at (`pipeline.RENDER_P95_S` before 2026-10-24).""" + def __post_init__(self) -> None: + if self.rlimit_as_mb is not None and (not self.rlimit_as or self.rlimit_as_mb <= 0): + raise ValueError("a row's own RLIMIT_AS needs rlimit_as on and a positive size") + @property def in_process(self) -> bool: """Whether the harness runs the code itself (Python) instead of a child command.""" @@ -117,10 +133,29 @@ def in_process(self) -> bool: def _row(language: Language, library: str) -> RuntimeCommand: code_file = CODE_FILE_OVERRIDES.get(library, CODE_FILES[language]) if language == "python": + if library == "letsplot": + # lets-plot rasterises in its Kotlin/Native bridge (ImageMagick linked in): under the configured + # 1 GiB every 3200x1800 export aborts ("Out of memory trying to allocate", SIGABRT). pyarrow's + # mimalloc pool reserves a 1 GiB arena on the first pandas string column, so the row takes Arrow's + # system allocator, as conversions do; then 2048 MiB held all 42 renders of the spike of 2026-10-26 + # up to 4800x2700 and 3600x3600 (VmPeak 1697 MiB) and still stops a 6400x3600 one (2580 MiB). In + # the renderer image with this row the canvas-size renders took a wall p95 of 7.69 s (max 15.5 s); + # the guarded host sweep of the 284 eligible catalogue files, canvas rewrite applied, 12.5 s. + return RuntimeCommand( + language, + code_file, + (), + env=MappingProxyType({"ARROW_DEFAULT_MEMORY_POOL": "system", "FONTCONFIG_FILE": FONTCONFIG_FILE}), + rlimit_as_mb=2048, + render_p95_s=15.0, + ) # altair renders in vl-convert's embedded V8, which reserves address space the way the JavaScript # row's Chromium does: under RLIMIT_AS up to 64 GiB it aborts at start ("Check failed: Start()", # SIGTRAP), measured on 2026-10-25 through the harness; its resident set is about 270 MiB and the - # MemAvailable watchdog, RLIMIT_CPU, RLIMIT_FSIZE and the byte budget remain. plotnine fits 1 GiB. + # MemAvailable watchdog, RLIMIT_CPU, RLIMIT_FSIZE and the byte budget remain. plotnine fits 1 GiB, + # and so does pygal: its heaviest catalogue render (bifurcation-basic) peaks at 682 MB resident, and + # cairo reserves no address space beyond its resident set; the 273 catalogue files that rendered under + # the guard took a wall p95 of 3.75 s and a p99 of 13.95 s (spike of 2026-10-26). return RuntimeCommand(language, code_file, (), rlimit_as=library != "altair") if language == "javascript": return RuntimeCommand( diff --git a/agents/renderer/executor.py b/agents/renderer/executor.py index c8082438ba9..4f4b789a3a3 100644 --- a/agents/renderer/executor.py +++ b/agents/renderer/executor.py @@ -412,9 +412,12 @@ def sandbox_env( """The complete environment inside the sandbox: nothing of the host's reaches it. `command` is the render's row of the command table (`commands.py`): a Python row gets the - matplotlib settings, any other row its own environment, and a row that switches - `RLIMIT_AS` or `RLIMIT_NPROC` off (Node, Chromium, Julia) gets no such variable. Without a - row (a data run, a conversion, the tests' direct calls) the Python settings apply. + matplotlib settings and then its own environment (lets-plot's allocator and fontconfig file), any + other row its own environment alone, and a row that switches `RLIMIT_AS` or `RLIMIT_NPROC` off + (Node, Chromium, Julia, altair) gets no such variable. A row with an address-space limit of its own + (`RuntimeCommand.rlimit_as_mb`, lets-plot) gets that value in place of the configured one, as long as + the configured one is on. Without a row (a data run, a conversion, the tests' direct calls) the + Python settings and the configured limits apply. A data run or a conversion (`theme` None) gets no theme and no matplotlib settings: it imports no plotting library. A conversion also gets Arrow's system allocator (`ARROW_DEFAULT_MEMORY_POOL=system`), so pyarrow's @@ -431,6 +434,7 @@ def sandbox_env( "MPLBACKEND": "Agg", "MPLCONFIGDIR": config.mplconfig, "ANYPLOT_MPL_SEED": config.mpl_seed, + **(command.env if command is not None else {}), } env = { "PATH": SANDBOX_PATH, @@ -447,7 +451,8 @@ def sandbox_env( if convert: env["ARROW_DEFAULT_MEMORY_POOL"] = "system" if config.rlimit_as_mb and (command is None or command.rlimit_as): - env["ANYPLOT_RLIMIT_AS_MB"] = str(config.rlimit_as_mb) + own = command.rlimit_as_mb if command is not None else None + env["ANYPLOT_RLIMIT_AS_MB"] = str(own or config.rlimit_as_mb) if config.rlimit_nproc and (command is None or command.rlimit_nproc): env["ANYPLOT_RLIMIT_NPROC"] = str(config.rlimit_nproc) return env diff --git a/agents/renderer/fonts.conf b/agents/renderer/fonts.conf new file mode 100644 index 00000000000..95044f07337 --- /dev/null +++ b/agents/renderer/fonts.conf @@ -0,0 +1,11 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd"> +<!-- + The fontconfig file of the lets-plot command row (FONTCONFIG_FILE, agents/renderer/commands.py), + copied to /opt/anyplot/fonts.conf by agents/renderer/Dockerfile. lets-plot's native bridge links its + own fontconfig, which finds no configuration in the image's layout. One font directory and no + cachedir: the bridge scans the fonts and never writes a cache. +--> +<fontconfig> + <dir>/usr/share/fonts</dir> +</fontconfig> diff --git a/tests/unit/agents/code/conftest.py b/tests/unit/agents/code/conftest.py index 466cd80bd96..178318b7c32 100644 --- a/tests/unit/agents/code/conftest.py +++ b/tests/unit/agents/code/conftest.py @@ -5,7 +5,7 @@ REPO_ROOT = Path(__file__).resolve().parents[4] -CODE_LIBRARIES = ("matplotlib", "seaborn", "plotnine", "altair") +CODE_LIBRARIES = ("matplotlib", "seaborn", "plotnine", "altair", "pygal", "letsplot") """The libraries with a Python code profile (`normalise.SUPPORTED_LIBRARIES`), in the corpus order.""" CATALOGUE_FILES = [ path diff --git a/tests/unit/agents/code/test_letsplot_names.py b/tests/unit/agents/code/test_letsplot_names.py new file mode 100644 index 00000000000..242c2d64d1c --- /dev/null +++ b/tests/unit/agents/code/test_letsplot_names.py @@ -0,0 +1,34 @@ +"""Tests for agents/anyplot/code/letsplot_names.py: the static `lets_plot.__all__` against the installed package.""" + +import pytest + +from agents.anyplot.code.letsplot_names import LETS_PLOT_NAMES +from agents.anyplot.code.normalise import normalise + + +def test_209_distinct_names_and_the_save_among_them() -> None: + assert len(LETS_PLOT_NAMES) == 209 + assert "ggsave" in LETS_PLOT_NAMES and "LetsPlot" in LETS_PLOT_NAMES + assert all(name.isidentifier() for name in LETS_PLOT_NAMES) + + +def test_the_names_are_the_installed_lets_plot_all() -> None: + """A lets-plot upgrade that changes `__all__` fails here until the data is refreshed (module docstring).""" + lets_plot = pytest.importorskip("lets_plot") + + assert set(lets_plot.__all__) == LETS_PLOT_NAMES + + +def test_the_expanded_star_import_binds_what_the_star_import_bound() -> None: + """Code that reads every name of `__all__`: the normaliser's explicit import binds the same objects.""" + lets_plot = pytest.importorskip("lets_plot") + names = sorted(set(lets_plot.__all__)) + code = "from lets_plot import *\n\n" + "".join(f"_ = {name}\n" for name in names) + expanded = normalise(code, library="letsplot") + + assert "import *" not in expanded and expanded.startswith("from lets_plot import (\n GGBunch,\n LetsPlot,\n") + star: dict[str, object] = {} + explicit: dict[str, object] = {} + exec(compile(code, "star.py", "exec"), star) + exec(compile(expanded, "explicit.py", "exec"), explicit) + assert all(explicit[name] is star[name] for name in names) diff --git a/tests/unit/agents/code/test_normalise.py b/tests/unit/agents/code/test_normalise.py index 64c33d8e968..25754ecd1f1 100644 --- a/tests/unit/agents/code/test_normalise.py +++ b/tests/unit/agents/code/test_normalise.py @@ -1,4 +1,4 @@ -"""Tests for agents/anyplot/code/normalise.py: header, guard, savefig target and canvas rewrites.""" +"""Tests for agents/anyplot/code/normalise.py: header, guards, save target, pygal and lets-plot rewrites, canvas.""" import ast from pathlib import Path @@ -7,6 +7,7 @@ from agents.anyplot.code.normalise import ( LANDSCAPE, + MAX_IMAGE_PIXELS, SQUARE, TOLERANCE, effective_dpi, @@ -134,6 +135,20 @@ def test_only_the_catalogue_docstring_goes() -> None: assert norm(other) == other +def test_a_second_catalogue_header_goes_too() -> None: + """lets-plot's indicator-bollinger, parliament-basic and probability-weibull open with two headers.""" + header = '""" anyplot.ai\nscatter-demo: Demo Scatter\nLibrary: letsplot 4.9.0\nQuality: 92/100\n"""\n' + code = header + "# ruff: noqa: F405\n" + header.replace(" anyplot.ai", "anyplot.ai") + "\n" + THEME_BLOCK + report = normalise_report(code, library="matplotlib") + + assert report.code == "# ruff: noqa: F405\n\n" + THEME_BLOCK + assert report.changes[:2] == ( + "removed the catalogue header at lines 1-5", + "removed the catalogue header at lines 7-11", + ) + assert norm(code) == report.code + + # --- title --------------------------------------------------------------------------------- @@ -339,6 +354,906 @@ def test_path_used_for_something_else_is_not_a_target_rewrite() -> None: assert "plt.savefig(out" in norm(code) +@pytest.mark.parametrize( + ("setup", "save", "expected"), + [ + # lets-plot's shap-summary + ( + "_plot_dir = os.path.dirname(os.path.abspath(__file__))", + 'ggsave(plot, f"{_plot_dir}/plot-{THEME}.png", scale=3)', + 'ggsave(plot, f"plot-{THEME}.png", scale=3)', + ), + # plotnine's candlestick-volume + ( + 'script_dir = __file__[: __file__.rfind("/")]', + 'ggsave(plot, f"{script_dir}/plot-{THEME}.png", dpi=300)', + 'ggsave(plot, f"plot-{THEME}.png", dpi=300)', + ), + ], +) +def test_a_formatted_directory_in_front_of_the_theme_file_is_a_target_rewrite( + setup: str, save: str, expected: str +) -> None: + code = source(f""" + import os + + from plotnine import ggsave + + THEME = os.getenv("ANYPLOT_THEME", "light") + {setup} + {save} + """) + result = norm(code, "plotnine") + + assert expected in result and "__file__" not in result + # Only a formatted directory: a literal one stays, as does a file name other than the theme's. + for other in ('f"out/plot-{THEME}.png"', 'f"{d}/plot-{THEME}-raw.png"'): + kept = THEME_BLOCK + f"plt.savefig({other})\n" + assert other in norm(kept) + + +# --- guards of every library -------------------------------------------------------------- + + +def test_find_spec_guard_becomes_its_imports() -> None: + """pygal's waveform-audio and nine more files; the rule applies to every library.""" + code = source(""" + import importlib.util + import os + import sys + + import numpy as np + + + # Prevent this file (pygal.py) from shadowing the installed pygal package + _pygal_spec = importlib.util.find_spec("pygal") + if _pygal_spec and _pygal_spec.origin != __file__: + import pygal + from pygal.style import Style + else: + _cwd = sys.path.pop(0) + import pygal + from pygal.style import Style + + sys.path.insert(0, _cwd) + + THEME = os.getenv("ANYPLOT_THEME", "light") + """) + expected = source(""" + import os + + import numpy as np + + + import pygal + from pygal.style import Style + + THEME = os.getenv("ANYPLOT_THEME", "light") + """) + + for library in ("pygal", "matplotlib"): + report = normalise_report(code, library=library) + assert report.code == expected, library + assert report.changes[:2] == ( + "replaced the find_spec guard at lines 10-18 with its imports", + "removed the unused find_spec result _pygal_spec at line 9", + ) + + +@pytest.mark.parametrize( + ("guard", "note"), + [ + # altair's indicator-macd: the branch loads the module by hand, and the test is another one + ( + """ + spec = importlib.util.find_spec("altair") + if spec and spec.origin and "site-packages" in spec.origin: + alt = importlib.util.module_from_spec(spec) + else: + import altair as alt + """, + None, + ), + ( + """ + spec = importlib.util.find_spec("pygal") + if spec and spec.origin != __file__: + import pygal + print(pygal) + """, + "find_spec guard: the if at lines 5-7 holds more than imports; left in place", + ), + ], +) +def test_other_find_spec_shapes_stay(guard: str, note: str | None) -> None: + code = "import importlib.util\nimport os\n\n" + source(guard) + '\nTHEME = os.getenv("ANYPLOT_THEME", "light")\n' + report = normalise_report(code, library="pygal") + + assert "find_spec" in report.code and "if spec" in report.code + assert (note in report.notes) if note else not any(n.startswith("find_spec") for n in report.notes) + + +def test_try_finally_guard_becomes_its_imports() -> None: + """altair's voronoi-basic: the snapshot, the filter and the try/finally all serve the guard.""" + code = source(""" + import os + import sys + + + # Remove current directory from path to avoid shadowing altair library + _current_dir = os.path.dirname(os.path.abspath(__file__)) + _sys_path_backup = sys.path.copy() + sys.path = [p for p in sys.path if os.path.abspath(p) != _current_dir] + + try: + import altair as alt + finally: + sys.path = _sys_path_backup + + THEME = os.getenv("ANYPLOT_THEME", "light") + """) + report = normalise_report(code, library="altair") + + assert report.code == 'import os\n\n\nimport altair as alt\n\nTHEME = os.getenv("ANYPLOT_THEME", "light")\n' + assert report.changes[0] == "replaced the try/finally sys.path guard at lines 10-13 with its imports" + assert "removed an unused sys.path snapshot at line 7" in report.changes + # A try with an `except`, or a finally that does more, is no guard. + other = code.replace("finally:\n sys.path = _sys_path_backup", "except ImportError:\n alt = None") + assert "try:" in normalise(other, library="altair") + + +def test_sys_modules_deletion_and_bytecode_flag_are_guard_statements() -> None: + """pygal's indicator-rsi: `del sys.modules[...]` in an if, then a try/finally guard.""" + code = source(""" + import os + import sys + + import numpy as np + + + # Clear the local module from sys.modules if it was somehow loaded + if "pygal" in sys.modules and "implementations" in sys.modules["pygal"].__file__: + del sys.modules["pygal"] + + # Remove current directory from path to prevent local file from being imported + _original_path = sys.path[:] + sys.path = [p for p in sys.path if p not in ("", ".", os.getcwd())] + sys.dont_write_bytecode = True + + try: + import pygal + from pygal.style import Style + finally: + # Restore path + sys.path = _original_path + + # Theme tokens + THEME = os.getenv("ANYPLOT_THEME", "light") + """) + expected = source(""" + import os + + import numpy as np + + + import pygal + from pygal.style import Style + + # Theme tokens + THEME = os.getenv("ANYPLOT_THEME", "light") + """) + + assert norm(code, "pygal") == expected + + +def test_unused_sys_path_snapshot_goes_and_a_used_one_stays() -> None: + """pygal's ohlc-bar keeps `_cwd = sys.path[0] if ...` that nothing reads.""" + snapshot = '_cwd = sys.path[0] if sys.path and sys.path[0] == "" or sys.path[0] == "." else None\n' + code = "import os\nimport sys\n\n" + snapshot + "sys.path.pop(0)\n\n" + THEME_BLOCK.removeprefix("import os\n") + result = norm(code) + + assert "sys" not in result.replace("os.getenv", "") + used = code + "print(_cwd)\n" + assert snapshot in norm(used) + + +@pytest.mark.parametrize( + ("line", "statement"), + [ + ('Style = importlib.import_module("pygal.style").Style', "from pygal.style import Style"), + ('_Style = importlib.import_module("pygal.style").Style', "from pygal.style import Style as _Style"), + ('pygal = importlib.import_module("pygal")', "import pygal"), + ('mpatches = importlib.import_module("matplotlib.patches")', "import matplotlib.patches as mpatches"), + ], +) +def test_import_module_attribute_becomes_a_from_import(line: str, statement: str) -> None: + code = f"import importlib\nimport os\n\n{line}\n\n" + THEME_BLOCK.removeprefix("import os\n") + report = normalise_report(code, library="pygal") + + assert f"\n{statement}\n" in report.code and "importlib" not in report.code + assert any(change.endswith(f"-> {statement} at line 4") for change in report.changes) + + +def test_import_module_imported_from_importlib() -> None: + """plotnine's bar-horizontal: `from importlib import import_module`, then `pn = import_module("plotnine")`.""" + code = source(""" + import os + import sys + from importlib import import_module + + + remove_paths = {os.path.dirname(os.path.abspath(__file__)), os.getcwd()} + sys.path[:] = [p for p in sys.path if os.path.abspath(p) not in remove_paths] + + import pandas as pd + + + pn = import_module("plotnine") + Style = import_module("pygal.style").Style + aes = pn.aes + + THEME = os.getenv("ANYPLOT_THEME", "light") + """) + result = norm(code, "plotnine") + + assert "import plotnine as pn\nfrom pygal.style import Style\naes = pn.aes\n" in result + assert "import_module" not in result and "sys" not in result + + +# --- pygal ----------------------------------------------------------------------------------- + + +PYGAL_HEAD = source(""" + import os + + import numpy as np + import pygal + from pygal.style import Style + + THEME = os.getenv("ANYPLOT_THEME", "light") + PAGE_BG = "#FAF8F1" if THEME == "light" else "#1A1A17" +""") + + +def pygal_code(body: str) -> str: + return PYGAL_HEAD + source(body) + + +@pytest.mark.parametrize( + "write", + [ + 'with open(f"plot-{THEME}.html", "wb") as f:\n f.write(chart.render())', + 'with open(f"plot-{THEME}.html", "w") as f:\n f.write(chart.render(is_unicode=True))', + 'with open(f"plot-{THEME}.html", "w", encoding="utf-8") as f:\n f.write(chart.render().decode())', + 'with open(os.path.join(out, f"plot-{THEME}.html"), "wb") as f:\n f.write(chart.render())', + ], +) +def test_pygal_html_write_becomes_render_to_file(write: str) -> None: + """158 catalogue files write `chart.render()` through `open()`; `render_to_file` writes the same bytes.""" + body = "out = os.path.dirname(os.path.abspath(__file__))\nchart = pygal.XY(width=3200, height=1800)\n" + code = PYGAL_HEAD + body + 'chart.render_to_png(f"plot-{THEME}.png")\n' + write + "\n" + report = normalise_report(code, library="pygal") + + assert report.code.endswith( + 'chart.render_to_png(f"plot-{THEME}.png")\nchart.render_to_file(f"plot-{THEME}.html")\n' + ) + assert "open(" not in report.code and "__file__" not in report.code + assert report.changes[0].startswith("the HTML write through open() at lines 12-13 -> chart.render_to_file(") + assert norm(code, "pygal") == report.code + + +def test_pygal_other_html_and_svg_writes_go_with_what_fed_them() -> None: + """contour-filled: an SVG file and a hand-built HTML page around the post-processed SVG.""" + code = pygal_code(''' + chart = pygal.XY(width=3200, height=1800) + base_svg = chart.render(is_unicode=True) + + # Insert custom contour SVG before the closing </svg> tag + output_svg = base_svg.replace("</svg>", "<g/>\\n</svg>") + + with open(f"plot-{THEME}.svg", "w", encoding="utf-8") as f: + f.write(output_svg) + + # Convert to PNG using cairosvg + cairosvg.svg2png(bytestring=output_svg.encode("utf-8"), write_to=f"plot-{THEME}.png") + + # Save HTML + html_content = f"""<!DOCTYPE html> + <html><body>{output_svg}</body></html>""" + + with open(f"plot-{THEME}.html", "w", encoding="utf-8") as f: + f.write(html_content) + ''') + report = normalise_report(code, library="pygal") + + assert report.code.endswith( + '\n\n# Convert to PNG using cairosvg\ncairosvg.svg2png(bytestring=output_svg.encode("utf-8"), ' + 'write_to=f"plot-{THEME}.png")\n' + ) + assert "open(" not in report.code and "html_content" not in report.code and '.svg"' not in report.code + assert "output_svg = base_svg.replace(" in report.code # it also feeds the PNG + assert report.changes[:3] == ( + "removed the SVG write through open() at lines 15-16", + "removed the HTML write through open() at lines 25-26", + "removed html_content, which only fed a removed write, at lines 22-23", + ) + + +def test_pygal_svg_save_goes() -> None: + """network-basic and nine more files also save the theme SVG, which the plot sandbox refuses.""" + code = pygal_code(""" + chart = pygal.XY(width=3200, height=1800) + chart.render_to_png(f"plot-{THEME}.png") + # The SVG for the web + chart.render_to_file(f"plot-{THEME}.svg") + """) + report = normalise_report(code, library="pygal") + + assert report.code.endswith('chart.render_to_png(f"plot-{THEME}.png")\n') + assert report.changes == ("removed the SVG save at line 12",) + + +def test_pygal_write_whose_target_is_read_again_stays() -> None: + """network-hierarchical renders the SVG file and converts it with `svg2png(url=...)`.""" + code = pygal_code(""" + chart = pygal.XY(width=3200, height=1800) + chart.render_to_file(f"plot-{THEME}.svg") + with open(f"plot-{THEME}.svg", "w") as f: + f.write(chart.render(is_unicode=True)) + cairosvg.svg2png(url=f"plot-{THEME}.svg", write_to=f"plot-{THEME}.png") + """) + report = normalise_report(code, library="pygal") + + assert report.code == code + assert "html: the SVG save at line 10 is read again elsewhere; left in place" in report.notes + assert "html: the SVG write through open() at lines 11-12 is read again elsewhere; left in place" in report.notes + + +def test_pygal_feeder_with_a_save_call_stays() -> None: + code = pygal_code(""" + chart = pygal.XY(width=3200, height=1800) + png = chart.render_to_png() + with open(f"plot-{THEME}.html", "w") as f: + f.write(f"<img src='{png}'>") + chart.render_to_png(f"plot-{THEME}.png") + """) + result = norm(code, "pygal") + + assert "png = chart.render_to_png()" in result and "open(" not in result + + +def test_html_writes_stay_for_the_other_libraries() -> None: + code = THEME_BLOCK + 'with open(f"plot-{THEME}.html", "w") as f:\n f.write(chart.render(is_unicode=True))\n' + assert norm(code) == code + + +def test_pygal_html_open_writes_the_same_bytes(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + """The rewrite's claim, for the three write forms: pygal's `render_to_file` writes what `open()` wrote.""" + pytest.importorskip("pygal") + import pygal.graph.base + + monkeypatch.setattr(pygal.graph.base, "uuid4", lambda: "00000000-0000-0000-0000-000000000000") + monkeypatch.setenv("ANYPLOT_THEME", "light") + chart = "chart = pygal.Bar(width=320, height=180, js=[])\nchart.add('a', [1, 3, 2])\n" + for number, write in enumerate( + [ + 'with open(f"plot-{THEME}.html", "wb") as f:\n f.write(chart.render())', + 'with open(f"plot-{THEME}.html", "w", encoding="utf-8") as f:\n f.write(chart.render(is_unicode=True))', + 'with open(f"plot-{THEME}.html", "w", encoding="utf-8") as f:\n f.write(chart.render().decode("utf-8"))', + ] + ): + original = 'import os\n\nimport pygal\n\nTHEME = os.getenv("ANYPLOT_THEME", "light")\n' + chart + write + "\n" + normalised = normalise(original, library="pygal") + assert "render_to_file" in normalised + written = [] + for form, code in (("original", original), ("normalised", normalised)): + directory = tmp_path / f"{number}-{form}" + directory.mkdir() + monkeypatch.chdir(directory) + exec(compile(code, "plot.py", "exec"), {"__name__": "__main__"}) + written.append((directory / "plot-light.html").read_bytes()) + assert written[0] == written[1], write + + +@pytest.mark.parametrize( + ("chart", "size", "target"), + [ + ("pygal.StackedLine(width=4800, height=2700, js=[])", "4800x2700", LANDSCAPE), + ("pygal.Pie(width=3600, height=3600)", "3600x3600", SQUARE), + ], +) +def test_pygal_large_chart_renders_the_canvas_through_svg2png(chart: str, size: str, target: tuple[int, int]) -> None: + """98 catalogue charts are 4800x2700 and 4 are 3600x3600; the layout stays, the PNG gets the canvas size.""" + code = pygal_code(f""" + chart = {chart} + chart.add("a", [1, 2, 3]) + chart.render_to_png(f"plot-{{THEME}}.png") + """) + report = normalise_report(code, library="pygal") + + width, height = target + assert report.code.startswith("import os\n\nimport cairosvg\nimport numpy as np\nimport pygal\n") + assert report.code.endswith( + f'cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{{THEME}}.png", output_width={width}, ' + f"output_height={height})\n" + ) + assert f"chart = {chart}" in report.code + assert report.changes == ( + "added import cairosvg at line 3", + f"canvas: pygal chart {size} (the saved chart at line 9) renders {size}; the save renders {width}x{height} " + f"through cairosvg.svg2png(output_width={width}, output_height={height}) in place of render_to_png", + ) + canvas = measure_canvas(report.code, library="pygal") + assert canvas.on_target and canvas.pixels == target + assert not measure_canvas(code, library="pygal").on_target + assert norm(code, "pygal") == report.code + + +def test_pygal_svg2png_save_gets_the_output_size() -> None: + """Traced through `render`, `replace`, `encode` and names; an existing `import cairosvg as _cairosvg` is used.""" + code = pygal_code(""" + import cairosvg as _cairosvg + + chart = pygal.XY(width=3600, height=3600) + svg = chart.render(is_unicode=True) + marked = svg.replace("</svg>", "<g/></svg>") + _cairosvg.svg2png(bytestring=marked.encode("utf-8"), write_to=f"plot-{THEME}.png", output_width=4800) + """) + report = normalise_report(code, library="pygal") + + assert report.code.endswith( + '_cairosvg.svg2png(bytestring=marked.encode("utf-8"), write_to=f"plot-{THEME}.png", output_width=2400, ' + "output_height=2400)\n" + ) + assert report.changes[-1].startswith("canvas: pygal chart 3600x3600 (the saved chart at line 11) renders 4800x4800") + assert measure_canvas(report.code, library="pygal").pixels == SQUARE + + +def test_pygal_from_import_of_svg2png_is_used() -> None: + code = pygal_code(""" + from cairosvg import svg2png + + chart = pygal.XY(width=4800, height=2700) + chart.render_to_png(filename=f"plot-{THEME}.png", dpi=96) + """) + result = norm(code, "pygal") + + assert result.endswith( + 'svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png", dpi=96, output_width=3200, ' + "output_height=1800)\n" + ) + assert "import cairosvg" not in result + + +@pytest.mark.parametrize( + ("body", "note", "pixels"), + [ + ( + 'chart = pygal.XY(width=size, height=size)\nchart.render_to_png(f"plot-{THEME}.png")', + "canvas: the chart's width= at line 10 is not a positive numeric literal; the PNG size is left as it is", + None, + ), + ( + 'chart = pygal.XY(width=4800, height=3600)\nchart.render_to_png(f"plot-{THEME}.png")', + "canvas: pygal chart 4800x3600 (the saved chart at line 10) has another aspect than 16:9 or 1:1; the PNG " + "size is left as it is", + (4800, 3600), + ), + ( + 'chart = pygal.XY()\nchart.render_to_png(f"plot-{THEME}.png")', + "canvas: pygal chart 800x600 (the saved chart at line 10) has another aspect than 16:9 or 1:1; the PNG " + "size is left as it is", + (800, 600), + ), + ( + "a = pygal.XY(width=4800, height=2700)\nb = pygal.Bar(width=4800, height=2700)\n" + 'cairosvg.svg2png(bytestring=merge(a, b), write_to=f"plot-{THEME}.png")', + "canvas: 2 pygal charts in the file, none traced from the save at line 12; the PNG size is left as it is", + None, + ), + ], +) +def test_pygal_canvas_left_alone_with_a_note(body: str, note: str, pixels: tuple[int, int] | None) -> None: + code = PYGAL_HEAD + "size = 4800\n" + body + "\n" + report = normalise_report(code, library="pygal") + + assert report.code == code + assert note in report.notes, report.notes + canvas = measure_canvas(code, library="pygal") + assert not canvas.on_target and canvas.pixels == pixels + + +def test_pygal_canvas_already_on_target_is_kept() -> None: + code = pygal_code('chart = pygal.XY(width=3200, height=1800)\nchart.render_to_png(f"plot-{THEME}.png")\n') + assert norm(code, "pygal") == code + assert measure_canvas(code, library="pygal").pixels == LANDSCAPE + + +# --- lets-plot ----------------------------------------------------------------------------- + + +LETSPLOT_HEAD = source(""" + import os + + import pandas as pd + from lets_plot import LetsPlot, aes, geom_point, ggplot, ggsave, ggsize + + LetsPlot.setup_html() + THEME = os.getenv("ANYPLOT_THEME", "light") + df = pd.DataFrame({"x": [1, 2], "y": [3, 4]}) +""") + + +def test_letsplot_catalogue_shape_in_miniature() -> None: + """A star import, the `export_ggsave` alias, saves without `path=` and the lets-plot-images epilogue.""" + code = source(""" + import os + import shutil + + import pandas as pd + from lets_plot import * # noqa: F403 + from lets_plot.export import ggsave as export_ggsave + + LetsPlot.setup_html() + THEME = os.getenv("ANYPLOT_THEME", "light") + df = pd.DataFrame({"x": [1, 2], "y": [3, 4]}) + plot = ggplot(df, aes(x="x", y="y")) + geom_point() + ggsize(1600, 900) + + export_ggsave(plot, f"plot-{THEME}.png", scale=3) + export_ggsave(plot, filename=f"plot-{THEME}.html") + + # Move files from lets-plot-images to current directory + if os.path.exists("lets-plot-images"): + for f in [f"plot-{THEME}.png", f"plot-{THEME}.html"]: + src = os.path.join("lets-plot-images", f) + if os.path.exists(src): + shutil.move(src, f) + if not os.listdir("lets-plot-images"): + shutil.rmtree("lets-plot-images") + """) + expected = source(""" + import os + + import pandas as pd + from lets_plot import ( + LetsPlot, + aes, + geom_point, + ggplot, + ggsize, + ) + from lets_plot.export import ggsave + + LetsPlot.setup_html() + THEME = os.getenv("ANYPLOT_THEME", "light") + df = pd.DataFrame({"x": [1, 2], "y": [3, 4]}) + plot = ggplot(df, aes(x="x", y="y")) + geom_point() + ggsize(1600, 900) + + ggsave(plot, f"plot-{THEME}.png", path=".", scale=2) + ggsave(plot, filename=f"plot-{THEME}.html", path=".") + """) + report = normalise_report(code, library="letsplot") + + assert report.code == expected + assert report.notes == () + assert report.changes == ( + "import ggsave as export_ggsave -> import ggsave at line 6", + "export_ggsave -> ggsave at line 13, 14", + "from lets_plot import * -> 5 names at line 5", + 'added path="." to ggsave at line 19', + 'added path="." to ggsave at line 20', + "removed the unused `import shutil` at line 2", + "removed the lets-plot-images epilogue at lines 23-29", + "canvas: 1600x900 (ggsize at line 16) at scale 3 renders 4800x2700; scale=2 renders 3200x1800", + ) + assert norm(code, "letsplot") == expected + assert measure_canvas(expected, library="letsplot").pixels == LANDSCAPE + + +@pytest.mark.parametrize( + "clash", ["ggsave = None", "def save(export_ggsave):\n return export_ggsave", "from plotnine import ggsave"] +) +def test_letsplot_save_alias_stays_when_a_name_is_bound_again(clash: str) -> None: + code = LETSPLOT_HEAD.replace(", ggsave,", ",") + "from lets_plot.export import ggsave as export_ggsave\n\n" + code += clash + '\nexport_ggsave(ggplot(), f"plot-{THEME}.png", path=".", scale=2)\n' + report = normalise_report(code, library="letsplot") + + assert "import ggsave as export_ggsave" in report.code + assert any( + note.startswith("save alias: ") and note.endswith("export_ggsave left unchanged") for note in report.notes + ) + + +def test_letsplot_star_import_lists_the_names_the_module_reads() -> None: + """renko-basic, with an explicit import kept, a name the file assigns (column-stratigraphic's `margin`) and a + name read only inside a function.""" + code = source(""" + import os + + from lets_plot import * + from lets_plot import element_blank, theme + + THEME = os.getenv("ANYPLOT_THEME", "light") + margin = 16 + LetsPlot.setup_html() + + + def styled(plot): + return plot + theme_minimal() + theme(panel_grid=element_blank()) + + + plot = styled(ggplot() + geom_tile(aes(x="x"), size=margin) + scale_fill_manual(values=["#009E73"])) + plot += ggsize(1600, 900) + labs(title="") + ggsave(plot, f"plot-{THEME}.png", path=".", scale=2) + """) + result = norm(code, "letsplot") + + assert result.startswith( + "import os\n\nfrom lets_plot import (\n LetsPlot,\n aes,\n geom_tile,\n ggplot,\n ggsave,\n" + " ggsize,\n labs,\n scale_fill_manual,\n theme_minimal,\n)\n" + "from lets_plot import element_blank, theme\n" + ) + + +@pytest.mark.parametrize( + ("code", "note"), + [ + ( + "from lets_plot import *\nfrom math import *\nplot = ggplot() + geom_point(size=pi)\n", + "star import: the file has 2 star imports; the star import at line 1 stays", + ), + ( + "from lets_plot import *\n\n\ndef keep():\n global plot\n plot = ggplot()\n", + "star import: a global statement at line 5; the star import at line 1 stays", + ), + ( + "from lets_plot import *\nplot = ggplot() + theme(legend_position='top')\ntheme = None\n", + "star import: theme is read before the file binds it; the star import at line 1 stays", + ), + ( + "try:\n from lets_plot import *\nexcept ImportError:\n pass\n", + "star import: it is not a module-level statement; the star import at line 2 stays", + ), + ], +) +def test_letsplot_star_import_refusals_keep_it_with_a_note(code: str, note: str) -> None: + report = normalise_report(code, library="letsplot") + + assert "from lets_plot import *" in report.code + assert note in report.notes, report.notes + + +def test_letsplot_unused_star_import_goes() -> None: + code = 'import os\nfrom lets_plot import *\n\nTHEME = os.getenv("ANYPLOT_THEME", "light")\n' + report = normalise_report(code, library="letsplot") + + assert report.code == 'import os\n\nTHEME = os.getenv("ANYPLOT_THEME", "light")\n' + assert report.changes[0] == "removed the unused `from lets_plot import *` at line 2" + + +@pytest.mark.parametrize( + ("saves", "expected"), + [ + # hive-basic: no path=, so lets-plot writes into ./lets-plot-images (the sandbox refuses the os.mkdir) + ( + 'ggsave(plot, f"plot-{THEME}.png", scale=3)\nggsave(plot, filename=f"plot-{THEME}.html")', + 'ggsave(plot, f"plot-{THEME}.png", path=".", scale=2)\nggsave(plot, filename=f"plot-{THEME}.html", path=".")', + ), + # scatter-annotated: a computed directory, and lets-plot's default spelled out + ( + "_script_dir = Path(__file__).parent\n" + 'ggsave(plot, f"plot-{THEME}.png", path=str(_script_dir), scale=3)\n' + 'ggsave(plot, f"plot-{THEME}.html", path=None)', + 'ggsave(plot, f"plot-{THEME}.png", path=".", scale=2)\nggsave(plot, f"plot-{THEME}.html", path=".")', + ), + # gain-curve: the shared target rewrite first, then the directory + ( + "output_dir = os.getcwd()\n" + 'ggsave(plot, os.path.join(output_dir, f"plot-{THEME}.png"), scale=3)\n' + 'ggsave(plot, os.path.join(output_dir, f"plot-{THEME}.html"))', + 'ggsave(plot, f"plot-{THEME}.png", path=".", scale=2)\nggsave(plot, f"plot-{THEME}.html", path=".")', + ), + ], +) +def test_letsplot_saves_get_the_directory(saves: str, expected: str) -> None: + code = "from pathlib import Path\n\n" + LETSPLOT_HEAD + "plot = ggplot(df) + geom_point() + ggsize(1600, 900)\n" + result = norm(code + saves + "\n", "letsplot") + + assert result.endswith(expected + "\n") + assert "Path" not in result.replace("LetsPlot", "") and "output_dir" not in result + + +def test_letsplot_other_literal_directory_stays_with_a_note() -> None: + code = ( + LETSPLOT_HEAD + 'plot = ggplot() + ggsize(1600, 900)\nggsave(plot, f"plot-{THEME}.png", path="out", scale=2)\n' + ) + report = normalise_report(code, library="letsplot") + + assert 'path="out"' in report.code + assert "save directory: the ggsave at line 10 saves into path='out'; left unchanged" in report.notes + + +@pytest.mark.parametrize( + "epilogue", + [ + # chessboard-pieces: one guarded move per file, then the directory + """ + # Move files from lets-plot-images to current directory + if os.path.exists(f"lets-plot-images/plot-{THEME}.png"): + shutil.move(f"lets-plot-images/plot-{THEME}.png", f"plot-{THEME}.png") + if os.path.exists("lets-plot-images"): + shutil.rmtree("lets-plot-images") + """, + # histogram-overlapping: a listing loop + """ + if os.path.exists("lets-plot-images"): + for file in os.listdir("lets-plot-images"): + src = os.path.join("lets-plot-images", file) + if os.path.isfile(src): + shutil.move(src, file) + shutil.rmtree("lets-plot-images") + """, + # line-3d-trajectory: pathlib names and a copy + """ + lpi_dir = pathlib.Path("lets-plot-images") + if lpi_dir.exists(): + for ext in ["png", "html"]: + src = lpi_dir / f"plot-{THEME}.{ext}" + dst = pathlib.Path(f"plot-{THEME}.{ext}") + if src.exists() and not dst.exists(): + shutil.copy(src, dst) + """, + # line-loss-training: a glob over the directory + """ + images_dir = Path("lets-plot-images") + if images_dir.exists(): + for file in images_dir.glob(f"plot-{THEME}.*"): + shutil.move(str(file), str(file.name)) + """, + # spectrum-basic: a cleanup that swallows OSError + """ + try: + if not os.listdir("lets-plot-images"): + os.rmdir("lets-plot-images") + except OSError: + pass + """, + # swimmer-clinical-timeline: a dead cleanup with its own import + """ + if os.path.exists("lets-plot-images"): + import shutil + + shutil.rmtree("lets-plot-images") + """, + ], +) +def test_letsplot_images_epilogue_goes(epilogue: str) -> None: + saves = source(""" + plot = ggplot(df) + geom_point() + ggsize(1600, 900) + ggsave(plot, f"plot-{THEME}.png", path=".", scale=2) + ggsave(plot, f"plot-{THEME}.html", path=".") + """) + code = "import pathlib\nimport shutil\nfrom pathlib import Path\n" + LETSPLOT_HEAD + saves + "\n" + source(epilogue) + report = normalise_report(code, library="letsplot") + + assert report.code == LETSPLOT_HEAD + saves + assert any(change.startswith("removed the lets-plot-images epilogue") for change in report.changes) + assert report.notes == () + + +def test_letsplot_returned_path_becomes_the_save() -> None: + """line-confidence moves the path ggsave returns; the save then sizes in pixels, so only the scale changes.""" + code = ( + "import shutil\n" + + LETSPLOT_HEAD + + source(""" + plot = ggplot(df) + geom_point() + ggsize(1600, 900) + + # Save as PNG (4800 x 2700 px) + png_path = ggsave(plot, f"plot-{THEME}.png", w=4800, h=2700, unit="px", dpi=100) + shutil.move(png_path, f"plot-{THEME}.png") + + # Save as HTML + html_path = ggsave(plot, f"plot-{THEME}.html") + shutil.move(html_path, f"plot-{THEME}.html") + """) + ) + report = normalise_report(code, library="letsplot") + + assert report.code.endswith( + "# Save as PNG (4800 x 2700 px)\n" + 'ggsave(plot, f"plot-{THEME}.png", path=".", w=4800, h=2700, unit="px", dpi=100, scale=0.6667)\n\n' + '# Save as HTML\nggsave(plot, f"plot-{THEME}.html", path=".")\n' + ) + assert "png_path = ggsave(...) -> ggsave(...) at line 13" in report.changes + assert measure_canvas(report.code, library="letsplot").pixels == LANDSCAPE + + +def test_letsplot_statement_that_does_more_than_move_stays_with_a_note() -> None: + code = LETSPLOT_HEAD + source(""" + lp_dir = "lets-plot-images" + plot = ggplot(df) + ggsize(1600, 900) + ggsave(plot, f"plot-{THEME}.png", path=".", scale=2) + print(os.listdir(lp_dir)) + if os.path.exists(lp_dir): + os.rmdir(lp_dir) + """) + report = normalise_report(code, library="letsplot") + + assert 'lp_dir = "lets-plot-images"' in report.code and "print(os.listdir(lp_dir))" in report.code + assert "os.rmdir" not in report.code + assert "save epilogue: the statement at line 12 uses lets-plot-images in other ways; left in place" in report.notes + + +@pytest.mark.parametrize( + ("plot", "save", "scale", "pixels"), + [ + ("ggsize(1600, 900)", "scale=3", "scale=2", LANDSCAPE), # 106 catalogue files rendered 4800x2700 + ("ggsize(1200, 1200)", "scale=3", "scale=2", SQUARE), + ("ggsize(900, 900)", "scale=3", "scale=2.667", SQUARE), + ("ggsize(800, 450)", "", ", scale=4", LANDSCAPE), # lets-plot's default scale is 2 + ("ggsize(800, 450)", "dpi=150", "dpi=150, scale=2.56", LANDSCAPE), # dpi= scales by dpi / 96 + ("ggsize(1600, 900)", "w=16, h=9, unit='in', dpi=100", "dpi=100, scale=2", LANDSCAPE), + ("ggsize(1600, 960)", "scale=3", "scale=1.874", (2998, 1799)), # tier 2: inside the canvas, under R2's cap + ], +) +def test_letsplot_canvas_changes_only_the_scale(plot: str, save: str, scale: str, pixels: tuple[int, int]) -> None: + keywords = f", {save}" if save else "" + code = ( + LETSPLOT_HEAD + + f'plot = ggplot(df) + geom_point() + {plot}\nggsave(plot, f"plot-{{THEME}}.png", path="."{keywords})\n' + ) + report = normalise_report(code, library="letsplot") + + assert plot in report.code and scale in report.code.splitlines()[-1] + assert measure_canvas(report.code, library="letsplot").pixels == pixels + assert norm(code, "letsplot") == report.code + + +@pytest.mark.parametrize( + ("plot", "note"), + [ + # candlestick-volume: a grid sizes itself from its panels + ( + "top = ggplot() + ggsize(1600, 630)\nbottom = ggplot() + ggsize(1600, 270)\nplot = gggrid([top, bottom])", + "canvas: gggrid at line 11 has no ggsize of its own; the render relies on the R3 canvas gate", + ), + # an aspect no scale reaches, under R2's cap + ( + "plot = ggplot() + ggsize(800, 853)", + "canvas: 800x853 (ggsize at line 9) at scale 3 renders 2400x2559; no scale renders 3200x1800 or " + "2400x2400, so the render relies on the R3 gate", + ), + ], +) +def test_letsplot_canvas_left_alone_with_a_note(plot: str, note: str) -> None: + code = LETSPLOT_HEAD.replace("ggsave, ggsize", "ggsave, gggrid, ggsize") + plot + "\n" + code += 'ggsave(plot, f"plot-{THEME}.png", path=".", scale=3)\n' + report = normalise_report(code, library="letsplot") + + assert report.code == code + assert note in report.notes, report.notes + assert not measure_canvas(code, library="letsplot").on_target + + +def test_letsplot_plot_size_falls_back_to_the_file_and_the_default() -> None: + added = ( + LETSPLOT_HEAD + + 'plot = ggplot(df) + geom_point()\nplot += ggsize(1600, 900)\nggsave(plot, f"plot-{THEME}.png", path=".", scale=3)\n' + ) + assert measure_canvas(added, library="letsplot").note == ( + "lets-plot renders 4800x2700 from 1600x900 (the file's only ggsize) at scale 3, target 3200x1800" + ) + default = LETSPLOT_HEAD + 'plot = ggplot(df) + geom_point()\nggsave(plot, f"plot-{THEME}.png", path=".")\n' + assert measure_canvas(default, library="letsplot").pixels == (1200, 800) # 600x400 at the default scale 2 + + +def test_max_image_pixels_is_r2s_cap() -> None: + from agents.anyplot.render.png import MAX_IMAGE_PIXELS as R2_CAP + + assert MAX_IMAGE_PIXELS == R2_CAP + + # --- canvas ------------------------------------------------------------------------------ @@ -511,9 +1426,15 @@ def test_measure_canvas_and_effective_dpi() -> None: @pytest.mark.parametrize("path", CATALOGUE_FILES, ids=lambda p: f"{p.parts[-4]}-{p.stem}") def test_catalogue_sweep(path: Path) -> None: original = path.read_text(encoding="utf-8") - result = normalise(original, library=path.stem) + report = normalise_report(original, library=path.stem) + result = report.code assert normalise(result, library=path.stem) == result + if any(change.startswith("canvas:") for change in report.changes) and path.stem in ("pygal", "letsplot"): + rendered = measure_canvas(result, library=path.stem) + assert rendered.pixels is not None and rendered.target is not None, rendered.note + assert all(side <= limit + TOLERANCE for side, limit in zip(rendered.pixels, rendered.target, strict=True)) + assert rendered.pixels[0] * rendered.pixels[1] <= MAX_IMAGE_PIXELS regions = find_regions(original, library=path.stem) size, _ = figure_size(regions) call = regions.savefig or (regions.savefig_calls[-1] if regions.savefig_calls else None) diff --git a/tests/unit/agents/code/test_readiness.py b/tests/unit/agents/code/test_readiness.py index 1c0d4d42990..072cb4fcd03 100644 --- a/tests/unit/agents/code/test_readiness.py +++ b/tests/unit/agents/code/test_readiness.py @@ -165,6 +165,127 @@ def test_an_unsupported_library_is_blocked_before_its_save_rule(self) -> None: ] +SIX_ENABLED = (*ALL_ENABLED, "pygal", "letsplot") +PYGAL = source(""" + import os + + import pygal + from pygal.style import Style + + THEME = os.getenv("ANYPLOT_THEME", "light") + PAGE_BG = "#FAF8F1" if THEME == "light" else "#1A1A17" + df = load_user_data() + chart = pygal.XY(width=4800, height=2700, style=Style(background=PAGE_BG), js=[]) + chart.add("a", list(zip(df["x"], df["y"]))) + chart.render_to_png(f"plot-{THEME}.png") + with open(f"plot-{THEME}.html", "wb") as f: + f.write(chart.render()) +""") +LETSPLOT = source(""" + import os + + from lets_plot import * + + LetsPlot.setup_html() + THEME = os.getenv("ANYPLOT_THEME", "light") + PAGE_BG = "#FAF8F1" if THEME == "light" else "#1A1A17" + df = load_user_data() + plot = ggplot(df, aes(x="x", y="y")) + geom_point(color=PAGE_BG) + ggsize(1600, 900) + ggsave(plot, f"plot-{THEME}.png", scale=3) + ggsave(plot, f"plot-{THEME}.html") +""") + + +def scan_normalised(code: str, library: str) -> Readiness: + return scan( + normalise(code, library=library), spec_id="scatter-basic", library=library, enabled_libraries=SIX_ENABLED + ) + + +class TestPygalAndLetsPlot: + """The catalogue shapes of pygal and lets-plot, normalised, and what the scan says where the normaliser stops.""" + + @pytest.mark.parametrize(("code", "library"), [(PYGAL, "pygal"), (LETSPLOT, "letsplot")]) + def test_normalised_file_is_clean_and_on_the_canvas(self, code: str, library: str) -> None: + assert scan_normalised(code, library) == Readiness("clean", [], []) + + @pytest.mark.parametrize( + ("code", "library", "reason"), + [ + ( + PYGAL.replace("width=4800, height=2700", "width=W, height=H"), + "pygal", + "canvas: pygal canvas unknown: the chart's width= at line 9 is not a positive numeric literal; the " + "render relies on the R3 canvas gate and padding", + ), + ( + LETSPLOT.replace("ggsize(1600, 900)", "ggsize(800, 853)"), + "letsplot", + "canvas: lets-plot renders 2400x2559 from 800x853 (ggsize at line 16) at scale 3, target 2400x2400; the " + "render relies on the R3 canvas gate and padding", + ), + ], + ) + def test_a_canvas_the_normaliser_cannot_set_is_a_note(self, code: str, library: str, reason: str) -> None: + result = scan_normalised(code, library) + + assert result.status == "clean" and result.reasons == [reason] + + def test_a_letsplot_save_without_the_directory_is_blocked(self) -> None: + """Unnormalised: lets-plot would write into ./lets-plot-images, which the plot sandbox refuses.""" + result = scan(LETSPLOT, spec_id="scatter-basic", library="letsplot", enabled_libraries=SIX_ENABLED) + + assert result.status == "blocked" + assert 'savefig-target: ggsave at line 10 does not save with path="."' in result.reasons + assert 'savefig-target: ggsave at line 11 does not save with path="."' in result.reasons + + @pytest.mark.parametrize( + ("code", "library", "reason"), + [ + # a second star import: the normaliser keeps the lets-plot one, the validator refuses both + ( + LETSPLOT.replace("from lets_plot import *", "from lets_plot import *\nfrom math import *"), + "letsplot", + "security: star-import at line 3: ", + ), + # the alias rename stops where the file binds `ggsave` itself + ( + LETSPLOT.replace( + "from lets_plot import *", + "from lets_plot import *\nfrom lets_plot.export import ggsave as keep\nggsave = keep", + ), + "letsplot", + "security: banned-call at line ", + ), + # an epilogue statement that does more than move files + (LETSPLOT + 'print(os.listdir("lets-plot-images"))\n', "letsplot", "security: os-use at line 19: "), + # an SVG save whose file the code reads again + ( + PYGAL.replace( + 'with open(f"plot-{THEME}.html", "wb") as f:\n f.write(chart.render())', + 'chart.render_to_file(f"plot-{THEME}.svg")\nprint(f"plot-{THEME}.svg")', + ), + "pygal", + "savefig-target: render_to_file saves to f'plot-{THEME}.svg' at line 13", + ), + # a hand-built page whose file the code names again: the `open()` write stays + ( + PYGAL.replace( + 'with open(f"plot-{THEME}.html", "wb") as f:\n f.write(chart.render())', + 'with open(f"plot-{THEME}.html", "w") as f:\n f.write("<html/>")\nprint(f"plot-{THEME}.html")', + ), + "pygal", + "security: banned-name at line 13: 'open'", + ), + ], + ) + def test_what_the_normaliser_leaves_is_blocked(self, code: str, library: str, reason: str) -> None: + result = scan_normalised(code, library) + + assert result.status == "blocked" and result.hints == [] + assert any(r.startswith(reason) for r in result.reasons), result.reasons + + def test_clean(validator_calls: list[str]) -> None: result = check('ax.plot(df["x"], df["y"], color=PAGE_BG)\nax.set_ylim(bottom=0)\nax.axhline(0)\n') diff --git a/tests/unit/agents/code/test_regions.py b/tests/unit/agents/code/test_regions.py index 1372cba3b18..7e88823b3d2 100644 --- a/tests/unit/agents/code/test_regions.py +++ b/tests/unit/agents/code/test_regions.py @@ -16,6 +16,7 @@ is_theme_assignment, is_theme_target, save_rule, + save_target, ) from agents.anyplot.code.regions import tests_theme as value_tests_theme # not named test* for pytest @@ -132,10 +133,12 @@ def test_a_theme_token_picks_fixed_values_and_a_data_dependent_conditional_is_no @pytest.mark.skipif(not CATALOGUE_FILES, reason="plots/ is not checked out") -def test_every_catalogue_theme_conditional_but_five_is_a_token() -> None: +def test_every_catalogue_theme_conditional_but_the_listed_ones_is_a_token() -> None: """Measured on 2026-10-10: 2,745 theme-testing assignments in the 650 matplotlib and seaborn files, one of them data-dependent; on 2026-10-25, 5,438 in the 1,296 files of the four libraries, five of them (a colour taken from - a palette index or another plot colour, a tuple of channel arithmetic, a list of layers).""" + a palette index or another plot colour, a tuple of channel arithmetic, a list of layers); on 2026-10-26, 8,020 + in the 1,946 files of the six libraries, eleven of them (lets-plot adds two `flavor_*()` calls, a theme call, a + tile set and two colours read from constants that test no theme).""" narrowed = [] for path in CATALOGUE_FILES: code = path.read_text(encoding="utf-8") @@ -153,6 +156,12 @@ def test_every_catalogue_theme_conditional_but_five_is_a_token() -> None: "heatmap-cohort-retention/plotnine.py:RULE", "slope-basic/altair.py:layers", "span-basic/altair.py:WARNING_LABEL_COLOR", + "bar-tornado-sensitivity/letsplot.py:flavor", + "column-stratigraphic/letsplot.py:flavor", + "heatmap-loss-triangle/letsplot.py:base_flavor", + "ks-test-comparison/letsplot.py:ribbon_color", + "map-tile-background/letsplot.py:map_tiles", + "nyquist-basic/letsplot.py:PM_LABEL_TEXT", ] @@ -242,20 +251,70 @@ def test_savefig_targets_fname_keyword_literal_and_nesting() -> None: _canvas.save(f"plot-{THEME}.png") chart.save(f"plot-{THEME}.html") """) +PYGAL = source(""" + import os + + import cairosvg + import pygal + + THEME = os.getenv("ANYPLOT_THEME", "light") + PAGE_BG = "#FAF8F1" if THEME == "light" else "#1A1A17" + df = load_user_data() + chart = pygal.XY(width=3200, height=1800, js=[]) + chart.add("points", list(zip(df["x"], df["y"]))) + cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png", output_width=3200) + chart.render_to_png(f"plot-{THEME}.png") + chart.render_to_file(f"plot-{THEME}.html") +""") +LETSPLOT = source(""" + import os + + from lets_plot import LetsPlot, aes, geom_point, ggplot, ggsave, ggsize + + LetsPlot.setup_html() + THEME = os.getenv("ANYPLOT_THEME", "light") + PAGE_BG = "#FAF8F1" if THEME == "light" else "#1A1A17" + df = load_user_data() + plot = ggplot(df, aes(x="x", y="y")) + geom_point() + ggsize(1600, 900) + ggsave(plot, f"plot-{THEME}.png", path=".", scale=2) + ggsave(plot, filename=f"plot-{THEME}.html", path=".") +""") class TestSaveRules: """One save rule per library (`SAVE_RULES`): which calls save, where the file is, what is protected.""" def test_every_rule_names_its_save_calls(self) -> None: - assert set(SAVE_RULES) == {"matplotlib", "seaborn", "plotnine", "altair"} - assert SAVE_NAMES == {"savefig", "save", "ggsave"} + assert set(SAVE_RULES) == {"matplotlib", "seaborn", "plotnine", "altair", "pygal", "letsplot"} + assert SAVE_NAMES == {"savefig", "save", "ggsave", "render_to_png", "render_to_file", "svg2png"} assert save_rule("matplotlib").verb == "savefig" and save_rule("plotnine").verb == "save" - assert save_rule("altair").html and save_rule("altair").reopens and not save_rule("altair").canvas - assert save_rule("seaborn").canvas and not save_rule("plotnine").canvas + assert save_rule("altair").html and save_rule("altair").reopens and save_rule("altair").canvas is None + assert save_rule("seaborn").canvas == "figure" and save_rule("plotnine").canvas is None + assert save_rule("pygal").canvas == "pygal" and save_rule("letsplot").canvas == "letsplot" + assert save_rule("letsplot").directory == "." and save_rule("pygal").directory is None with pytest.raises(ValueError, match="no save rule"): save_rule("plotly") + def test_pygal_svg2png_takes_the_file_by_keyword_only(self) -> None: + regions = find_regions(PYGAL, library="pygal") + + shapes = [(c.name, c.standard_target, c.html_target) for c in regions.savefig_calls] + assert shapes == [("svg2png", True, False), ("render_to_png", True, False), ("render_to_file", False, True)] + assert regions.savefig is regions.savefig_calls[1] # the last module-level save of the PNG + rule = save_rule("pygal") + assert rule.target_position("svg2png") == -1 and rule.target_position("render_to_png") == 0 + # `svg2png`'s first positional is the SVG, never the file. + positional = ast.parse('cairosvg.svg2png(f"plot-{THEME}.png")', mode="eval").body + assert isinstance(positional, ast.Call) and save_target(positional, rule, "svg2png") is None + + def test_letsplot_ggsave_takes_the_file_second(self) -> None: + regions = find_regions(LETSPLOT, library="letsplot") + + shapes = [(c.name, c.standard_target, c.html_target) for c in regions.savefig_calls] + assert shapes == [("ggsave", True, False), ("ggsave", False, True)] + assert regions.savefig is regions.savefig_calls[0] + assert text(LETSPLOT, regions.protected[-1].span) == 'ggsave(plot, f"plot-{THEME}.png", path=".", scale=2)\n' + def test_plotnine_ggsave_takes_the_file_second(self) -> None: regions = find_regions(PLOTNINE, library="plotnine") diff --git a/tests/unit/agents/code/test_validate.py b/tests/unit/agents/code/test_validate.py index 9aec6d262a7..a0c50d58503 100644 --- a/tests/unit/agents/code/test_validate.py +++ b/tests/unit/agents/code/test_validate.py @@ -17,8 +17,10 @@ BANNED_ATTRIBUTES, BANNED_IO, ESCAPE_ATTRIBUTES, + LIBRARY_BANS, MAX_LITERAL_NUMBERS, MAX_STRING_CHARS, + MODULE_ESCAPES, PLACEHOLDER, UNSAFE_HELPERS, UNSAFE_SUBMODULES, @@ -1478,8 +1480,9 @@ def test_messages_never_echo_the_setting(self) -> None: # Every public first-level submodule of a package the validator admits whole, as reviewed on 2026-10-14 # (numpy 2.5, pandas 3.0, matplotlib 3.11, seaborn 0.13, scikit-learn 1.9, statsmodels 0.15) and, by the -# import-surface survey of 2026-10-24, plotnine 0.15, mizani 0.14 and altair 6.3: it is either here, reviewed as -# computing and drawing only, or banned by name in the validator. A library upgrade that adds a submodule fails +# import-surface survey of 2026-10-24, plotnine 0.15, mizani 0.14, altair 6.3, pygal 3.1.3, cairosvg 2.9.1 and +# lets-plot 4.11.0: it is either here, reviewed as computing and drawing only, or banned by name in the validator (on +# every receiver, or on its own module in `MODULE_ESCAPES`). A library upgrade that adds a submodule fails # `test_every_submodule_is_reviewed` until someone looks at it. REVIEWED_SUBMODULES: dict[str, frozenset[str]] = { "numpy": frozenset( @@ -1534,14 +1537,30 @@ def test_messages_never_echo_the_setting(self) -> None: "mizani": frozenset("bounds breaks formatters labels palettes scale transforms typing utils".split()), # `datasets` (fetches over the network) and `jupyter` (re-exports `find_spec`) are banned by name. "altair": frozenset("expr theme typing utils vegalite".split()), + # Surveys of 2026-10-24 (pygal 3.1.3, cairosvg 2.9.1, lets-plot 4.11.0). pygal's `etree` (its ElementTree + # proxy) and `test` are banned by name; cairosvg's `css`, `features`, `image`, `parser`, `surface`, `url` and + # `test_api` on their module (`MODULE_ESCAPES`); lets-plot's `frontend_context`, `geo_data`, `settings_utils`, + # `tilesets` and the plot package's `geom_livemap_` by name. `lets_plot.plot` is pinned too: it holds the livemap. + "pygal": frozenset( + "adapters colors config formatters graph interpolate maps serie state stats style svg table util view".split() + ), + "cairosvg": frozenset("bounding_box colors defs helpers path shapes svg text".split()), + "lets_plot": frozenset("bistro export geo_data_internals mapping plot".split()), + "lets_plot.plot": frozenset( + "annotation coord core expand_limits_ facet font_features geom geom_extras geom_function_ geom_imshow_ " + "ggbunch_ ggdeck_ gggrid_ ggtb_ guide label marginal_layer plot pos sampling sandbox_ scale " + "scale_colormap_mpl scale_convenience scale_identity_ scale_position series_meta stat subplots " + "subplots_util theme_ theme_set tooltip util".split() + ), } @pytest.mark.parametrize("root", sorted(REVIEWED_SUBMODULES)) def test_every_submodule_is_reviewed(root: str) -> None: - """A public submodule is reviewed as safe, or the validator bans its name on every receiver.""" + """A public submodule is reviewed as safe, or the validator bans its name on every receiver or on its module.""" package = pytest.importorskip(root) - banned = ESCAPE_ATTRIBUTES | UNSAFE_SUBMODULES | UNSAFE_HELPERS | BANNED_ATTRIBUTES | BANNED_IO + on_module = {path.rpartition(".")[2] for path in MODULE_ESCAPES if path.rpartition(".")[0] == root} + banned = ESCAPE_ATTRIBUTES | UNSAFE_SUBMODULES | UNSAFE_HELPERS | BANNED_ATTRIBUTES | BANNED_IO | on_module found = {info.name for info in pkgutil.iter_modules(package.__path__) if not info.name.startswith("_")} unreviewed = sorted(found - REVIEWED_SUBMODULES[root] - banned) assert not unreviewed, f"review these {root} submodules and add them to REVIEWED_SUBMODULES or ban them" @@ -1608,6 +1627,10 @@ def library_plot(library: str, body: str = "") -> str: return plotnine_plot(body) if library == "altair": return altair_plot(body) + if library == "pygal": + return pygal_plot(body) + if library == "letsplot": + return letsplot_plot(body) return plot(("import seaborn as sns\n" if library == "seaborn" else "") + body) @@ -1782,6 +1805,22 @@ def test_an_argument_the_walk_cannot_read_is_refused(self, expression: str) -> N opaque = ("as string literals, not as an expression", "takes ** only from a dict literal") assert any(f.rule == "banned-call" and f.message.endswith(opaque) for f in findings), findings + @pytest.mark.parametrize( + "rebinding", + [ + pytest.param("match 'open(\"x\").read()':\n case COLUMN:\n pass\n", id="match capture"), + pytest.param("for COLUMN in ['open(\"x\").read()']:\n pass\n", id="loop target"), + pytest.param("from textwrap import dedent as COLUMN\n", id="import"), + pytest.param("def COLUMN():\n return 1\n", id="function name"), + ], + ) + def test_a_name_bound_twice_is_not_read_as_its_literal(self, rebinding: str) -> None: + """`COLUMN = "a"` and then `case COLUMN:` would hand plotnine the subject string, which the walk never saw + (the validator pass of 2026-10-26: the 1b rule counted only assignments and passed the match capture).""" + body = EXPRESSION_IMPORTS + 'COLUMN = "a"\n' + rebinding + "m = aes(x=COLUMN)\n" + findings = validate_security(plotnine_plot(body), library="plotnine") + assert any(f.message == "aes takes its column names as string literals, not as an expression" for f in findings) + def test_literal_arguments_the_walk_can_read_pass(self) -> None: body = EXPRESSION_IMPORTS + ( 'COLUMN = "a"\n' @@ -2008,6 +2047,601 @@ def test_data_transformer_that_writes_a_file_is_refused(self, body: str) -> None assert rules_of(altair_plot(body), "altair") != set() +# --- pygal and lets-plot (step 1c of agentic/specs/261024-agent-all-libraries.md) ------------------------------ + +PYGAL_HEADER = """import os + +import pygal +from pygal.style import Style + +THEME = os.getenv("ANYPLOT_THEME", "light") +PAGE_BG = "#FAF8F1" if THEME == "light" else "#1A1A17" +INK = "#1A1A17" if THEME == "light" else "#F0EFE8" +IMPRINT = ["#009E73", "#C475FD", "#4467A3"] +""" +# The catalogue's chart: pygal's own stylesheets before an inline rule (14 files), no tooltip script (30 files). +PYGAL_CSS = 'css=("file://style.css", "file://graph.css", "inline:.axis .line { stroke-opacity: .25; }")' +PYGAL_CHART = ( + "style = Style(background=PAGE_BG, plot_background=PAGE_BG, foreground=INK, colors=IMPRINT)\n" + 'chart = pygal.XY(width=3200, height=1800, style=style, title="", js=[], ' + + PYGAL_CSS + + ', value_formatter=lambda v: f"{v:.0f}%")\n' + 'chart.add("a", [(1, 2), (3, 4)])\n' +) +PYGAL_PNG_SAVE = 'chart.render_to_png(f"plot-{THEME}.png")' +PYGAL_HTML_SAVE = 'chart.render_to_file(f"plot-{THEME}.html")' +PYGAL_FOOTER = "\n" + PYGAL_CHART + PYGAL_PNG_SAVE + "\n" + PYGAL_HTML_SAVE + "\n" +SVG2PNG = 'cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png")' +LETSPLOT_HEADER = """import os + +import pandas as pd +from lets_plot import LetsPlot, aes, geom_point, ggplot, ggsize, labs, layer_tooltips +from lets_plot.export import ggsave + +LetsPlot.setup_html() + +THEME = os.getenv("ANYPLOT_THEME", "light") +df = pd.DataFrame({"a": [1, 2, 3]}) +""" +LETSPLOT_PLOT = ( + 'plot = ggplot(df, aes(x="a", y="a")) + geom_point(tooltips=layer_tooltips().line("@a").format("@a", ".1f"))' + ' + labs(title="") + ggsize(1600, 900)\n' +) +LETSPLOT_PNG_SAVE = 'ggsave(plot, f"plot-{THEME}.png", path=".", scale=2)' +LETSPLOT_HTML_SAVE = 'ggsave(plot, f"plot-{THEME}.html", path=".")' +LETSPLOT_FOOTER = "\n" + LETSPLOT_PLOT + LETSPLOT_PNG_SAVE + "\n" + LETSPLOT_HTML_SAVE + "\n" + + +def pygal_plot(body: str = "") -> str: + """A minimal valid pygal file in the catalogue's shape, PNG and HTML saves included, with `body` before the chart.""" + return PYGAL_HEADER + body + PYGAL_FOOTER + + +def letsplot_plot(body: str = "") -> str: + """A minimal valid lets-plot file in the catalogue's normalised shape, with `body` before the plot.""" + return LETSPLOT_HEADER + body + LETSPLOT_FOOTER + + +PYGAL_ROUTES = [ + pytest.param("t = chart.render_tree()\n", {"banned-attribute"}, id="render_tree hands out the live tree"), + pytest.param("chart.render_in_browser()\n", {"banned-attribute"}, id="render_in_browser"), + pytest.param("t = chart.render_table()\n", {"banned-attribute"}, id="render_table"), + pytest.param("r = chart.render_response()\n", {"banned-attribute"}, id="render_response"), + pytest.param("chart.add_xml_filter(lambda tree: tree)\n", {"banned-attribute"}, id="add_xml_filter"), + pytest.param('x = pygal.util.cut([IMPRINT], "copy")\n', {"banned-attribute"}, id="cut, a getattr by string"), + pytest.param("from pygal.util import template\n", {"banned-attribute"}, id="template, a str.format"), + pytest.param("e = pygal.entry_points\n", {"banned-attribute"}, id="plugin entry points"), + pytest.param("e = pygal.etree\n", {"banned-attribute"}, id="ElementTree proxy"), + pytest.param("e = pygal.svg.etree\n", {"banned-attribute"}, id="ElementTree proxy re-exported"), + pytest.param("from pygal.etree import etree\n", {"banned-import", "banned-attribute"}, id="from pygal.etree"), + pytest.param('chart.config._update({"js": ["x.js"]})\n', {"banned-attribute"}, id="config merge"), + pytest.param("import cairosvg\ns = cairosvg.SURFACES\n", {"banned-attribute"}, id="SURFACES"), + pytest.param( + 'import cairosvg\ncairosvg.svg2pdf(bytestring=b"", write_to="x.pdf")\n', {"banned-attribute"}, id="svg2pdf" + ), + pytest.param("import cairosvg\nc = cairosvg.surface.cairo\n", {"banned-attribute"}, id="cairocffi in surface"), + pytest.param("import cairosvg\nf = cairosvg.helpers.cairo.ffi\n", {"banned-attribute"}, id="cairocffi in helpers"), + pytest.param("from cairosvg.surface import PNGSurface\n", {"banned-import", "banned-attribute"}, id="a surface"), + pytest.param("import cairosvg.parser\n", {"banned-import"}, id="parser import"), + pytest.param('import cairosvg\nb = cairosvg.url.fetch("x")\n', {"banned-attribute"}, id="url fetch"), + pytest.param('import cairosvg\np = cairosvg.Path("x")\n', {"banned-attribute"}, id="re-exported Path"), + pytest.param("import cairosvg\np = cairosvg.ROOT.parent\n", {"banned-attribute"}, id="ROOT, a Path instance"), + pytest.param("import cairosvg\ni = cairosvg.image.Image\n", {"banned-attribute"}, id="PIL in image"), + pytest.param("import cairosvg\nc = cairosvg.css.cssselect2\n", {"banned-attribute"}, id="cssselect2 in css"), + pytest.param("import cairosvg\nc = [cairosvg.colors][0].tinycss2\n", {"banned-attribute"}, id="tinycss2 by name"), + pytest.param("import cairosvg\nt = cairosvg.test_api\n", {"banned-attribute"}, id="test_api"), +] +PYGAL_NEAR_ROUTES = [ + pytest.param("svg = chart.render()\n", id="render"), + pytest.param("svg = chart.render(is_unicode=True)\n", id="render as text"), + pytest.param("uri = chart.render_data_uri()\n", id="render_data_uri"), + pytest.param('chart.x_labels = ["a", "b"]\n', id="labels"), + pytest.param('style2 = Style(font_family="DejaVu Sans, sans-serif")\n', id="a local font"), + pytest.param("from pygal.formatters import Significant\nf = Significant()\n", id="a formatter"), + pytest.param("import cairosvg\nv = cairosvg.VERSION\n", id="cairosvg's version string"), +] +PYGAL_CONFIG_ROUTES = [ + pytest.param('c2 = pygal.Bar(js=["//cdn.example/x.js"])\n', {"banned-keyword"}, id="a script fetched"), + pytest.param('c2 = pygal.Bar(js=["file:///etc/passwd"])\n', {"banned-keyword", "url-literal"}, id="a script read"), + pytest.param('c2 = pygal.Bar(css=["file:///etc/passwd"])\n', {"banned-keyword", "url-literal"}, id="a file read"), + pytest.param('c2 = pygal.Bar(css=["fi" + "le:///etc/passwd"])\n', {"banned-keyword"}, id="a built entry"), + pytest.param('p = "x"\nc2 = pygal.Bar(css=[f"{p}inline:a"])\n', {"banned-keyword"}, id="f-string head"), + pytest.param('c2 = pygal.Bar(css="inline:a")\n', {"banned-keyword"}, id="not a list"), + pytest.param('C = ["inline:a"]\nC = ["x"]\nc2 = pygal.Bar(css=C)\n', {"banned-keyword"}, id="name bound twice"), + pytest.param( + 'C = ["inline:a"]\nC.append("fi" + "le:///x")\nc2 = pygal.Bar(css=C)\n', {"banned-keyword"}, id="list mutated" + ), + pytest.param('c2 = pygal.Bar(defs=["<x/>"])\n', {"banned-keyword"}, id="defs"), + pytest.param('chart.defs = ["<x/>"]\n', {"banned-attribute"}, id="defs attribute"), + pytest.param('chart.css = ["fi" + "le:///x"]\n', {"banned-keyword"}, id="attribute with a built entry"), + pytest.param('chart.css += ["fi" + "le:///x"]\n', {"banned-attribute"}, id="augmented"), + pytest.param('chart.css.append("inline:a")\n', {"banned-attribute"}, id="mutator"), + pytest.param('chart.css[0] = "inline:a"\n', {"banned-attribute"}, id="item store"), + pytest.param("c = chart.css\n", {"banned-attribute"}, id="read"), + pytest.param("del chart.js\n", {"banned-attribute"}, id="delete"), + pytest.param("chart.js, n = [], 1\n", {"banned-attribute"}, id="unpacked target"), + pytest.param('o = {}\no["c" + "ss"] = ["x"]\nc2 = pygal.Bar(**o)\n', {"banned-keyword"}, id="** built"), + pytest.param('c2 = pygal.Bar(**{"css": ["fi" + "le:///x"]})\n', {"banned-keyword"}, id="** literal, bad css"), + pytest.param('c2 = pygal.Bar(**{"c" + "ss": ["x"]})\n', {"banned-keyword"}, id="** built key"), + pytest.param('O = {"width": 800}\nO["js"] = ["x"]\nc2 = pygal.Bar(**O)\n', {"banned-keyword"}, id="** mutated"), + pytest.param('c2 = pygal.Bar(**{**{"js": []}})\n', {"banned-keyword"}, id="** nested unpacking"), + pytest.param('cfg = pygal.Config(js=["x.js"])\n', {"banned-keyword"}, id="Config"), + pytest.param('c2 = chart(css=["x.css"])\n', {"banned-keyword"}, id="a chart called with options"), + pytest.param('s = Style(font_family="googlefont:Roboto")\n', {"url-literal"}, id="Google font"), + pytest.param('f = "Roboto"\ns = Style(title_font_family=f"googlefont:{f}")\n', {"url-literal"}, id="font f-string"), + pytest.param('s = "file://style.css"\n', {"url-literal"}, id="a package stylesheet outside a css list"), +] +PYGAL_CONFIG_SIBLINGS = [ + pytest.param("c2 = pygal.Bar(js=())\n", id="js empty tuple"), + pytest.param('c2 = pygal.Bar(js=[], css=["inline:.a { fill: red; }"])\n', id="inline css"), + pytest.param( + 'CSS = ("file://style.css", "file://graph.css", "inline:.a { fill: red; }")\n' + "c2 = pygal.Bar(js=[], css=CSS)\nc3 = pygal.Line(css=CSS)\n", + id="a css list bound once", + ), + pytest.param( + 'EXTRA = "inline:.b { opacity: .5; }"\nc2 = pygal.Bar(css=["file://base.css", EXTRA])\n', + id="an entry bound once", + ), + pytest.param('x = 2\nc2 = pygal.Bar(css=[f"inline:.a {{ stroke-width: {x}; }}"])\n', id="inline f-string"), + pytest.param('chart.css = ["file://style.css", "inline:.c { fill: none; }"]\n', id="css attribute"), + pytest.param("chart.js = []\n", id="js attribute"), + pytest.param( + 'OPTIONS = {"width": 3200, "height": 1800, "js": []}\nc2 = pygal.Bar(**OPTIONS, title="")\n' + "c3 = pygal.Line(**OPTIONS)\n", + id="** a dict bound once", + ), + pytest.param('c2 = pygal.Bar(**{"show_legend": False})\n', id="** a dict literal"), +] +SVG_NAMESPACE_LOOKALIKES = [ + pytest.param("http://www.w3.org/2000/svgevil.example/x", id="name continued"), + pytest.param("http://www.w3.org/2000/svg/../x", id="path continued"), + pytest.param("http://www.w3.org/2000/svg http://evil.example", id="a second URL"), + pytest.param("https://www.w3.org/2000/svg", id="https"), + pytest.param("HTTP://WWW.W3.ORG/2000/SVG", id="upper case"), + pytest.param("{http://www.w3.org/2000/svg.x}a", id="Clark name continued"), + pytest.param("http://www.w3.org/1999/xlinks", id="xlink continued"), +] + + +class TestPygalProfile: + """pygal: pygal and cairosvg only, a PNG and an HTML save, pygal's config and its SVG namespaces.""" + + def test_minimal_file_has_no_findings(self) -> None: + assert validate_security(pygal_plot(), library="pygal") == [] + + @pytest.mark.parametrize( + "body", + [ + "import cairosvg\n", + "from cairosvg import svg2png\n", + "import pygal.style\n", + "from pygal import formatters\n", + "import numpy as np\n", + "from scipy import stats\n", + ], + ) + def test_allowed_import(self, body: str) -> None: + assert rules_of(pygal_plot(body), "pygal") == set() + + @pytest.mark.parametrize( + "body", + [ + "import xml.etree.ElementTree as ET\n", + "from xml.etree import ElementTree\n", + "from PIL import Image\n", + "import io\n", + "import cairocffi\n", + "import cssselect2\n", + "import matplotlib.colors\n", + "import pygal.etree\n", + "import cairosvg.url as url\n", + "from pygal_maps_world.maps import World\n", + "import lets_plot\n", + ], + ) + def test_banned_import(self, body: str) -> None: + assert "banned-import" in rules_of(pygal_plot(body), "pygal") + + @pytest.mark.parametrize( + ("old", "new"), + [ + pytest.param(PYGAL_PNG_SAVE, 'chart.render_to_png(filename=f"plot-{THEME}.png", dpi=96)', id="filename="), + pytest.param(PYGAL_PNG_SAVE, "import cairosvg\n" + SVG2PNG, id="svg2png"), + pytest.param( + PYGAL_PNG_SAVE, + "import cairosvg\n" + 'cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png", output_width=3200, ' + "output_height=1800, dpi=96, scale=1, background_color=PAGE_BG)", + id="svg2png sized", + ), + pytest.param( + PYGAL_PNG_SAVE, + 'from cairosvg import svg2png\nsvg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png")', + id="svg2png imported", + ), + pytest.param(PYGAL_HTML_SAVE, 'chart.render_to_file(filename=f"plot-{THEME}.html")', id="HTML filename="), + pytest.param(PYGAL_HTML_SAVE, "", id="no HTML"), + ], + ) + def test_save_passes(self, old: str, new: str) -> None: + assert validate_security(swapped(pygal_plot(), old, new), library="pygal") == [] + + @pytest.mark.parametrize( + ("old", "new"), + [ + pytest.param(PYGAL_PNG_SAVE, 'chart.render_to_png("plot.png")', id="other file"), + pytest.param(PYGAL_PNG_SAVE, 'chart.render_to_png(f"plot-{THEME}.svg")', id="other type"), + pytest.param(PYGAL_PNG_SAVE, 'chart.render_to_png(f"plot-{THEME}.png", 300)', id="dpi by position"), + pytest.param(PYGAL_PNG_SAVE, 'chart.render_to_png(f"plot-{THEME}.png", width=800)', id="chart options"), + pytest.param(PYGAL_PNG_SAVE, 'chart.render_to_png(f"plot-{THEME}.png", **{})', id="unpacked keywords"), + pytest.param(PYGAL_PNG_SAVE, "data = chart.render_to_png()\n" + PYGAL_PNG_SAVE, id="bytes, no file"), + pytest.param(PYGAL_HTML_SAVE, 'chart.render_to_file(f"plot-{THEME}.svg")', id="SVG file"), + pytest.param(PYGAL_HTML_SAVE, 'chart.render_to_file(f"plot-{THEME}.html", pretty_print=True)', id="opts"), + pytest.param( + PYGAL_PNG_SAVE, + 'import cairosvg\ncairosvg.svg2png(chart.render(), write_to=f"plot-{THEME}.png")', + id="svg2png by position", + ), + pytest.param( + PYGAL_PNG_SAVE, "import cairosvg\ncairosvg.svg2png(bytestring=chart.render())", id="svg2png bytes" + ), + pytest.param( + PYGAL_PNG_SAVE, + "import cairosvg\ncairosvg.svg2png(bytestring=chart.render(), write_to=handle)", + id="svg2png into a file object", + ), + pytest.param( + PYGAL_PNG_SAVE, + 'import cairosvg\ncairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png", parent=1)', + id="svg2png keyword it does not list", + ), + ], + ) + def test_other_save_is_a_finding(self, old: str, new: str) -> None: + assert rules_of(swapped(pygal_plot(), old, new), "pygal") == {"savefig-target"} + + def test_svg2png_takes_no_positional(self) -> None: + new = 'import cairosvg\ncairosvg.svg2png(chart.render(), write_to=f"plot-{THEME}.png")' + findings = validate_security(swapped(pygal_plot(), PYGAL_PNG_SAVE, new), library="pygal") + assert [f.message for f in findings] == ["svg2png takes every argument by keyword"] + + @pytest.mark.parametrize("keyword", ['url="plot.svg"', "file_obj=handle", "unsafe=True", "url_fetcher=fetcher"]) + def test_svg2png_input_keywords_are_refused(self, keyword: str) -> None: + """`url=` and `file_obj=` read the main input from any path or URL, `unsafe=` and `url_fetcher=` open hrefs.""" + new = f'import cairosvg\ncairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{{THEME}}.png", {keyword})' + assert rules_of(swapped(pygal_plot(), PYGAL_PNG_SAVE, new), "pygal") == {"banned-keyword", "savefig-target"} + + def test_a_file_that_saves_no_png_is_a_finding(self) -> None: + findings = validate_security(swapped(pygal_plot(), PYGAL_PNG_SAVE, ""), library="pygal") + assert [(f.rule, f.message, f.line) for f in findings] == [("savefig-target", NO_PNG_SAVE, None)] + + @pytest.mark.parametrize( + ("body", "expected"), + [ + ("import matplotlib.pyplot as plt\nplt.savefig(f'plot-{THEME}.png')\n", {"banned-import", "banned-call"}), + ("canvas.save(f'plot-{THEME}.png')\n", {"banned-call"}), + ], + ) + def test_other_libraries_saves_are_banned_calls(self, body: str, expected: set[str]) -> None: + """PIL's `.save` pads the PNG in 13 catalogue files; with pygal it is no save of the plot.""" + findings = validate_security(pygal_plot(body), library="pygal") + assert {f.rule for f in findings} == expected + assert any(f.message.endswith("; the plot is saved with save") for f in findings if f.rule == "banned-call") + + @pytest.mark.parametrize(("body", "expected"), PYGAL_ROUTES) + def test_route_is_refused(self, body: str, expected: set[str]) -> None: + assert rules_of(pygal_plot(body), "pygal") == expected + + @pytest.mark.parametrize("body", PYGAL_NEAR_ROUTES) + def test_nearest_allowed_sibling_passes(self, body: str) -> None: + assert rules_of(pygal_plot(body), "pygal") == set() + + @pytest.mark.parametrize(("body", "expected"), PYGAL_CONFIG_ROUTES) + def test_config_that_reads_fetches_or_changes_later_is_refused(self, body: str, expected: set[str]) -> None: + assert rules_of(pygal_plot(body), "pygal") == expected + + @pytest.mark.parametrize("body", PYGAL_CONFIG_SIBLINGS) + def test_config_the_rule_can_read_passes(self, body: str) -> None: + assert rules_of(pygal_plot(body), "pygal") == set() + + def test_svg_namespaces_pass_in_pygal_only(self) -> None: + body = ( + 'NS = {"svg": "http://www.w3.org/2000/svg", "xlink": "http://www.w3.org/1999/xlink"}\n' + 'TAG = "{http://www.w3.org/2000/svg}rect"\n' + "MARKUP = '<svg xmlns=\"http://www.w3.org/2000/svg\"/>'\n" + ) + assert rules_of(pygal_plot(body), "pygal") == set() + assert rules_of(library_plot("matplotlib", body), "matplotlib") == {"url-literal"} + + @pytest.mark.parametrize("text", SVG_NAMESPACE_LOOKALIKES) + def test_a_namespace_lookalike_is_a_url(self, text: str) -> None: + assert rules_of(pygal_plot(f"u = {text!r}\n"), "pygal") == {"url-literal"} + + def test_cut_is_pandas_with_the_other_libraries(self) -> None: + """`cut` is banned in pygal's profile only: `pygal.util.cut` is a getattr by string, `pd.cut` bins values.""" + body = 'bins = pd.cut(df["a"], 3)\n' + assert rules_of(library_plot("matplotlib", body), "matplotlib") == set() + assert rules_of(pygal_plot("import pandas as pd\n" + body), "pygal") == {"banned-attribute"} + + +LETSPLOT_ROUTES = [ + pytest.param('plot.to_png("x.png")\n', {"banned-attribute"}, id="to_png"), + pytest.param('plot.to_svg("x.svg")\n', {"banned-attribute"}, id="to_svg"), + pytest.param('plot.to_pdf("x.pdf")\n', {"banned-attribute"}, id="to_pdf"), + pytest.param('plot.to_html("x.html")\n', {"banned-call"}, id="to_html"), + pytest.param("plot.show()\n", {"banned-attribute"}, id="show"), + pytest.param("p = geom_point().props()\n", {"banned-attribute"}, id="props hands out the spec dict"), + pytest.param('LetsPlot.setup_show_ext(exec="sh -c id")\n', {"banned-attribute", "banned-call"}, id="browser"), + pytest.param('LetsPlot.set({"js_url_manual": "x"})\n', {"banned-attribute", "banned-call"}, id="LetsPlot.set"), + pytest.param("LetsPlot.set_theme(None)\n", {"banned-call"}, id="another LetsPlot method"), + pytest.param("LetsPlot.setup_html(offline=True)\n", {"banned-call"}, id="setup_html with arguments"), + pytest.param("lp = LetsPlot\n", {"banned-call"}, id="LetsPlot as a value"), + pytest.param("import lets_plot\n[lets_plot.LetsPlot][0].set({})\n", {"banned-call"}, id="LetsPlot in a list"), + pytest.param("import lets_plot\nc = lets_plot.cfg\n", {"banned-attribute"}, id="cfg"), + pytest.param("from lets_plot import cfg\n", {"banned-attribute"}, id="from lets_plot import cfg"), + pytest.param( + 'import lets_plot.plot.core as core\nm = core.LazyModule("subprocess")\n', {"banned-attribute"}, id="LazyModule" + ), + pytest.param( + 'import lets_plot.plot.geom_imshow_ as gi\nr = gi.png.Reader(filename="x")\n', + {"banned-attribute"}, + id="png proxy", + ), + pytest.param( + "import lets_plot.plot.geom_imshow_ as gi\np = gi.palettable\n", {"banned-attribute"}, id="palettable" + ), + pytest.param("import lets_plot.plot.geom as g\np = g.geopandas\n", {"banned-attribute"}, id="geopandas proxy"), + pytest.param("import lets_plot\np = lets_plot.extend_path\n", {"banned-attribute"}, id="pkgutil.extend_path"), + pytest.param("from lets_plot import geom_livemap\n", {"banned-attribute"}, id="livemap"), + pytest.param("from lets_plot import maptiles_zxy\n", {"banned-attribute"}, id="map tiles"), + pytest.param("import lets_plot\ng = lets_plot.geo_data\n", {"banned-attribute"}, id="geo_data by attribute"), +] +LETSPLOT_NEAR_ROUTES = [ + pytest.param('from lets_plot import scale_y_continuous\ns = scale_y_continuous(format="{.0f} %")\n', id="format="), + pytest.param( + 'from lets_plot import layer_labels\nl = layer_labels().line("@a").format("@a", "d").size(10)\n', id="labels" + ), + pytest.param( + 'from lets_plot import smooth_labels\nl = smooth_labels().eq(lhs="y").format("^R2", ".2f").label_x("left")\n', + id="smooth labels", + ), + pytest.param( + 't = layer_tooltips(["a"]).format(field="@a", format=".0f").title("x").anchor("top_right").min_width(50)\n', + id="tooltips by keyword", + ), + pytest.param("d = layer_tooltips().as_dict()\n", id="as_dict"), + pytest.param('from lets_plot.mapping import as_discrete\nm = as_discrete("a")\n', id="mapping"), + pytest.param("from lets_plot import gggrid\ng = gggrid([ggplot(df)])\n", id="gggrid"), +] +LETSPLOT_FORMAT_ROUTES = [ + pytest.param('t = "{0}".format(1)\n', id="a string's format"), + pytest.param('tt = layer_tooltips()\nt = tt.format("@a", ".1f")\n', id="a builder bound to a name"), + pytest.param('layer_tooltips = str\nt = layer_tooltips("{0}").format("@a")\n', id="the builder name rebound"), + pytest.param( + 'match str:\n case layer_tooltips:\n pass\nt = layer_tooltips("{0}").format("@a")\n', + id="match capture", + ), + pytest.param('def f(layer_tooltips):\n return layer_tooltips("{0}").format("@a")\n', id="parameter"), + pytest.param( + 'import lets_plot\nlets_plot.layer_tooltips = str\nt = layer_tooltips("{0}").format("@a")\n', + id="the library's attribute replaced", + ), + pytest.param('v = "@a"\nt = layer_tooltips().format(v, ".1f")\n', id="a non-literal argument"), + pytest.param('t = layer_tooltips().format(*["@a"])\n', id="starred"), + pytest.param('t = layer_tooltips().format("@a", spec=".1f")\n', id="another keyword"), + pytest.param('t = layer_tooltips().as_dict().format("a")\n', id="as_dict in the chain"), + pytest.param('t = layer_tooltips().line("@a").upper().format("a")\n', id="a method outside the builder's"), + pytest.param('import lets_plot as lp\nt = lp.layer_tooltips().format("@a")\n', id="through the module"), + pytest.param( + 'from lets_plot.plot.tooltip import layer_tooltips as lt\nt = lt().format("@a")\n', id="another import path" + ), + pytest.param('f = layer_tooltips().format\nt = f("@a")\n', id="not called"), +] + + +class TestLetsplotProfile: + """lets-plot: lets_plot only, `ggsave` into `.`, `LetsPlot.setup_html()`, the builders' `.format`.""" + + def test_minimal_file_has_no_findings(self) -> None: + assert validate_security(letsplot_plot(), library="letsplot") == [] + + @pytest.mark.parametrize( + "body", + [ + "import lets_plot\n", + "from lets_plot import ggsave\n", + "from lets_plot.mapping import as_discrete\n", + "from lets_plot.bistro.corr import corr_plot\n", + "import numpy as np\n", + "from scipy import stats\n", + ], + ) + def test_allowed_import(self, body: str) -> None: + assert rules_of(letsplot_plot(body), "letsplot") == set() + + @pytest.mark.parametrize( + "body", + [ + "from lets_plot.geo_data import geocode_countries\n", + "import lets_plot.geo_data\n", + "from lets_plot import tilesets\n", + "import lets_plot.settings_utils\n", + "import lets_plot.frontend_context\n", + "from lets_plot.plot.geom_livemap_ import geom_livemap\n", + "import matplotlib.pyplot as plt\n", + "from PIL import Image\n", + "import shutil\n", + "import pygal\n", + ], + ) + def test_banned_import(self, body: str) -> None: + assert "banned-import" in rules_of(letsplot_plot(body), "letsplot") + + def test_star_import_is_refused(self) -> None: + """The normaliser expands `from lets_plot import *` (151 catalogue files); left in, it is a finding.""" + assert rules_of(letsplot_plot("from lets_plot import *\n"), "letsplot") == {"star-import"} + + @pytest.mark.parametrize( + ("old", "new"), + [ + pytest.param( + LETSPLOT_PNG_SAVE, 'ggsave(plot, filename=f"plot-{THEME}.png", path=".", scale=4)', id="file=" + ), + pytest.param( + LETSPLOT_PNG_SAVE, + 'ggsave(plot, f"plot-{THEME}.png", path=".", w=3200, h=1800, unit="px", dpi=96)', + id="pixel size", + ), + pytest.param(LETSPLOT_PNG_SAVE, 'ggsave(plot, f"plot-{THEME}.png", path=".")', id="no scale"), + pytest.param(LETSPLOT_HTML_SAVE, 'ggsave(plot, filename=f"plot-{THEME}.html", path=".")', id="HTML file="), + pytest.param(LETSPLOT_HTML_SAVE, "", id="no HTML"), + ], + ) + def test_save_passes(self, old: str, new: str) -> None: + assert validate_security(swapped(letsplot_plot(), old, new), library="letsplot") == [] + + @pytest.mark.parametrize( + ("old", "new"), + [ + pytest.param(LETSPLOT_PNG_SAVE, 'ggsave(plot, f"plot-{THEME}.png", scale=2)', id="no path"), + pytest.param(LETSPLOT_PNG_SAVE, 'ggsave(plot, f"plot-{THEME}.png", path="/tmp")', id="another path"), + pytest.param(LETSPLOT_PNG_SAVE, 'ggsave(plot, f"plot-{THEME}.png", path=str(d))', id="computed path"), + pytest.param(LETSPLOT_HTML_SAVE, 'ggsave(plot, f"plot-{THEME}.html")', id="HTML without a path"), + pytest.param(LETSPLOT_HTML_SAVE, 'ggsave(plot, f"plot-{THEME}.svg", path=".")', id="SVG"), + pytest.param(LETSPLOT_PNG_SAVE, 'ggsave(plot, "plot.png", path=".")', id="old-form file"), + pytest.param(LETSPLOT_PNG_SAVE, 'ggsave(plot, f"plot-{THEME}.png", ".")', id="path by position"), + pytest.param(LETSPLOT_HTML_SAVE, 'ggsave(plot, f"plot-{THEME}.html", path=".", iframe=False)', id="if"), + pytest.param(LETSPLOT_PNG_SAVE, 'ggsave(plot, f"plot-{THEME}.png", **{"path": "."})', id="unpacked"), + pytest.param(LETSPLOT_PNG_SAVE, 'ggsave(plot=plot, filename=f"plot-{THEME}.png", path=".")', id="plot="), + ], + ) + def test_other_save_is_a_finding(self, old: str, new: str) -> None: + assert rules_of(swapped(letsplot_plot(), old, new), "letsplot") == {"savefig-target"} + + def test_a_save_without_the_directory_names_it(self) -> None: + """Without `path=`, lets-plot creates `./lets-plot-images` and writes there (the render guard refuses it).""" + code = swapped(letsplot_plot(), LETSPLOT_PNG_SAVE, 'ggsave(plot, f"plot-{THEME}.png", scale=2)') + assert [f.message for f in validate_security(code, library="letsplot")] == ['ggsave must save with path="."'] + + def test_a_file_that_saves_no_png_is_a_finding(self) -> None: + findings = validate_security(swapped(letsplot_plot(), LETSPLOT_PNG_SAVE, ""), library="letsplot") + assert [(f.rule, f.message, f.line) for f in findings] == [("savefig-target", NO_PNG_SAVE, None)] + + @pytest.mark.parametrize(("body", "expected"), LETSPLOT_ROUTES) + def test_route_is_refused(self, body: str, expected: set[str]) -> None: + assert rules_of(letsplot_plot(body), "letsplot") == expected + + @pytest.mark.parametrize("body", LETSPLOT_NEAR_ROUTES) + def test_nearest_allowed_sibling_passes(self, body: str) -> None: + assert rules_of(letsplot_plot(body), "letsplot") == set() + + @pytest.mark.parametrize("body", LETSPLOT_FORMAT_ROUTES) + def test_format_outside_a_builder_chain_is_refused(self, body: str) -> None: + findings = validate_security(letsplot_plot(body), library="letsplot") + assert ("banned-attribute", "attribute '.format' is not allowed") in {(f.rule, f.message) for f in findings} + + def test_a_dunder_in_a_builder_format_still_fails(self) -> None: + body = 't = layer_tooltips().format("@a", "{0.__class__}")\n' + assert rules_of(letsplot_plot(body), "letsplot") == {"dunder"} + + def test_the_builder_exemption_is_lets_plots(self) -> None: + """In another profile the same chain is an ordinary `.format`.""" + body = 'from plotnine import labs as layer_tooltips\nt = layer_tooltips().format("@a", ".1f")\n' + assert "banned-attribute" in rules_of(plotnine_plot(body), "plotnine") + + +# The save rule finds a save by its callee's name, so a save reached under another name escapes it: open in the 1b +# plotnine profile (the lets-plot draft of 2026-10-26, alias_probe.py). One save name per profile, its import and +# a call that writes elsewhere. +SAVE_NAME_CASES = [ + pytest.param("plotnine", "from plotnine import ggsave\n", "ggsave", 'plot, "/tmp/x.pdf"', id="plotnine"), + pytest.param( + "pygal", "from cairosvg import svg2png\n", "svg2png", 'bytestring=b"", write_to="/tmp/x.png"', id="pygal" + ), + pytest.param("letsplot", "", "ggsave", 'plot, "/tmp/x.pdf", path="/tmp"', id="letsplot"), +] +SAVE_NAME_ROUTES = [ + pytest.param("from {module} import {name} as keep\nkeep({args})\n", {"banned-call"}, id="imported as"), + pytest.param("from textwrap import dedent as {name}\n", {"banned-call"}, id="imported under a save name"), + pytest.param("g = {name}\ng({args})\n", {"banned-call"}, id="assigned"), + pytest.param("[{name}][0]({args})\n", {"banned-call"}, id="in a list"), + pytest.param("import functools\nfunctools.partial({name})({args})\n", {"banned-call"}, id="partial"), + # The wrapper calls the save where it is named, so the save rule sees its starred target (pygal's profile also + # refuses a `**k` it cannot read, so the wrapper forwards positionals only). + pytest.param("w = lambda *a: {name}(*a)\nw({args})\n", {"savefig-target"}, id="lambda wrapper"), + pytest.param("g = getattr(df, '{name}')\n", {"banned-name"}, id="getattr"), +] + + +@pytest.mark.parametrize(("library", "imports", "name", "args"), SAVE_NAME_CASES) +@pytest.mark.parametrize(("template", "expected"), SAVE_NAME_ROUTES) +def test_a_save_reached_under_another_name_is_refused( + library: str, imports: str, name: str, args: str, template: str, expected: set[str] +) -> None: + module = {"plotnine": "plotnine", "pygal": "cairosvg", "letsplot": "lets_plot.export"}[library] + body = imports + template.format(module=module, name=name, args=args) + assert rules_of(library_plot(library, body), library) == expected + + +@pytest.mark.parametrize( + ("library", "body"), + [ + pytest.param("plotnine", "from plotnine import ggsave as ggsave\n", id="plotnine, imported as itself"), + pytest.param( + "pygal", + 'from cairosvg import svg2png\nsvg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png")\n', + id="pygal, called where named", + ), + pytest.param("letsplot", "from lets_plot import ggsave\n", id="letsplot, imported twice under its name"), + ], +) +def test_a_save_name_under_its_own_name_passes(library: str, body: str) -> None: + assert rules_of(library_plot(library, body), library) == set() + + +def test_a_save_name_in_a_plotnine_expression_is_refused() -> None: + """plotnine evaluates the string in the plot's namespace, where `ggsave` is bound.""" + body = "from plotnine import ggsave\nm = aes(x=\"(lambda g: g(df, '/tmp/x.pdf'))(ggsave)\")\n" + findings = validate_security(plotnine_plot(body), library="plotnine") + assert [(f.rule, f.message) for f in findings] == [ + ("banned-call", "in the aes expression: 'ggsave' may only be called directly") + ] + + +LIBRARY_ROOTS = {"altair": "altair", "pygal": "pygal", "letsplot": "lets_plot"} + + +@pytest.mark.parametrize( + ("library", "name"), [(library, name) for library, names in sorted(LIBRARY_BANS.items()) for name in sorted(names)] +) +def test_a_library_ban_is_refused_on_any_receiver_and_as_an_import(library: str, name: str) -> None: + for body in (f"x = obj.{name}\n", f"from {LIBRARY_ROOTS[library]} import {name}\n"): + assert rules_of(library_plot(library, body), library) == {"banned-attribute"}, body + + +LETSPLOT_HELPERS = ( + "to_png to_svg to_pdf setup_show_ext WebBrHtmlPageContext LazyModule geom_livemap maptiles_zxy maptiles_lets_plot " + "maptiles_solid maptiles_chessboard geocoding_service geocode geocode_cities geocode_counties geocode_states " + "geocode_countries reverse_geocode get_geocodes get_centroids get_boundaries get_limits extend_path".split() +) + + +@pytest.mark.parametrize("library", ["letsplot", "matplotlib"]) +@pytest.mark.parametrize("name", LETSPLOT_HELPERS) +def test_a_lets_plot_helper_is_refused_in_every_profile(library: str, name: str) -> None: + """No catalogue file of another library uses these names, so they are banned everywhere (`UNSAFE_HELPERS`).""" + assert rules_of(library_plot(library, f"x = obj.{name}\n"), library) == {"banned-attribute"} + + +def test_a_save_name_as_a_value_is_refused_in_plot_and_data_code() -> None: + findings = validate_security(plot("s = savefig\n"), library="matplotlib") + assert [(f.rule, f.message) for f in findings] == [("banned-call", "'savefig' may only be called directly")] + assert ("banned-call", "'savefig' may only be called directly") in { + (f.rule, f.message) for f in validate_data_code("import pandas as pd\ns = savefig\ndf = pd.DataFrame()\n") + } + + # `np.save` shares its name with the `save` of plotnine and altair: the save rule resolves the receiver, and a # module outside the plotting library is never the plot's save (finding of the 1b review, 2026-10-25). @pytest.mark.parametrize("library", CODE_LIBRARIES) diff --git a/tests/unit/agents/renderer/test_commands.py b/tests/unit/agents/renderer/test_commands.py index d4e0073ec1e..8039bc2463a 100644 --- a/tests/unit/agents/renderer/test_commands.py +++ b/tests/unit/agents/renderer/test_commands.py @@ -1,5 +1,8 @@ """The renderer's command table (agents/renderer/commands.py): one fixed command per language, pinned to the catalogue.""" +import re +from pathlib import Path + import pytest from agents.renderer import commands @@ -37,6 +40,42 @@ def test_python_runs_in_process_and_keeps_every_limit(self) -> None: assert command_for("python", "plotnine").rlimit_as altair = command_for("python", "altair") # vl-convert's V8 reserves address space like Chromium's assert altair.in_process and not altair.rlimit_as and altair.rlimit_nproc + for library in ("matplotlib", "seaborn", "plotnine", "altair", "pygal"): + row = command_for("python", library) + assert row.env == {} and row.rlimit_as_mb is None and row.render_p95_s == 15.0, library + + def test_pygal_keeps_the_python_defaults(self) -> None: + """cairo reserves no address space beyond its resident set; the heaviest catalogue render peaks at 682 MB.""" + assert command_for("python", "pygal") == command_for("python", "matplotlib") + + def test_lets_plot_has_its_own_address_space_limit_and_environment(self) -> None: + """The native bridge needs more than the configured 1 GiB, with Arrow's system allocator (spike 2026-10-26).""" + row = command_for("python", "letsplot") + assert row.in_process and row.argv == () and row.code_file == "plot.py" and row.toolchain == () + assert row.rlimit_as and row.rlimit_as_mb == 2048 and row.rlimit_nproc and row.render_p95_s == 15.0 + assert dict(row.env) == {"ARROW_DEFAULT_MEMORY_POOL": "system", "FONTCONFIG_FILE": "/opt/anyplot/fonts.conf"} + assert commands.FONTCONFIG_FILE == "/opt/anyplot/fonts.conf" + + @pytest.mark.parametrize( + ("rlimit_as", "rlimit_as_mb"), + [ + pytest.param(False, 2048, id="with RLIMIT_AS off"), + pytest.param(True, 0, id="zero"), + pytest.param(True, -1, id="negative"), + ], + ) + def test_a_row_limit_needs_rlimit_as_on_and_a_positive_size(self, rlimit_as: bool, rlimit_as_mb: int) -> None: + with pytest.raises(ValueError, match="own RLIMIT_AS"): + RuntimeCommand("python", "plot.py", (), rlimit_as=rlimit_as, rlimit_as_mb=rlimit_as_mb) + + def test_the_image_carries_the_fontconfig_file_the_row_names(self) -> None: + """`agents/renderer/fonts.conf` is copied to `FONTCONFIG_FILE` by the Dockerfile: one font directory, no + cache directory, so the bridge's fontconfig never writes.""" + renderer = Path(commands.__file__).parent + conf = (renderer / "fonts.conf").read_text(encoding="utf-8") + assert re.findall(r"<dir>([^<]*)</dir>", conf) == ["/usr/share/fonts"] and "<cachedir" not in conf + dockerfile = (renderer / "Dockerfile").read_text(encoding="utf-8") + assert f"COPY agents/renderer/fonts.conf {commands.FONTCONFIG_FILE}\n" in dockerfile def test_the_other_languages_run_the_ci_command_through_exec_mode(self) -> None: js = command_for("javascript", "chartjs") diff --git a/tests/unit/agents/renderer/test_language_rows.py b/tests/unit/agents/renderer/test_language_rows.py index 18f3fcf99b2..039b4dc7933 100644 --- a/tests/unit/agents/renderer/test_language_rows.py +++ b/tests/unit/agents/renderer/test_language_rows.py @@ -51,6 +51,56 @@ def test_a_row_switches_the_limits_it_cannot_live_under(self, config: ExecutorCo data = sandbox_env(limited, None, 20) assert data["ANYPLOT_RLIMIT_AS_MB"] == "1024" and "ANYPLOT_THEME" not in data + def test_an_in_process_row_brings_its_environment_and_its_own_limit(self, config: ExecutorConfig) -> None: + """lets-plot's row: the matplotlib settings, then Arrow's system allocator and the fontconfig file, and its + 2048 MiB in place of the configured `RLIMIT_AS` (spike of 2026-10-26).""" + limited = replace(config, rlimit_as_mb=1024, rlimit_nproc=64) + letsplot = sandbox_env(limited, "light", 60, command=command_for("python", "letsplot")) + + assert letsplot["ANYPLOT_RLIMIT_AS_MB"] == "2048" and letsplot["ANYPLOT_RLIMIT_NPROC"] == "64" + assert letsplot["ARROW_DEFAULT_MEMORY_POOL"] == "system" + assert letsplot["FONTCONFIG_FILE"] == "/opt/anyplot/fonts.conf" + assert letsplot["MPLBACKEND"] == "Agg" and letsplot["ANYPLOT_THEME"] == "light" + assert letsplot["PATH"] == SANDBOX_PATH and letsplot["HOME"] == "/tmp" + # pygal keeps the Python defaults: the same environment as matplotlib's, the configured limit included. + pygal = sandbox_env(limited, "light", 60, command=command_for("python", "pygal")) + assert pygal == sandbox_env(limited, "light", 60, command=command_for("python", "matplotlib")) + assert pygal["ANYPLOT_RLIMIT_AS_MB"] == "1024" and "ARROW_DEFAULT_MEMORY_POOL" not in pygal + + def test_a_row_limit_never_switches_a_configured_off_limit_on(self, config: ExecutorConfig) -> None: + """`RENDERER_RLIMIT_AS_MB=0` turns address-space limits off for every row, lets-plot's own value included.""" + unlimited = sandbox_env(config, "dark", 60, command=command_for("python", "letsplot")) + + assert config.rlimit_as_mb == 0 and "ANYPLOT_RLIMIT_AS_MB" not in unlimited + assert unlimited["ARROW_DEFAULT_MEMORY_POOL"] == "system" + + def test_data_runs_and_conversions_are_unchanged_by_the_python_rows(self, config: ExecutorConfig) -> None: + limited = replace(config, rlimit_as_mb=1024, rlimit_nproc=64) + + data = sandbox_env(limited, None, 20) + assert data["ANYPLOT_RLIMIT_AS_MB"] == "1024" and "ARROW_DEFAULT_MEMORY_POOL" not in data + assert "FONTCONFIG_FILE" not in data and "MPLBACKEND" not in data + convert = sandbox_env(limited, None, 20, convert=True) + assert convert["ANYPLOT_RLIMIT_AS_MB"] == "1024" and convert["ARROW_DEFAULT_MEMORY_POOL"] == "system" + assert "FONTCONFIG_FILE" not in convert + + def test_the_lets_plot_row_runs_the_plot_mode_command(self, config: ExecutorConfig, tmp_path: Path) -> None: + limited = replace(config, rlimit_as_mb=1024) + argv = build_argv(limited, "r-a-light", tmp_path, "light", 60, command=command_for("python", "letsplot")) + + assert argv[argv.index("--") :] == [ + "--", + config.python, + "-I", + "-X", + "disable-remote-debug", + config.harness, + "plot.py", + ] + values = envs(argv) + assert values["ANYPLOT_RLIMIT_AS_MB"] == "2048" and values["ARROW_DEFAULT_MEMORY_POOL"] == "system" + assert EXEC_FLAG not in argv + def test_the_muix_row_writes_a_tsx_file(self, config: ExecutorConfig, tmp_path: Path) -> None: argv = build_argv(config, "r-a-light", tmp_path, "light", 60, command=command_for("javascript", "muix")) diff --git a/tests/unit/agents/runtime/test_harness_guard.py b/tests/unit/agents/runtime/test_harness_guard.py index cc390fddd0b..eb76d9c86be 100644 --- a/tests/unit/agents/runtime/test_harness_guard.py +++ b/tests/unit/agents/runtime/test_harness_guard.py @@ -7,6 +7,7 @@ behind the validator, so these plots and snippets are written as if the validator had missed them. """ +import importlib.util import json import struct import subprocess @@ -70,6 +71,26 @@ def run_data(tmp_path: Path, code: str) -> tuple[int, str | None, str]: # Each writes the marker file (or tries to) through a route the guard must refuse; the payload is text the # route compiles or runs, so a refusal leaves no marker behind. WRITE_MARKER = f"open('{MARKER}', 'w').write('x')" +NO_CSSSELECT2 = pytest.mark.skipif( + importlib.util.find_spec("cssselect2") is None, reason="needs cssselect2 (lib-pygal)" +) + + +def forged_selector(payload: str) -> str: + """A plot body that hands cssselect2's compiler Python objects in place of tokens: a `dimension` whose `int_value` + is `payload` lands unquoted in the `eval` text `CompiledSelector.__init__` builds (`CODE_BUILDERS`), and the + lambda runs it when it tests an element (the pygal spike of 2026-10-26; without a guard it writes the marker).""" + return ( + f"import cssselect2.compiler as compiler\nPAYLOAD = {payload!r}\n" + "class Token:\n def __init__(self, **fields):\n self.__dict__.update(fields)\n" + " def __eq__(self, other):\n return other == self.__dict__.get('eq')\n" + "dimension = Token(type='dimension', is_integer=True, lower_unit='n', int_value=PAYLOAD)\n" + "nth = Token(type='function', lower_name='nth-child', arguments=[dimension], value=None)\n" + "[selector] = compiler.compile_selector_list([Token(type='literal', value=':', eq=':'), nth])\n" + "class Element:\n index = 0\nselector.test(Element())\n" + ) + + PLOT_ROUTES = [ pytest.param(f'np.testing.measure("{WRITE_MARKER}")\n', id="numpy.testing.measure (the reported case)"), pytest.param(f'np.testing.runstring("{WRITE_MARKER}", {{}})\n', id="numpy.testing.runstring"), @@ -158,6 +179,22 @@ def run_data(tmp_path: Path, code: str) -> tuple[int, str | None, str]: f"open('{MARKER}', 'w').write('x')\n", id="gc hands out the guard", ), + # cssselect2's compiler is a `CODE_BUILDERS` entry (pygal's PNG export): an `__init__` anywhere else is not it, + # and code its `eval` built runs under the guard like the plot's own. + pytest.param( + f'class Builder:\n def __init__(self):\n exec("{WRITE_MARKER}")\nBuilder()\n', + id="exec from an __init__ that is not cssselect2's", + ), + pytest.param( + forged_selector(f"1) and {WRITE_MARKER} or (1"), + id="a forged cssselect2 token writes from the built lambda", + marks=NO_CSSSELECT2, + ), + pytest.param( + forged_selector(f'1) and exec("{WRITE_MARKER}") or (1'), + id="a forged cssselect2 token execs from the built lambda", + marks=NO_CSSSELECT2, + ), ] # Fable review of #12181: a trace, profile or signal callback gets the real frame and walks `f_back` (no audit event) # to `run_plot`'s or `run_data_snippet`'s locals, where the guard sits. Each payload disarms whatever guard it finds, @@ -353,6 +390,83 @@ def test_altair_renders_its_png_and_html(self, tmp_path: Path) -> None: assert (tmp_path / "plot-light.png").read_bytes()[:8] == b"\x89PNG\r\n\x1a\n" assert "<html" in (tmp_path / "plot-light.html").read_text(encoding="utf-8") + @pytest.mark.parametrize( + ("imports", "size", "save"), + [ + pytest.param("", (400, 300), "chart.render_to_png(f'plot-{THEME}.png')\n", id="render_to_png"), + pytest.param( + "import cairosvg\n", + (600, 450), + "cairosvg.svg2png(bytestring=chart.render(), write_to=f'plot-{THEME}.png', output_width=400, " + "output_height=300)\n", + id="svg2png, the canvas rewrite's form", + ), + ], + ) + def test_pygal_renders_its_png_and_html( + self, tmp_path: Path, imports: str, size: tuple[int, int], save: str + ) -> None: + """pygal's PNG goes through cairosvg: `warm_cairo` loads libcairo before the guard, and cssselect2 compiles the + chart's stylesheet into lambdas through `eval` (`CODE_BUILDERS`). No matplotlib figure, so no probe.""" + pytest.importorskip("pygal") + pytest.importorskip("cairosvg") + code = ( + f"import os\n\n{imports}import pygal\n\nTHEME = os.environ['ANYPLOT_THEME']\n" + f"chart = pygal.Bar(width={size[0]}, height={size[1]}, title='t')\nchart.add('y', [1, 3, 2])\n" + f"{save}chart.render_to_file(f'plot-{{THEME}}.html')\n" + ) + exit_code, stderr = render_file(tmp_path, code) + assert exit_code == 0, stderr[-3000:] + assert "blocked by the" not in stderr + png = (tmp_path / "plot-light.png").read_bytes() + assert png[:8] == b"\x89PNG\r\n\x1a\n" and struct.unpack(">II", png[16:24]) == (400, 300) + assert "<svg" in (tmp_path / "plot-light.html").read_text(encoding="utf-8") + assert not (tmp_path / "probe-light.json").exists() + + LETS_PLOT = ( + "import os\n\nimport pandas as pd\nfrom lets_plot import LetsPlot, aes, geom_point, ggplot, ggsize\n" + "from lets_plot.export import ggsave\n\nLetsPlot.setup_html()\nTHEME = os.environ['ANYPLOT_THEME']\n" + "df = pd.DataFrame({'x': ['a', 'b', 'c'], 'y': [1.0, 3.0, 2.0]})\n" + "plot = ggplot(df, aes(x='x', y='y')) + geom_point() + ggsize(200, 150)\n" + ) + + def test_lets_plot_renders_its_png_and_html(self, tmp_path: Path) -> None: + """lets-plot rasterises in its native bridge, loaded at import: the guard needs no entry for it, and the two + files `path="."` names are the only writes. No matplotlib figure, so no probe.""" + pytest.importorskip("lets_plot") + code = self.LETS_PLOT + ( + "ggsave(plot, f'plot-{THEME}.png', path='.', scale=2)\nggsave(plot, f'plot-{THEME}.html', path='.')\n" + ) + exit_code, stderr = render_file(tmp_path, code) + assert exit_code == 0, stderr[-3000:] + assert "blocked by the" not in stderr + png = (tmp_path / "plot-light.png").read_bytes() + assert png[:8] == b"\x89PNG\r\n\x1a\n" and struct.unpack(">II", png[16:24]) == (400, 300) + assert "data-lets-plot-script" in (tmp_path / "plot-light.html").read_text(encoding="utf-8") + assert not (tmp_path / "probe-light.json").exists() + + def test_a_lets_plot_save_without_path_is_refused(self, tmp_path: Path) -> None: + """Without `path=`, `ggsave` creates `./lets-plot-images` (`os.mkdir`), which the guard refuses; the + normaliser adds `path="."` to every save.""" + pytest.importorskip("lets_plot") + exit_code, stderr = render_file(tmp_path, self.LETS_PLOT + "ggsave(plot, f'plot-{THEME}.png', scale=2)\n") + assert exit_code != 0 and "blocked by the render sandbox: os.mkdir" in stderr, stderr[-2000:] + assert not (tmp_path / "lets-plot-images").exists() and not (tmp_path / "plot-light.png").exists() + + def test_a_cssselect2_selector_compiles_and_runs_under_the_guard(self, tmp_path: Path) -> None: + """`CompiledSelector.__init__` builds each selector's test with `eval` (`CODE_BUILDERS`), and the lambda it + built runs under the guard like any plot code.""" + pytest.importorskip("cssselect2") + body = ( + "import xml.etree.ElementTree as ET\n\nimport cssselect2\n\n" + "[selector] = cssselect2.compile_selector_list('rect.a')\n" + "root = cssselect2.ElementWrapper.from_xml_root(ET.fromstring('<svg><rect class=\"a\"/><g/></svg>'))\n" + "assert [element.local_name for element in root.iter_subtree() if selector.test(element)] == ['rect']\n" + ) + exit_code, stderr = render(tmp_path, body) + assert exit_code == 0, stderr[-3000:] + assert "blocked by the" not in stderr + def test_a_syntax_error_is_reported_before_the_guard(self, tmp_path: Path) -> None: exit_code, stderr = render(tmp_path, "x = (\n") assert exit_code != 0 and "SyntaxError" in stderr and 'plot.py", line' in stderr @@ -379,18 +493,32 @@ def test_a_caught_frame_refusal_still_renders(self, tmp_path: Path) -> None: pytest.param("silhouette-basic", "seaborn", id="silhouette-basic/seaborn: KMeans"), pytest.param("scatter-basic", "plotnine", id="scatter-basic/plotnine: aes through Environment.capture"), pytest.param("scatter-basic", "altair", id="scatter-basic/altair: vl-convert, PIL padding and the HTML"), + pytest.param("scatter-basic", "pygal", id="scatter-basic/pygal: cairosvg, cssselect2 and the HTML"), + pytest.param("line-basic", "pygal", id="line-basic/pygal: a 4800x2700 chart saved through svg2png at 3200x1800"), + pytest.param("scatter-basic", "letsplot", id="scatter-basic/letsplot: the native bridge and the HTML"), ] -LIBRARY_MODULES = {"seaborn": ("seaborn",), "plotnine": ("plotnine",), "altair": ("altair", "vl_convert")} +LIBRARY_MODULES = { + "seaborn": ("seaborn",), + "plotnine": ("plotnine",), + "altair": ("altair", "vl_convert"), + "pygal": ("pygal", "cairosvg"), + "letsplot": ("lets_plot",), +} """The modules a library's catalogue case needs beyond matplotlib's stack; CI's test environment installs none.""" +WITHOUT_PROBE = frozenset({"altair", "pygal", "letsplot"}) +"""The libraries that draw no matplotlib figure, so their runs write no probe but an HTML twin.""" +ON_CANVAS = frozenset({"pygal", "letsplot"}) +"""The libraries whose cases the normaliser's canvas rewrite holds to 3200x1800 (the 1c decisions).""" @pytest.mark.parametrize(("spec_id", "library"), CATALOGUE_UNDER_GUARD) def test_catalogue_files_render_under_the_guard(tmp_path: Path, spec_id: str, library: str) -> None: """Real catalogue files, normalised as a session opening does, render under the plot guard: a guard change that - breaks scikit-learn, statsmodels, mathtext, plotnine's frame read or altair's vl-convert fails here. The seaborn, - plotnine and altair cases need their libraries, which CI's test environment does not install; the renderer-image - job of `ci-image.yml` renders all three through the harness in the image. altair draws no matplotlib figure, so its - run writes no probe: the PNG and its HTML twin are what the case checks.""" + breaks scikit-learn, statsmodels, mathtext, plotnine's frame read, altair's vl-convert, pygal's cairosvg or + lets-plot's bridge fails here. The seaborn, plotnine, altair, pygal and lets-plot cases need their libraries, which + CI's test environment does not install; the renderer-image job of `ci-image.yml` renders all five through the + harness in the image. altair, pygal and lets-plot draw no matplotlib figure, so their runs write no probe: the PNG + and its HTML twin are what the case checks.""" from agents.anyplot.code.normalise import normalise from core.utils import strip_noqa_comments @@ -419,10 +547,12 @@ def test_catalogue_files_render_under_the_guard(tmp_path: Path, spec_id: str, li assert done.returncode == 0, done.stderr[-3000:] assert "blocked by the" not in done.stderr assert (tmp_path / "plot-light.png").exists() - if library == "altair": + if library in WITHOUT_PROBE: assert (tmp_path / "plot-light.html").exists() else: assert (tmp_path / "probe-light.json").exists() + if library in ON_CANVAS: + assert struct.unpack(">II", (tmp_path / "plot-light.png").read_bytes()[16:24]) == (3200, 1800) class TestPlotGuardUnit: @@ -480,6 +610,21 @@ def test_frame_readers_match_their_whole_chain(self) -> None: assert harness.reads_frames(type("Frame", (), {"f_code": walker, "f_back": consumed})) assert not harness.reads_frames(None) + def test_cssselect2s_compiler_builds_code_and_nothing_else_of_it_does(self) -> None: + """The entry is the compiler's `CompiledSelector.__init__` alone: another function of the file, an `__init__` + elsewhere and a directory that merely ends in the package name do not match.""" + + def frame(path: str, name: str) -> object: + code = type("Code", (), {"co_filename": path, "co_name": name}) + return type("Frame", (), {"f_code": code, "f_back": None}) + + site = "/app/.venv/lib/python3.14/site-packages" + assert ("cssselect2/compiler.py", "__init__") in harness.CODE_BUILDERS + assert harness.builds_code(frame(f"{site}/cssselect2/compiler.py", "__init__")) + assert not harness.builds_code(frame(f"{site}/cssselect2/compiler.py", "compile_selector_list")) + assert not harness.builds_code(frame("plot.py", "__init__")) + assert not harness.builds_code(frame(f"{site}/not_cssselect2/compiler.py", "__init__")) + def test_refuses_remote_debugging(self, tmp_path: Path) -> None: guard = self.guard(tmp_path) assert guard.refuses("sys.remote_exec", (1, "x.py")) and guard.refuses("cpython.remote_debugger_script", ()) diff --git a/tests/unit/agents/runtime/test_runtimes.py b/tests/unit/agents/runtime/test_runtimes.py index f04af43f423..6ff3728f8b2 100644 --- a/tests/unit/agents/runtime/test_runtimes.py +++ b/tests/unit/agents/runtime/test_runtimes.py @@ -20,7 +20,7 @@ class TestRegistry: def test_the_registry_serves_exactly_the_normalised_python_libraries(self) -> None: assert RUNTIME_LIBRARIES == PYTHON_LIBRARIES == NORMALISED_LIBRARIES - assert PYTHON_LIBRARIES == {"matplotlib", "seaborn", "plotnine", "altair"} + assert PYTHON_LIBRARIES == {"matplotlib", "seaborn", "plotnine", "altair", "pygal", "letsplot"} assert RUNTIME_LIBRARIES <= SUPPORTED_LIBRARIES @pytest.mark.parametrize("library", sorted(RUNTIME_LIBRARIES)) @@ -103,3 +103,43 @@ def test_plotnine_and_altair_runtimes_read_their_own_save_rule(self) -> None: assert plotnine.file_name == altair.file_name == "plot.py" and altair.code_artifact == "plot.py" changed = self.PLOTNINE.replace("dpi=400", "dpi=100") assert plotnine.restore_protected(self.PLOTNINE, changed) == self.PLOTNINE + + +class TestRowEnvironment: + """The local Docker backend renders with the library's command row as the renderer's `sandbox_env` does (1c).""" + + @pytest.mark.parametrize("library", sorted(RUNTIME_LIBRARIES)) + def test_the_render_env_carries_the_row_env_and_its_own_limit(self, library: str) -> None: + from agents.renderer.commands import command_for + from agents.renderer.executor import ExecutorConfig, sandbox_env + from agents.renderer.settings import RendererSettings + + row = command_for("python", library) + local = runtime_for(library).env("dark") + deployed = sandbox_env(ExecutorConfig.from_settings(RendererSettings()), "dark", 60, command=row) + for key, value in row.env.items(): + assert local[key] == deployed[key] == value, key + if row.rlimit_as_mb is not None: + assert local["ANYPLOT_RLIMIT_AS_MB"] == deployed["ANYPLOT_RLIMIT_AS_MB"] == str(row.rlimit_as_mb) + else: + assert "ANYPLOT_RLIMIT_AS_MB" not in local # a local render keeps no configured limit, as before 1c + assert local["ANYPLOT_THEME"] == "dark" and local["MPLBACKEND"] == "Agg" and local["HOME"] == "/tmp" + + def test_lets_plot_gets_its_allocator_fontconfig_and_limit_locally(self) -> None: + env = runtime_for("letsplot", cpu_seconds=45).env("light") + assert env["ARROW_DEFAULT_MEMORY_POOL"] == "system" and env["FONTCONFIG_FILE"] == "/opt/anyplot/fonts.conf" + assert env["ANYPLOT_RLIMIT_AS_MB"] == "2048" and env["ANYPLOT_RLIMIT_CPU_S"] == "45" + + def test_the_other_python_libraries_keep_the_render_env_they_had(self) -> None: + keys = { + "ANYPLOT_THEME", + "MPLBACKEND", + "MPLCONFIGDIR", + "ANYPLOT_MPL_SEED", + "HOME", + "PYTHONDONTWRITEBYTECODE", + "ANYPLOT_RLIMIT_CPU_S", + } + for library in ("matplotlib", "seaborn", "plotnine", "altair", "pygal"): + assert set(runtime_for(library).env("light")) == keys, library + assert set(PythonRuntime().env("light")) == keys From ec98dc08bbc5a3ea215c1884a94124a8a61df2db Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 26 Oct 2026 05:42:13 +0000 Subject: [PATCH 3/6] fix(agents): step 1c review findings, eval fixtures, docs and plan Two reviews of the step-1c core (a security review and a correctness review with renders of every eligible pygal and lets-plot file) found no sandbox escape and no validator bypass with an effect; this commit fixes what they did find. - R2's blank check refuses a canvas that is 99.7 % one colour, not 98 %, for every library: 33 of 195 eligible pygal renders reach 98 % to 99.44 % legitimately, while a pygal chart with only a title is 99.78 %. A higher threshold refuses nothing 0.98 accepted. - pygal: the canvas rewrite reads the root <svg> of a hand-built SVG (four eligible files rendered over R2's pixel cap), a size set after the chart's constructor makes the canvas unknown instead of 800x600, and each save name writes only its own file type (SaveRule.writes). html-drop takes a body that assigns names nothing else reads, which unblocks heatmap-basic/pygal (209 eligible). - Every profile pins THEME to the theme block: pygal's PNG is written natively, where the plot guard cannot see the path, and origin/main's validator accepted a rebinding. - lets-plot: the fit under R2's cap includes the exact scale, a conditionally bound name keeps the star import, every returned path is unwrapped, and the import order matches ruff. - Renderer: sandbox_env sets PATH and HOME after a row's env, a CI step fails when an ImageMagick delegate program is on the sandbox PATH (the bridge's ImageMagick is a zero-configuration build that reads no policy), the lets-plot CI step takes its env from the command table, and the pygal step renders the svg2png canvas form too. Also: 120 eval fixture cases for pygal and lets-plot (360 generated, smoke 16; histogram-basic and line-timeseries stay blocked for pygal), the plan's "What 1c built", docs for six libraries, and the changelog fragment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WbjVqBweiXjUZKp626ZFWm --- .github/workflows/ci-image.yml | 127 +- agentic/specs/261024-agent-all-libraries.md | 307 +- agents/README.md | 32 +- agents/anyplot/code/normalise.py | 603 +- agents/anyplot/code/readiness.py | 52 +- agents/anyplot/code/regions.py | 21 +- agents/anyplot/code/validate.py | 101 +- agents/anyplot/render/png.py | 14 +- agents/anyplot/settings.py | 2 +- agents/evals/cases.py | 7 +- agents/evals/fixtures/README.md | 10 +- .../cases/area-basic-letsplot-date/case.json | 26 + .../cases/area-basic-letsplot-date/data.csv | 91 + .../case.json | 24 + .../data.csv | 91 + .../cases/area-basic-letsplot-n12/case.json | 24 + .../cases/area-basic-letsplot-n12/data.csv | 13 + .../cases/area-basic-letsplot-n5000/case.json | 24 + .../cases/area-basic-letsplot-n5000/data.csv | 5001 +++++++++++++++++ .../area-basic-letsplot-renamed/case.json | 24 + .../area-basic-letsplot-renamed/data.csv | 91 + .../cases/area-basic-letsplot-x10/case.json | 24 + .../cases/area-basic-letsplot-x10/data.csv | 91 + .../cases/area-basic-pygal-date/case.json | 26 + .../cases/area-basic-pygal-date/data.csv | 91 + .../area-basic-pygal-decimal-comma/case.json | 24 + .../area-basic-pygal-decimal-comma/data.csv | 91 + .../cases/area-basic-pygal-n12/case.json | 24 + .../cases/area-basic-pygal-n12/data.csv | 13 + .../cases/area-basic-pygal-n5000/case.json | 24 + .../cases/area-basic-pygal-n5000/data.csv | 5001 +++++++++++++++++ .../cases/area-basic-pygal-renamed/case.json | 24 + .../cases/area-basic-pygal-renamed/data.csv | 91 + .../cases/area-basic-pygal-x10/case.json | 24 + .../cases/area-basic-pygal-x10/data.csv | 91 + .../cases/bar-grouped-letsplot-date/case.json | 30 + .../cases/bar-grouped-letsplot-date/data.csv | 16 + .../case.json | 28 + .../data.csv | 16 + .../cases/bar-grouped-letsplot-n12/case.json | 28 + .../cases/bar-grouped-letsplot-n12/data.csv | 13 + .../bar-grouped-letsplot-n5000/case.json | 29 + .../cases/bar-grouped-letsplot-n5000/data.csv | 5001 +++++++++++++++++ .../bar-grouped-letsplot-renamed/case.json | 29 + .../bar-grouped-letsplot-renamed/data.csv | 16 + .../cases/bar-grouped-letsplot-x10/case.json | 28 + .../cases/bar-grouped-letsplot-x10/data.csv | 16 + .../cases/bar-grouped-pygal-date/case.json | 30 + .../cases/bar-grouped-pygal-date/data.csv | 16 + .../bar-grouped-pygal-decimal-comma/case.json | 28 + .../bar-grouped-pygal-decimal-comma/data.csv | 16 + .../cases/bar-grouped-pygal-n12/case.json | 28 + .../cases/bar-grouped-pygal-n12/data.csv | 13 + .../cases/bar-grouped-pygal-n5000/case.json | 29 + .../cases/bar-grouped-pygal-n5000/data.csv | 5001 +++++++++++++++++ .../cases/bar-grouped-pygal-renamed/case.json | 29 + .../cases/bar-grouped-pygal-renamed/data.csv | 16 + .../cases/bar-grouped-pygal-x10/case.json | 28 + .../cases/bar-grouped-pygal-x10/data.csv | 16 + .../cases/box-basic-letsplot-date/case.json | 26 + .../cases/box-basic-letsplot-date/data.csv | 241 + .../case.json | 24 + .../box-basic-letsplot-decimal-comma/data.csv | 241 + .../cases/box-basic-letsplot-n12/case.json | 24 + .../cases/box-basic-letsplot-n12/data.csv | 13 + .../cases/box-basic-letsplot-n5000/case.json | 24 + .../cases/box-basic-letsplot-n5000/data.csv | 5001 +++++++++++++++++ .../box-basic-letsplot-renamed/case.json | 25 + .../cases/box-basic-letsplot-renamed/data.csv | 241 + .../cases/box-basic-letsplot-x10/case.json | 24 + .../cases/box-basic-letsplot-x10/data.csv | 241 + .../cases/box-basic-pygal-date/case.json | 26 + .../cases/box-basic-pygal-date/data.csv | 241 + .../box-basic-pygal-decimal-comma/case.json | 24 + .../box-basic-pygal-decimal-comma/data.csv | 241 + .../cases/box-basic-pygal-n12/case.json | 24 + .../cases/box-basic-pygal-n12/data.csv | 13 + .../cases/box-basic-pygal-n5000/case.json | 24 + .../cases/box-basic-pygal-n5000/data.csv | 5001 +++++++++++++++++ .../cases/box-basic-pygal-renamed/case.json | 25 + .../cases/box-basic-pygal-renamed/data.csv | 241 + .../cases/box-basic-pygal-x10/case.json | 24 + .../cases/box-basic-pygal-x10/data.csv | 241 + .../heatmap-basic-letsplot-date/case.json | 30 + .../heatmap-basic-letsplot-date/data.csv | 169 + .../case.json | 28 + .../data.csv | 169 + .../heatmap-basic-letsplot-n12/case.json | 28 + .../cases/heatmap-basic-letsplot-n12/data.csv | 13 + .../heatmap-basic-letsplot-n5000/case.json | 29 + .../heatmap-basic-letsplot-n5000/data.csv | 5001 +++++++++++++++++ .../heatmap-basic-letsplot-renamed/case.json | 29 + .../heatmap-basic-letsplot-renamed/data.csv | 169 + .../heatmap-basic-letsplot-x10/case.json | 28 + .../cases/heatmap-basic-letsplot-x10/data.csv | 169 + .../cases/heatmap-basic-pygal-date/case.json | 30 + .../cases/heatmap-basic-pygal-date/data.csv | 169 + .../case.json | 28 + .../data.csv | 169 + .../cases/heatmap-basic-pygal-n12/case.json | 28 + .../cases/heatmap-basic-pygal-n12/data.csv | 13 + .../cases/heatmap-basic-pygal-n5000/case.json | 29 + .../cases/heatmap-basic-pygal-n5000/data.csv | 5001 +++++++++++++++++ .../heatmap-basic-pygal-renamed/case.json | 29 + .../heatmap-basic-pygal-renamed/data.csv | 169 + .../cases/heatmap-basic-pygal-x10/case.json | 28 + .../cases/heatmap-basic-pygal-x10/data.csv | 169 + .../histogram-basic-letsplot-date/case.json | 22 + .../histogram-basic-letsplot-date/data.csv | 401 ++ .../case.json | 20 + .../data.csv | 401 ++ .../histogram-basic-letsplot-n12/case.json | 20 + .../histogram-basic-letsplot-n12/data.csv | 13 + .../histogram-basic-letsplot-n5000/case.json | 20 + .../histogram-basic-letsplot-n5000/data.csv | 5001 +++++++++++++++++ .../case.json | 20 + .../histogram-basic-letsplot-renamed/data.csv | 401 ++ .../histogram-basic-letsplot-x10/case.json | 20 + .../histogram-basic-letsplot-x10/data.csv | 401 ++ .../histogram-basic-pygal-date/case.json | 22 + .../cases/histogram-basic-pygal-date/data.csv | 401 ++ .../case.json | 20 + .../data.csv | 401 ++ .../cases/histogram-basic-pygal-n12/case.json | 20 + .../cases/histogram-basic-pygal-n12/data.csv | 13 + .../histogram-basic-pygal-n5000/case.json | 20 + .../histogram-basic-pygal-n5000/data.csv | 5001 +++++++++++++++++ .../histogram-basic-pygal-renamed/case.json | 20 + .../histogram-basic-pygal-renamed/data.csv | 401 ++ .../cases/histogram-basic-pygal-x10/case.json | 20 + .../cases/histogram-basic-pygal-x10/data.csv | 401 ++ .../cases/line-basic-letsplot-date/case.json | 26 + .../cases/line-basic-letsplot-date/data.csv | 62 + .../case.json | 24 + .../data.csv | 62 + .../cases/line-basic-letsplot-n12/case.json | 24 + .../cases/line-basic-letsplot-n12/data.csv | 13 + .../cases/line-basic-letsplot-n5000/case.json | 24 + .../cases/line-basic-letsplot-n5000/data.csv | 5001 +++++++++++++++++ .../line-basic-letsplot-renamed/case.json | 25 + .../line-basic-letsplot-renamed/data.csv | 62 + .../cases/line-basic-letsplot-x10/case.json | 24 + .../cases/line-basic-letsplot-x10/data.csv | 62 + .../cases/line-basic-pygal-date/case.json | 26 + .../cases/line-basic-pygal-date/data.csv | 62 + .../line-basic-pygal-decimal-comma/case.json | 24 + .../line-basic-pygal-decimal-comma/data.csv | 62 + .../cases/line-basic-pygal-n12/case.json | 24 + .../cases/line-basic-pygal-n12/data.csv | 13 + .../cases/line-basic-pygal-n5000/case.json | 24 + .../cases/line-basic-pygal-n5000/data.csv | 5001 +++++++++++++++++ .../cases/line-basic-pygal-renamed/case.json | 25 + .../cases/line-basic-pygal-renamed/data.csv | 62 + .../cases/line-basic-pygal-x10/case.json | 24 + .../cases/line-basic-pygal-x10/data.csv | 62 + .../line-timeseries-letsplot-date/case.json | 26 + .../line-timeseries-letsplot-date/data.csv | 366 ++ .../case.json | 25 + .../data.csv | 366 ++ .../line-timeseries-letsplot-n12/case.json | 24 + .../line-timeseries-letsplot-n12/data.csv | 13 + .../line-timeseries-letsplot-n5000/case.json | 24 + .../line-timeseries-letsplot-n5000/data.csv | 5001 +++++++++++++++++ .../case.json | 25 + .../line-timeseries-letsplot-renamed/data.csv | 366 ++ .../line-timeseries-letsplot-x10/case.json | 24 + .../line-timeseries-letsplot-x10/data.csv | 366 ++ .../line-timeseries-pygal-date/case.json | 26 + .../cases/line-timeseries-pygal-date/data.csv | 366 ++ .../case.json | 25 + .../data.csv | 366 ++ .../cases/line-timeseries-pygal-n12/case.json | 24 + .../cases/line-timeseries-pygal-n12/data.csv | 13 + .../line-timeseries-pygal-n5000/case.json | 24 + .../line-timeseries-pygal-n5000/data.csv | 5001 +++++++++++++++++ .../line-timeseries-pygal-renamed/case.json | 25 + .../line-timeseries-pygal-renamed/data.csv | 366 ++ .../cases/line-timeseries-pygal-x10/case.json | 24 + .../cases/line-timeseries-pygal-x10/data.csv | 366 ++ .../cases/pie-basic-letsplot-date/case.json | 26 + .../cases/pie-basic-letsplot-date/data.csv | 7 + .../case.json | 24 + .../pie-basic-letsplot-decimal-comma/data.csv | 7 + .../cases/pie-basic-letsplot-n12/case.json | 24 + .../cases/pie-basic-letsplot-n12/data.csv | 13 + .../cases/pie-basic-letsplot-n5000/case.json | 25 + .../cases/pie-basic-letsplot-n5000/data.csv | 5001 +++++++++++++++++ .../pie-basic-letsplot-renamed/case.json | 24 + .../cases/pie-basic-letsplot-renamed/data.csv | 7 + .../cases/pie-basic-letsplot-x10/case.json | 24 + .../cases/pie-basic-letsplot-x10/data.csv | 7 + .../cases/pie-basic-pygal-date/case.json | 26 + .../cases/pie-basic-pygal-date/data.csv | 7 + .../pie-basic-pygal-decimal-comma/case.json | 24 + .../pie-basic-pygal-decimal-comma/data.csv | 7 + .../cases/pie-basic-pygal-n12/case.json | 24 + .../cases/pie-basic-pygal-n12/data.csv | 13 + .../cases/pie-basic-pygal-n5000/case.json | 25 + .../cases/pie-basic-pygal-n5000/data.csv | 5001 +++++++++++++++++ .../cases/pie-basic-pygal-renamed/case.json | 24 + .../cases/pie-basic-pygal-renamed/data.csv | 7 + .../cases/pie-basic-pygal-x10/case.json | 24 + .../cases/pie-basic-pygal-x10/data.csv | 7 + .../scatter-basic-letsplot-date/case.json | 26 + .../scatter-basic-letsplot-date/data.csv | 151 + .../case.json | 24 + .../data.csv | 151 + .../scatter-basic-letsplot-n12/case.json | 24 + .../cases/scatter-basic-letsplot-n12/data.csv | 13 + .../scatter-basic-letsplot-n5000/case.json | 24 + .../scatter-basic-letsplot-n5000/data.csv | 5001 +++++++++++++++++ .../scatter-basic-letsplot-renamed/case.json | 25 + .../scatter-basic-letsplot-renamed/data.csv | 151 + .../scatter-basic-letsplot-x10/case.json | 24 + .../cases/scatter-basic-letsplot-x10/data.csv | 151 + .../cases/scatter-basic-pygal-date/case.json | 26 + .../cases/scatter-basic-pygal-date/data.csv | 151 + .../case.json | 24 + .../data.csv | 151 + .../cases/scatter-basic-pygal-n12/case.json | 24 + .../cases/scatter-basic-pygal-n12/data.csv | 13 + .../cases/scatter-basic-pygal-n5000/case.json | 24 + .../cases/scatter-basic-pygal-n5000/data.csv | 5001 +++++++++++++++++ .../scatter-basic-pygal-renamed/case.json | 25 + .../scatter-basic-pygal-renamed/data.csv | 151 + .../cases/scatter-basic-pygal-x10/case.json | 24 + .../cases/scatter-basic-pygal-x10/data.csv | 151 + .../violin-basic-letsplot-date/case.json | 26 + .../cases/violin-basic-letsplot-date/data.csv | 401 ++ .../case.json | 24 + .../data.csv | 401 ++ .../cases/violin-basic-letsplot-n12/case.json | 24 + .../cases/violin-basic-letsplot-n12/data.csv | 13 + .../violin-basic-letsplot-n5000/case.json | 24 + .../violin-basic-letsplot-n5000/data.csv | 5001 +++++++++++++++++ .../violin-basic-letsplot-renamed/case.json | 24 + .../violin-basic-letsplot-renamed/data.csv | 401 ++ .../cases/violin-basic-letsplot-x10/case.json | 24 + .../cases/violin-basic-letsplot-x10/data.csv | 401 ++ .../cases/violin-basic-pygal-date/case.json | 26 + .../cases/violin-basic-pygal-date/data.csv | 401 ++ .../case.json | 24 + .../violin-basic-pygal-decimal-comma/data.csv | 401 ++ .../cases/violin-basic-pygal-n12/case.json | 24 + .../cases/violin-basic-pygal-n12/data.csv | 13 + .../cases/violin-basic-pygal-n5000/case.json | 24 + .../cases/violin-basic-pygal-n5000/data.csv | 5001 +++++++++++++++++ .../violin-basic-pygal-renamed/case.json | 24 + .../cases/violin-basic-pygal-renamed/data.csv | 401 ++ .../cases/violin-basic-pygal-x10/case.json | 24 + .../cases/violin-basic-pygal-x10/data.csv | 401 ++ agents/evals/make_fixtures.py | 94 +- agents/evals/matrix.py | 5 +- agents/evals/report.py | 4 +- agents/renderer/Dockerfile | 14 +- agents/renderer/commands.py | 21 +- agents/renderer/executor.py | 7 +- changelog.d/agent-pygal-letsplot.md | 48 + core/canvas.py | 2 +- docs/concepts/agent-network.md | 40 +- tests/unit/agents/code/test_normalise.py | 305 +- tests/unit/agents/code/test_readiness.py | 53 +- tests/unit/agents/code/test_validate.py | 186 +- tests/unit/agents/evals/test_cases.py | 8 +- tests/unit/agents/evals/test_make_fixtures.py | 29 +- .../agents/renderer/test_language_rows.py | 24 + .../unit/agents/runtime/test_harness_guard.py | 25 +- tests/unit/agents/runtime/test_render.py | 20 + 268 files changed, 120361 insertions(+), 308 deletions(-) create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-date/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-date/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-n12/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-n12/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-n5000/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-renamed/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-x10/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-letsplot-x10/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-date/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-date/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-n12/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-n12/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-n5000/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-renamed/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-x10/case.json create mode 100644 agents/evals/fixtures/cases/area-basic-pygal-x10/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-date/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-date/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-n12/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-n12/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-n5000/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-renamed/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-x10/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-letsplot-x10/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-date/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-date/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-n12/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-n12/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-n5000/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-renamed/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-x10/case.json create mode 100644 agents/evals/fixtures/cases/bar-grouped-pygal-x10/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-date/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-date/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-n12/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-n12/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-n5000/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-renamed/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-x10/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-letsplot-x10/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-date/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-date/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-n12/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-n12/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-n5000/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-renamed/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-x10/case.json create mode 100644 agents/evals/fixtures/cases/box-basic-pygal-x10/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-date/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-date/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-n12/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-n12/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-n5000/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-renamed/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-x10/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-letsplot-x10/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-date/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-date/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-n12/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-n12/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-n5000/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-renamed/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-x10/case.json create mode 100644 agents/evals/fixtures/cases/heatmap-basic-pygal-x10/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-date/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-date/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-n12/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-n12/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-n5000/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-renamed/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-x10/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-letsplot-x10/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-date/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-date/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-n12/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-n12/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-n5000/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-renamed/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-x10/case.json create mode 100644 agents/evals/fixtures/cases/histogram-basic-pygal-x10/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-date/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-date/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-n12/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-n12/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-n5000/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-renamed/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-x10/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-letsplot-x10/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-date/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-date/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-n12/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-n12/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-n5000/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-renamed/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-x10/case.json create mode 100644 agents/evals/fixtures/cases/line-basic-pygal-x10/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-date/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-date/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-n12/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-n12/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-n5000/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-renamed/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-x10/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-letsplot-x10/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-date/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-date/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-n12/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-n12/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-n5000/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-renamed/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-x10/case.json create mode 100644 agents/evals/fixtures/cases/line-timeseries-pygal-x10/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-date/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-date/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-n12/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-n12/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-n5000/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-renamed/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-x10/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-letsplot-x10/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-date/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-date/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-n12/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-n12/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-n5000/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-renamed/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-x10/case.json create mode 100644 agents/evals/fixtures/cases/pie-basic-pygal-x10/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-date/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-date/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-n12/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-n12/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-n5000/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-renamed/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-x10/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-letsplot-x10/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-date/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-date/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-n12/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-n12/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-n5000/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-renamed/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-x10/case.json create mode 100644 agents/evals/fixtures/cases/scatter-basic-pygal-x10/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-date/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-date/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-n12/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-n12/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-n5000/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-renamed/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-x10/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-letsplot-x10/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-date/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-date/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-decimal-comma/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-decimal-comma/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-n12/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-n12/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-n5000/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-n5000/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-renamed/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-renamed/data.csv create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-x10/case.json create mode 100644 agents/evals/fixtures/cases/violin-basic-pygal-x10/data.csv create mode 100644 changelog.d/agent-pygal-letsplot.md diff --git a/.github/workflows/ci-image.yml b/.github/workflows/ci-image.yml index 2cc5c987bf7..af392926fbc 100644 --- a/.github/workflows/ci-image.yml +++ b/.github/workflows/ci-image.yml @@ -738,12 +738,43 @@ jobs: # defaults. Its PNG is cairosvg's: libcairo from the image's apt layer, loaded before the # guard (warm_cairo in harness.py), and cssselect2's selector lambdas (CODE_BUILDERS). # The HTML twin is the chart's SVG, written by render_to_file; pygal writes no probe. + # Two forms: render_to_png on a 3200x1800 chart, and the form the normaliser's canvas + # rewrite gives oversized charts (agents/anyplot/code/normalise.py; 94 catalogue files + # on 2026-10-26, 89 of them 4800x2700): the plot itself imports cairosvg and calls + # svg2png at 3200x1800. - name: Render a pygal plot through the harness if: steps.check.outputs.should_build == 'true' run: | set -euo pipefail - mkdir -p work-pygal + render() { # $1: work dir with plot.py and data.csv + local work=$1 + docker run --rm --network none --read-only --tmpfs /tmp \ + --cap-drop ALL --security-opt no-new-privileges --user "$(id -u):$(id -g)" \ + -v "$PWD/$work:/work" -w /work \ + -e ANYPLOT_THEME=light -e MPLBACKEND=Agg -e MPLCONFIGDIR=/tmp/mpl -e ANYPLOT_MPL_SEED=/opt/mplconfig \ + -e HOME=/tmp -e PYTHONDONTWRITEBYTECODE=1 -e OPENBLAS_NUM_THREADS=1 -e OMP_NUM_THREADS=1 \ + -e ANYPLOT_RLIMIT_CPU_S=60 -e ANYPLOT_RLIMIT_FSIZE_MB=50 -e ANYPLOT_RLIMIT_AS_MB=1024 \ + anyplot-renderer:ci /app/.venv/bin/python -I -X disable-remote-debug /opt/anyplot/harness.py plot.py > "$work/harness.out" + grep -qxF 'HARNESS {"event": "start"}' "$work/harness.out" || { echo "::error::no HARNESS start line in $work"; cat "$work/harness.out"; exit 1; } + grep -q '^HARNESS {"event": "end"' "$work/harness.out" || { echo "::error::no HARNESS end line in $work"; cat "$work/harness.out"; exit 1; } + python3 - "$work" <<'EOF' + import struct + import sys + + work = sys.argv[1] + png = open(f"{work}/plot-light.png", "rb").read() + assert png[:8] == b"\x89PNG\r\n\x1a\n", "not a PNG" + width, height = struct.unpack(">II", png[16:24]) + assert (width, height) == (3200, 1800), (width, height) + html = open(f"{work}/plot-light.html", encoding="utf-8").read() + assert "pygal-chart" in html, "plot-light.html holds no pygal chart" + print(f"OK: {work} plot-light.png {width}x{height}, {len(png)} bytes; plot-light.html {len(html)} characters") + EOF + tail -n 1 "$work/harness.out" + } + mkdir -p work-pygal work-pygal-canvas printf 'x,y\na,1\nb,3\nc,2\n' > work-pygal/data.csv + cp work-pygal/data.csv work-pygal-canvas/data.csv cat > work-pygal/plot.py <<'EOF' import os @@ -758,39 +789,50 @@ jobs: chart.render_to_png(f"plot-{THEME}.png") chart.render_to_file(f"plot-{THEME}.html") EOF - docker run --rm --network none --read-only --tmpfs /tmp \ - --cap-drop ALL --security-opt no-new-privileges --user "$(id -u):$(id -g)" \ - -v "$PWD/work-pygal:/work" -w /work \ - -e ANYPLOT_THEME=light -e MPLBACKEND=Agg -e MPLCONFIGDIR=/tmp/mpl -e ANYPLOT_MPL_SEED=/opt/mplconfig \ - -e HOME=/tmp -e PYTHONDONTWRITEBYTECODE=1 -e OPENBLAS_NUM_THREADS=1 -e OMP_NUM_THREADS=1 \ - -e ANYPLOT_RLIMIT_CPU_S=60 -e ANYPLOT_RLIMIT_FSIZE_MB=50 -e ANYPLOT_RLIMIT_AS_MB=1024 \ - anyplot-renderer:ci /app/.venv/bin/python -I -X disable-remote-debug /opt/anyplot/harness.py plot.py > work-pygal/harness.out - grep -qxF 'HARNESS {"event": "start"}' work-pygal/harness.out || { echo "::error::no HARNESS start line"; cat work-pygal/harness.out; exit 1; } - grep -q '^HARNESS {"event": "end"' work-pygal/harness.out || { echo "::error::no HARNESS end line"; cat work-pygal/harness.out; exit 1; } - python3 - <<'EOF' - import struct - png = open("work-pygal/plot-light.png", "rb").read() - assert png[:8] == b"\x89PNG\r\n\x1a\n", "not a PNG" - width, height = struct.unpack(">II", png[16:24]) - assert (width, height) == (3200, 1800), (width, height) - html = open("work-pygal/plot-light.html", encoding="utf-8").read() - assert "pygal-chart" in html, "plot-light.html holds no pygal chart" - print(f"OK: pygal plot-light.png {width}x{height}, {len(png)} bytes; plot-light.html {len(html)} characters") + cat > work-pygal-canvas/plot.py <<'EOF' + import os + + import cairosvg + import pandas as pd + import pygal + + THEME = os.environ["ANYPLOT_THEME"] + df = pd.read_csv("data.csv") + chart = pygal.Bar(width=4800, height=2700, title="pygal", x_title="x", y_title="y") + chart.x_labels = list(df["x"]) + chart.add("y", [float(value) for value in df["y"]]) + cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png", output_width=3200, output_height=1800) + chart.render_to_file(f"plot-{THEME}.html") EOF - tail -n 1 work-pygal/harness.out + render work-pygal + render work-pygal-canvas # lets-plot (step 1c) rasterises in its native bridge, which needs more address space # than the Python default: its row of agents/renderer/commands.py sets RLIMIT_AS to # 2048 MiB with Arrow's system allocator, and points the bridge's own fontconfig at the - # image's /opt/anyplot/fonts.conf. This run passes exactly that row's environment and - # limit (1024 MB aborts the export: "Out of memory trying to allocate"); every other - # flag is the seaborn step's. Without the fontconfig file every export writes + # image's /opt/anyplot/fonts.conf. This run takes that row's environment and limit from + # the command table itself (commands.py imports only the standard library, so the + # runner's Python reads it), in the order the sandbox's environment has them. Every + # other flag is the seaborn step's. Without the fontconfig file every export writes # "Fontconfig error" to stderr, which is the extra assert. No probe. - name: Render a lets-plot plot through the harness if: steps.check.outputs.should_build == 'true' run: | set -euo pipefail mkdir -p work-letsplot + python3 - > work-letsplot/row.flags <<'EOF' + from agents.renderer.commands import command_for + + row = command_for("python", "letsplot") + flags = [f"{key}={value}" for key, value in row.env.items()] + if row.rlimit_as: + flags.append(f"ANYPLOT_RLIMIT_AS_MB={row.rlimit_as_mb or 1024}") + for flag in flags: + print(f"-e\n{flag}") + EOF + mapfile -t ROW_FLAGS < work-letsplot/row.flags + test "${#ROW_FLAGS[@]}" -gt 0 || { echo "::error::the letsplot row of commands.py gave no flags"; exit 1; } + echo "the letsplot row: ${ROW_FLAGS[*]}" printf 'x,y\na,1\nb,3\nc,2\n' > work-letsplot/data.csv cat > work-letsplot/plot.py <<'EOF' import os @@ -811,9 +853,9 @@ jobs: --cap-drop ALL --security-opt no-new-privileges --user "$(id -u):$(id -g)" \ -v "$PWD/work-letsplot:/work" -w /work \ -e ANYPLOT_THEME=light -e MPLBACKEND=Agg -e MPLCONFIGDIR=/tmp/mpl -e ANYPLOT_MPL_SEED=/opt/mplconfig \ - -e ARROW_DEFAULT_MEMORY_POOL=system -e FONTCONFIG_FILE=/opt/anyplot/fonts.conf \ + "${ROW_FLAGS[@]}" \ -e HOME=/tmp -e PYTHONDONTWRITEBYTECODE=1 -e OPENBLAS_NUM_THREADS=1 -e OMP_NUM_THREADS=1 \ - -e ANYPLOT_RLIMIT_CPU_S=60 -e ANYPLOT_RLIMIT_FSIZE_MB=50 -e ANYPLOT_RLIMIT_AS_MB=2048 \ + -e ANYPLOT_RLIMIT_CPU_S=60 -e ANYPLOT_RLIMIT_FSIZE_MB=50 \ anyplot-renderer:ci /app/.venv/bin/python -I -X disable-remote-debug /opt/anyplot/harness.py plot.py \ > work-letsplot/harness.out 2> work-letsplot/harness.err \ || { echo "::error::the lets-plot render failed"; cat work-letsplot/harness.out work-letsplot/harness.err; exit 1; } @@ -834,6 +876,41 @@ jobs: EOF tail -n 1 work-letsplot/harness.out + # Native code the audit hook cannot see finds no program to run. lets-plot's bridge links + # ImageMagick with a compiled-in delegate map that runs programs by name through /bin/sh + # (gs, curl, soffice, ffmpeg, rsvg-convert, inkscape and the rest listed below). That + # ImageMagick is a zero-configuration build: it reads no policy.xml, so no policy file can + # switch the delegates off (an export with a policy denying PNG under MAGICK_CONFIGURE_PATH + # still wrote its PNG, 2026-10-26). matplotlib calls fc-list when it finds it. So the + # sandbox's PATH (SANDBOX_PATH of agents/renderer/executor.py, read in the image) must + # carry none of them, next to RLIMIT_NPROC and the sandbox itself. node stays on the list + # until the JavaScript runtime (step 3 of agentic/specs/261024-agent-all-libraries.md) + # installs it as its row's toolchain. + - name: No delegate program on the sandbox PATH + if: steps.check.outputs.should_build == 'true' + run: | + set -euo pipefail + docker run --rm --network none anyplot-renderer:ci /app/.venv/bin/python -c ' + import shutil + import sys + + from agents.renderer.executor import SANDBOX_PATH + + PROGRAMS = ( + "gs", "ghostscript", "curl", "wget", "soffice", "libreoffice", "ffmpeg", "inkscape", "rsvg-convert", + "fc-list", "fc-match", "magick", "convert", "identify", "dot", "java", "node", + # The other programs of the delegate map. + "bpgdec", "bpgenc", "xdg-open", "uniconvertor", "ufraw-batch", "dvips", "xterm", "hp2xx", "html2ps", + "ilbmtoppm", "ppmtoilbm", "lepton", "JxrDecApp", "JxrEncApp", "pcl6", "gxps", "xclip", "cwebp", "dwebp", + "lpr", "mrsidgeodecode", "gimp", + ) + found = {name: shutil.which(name, path=SANDBOX_PATH) for name in PROGRAMS} + found = {name: path for name, path in found.items() if path is not None} + if found: + sys.exit(f"on the sandbox PATH {SANDBOX_PATH}: {found}") + print(f"OK: none of {len(PROGRAMS)} delegate programs on {SANDBOX_PATH}") + ' + # The file conversion inside the image (harness.py --convert): every format the # page sends, with the image's slimmed pyarrow (owner decision of 2026-10-15), # its calamine and NumPy, the guard's preload, and the sandbox's environment. diff --git a/agentic/specs/261024-agent-all-libraries.md b/agentic/specs/261024-agent-all-libraries.md index 1918d2a83c8..433bfc0f403 100644 --- a/agentic/specs/261024-agent-all-libraries.md +++ b/agentic/specs/261024-agent-all-libraries.md @@ -1,9 +1,10 @@ # Feature: "Use with my data" for all 15 catalogue libraries -> **Status (2026-10-25):** plan, in progress. Steps 1a (the runtime seam) and 1b +> **Status (2026-10-26):** plan, in progress. Steps 1a (the runtime seam) and 1b > (plotnine and altair) merged with PR #12404; see "What 1b built" under step 1b. Step 1c -> (pygal and lets-plot) is in progress. The deploy serves matplotlib and seaborn: -> plotnine and altair have runtimes, but `AGENT_LIBRARIES` keeps its default +> (pygal and lets-plot) is implemented on its branch, and its PR follows; see "What 1c +> built" under step 1c. The deploy serves matplotlib and seaborn: plotnine, altair, pygal +> and lets-plot have runtimes, but `AGENT_LIBRARIES` keeps its default > `matplotlib,seaborn` until each one's matrix run passes. Every other library in this > document is planned, not shipped. @@ -355,6 +356,306 @@ reasons (a file can have several causes): rewritten by the normaliser to `ggsave(..., path=".")`, the form the other 301 use. The slim image needs `libcairo2` for cairosvg. +#### What 1c built (2026-10-26) + +- **Two more save rules.** `regions.SAVE_RULES` gains pygal: `render_to_png` (the file + as its positional or `filename=`, plus `dpi=`), `render_to_file` for the HTML twin + (`filename` only), and `cairosvg.svg2png`, which takes every argument by keyword + (`SaveRule.keyword_only`: the file is `write_to=`). lets-plot saves through `ggsave` + with the file second and `path="."` on every save (`SaveRule.directory`, the one + literal every save passes). `SaveRule.writes` pairs a save name with the one file + type it writes (pygal: `render_to_png` and `svg2png` only the PNG, `render_to_file` + only the HTML; `SaveRule.writes_suffix`), which the validator, the readiness scan and + the canvas step check. `SaveRule.canvas` names each library's canvas rewrite + (`figure`, `pygal`, `letsplot`, or none for plotnine and altair). `SAVE_NAMES` gains + `render_to_png`, `render_to_file` and `svg2png` in every profile, and `PythonRuntime` + serves `PYTHON_LIBRARIES`: matplotlib, seaborn, plotnine, altair, pygal and + `letsplot`. +- **Validator.** `LIBRARY_IMPORTS` gains pygal (`pygal`, `cairosvg`) and lets-plot + (`lets_plot`), after a walk of both public surfaces that `REVIEWED_SUBMODULES` pins + (pygal 3.1.3, cairosvg 2.9.1, lets-plot 4.11.0, `lets_plot.plot` included). + - pygal: `cssselect2`, `tinycss2`, `webencodings` and `cairocffi` are unreachable, + and so are cairosvg's `Path`, `parser`, `surface`, `url`, `image`, `css`, + `features`, `test_api` and `ROOT`; pygal's `etree` is an unsafe submodule; + `LIBRARY_BANS["pygal"]` holds the browser, pyquery and tree renderers, + `add_xml_filter`, cairosvg's PDF, PS, EPS and SVG exporters, the cairo surfaces, + the fetchers, `cut` and `_update` (which merges any dict into the chart's config). + The config rule: `defs=` is refused, `js=` takes only `[]` or `()`, `css=` takes + only inline entries and pygal's three package stylesheets (exempt from the URL rule + at that node only), `.css` and `.js` are only ever the single target of a plain + assignment, every `**` is a dict literal with string keys or a name bound once and + used only as `**name`, and a `googlefont:` string is a URL literal. The SVG namespace names are exempt from the + URL rule in pygal's profile only. `file_obj`, `unsafe` and `url_fetcher` are banned + keywords on every call. + - lets-plot: `geo_data`, `tilesets`, `settings_utils`, `frontend_context` and + `plot.geom_livemap_` are denied, its 23 helpers (geocoding, map tiles, `to_png`, + `to_svg`, `to_pdf`, `setup_show_ext`, `LazyModule` and others) are unsafe + everywhere, and `LetsPlot.set`, `setup_show_ext` and `cfg` are module escapes. + `LetsPlot` is only ever the receiver of a `setup_html()` with no arguments, and + `.props` is banned. The `.format` exemption for builder chains is described in the + table below. + - Every profile: the save-name rule (`_check_save_names`), also inside plotnine's + expression strings and in the DATA profile; plotnine's expression rule counts a + name's bindings strictly (`_bindings`, match captures included). The SECURITY + profile of every library pins `THEME` to its theme block and `os` to its import + (`_check_theme_bindings`; see the table below), and a pygal save whose name does + not write its target's file type is a `savefig-target` finding. +- **Normaliser.** Four guard rules for every library (`importlib.util.find_spec` + tests, a `try` whose `finally` only restores `sys.path`, `del sys.modules[...]` and + `sys.dont_write_bytecode` in a guard, `import_module("m").ATTR`). For pygal: the + html-open rewrite (158 files), html-drop with its feeder cleanup (103 files, feeders + in 41) and the canvas rewrite (94 files: 76 `render_to_png` saves become `svg2png` + with `import cairosvg` added, 13 `svg2png` saves get the output size, and 5 hand-built + SVGs get it from their root `<svg>`; 89 land at 3200x1800 and 5 at 2400x2400). A + chart's size and an output size may be a module-level name bound once to a number; a + size set after the constructor leaves the save alone with a note. For lets-plot: + the `export_ggsave` alias rename (17 files), the star-import expansion (151 files, + from `letsplot_names.py`, a static copy of `lets_plot.__all__` 4.11.0 that a test + pins, in ruff's natural import order; a name the file may read before it binds it + keeps the star import with a note), `path="."` on 62 saves in 31 files, 25 epilogues + removed, one returned path unwrapped, the `f"{d}/plot-{THEME}.png"` target form, and + the scale-only canvas rewrite (117 files; mosaic-categorical fits inside the target + at 3000x1800 with `scale=1.875`, and three grids and two aspects keep a note). The + header step strips every catalogue header at the top, because three lets-plot files + carry two. The readiness scan reports a missing `path="."` and a save name that does + not write its target's file type as `savefig-target` reasons, and for a pygal or + lets-plot canvas of unknown size says that R2 refuses a PNG over its pixel cap + instead of promising R3's padding. The normalised matplotlib and seaborn output is + byte-identical to main on all 650 files, and all 1,946 catalogue files of the six + libraries normalise idempotently. +- **Harness.** `warm_cairo` imports cairosvg before the guard is armed when the plot + names pygal or cairosvg. `CODE_BUILDERS` gains `("cssselect2/compiler.py", + "__init__")`, the compiler that turns each CSS selector of a pygal SVG into one + `eval("lambda el: ...")` (87 per chart) and quotes every string the CSS controls with + `repr`; its docstring holds the security argument. lets-plot needed no harness change: + its native bridge loads at import, and its guarded renders wrote only the two + allowlisted files. +- **Renderer.** `RuntimeCommand.rlimit_as_mb` is a row's own `RLIMIT_AS` in place of + the configured one; it refuses to exist unless `rlimit_as` is on and the size is + positive, and a configured limit of 0 still switches the limit off for every row. + The letsplot row sets 2048 MiB, `ARROW_DEFAULT_MEMORY_POOL=system`, + `FONTCONFIG_FILE=/opt/anyplot/fonts.conf` and `render_p95_s` 15. The pygal row keeps + the Python defaults (its heaviest catalogue render, bifurcation-basic, peaks at + 682 MB resident; the guarded wall p95 is 3.75 s). `executor.sandbox_env` passes an + in-process row's environment and own limit after the matplotlib keys and before + `PATH`, `HOME` and the limit variables, which a row can no longer replace, and + `PythonRuntime.env` gives the local Docker backend the same. The image installs + `lib-pygal`, `lib-letsplot` and `libcairo2` (without recommends), links DejaVu Sans + next to Serif and Mono, and copies `agents/renderer/fonts.conf` to + `/opt/anyplot/fonts.conf`: 1,174,874,816 bytes, 49.2 MB (4.4 %) more than 1b's. + `ci-image.yml` renders a pygal plot in both save forms (`render_to_png` at 3200x1800, + and a 4800x2700 chart through `svg2png` at 3200x1800, the canvas rewrite's form) and + a lets-plot plot through the harness in the image; the lets-plot step takes its + environment and limit from the command table's row and also fails on "Fontconfig + error" in stderr. A new step fails when any of 39 programs (those the bridge's + ImageMagick delegates to, such as `gs`, `curl`, `soffice` and `ffmpeg`, ImageMagick's + own tools, `fc-list`, `fc-match`, `java` and `node`) is on the sandbox's `PATH`, read + from `executor.SANDBOX_PATH` in the image. +- **Host gates.** R2's blank check refuses a canvas that is 99.7 % one colour, not 98 %, + for every library (see the table below). +- **Evals.** `eligibility.py` sweeps all six libraries. `make_fixtures.py` writes the + ten specs for pygal and lets-plot (360 generated cases in all, 367 in a full run); the + smoke set gains `scatter-basic-pygal-renamed` and `scatter-basic-letsplot-renamed` + (16 cases). pygal has no column syntax, so its `renamed` case tests the axis titles + the adaptation must pass itself. The readiness scan blocks two of the ten pygal + fixture files, which `test_make_fixtures.py` pins: `histogram-basic` composites an + annotation layer onto the PNG with PIL (`io`, `PIL.Image`, `ImageDraw`, + `ImageFont`), and `line-timeseries` draws its random walk with the standard `random` + module, which no plot profile admits and none will: the adapter must not fabricate + data, which the ADAPTATION rules enforce. Their 12 cases are written anyway and open + blocked sessions until the catalogue files change; every lets-plot fixture file is + eligible. +- **Verified by hand.** The literal `ci-image.yml` steps against the 1c image: the + seaborn, plotnine and altair PNGs, the altair HTML and the multi-script render are + byte-identical to the 1b image's; pygal renders in 1.6 to 1.8 s at 185 to 189 MB, and + lets-plot in 5.0 to 5.3 s at 663 to 667 MB with an empty stderr. Through the local + Docker backend, the normalised `scatter-basic` of pygal (1.4 s per theme) and of + lets-plot (6.0 s per theme) render both themes at 3200x1800, and pygal's + `line-basic`, a 4800x2700 chart, renders at 3200x1800. `test_harness_guard.py` + renders the same three files under the guard where the libraries are installed. After + the review fixes, every renderer-image step of `ci-image.yml` passed three times + against the rebuilt image with the round-one PNG sizes (the pygal `svg2png` form + 3200x1800 too), and the normalised hand-built-SVG files (dendrogram-radial, + histogram-2d, upset-basic, ternary-density), heatmap-basic and lets-plot's + mosaic-categorical render at their target in both themes, which R2 accepts. + +#### Decisions that change or settle the text above + +| Text above | Built | Why | +|---|---|---| +| The canvas rewrite stays matplotlib's (1b) | Canvas rewrites for both libraries. pygal: a chart at another literal size with the target's aspect (in the catalogue only 4800x2700 and 3600x3600) saves through `cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png", output_width=3200, output_height=1800)` or 2400 by 2400, the chart itself unchanged. lets-plot: only `scale=` on the PNG save changes (the PNG is the `ggsize` times the scale, floored) | R2's pixel cap (`MAX_IMAGE_PIXELS`, 11.52 MP) refuses a 4800x2700 or 3600x3600 PNG outright, and R2 is blocking: 123 of the 322 lets-plot files that render (108 of the 284 eligible) and about a third of the pygal files are that size, and lets-plot's scale sits in the protected save, out of the adapter's reach. After the rewrite 268 of 273 lets-plot renders are on target and none is over R2's pixel cap, and the guarded wall p95 falls from 25.9 s to 12.5 s; `svg2png` gives pygal's exact canvas with the same layout | +| lets-plot's `shutil.move`/`rmtree` (24 catalogue files) is rewritten to `ggsave(..., path=".")`, the form the other 301 use | `path="."` is added to 62 saves in 31 files, one computed `path=` becomes `"."`, 25 epilogues are removed and one returned path is unwrapped; the save rule requires `path="."` on every `ggsave` (`SaveRule.directory`), and readiness reports its absence | 31 files save without `path=`, not 24, and 292 pass `path="."`, not 301: 21 files move their outputs afterwards, 4 pass `path="."` and keep a dead `rmtree`, and others write straight into `./lets-plot-images` or compute the directory. Without `path=`, `ggsave` creates that directory, which the guard refuses (`os.mkdir`) | +| Not covered | The star import (`from lets_plot import *`) becomes one explicit import of the names the file uses, from the static list in `letsplot_names.py` | 151 files use it, not the survey's 158 (counted by AST and by grep). The validator refuses star imports; the expansion alone unlocks 132 files. A static list keeps the normaliser from importing lets-plot (the agents image does not install it, and an import runs its side effects); a test fails an upgrade that changes `__all__` | +| `render_to_png` and `ggsave` as save statements | pygal's rule also lists `render_to_file` (the HTML twin, `filename` only) and `cairosvg.svg2png` with a keyword-only `write_to=` and without `url=`, `file_obj=` and `unsafe=`; `render_to_png` takes only `filename` and `dpi` | 87 catalogue files end on `svg2png`. libcairo writes the PNG with its own `fopen`, which the audit hook never sees, so the static pin is the only thing that holds the path. `render_to_png` and `render_to_file` hand their `**kwargs` to the chart's config (`css=`, `js=`, `defs=`), and `svg2png`'s `url=` and `file_obj=` read through cairosvg's unrestricted fetcher | +| `pygal`, `cairosvg` and `cairocffi` in the import surface | `pygal` and `cairosvg` only; `cairocffi`, `cssselect2`, `tinycss2` and `webencodings` are unreachable. `xml.etree` and `Graph` subclasses stay out of pygal's profile, and PIL out of both | cffi's library loads and calls into libcairo raise no audit event. A forged token handed to cssselect2's selector compiler is the one route to an unquoted slot in the lambda it builds, so the CSS stack stays out of reach. `xml.etree`, class definitions and PIL change the security surface and wait for the owner ("Next"): `xml.etree` and `Graph` subclasses block 45 pygal files, PIL 4 lets-plot files | +| Not covered | `CODE_BUILDERS` gains cssselect2's `CompiledSelector.__init__` | Every pygal PNG export compiles the chart's stylesheet into one `eval("lambda el: ...")` per selector. The spike fed 339 selectors with quotes, escapes, newlines and Python text through every pygal channel: the generated source only compares `el`'s name, classes, id, attributes and `lang` | +| Not covered (pygal's HTML writes) | html-open: a write of exactly the chart's `render()` output to `f"plot-{THEME}.html"` becomes `chart.render_to_file(f"plot-{THEME}.html")` (158 files). html-drop: every other module-level HTML or SVG write (hand-built pages, post-processed SVG, `.svg` files) is removed with the assignments that only fed it (103 files) | Dropping alone would unlock the same files; the rewrite is chosen for the export: its HTML and PNG are byte-identical to the catalogue file's on all 156 runnable files (apart from pygal's generation-date comment), and `render_to_file` is a save name the validator pins while `open` stays banned. The dropped writes have no pinnable form, and the guard refuses `.svg` writes anyway; the export loses those pages | +| Not covered (Python keeps the default limits) | lets-plot's row has its own `RLIMIT_AS` of 2048 MiB (`RuntimeCommand.rlimit_as_mb`) with Arrow's system allocator and a minimal fontconfig file in its environment; not the Python default and not off as for altair | lets-plot rasterises in its Kotlin/Native bridge with ImageMagick linked in. An allocation it cannot make kills the process ("Out of memory trying to allocate"): SIGABRT (exit 134) on a developer machine, SIGSEGV (exit 139) in the renderer image, with either Arrow pool. pyarrow's default pool reserves another 1 GiB arena on the first pandas string column, which kills even a minimal 3200x1800 chart at 1024 and 1536 MiB; with the system allocator 18 of the 42 spike renders still die at 1024 MiB. With it, 2048 MiB held all 42 spike renders up to 4800x2700 and 3600x3600 (peak 1697 MiB) and still stops a 6400x3600 export (2580 MiB). No catalogue file renders at 6400x3600: the `ggsize(1600, 900)` files use `scale=3`, so the survey's worst case does not occur. Off, a runaway scale would meet only the `MemAvailable` watchdog | +| The slim image needs `libcairo2` | As planned, without recommends (a 13.8 MB layer), plus DejaVu Sans linked next to Serif and Mono and `/opt/anyplot/fonts.conf` | lets-plot draws its default text in DejaVu Sans and falls back to a Noto Sans face without it; its bridge's own fontconfig finds no configuration in the image and writes "Fontconfig error" on every export. `libcairo2` brings Debian's DejaVu faces and `/etc/fonts`, which left every seaborn, plotnine and altair render of `ci-image.yml` byte-identical | +| Not covered | In every profile a save name imported under another name, anything imported under a save name, and a bare save name that is not a call's callee are a `banned-call`; a `match` capture counts as a binding of a plotnine expression name | Both routes passed the shipped plotnine profile with no finding: `from plotnine import ggsave as keep` (or `g = ggsave`, `[ggsave][0]`, `functools.partial(ggsave, plot)`) reaches any path in the exported code, and `COLUMN = "x"` followed by `match '<code>': case COLUMN: pass` hands plotnine code to evaluate in `aes(x=COLUMN)`. The normaliser renames the `export_ggsave` alias in 17 lets-plot files; no eligible file is lost, and the raw findings of the four shipped libraries are unchanged | +| Not covered (`.format` is a banned attribute) | lets-plot's profile exempts a `.format` with string-literal arguments (positional, `field=`, `format=`) at the end of a chain of builder methods (`LETSPLOT_BUILDER_METHODS`, each checked to return the builder in 4.11.0) whose root is `layer_tooltips()`, `layer_labels()` or `smooth_labels()`, imported from `lets_plot` under a name bound once whose attributes are never stored | 59 catalogue files use it 128 times, and the exemption is worth 53 eligible files (284 instead of 231). `str.format` stays refused, and so do a builder held in a variable, a rebound builder name, a non-literal argument and `lets_plot.layer_tooltips = str` | +| Not covered (R2's blank check refuses a canvas 98 % one colour, since phase 1) | `MAX_BACKGROUND_RATIO` is 0.997 for every library: R2 refuses a canvas that is 99.7 % one colour, and its message gives the share to one decimal | Measured on 2026-10-26 with `core.canvas.dominant_color`: the sparsest eligible pygal render (network-directed) is 99.44 % one colour, 33 of the 195 eligible pygal renders are at 98 % or more, and lets-plot's point-basic is at 98.38 %, so 0.98 refused about one pygal plot in six on every render. A pygal chart with only a title is 99.78 % and a bare pygal canvas 99.93 %. A pygal chart with axes and guides but no data is 98.62 % and passes; R2 never caught empty axes, because matplotlib's stay under 98 % too. A higher threshold refuses nothing that 0.98 accepted | +| `render_to_png` and `ggsave` as save statements (pygal's three save names, the row above) | `SaveRule.writes` gives each pygal save name the one file type it writes: `render_to_png` and `svg2png` the PNG, `render_to_file` the HTML. The validator reports a mismatch as `savefig-target` (`render_to_file writes only f"plot-{THEME}.html"`), and a PNG save under the wrong name does not count as the PNG save; the readiness scan reports it through `SaveRule.writes_suffix`, and the canvas step and `measure_canvas` leave such a save alone | The rule took any of the three names with either target, so `chart.render_to_file(f"plot-{THEME}.png")` wrote SVG text into the PNG and `render_to_png(f"plot-{THEME}.html")` a PNG into the HTML, both with no finding, and the canvas rewrite turned the first into `svg2png` (correctness review of 2026-10-26). No catalogue file changes | +| Not covered (`THEME` is a protected region, not a pinned name) | The SECURITY profile of every library pins `THEME` (rule `savefig-target`): its one binding is the first module-level theme block that `regions.is_theme_assignment` accepts, after `import os`. Every other binding is a finding at its own line: a second, augmented or annotated assignment, an unpacking, a `for`, `with`, `except`, `match`, walrus or comprehension target, an import, a `def` or parameter, `del`, a type alias and a `global` or `nonlocal` declaration. Once `import os` binds `os`, any other binding of `os` is an `os-use` finding | Every save target is `f"plot-{THEME}..."`, so a rebound `THEME` moves the write. The security review of 2026-10-26 passed the validator with `THEME` reassigned to a traversal literal before `svg2png`, whose native write the guard never sees; it failed only because no `plot-` directory existed. The pin refuses three theme blocks the validator passed (`os.environ.get`, an `os` alias, `.lower()`), which the readiness scan already blocked as `no-theme`. No catalogue file binds `THEME` twice, eligibility is unchanged, and only heatmap-polar (pygal, already blocked) gains a finding. The block's default value stays unpinned ("Next") | +| html-drop removes the HTML and SVG writes with the assignments that only fed them (the HTML row above) | html-drop also removes a module-level `with open(...)` of the theme's `.html` or `.svg` target whose body assigns names that nothing outside it reads and whose values hold no save call, as long as it writes at least once; html-open still rewrites only a single-write body | heatmap-basic writes its hand-built page from a two-statement body (`pygal_svg = chart.render(...)`, then `fout.write(...)`), which left `open` and a 216-character literal in the run form and blocked the file and its six fixture cases. The extension unlocks exactly that file (blocked to coupled); no other catalogue file's output changes | +| The pygal canvas rewrite reads the chart's literal size (the first row) | Where the `svg2png` bytestring traces to no chart, the normaliser reads the root `<svg>`'s `width=` and `height=` from the string literals that build the bytestring (through names, `+=`, `.append`, `.extend` and `.insert`), as numbers, `px` lengths or module-level names bound once, and sets the output size as for a traced chart. Several `<svg>` tags, a computed or `%` size, or a name bound twice leave a note. A size set after the constructor (`.width` or `.height` stores, `chart.config(...)`, `config=`, a positional `pygal.Config`, a `render()` keyword) makes the size unknown: a note, no rewrite, and no fallback to pygal's 800x600 | Four eligible pygal files (dendrogram-radial, histogram-2d, upset-basic, ternary-density) pass a hand-built 4800x2700 or 3600x3600 SVG to `svg2png` with no output size, so R2's pixel cap refused every render while the readiness reason promised R3's padding. They now render at 3200x1800 or 2400x2400 in both themes, and heatmap-adjacency gets the same rewrite but stays blocked by a function-level guard. Module-level size names turned 6 of the 7 unknown-size notes on eligible pygal files into known on-target sizes; heatmap-stripes-climate (`**_base`) keeps its note. No eligible pygal or lets-plot file now has a known size over the cap | + +#### Eligibility after 1c + +`uv run --extra agents python -m agents.evals.eligibility` on 2026-10-26; matplotlib +and seaborn are unchanged against main. plotnine and altair gain seven files from 1c's +library-agnostic rules: plotnine's bar-horizontal and spiral-timeseries and altair's +chessboard-basic, voronoi-basic, waffle-basic and scatter-ashby-material through the +guard rules, and plotnine's candlestick-volume through the `f"{d}/plot-{THEME}.png"` +target form. The review fixes moved one file: html-drop's extension makes pygal's +heatmap-basic eligible (208 before). The `THEME` pin and the save-name pairing change +no status. + +| Library | Files | Eligible | Clean | Coupled | Blocked | +|---|---|---|---|---|---| +| matplotlib | 325 | 285 (87.7 %) | 15 | 270 | 40 | +| seaborn | 325 | 287 (88.3 %) | 18 | 269 | 38 | +| plotnine | 321 | 267 (83.2 %) | 59 | 208 | 54 | +| altair | 325 | 273 (84.0 %) | 58 | 215 | 52 | +| pygal | 325 | 209 (64.3 %) | 64 | 145 | 116 | +| lets-plot | 325 | 284 (87.4 %) | 53 | 231 | 41 | + +Why the pygal and lets-plot files are blocked, first cause per file (each column sums to +its blocked count): + +| Cause | pygal | lets-plot | +|---|---|---| +| One of the 13 map specs | 13 | 13 | +| `xml.etree` post-processing of the SVG | 23 | 0 | +| A subclass of pygal's `Graph` (a class definition) | 18 | 0 | +| Old-form file: no `THEME` block and a single-theme `plot.png` | 13 | 7 | +| `io` or PIL compositing of the PNG | 12 | 4 | +| `sklearn.datasets` for the example data | 6 | 10 | +| `.format` on a string (lets-plot: hex colours) | 6 | 4 | +| matplotlib, outside pygal's surface | 4 | 0 | +| A guard shape the normaliser does not strip | 3 | 0 | +| A string literal over 200 characters | 3 | 1 | +| `.query` | 0 | 1 | +| `qrcode` and a URL literal | 0 | 1 | +| Other one-offs | 15 | 0 | + +By SECURITY rule (a file can have several): pygal `banned-import` 62, `savefig-target` +30, `banned-statement` 22, `dunder` 22, `banned-keyword` 19, `banned-attribute` 16, +`string-length` 12, `banned-call` 7, `os-use` 6, `banned-name` 5, `url-literal` 2; +lets-plot `banned-import` 18, `banned-call` 11, `savefig-target` 8, `banned-attribute` +7, `url-literal` 1, `string-length` 1. 216 normalised pygal files and 293 lets-plot +files pass SECURITY; the map specs and the files without a `THEME` block make up the +rest of the gap. The static count includes files that fail their first render anyway: +13 pygal and 10 lets-plot files divide by the length of the emptied title, +waveform-audio (pygal) runs past `RLIMIT_CPU` in cairosvg's path parser, and two +lets-plot files do not render with lets-plot 4.11.0: calibration-curve raises a +MagickWand error in the export, and line-confidence writes an almost fully transparent +PNG, which R2 refuses as 100 % one colour. R2's blank check, at 99.7 %, passes every +eligible pygal render measured (the sparsest is 99.44 %). + +#### Next + +Settled by 1c: normaliser rules for the guard shapes of 1b's third blocked row. The four +library-agnostic rules and the new target form took plotnine from 264 to 267 and altair +from 269 to 273. The rest of that row stays, altair's two `"site-packages" in X.origin` +loaders among it, which the find-spec rule leaves alone. Also settled: the fixtures and +smoke cases for pygal and lets-plot ("What 1c built"), and the review of the lets-plot +bridge (the owner questions below). What stays from 1b's list, and what 1c adds: + +- plotnine's own canvas rewrite through `save(dpi=, width=, height=)` and `ggsave`. + plotnine and altair are now the only Python libraries whose canvas rests on the R3 + gate. +- The readiness coupling scan knows only matplotlib's limit and tick calls: plotnine's + `coord_cartesian(xlim=, ylim=)` and `scale_*_continuous(limits=, breaks=)`, altair's + `alt.Scale(domain=)` and axis `values=`, pygal's `range=` (111 files) and `xrange=` + (75 files), and lets-plot's literal `limits=` and `breaks=` (126 files, of which the + scan flags 10) go unflagged, so the adapter gets no `limits` hint for them. +- altair, pygal and lets-plot write no probe, so the advisory gates (G3 to G12, the + row-fidelity check G8 among them) never run for them; whether a row count read from + the chart's own spec should replace G8 is open. +- The normaliser blanks the catalogue title to `""`; code that divides by `len(title)` + (11 plotnine, 5 altair and 54 matplotlib files, and among the eligible files 13 pygal + and 10 lets-plot ones) fails a raw render with ZeroDivisionError unless the adapter + writes a new title. A non-empty placeholder would avoid it. +- HTML saves stay in the run form, uncollected: altair's `disable_max_rows()` heatmap + writes 50 MB and can hit `RLIMIT_FSIZE`, and pygal's and lets-plot's reach 25 MB + (lets-plot's heatmap-mandelbrot 25.3 MB, about 40 % of the 64 MiB run budget; pygal's + ice-basic 21.7 MB). The normaliser could drop the HTML save after all. +- `matrix.py` warns when `AGENT_LIBRARIES` does not enable a selected case's library; + whether the harness should enable the cases' libraries itself is open. +- Arrow's system allocator for every plot row: pyarrow's default pool reserves a 1 GiB + address-space arena on the first pandas string column, which counts against + `RLIMIT_AS` in every Python row, and only lets-plot's row and the conversions avoid + it. The CI lets-plot step takes its variables from the command table's row but cannot + tell whether the allocator took effect, because its minimal chart passes at 2048 MiB + with either pool; only unit tests pin it. A second run at 1536 MiB would tell (the + system pool exits 0, the default pool 139). +- A resource-error grammar for lets-plot: under `RLIMIT_AS` the bridge dies by a signal + after "Out of memory trying to allocate" (SIGABRT, exit 134, on a developer machine; + SIGSEGV, exit 139, in the renderer image) or raises a MagickWand `ValueError` from the + export, and `gates.error_summary` hands that `ValueError` to the repair as a code + error on the `ggsave` line. All three should read as resource errors. +- Three eligible files always fail R2's pixel cap: matplotlib's dot-matrix-proportional + and timeseries-decomposition and seaborn's heatmap-clustered crop a 4800x3000 or + 4800x3600 canvas with `bbox_inches="tight"` at an aspect that no dpi brings onto a + target. Their readiness reason says so since 2026-10-26. A fit inside the target, as + lets-plot's rewrite does, or blocking a known over-cap canvas in the readiness scan + would change what matplotlib and seaborn do today. +- pygal's cairo writes a fontconfig cache of about 184 KB (7 files) into + `$HOME/.cache/fontconfig`, the sandbox's private `/tmp`, on every render: native + writes the guard cannot see, inside the sandbox boundary and at no measurable time. + Accept it, or bake a cache, which needs Debian's `fontconfig` package (`fc-cache`) in + the image. +- Validator questions from the build: no rule refuses an attribute store on an imported + module (`np.x = ...`; closed only where the builder exemption depends on it); the + SECURITY profile bans a private attribute only on a receiver that resolves through an + import (`chart.config._update(...)` passed until `_update` was banned by name in + pygal's profile; the DATA profile bans every private attribute); and the URL rule + does not match `javascript:` URLs, which pygal's value metadata (`xlink` hrefs) and + altair's href channel can put into the exported HTML (the sandbox is not affected). + The `THEME` pin leaves the theme block's default unpinned: + `regions.is_theme_assignment` accepts any second argument to `os.getenv`. The + renderer always sets `ANYPLOT_THEME`, so the default never reaches a render, but an + exported file run without the variable names its files from it. +- Owner questions: + - The 80 % matrix gate for pygal: 12 of its 60 generated cases (the `histogram-basic` + and `line-timeseries` files) open blocked sessions, so pygal reaches at most 48 of + 60, exactly the gate, and only if every eligible case passes. Count only the + eligible pairs in the gate, regenerate the two catalogue files through the pipeline + (the annotation drawn by pygal instead of PIL, `np.random.default_rng` instead of + `random`), or accept it. + - pygal's `xml.etree` post-processing (26 files) and `Graph` subclasses (23 files), + 45 blocked files as the groundwork counted the first cause. Admitting `xml.etree` + with a ban list on its readers and writers would unlock 14; a class definition is + refused in every profile today. + - PIL for lets-plot: 4 files post-process the PNG with PIL (chord-basic, + heatmap-chromagram, rose-basic, windrose-basic); altair's reopen rule could extend + to them. + - CJK and Arabic text in pygal: cairo's toy font API resolves one face per text run + and never falls back per glyph, and cairosvg takes only the first family of + `font-family`, so such text in user data draws as DejaVu's empty boxes; the + harness's fallback families and G10 are matplotlib's. Accept it, or have the + adapter put `Noto Sans CJK JP` or `Noto Sans` first when the data's script needs it. + - The lets-plot native bridge before enabling: it imports `execvp`, `fork`, `popen`, + `system` and `mkstemp` (ImageMagick's delegates and temp files), which the audit + hook cannot see. The adversarial security review of 2026-10-26 (real renders under + the harness with `strace -f`) found no escape and no validator bypass with an effect: + titles, labels and font families with ImageMagick coder prefixes (`@`, `caption:`, + `label:`, `msl:`) never reach a coder, and `geom_imshow` builds an in-memory + `data:` href from an array and reads no file, so admitted code cannot steer the + native layer. The bridge's native process starts are bounded by the image's `PATH`, + `RLIMIT_NPROC` and the sandbox, and since 2026-10-26 `ci-image.yml` fails when any + of 39 delegate programs is on the sandbox's `PATH`. No ImageMagick policy ships: + the bridge's ImageMagick is a zero-configuration build that reads no `policy.xml` + and no `MAGICK_*` variable (a policy denying every coder and delegate changed no + export, on the host or in the image). The two `fc-list` starts in the review's + traces come from matplotlib's font manager, not the bridge, whose plain export + started no process in a host trace; the image has no `fc-list`. Accept this containment, or add a + seccomp filter that denies `execve` in the render container before lets-plot is + enabled. +- The owner's matrix run per library on Vertex (question 7), then `_LIBRARIES` in + `agents/cloudbuild.yaml`. + ### 2. R: ggplot2 (the exec-mode pilot) - Toolchain: R 4.6.1 as in `.github/actions/setup-r` (Posit snapshot 2026-10-20, the same diff --git a/agents/README.md b/agents/README.md index 98f8ba89a72..0a03eba148e 100644 --- a/agents/README.md +++ b/agents/README.md @@ -4,7 +4,7 @@ This directory holds the anyplot agent network: the service that lets an admin p ## What is built -The runtime core runs locally: the agents, the plot pipeline, the guardrail plugins, the render layer, the private `/v1` service with its run queue, the theme toggle, and the footer strip on every PNG the service serves ("made with any.plot()" and "anyplot.ai/<spec-id>", see [Footer strip](../docs/concepts/agent-network.md#footer-strip)). The renderer service `anyplot-renderer` (`renderer/`), which runs the adapted code in Cloud Run sandboxes, and the `remote` backend that calls it are built, and the renderer has run in Cloud Run since 2026-10-11 (deployed by the `deploy-renderer` trigger; see [Render through the deployed renderer](#render-through-the-deployed-renderer)). The model-regression harness, the 240 synthetic cases (the 120 of spike X for matplotlib and seaborn, and since 2026-10-25 the same for plotnine and altair), the 23 stress cases with their model-free static stage, the blind two-run review gallery and the catalogue eligibility sweep are built (see [Run the regression harness](#run-the-regression-harness)), and the Claude Haiku 5.5 baseline from the thinking run of 2026-10-11 on main is committed (`evals/baselines/claude-haiku-5-5.json`: 122 runs, all passed the gates, 50.8 % ended `ok`); the Gemini baseline is not. The chat page that uses the service through the API's `/debug/agent` routes is in the app (`app/src/pages/AgentChatPage.tsx`, built with `VITE_ENABLE_AGENT_CHAT=true`); since 2026-10-11 its data field also takes free text ("Hund 7 Katze 3 und Vogel 4"), which the judge model reads as a table that the user confirms before it is stored (`anyplot/data/transcribe.py`, rubric `prompts/transcriber.md`), and the flow has two steps: the user confirms the data with its bindings (`POST /v1/sessions/{sid}/dataset/confirm`) before the pipeline draws anything, and in step 1 the root's `prepare_data` tool changes the data on request from a fixed set of operations the server applies (`anyplot/data/prepare.py`, `anyplot/dataset_versions.py`), with the `done` event carrying the new version, the `summarize_data` action for the step-1 summary and `POST /v1/sessions/{sid}/dataset/undo` as the user's undo (since 2026-10-14 the lines pasted above or below a table, which the parser leaves out of it, are kept as the user's notes about the data: the dataset route runs the pre-filter and the scope judge on them, returns the kept ones as `context_lines`, and the `summarize_data` turn and `get_dataset_profile` hand them to the root fenced as `<user_notes>`, see [Request flow](../docs/concepts/agent-network.md#request-flow-for-use-with-my-data)), and its `generate_data` tool computes the data from a formula the model chose, such as `sin(x)` from -pi to pi (`anyplot/data/generate.py`; a formula pasted into the data field answers `422 formula`) (see [Two steps: data first, then the plot](../docs/concepts/agent-network.md#two-steps-data-first-then-the-plot)); the prep eval scores the root's choices (see [Run the prep eval](#run-the-prep-eval)). Since 2026-10-12 a session has one language for the replies and every text in the plot, English by default whatever the browser's locale, set since 2026-10-14 by a paste before any typed message from the language of its notes or column names (`pasted`), by the first in-scope typed message (`detected`), or for good by the chip in the chat header (`PUT /v1/sessions/{sid}/language`) or the root's `set_language` tool (`chosen`); code, comments, column names and labels from the data stay as they are (`anyplot/language.py`, see [Session language](../docs/concepts/agent-network.md#session-language)). The service's own image (`Dockerfile`) and Cloud Build config (`cloudbuild.yaml`) are built, with a CI job that builds and smokes the image before merge, and the service has run in Cloud Run since 2026-10-11, deployed by the `deploy-agents` trigger (see [Build and deploy the service](#build-and-deploy-the-service)); the API side is switched on for admins since 2026-10-11 (the user-id secret is bound, the API trigger sets the service URL and `_AGENT_ENABLED=true`). The judge-only scope eval and its cases are built, and its first full run on 2026-10-10 passed both gates (see [Run the scope eval](#run-the-scope-eval)). Real sessions reach the harness too: `evals/import_case.py` turns a saved session or a stored feedback case into an eval case, and since 2026-10-12 `evals/sync_cases.py` pulls the cases you promoted on the debug page from the private case bucket (see [Sync promoted cases from the bucket](#sync-promoted-cases-from-the-bucket)). Not built yet: the scope cases' second stage through the root, and the `agents-eval.yml` workflow. +The runtime core runs locally: the agents, the plot pipeline, the guardrail plugins, the render layer, the private `/v1` service with its run queue, the theme toggle, and the footer strip on every PNG the service serves ("made with any.plot()" and "anyplot.ai/<spec-id>", see [Footer strip](../docs/concepts/agent-network.md#footer-strip)). The renderer service `anyplot-renderer` (`renderer/`), which runs the adapted code in Cloud Run sandboxes, and the `remote` backend that calls it are built, and the renderer has run in Cloud Run since 2026-10-11 (deployed by the `deploy-renderer` trigger; see [Render through the deployed renderer](#render-through-the-deployed-renderer)). The model-regression harness, the 360 synthetic cases (the 120 of spike X for matplotlib and seaborn, the same for plotnine and altair since 2026-10-25, and for pygal and lets-plot since 2026-10-26), the 23 stress cases with their model-free static stage, the blind two-run review gallery and the catalogue eligibility sweep are built (see [Run the regression harness](#run-the-regression-harness)), and the Claude Haiku 5.5 baseline from the thinking run of 2026-10-11 on main is committed (`evals/baselines/claude-haiku-5-5.json`: 122 runs, all passed the gates, 50.8 % ended `ok`); the Gemini baseline is not. The chat page that uses the service through the API's `/debug/agent` routes is in the app (`app/src/pages/AgentChatPage.tsx`, built with `VITE_ENABLE_AGENT_CHAT=true`); since 2026-10-11 its data field also takes free text ("Hund 7 Katze 3 und Vogel 4"), which the judge model reads as a table that the user confirms before it is stored (`anyplot/data/transcribe.py`, rubric `prompts/transcriber.md`), and the flow has two steps: the user confirms the data with its bindings (`POST /v1/sessions/{sid}/dataset/confirm`) before the pipeline draws anything, and in step 1 the root's `prepare_data` tool changes the data on request from a fixed set of operations the server applies (`anyplot/data/prepare.py`, `anyplot/dataset_versions.py`), with the `done` event carrying the new version, the `summarize_data` action for the step-1 summary and `POST /v1/sessions/{sid}/dataset/undo` as the user's undo (since 2026-10-14 the lines pasted above or below a table, which the parser leaves out of it, are kept as the user's notes about the data: the dataset route runs the pre-filter and the scope judge on them, returns the kept ones as `context_lines`, and the `summarize_data` turn and `get_dataset_profile` hand them to the root fenced as `<user_notes>`, see [Request flow](../docs/concepts/agent-network.md#request-flow-for-use-with-my-data)), and its `generate_data` tool computes the data from a formula the model chose, such as `sin(x)` from -pi to pi (`anyplot/data/generate.py`; a formula pasted into the data field answers `422 formula`) (see [Two steps: data first, then the plot](../docs/concepts/agent-network.md#two-steps-data-first-then-the-plot)); the prep eval scores the root's choices (see [Run the prep eval](#run-the-prep-eval)). Since 2026-10-12 a session has one language for the replies and every text in the plot, English by default whatever the browser's locale, set since 2026-10-14 by a paste before any typed message from the language of its notes or column names (`pasted`), by the first in-scope typed message (`detected`), or for good by the chip in the chat header (`PUT /v1/sessions/{sid}/language`) or the root's `set_language` tool (`chosen`); code, comments, column names and labels from the data stay as they are (`anyplot/language.py`, see [Session language](../docs/concepts/agent-network.md#session-language)). The service's own image (`Dockerfile`) and Cloud Build config (`cloudbuild.yaml`) are built, with a CI job that builds and smokes the image before merge, and the service has run in Cloud Run since 2026-10-11, deployed by the `deploy-agents` trigger (see [Build and deploy the service](#build-and-deploy-the-service)); the API side is switched on for admins since 2026-10-11 (the user-id secret is bound, the API trigger sets the service URL and `_AGENT_ENABLED=true`). The judge-only scope eval and its cases are built, and its first full run on 2026-10-10 passed both gates (see [Run the scope eval](#run-the-scope-eval)). Real sessions reach the harness too: `evals/import_case.py` turns a saved session or a stored feedback case into an eval case, and since 2026-10-12 `evals/sync_cases.py` pulls the cases you promoted on the debug page from the private case bucket (see [Sync promoted cases from the bucket](#sync-promoted-cases-from-the-bucket)). Not built yet: the scope cases' second stage through the root, and the `agents-eval.yml` workflow. The model is **Claude Haiku 5.5 on Vertex AI** (`claude-haiku-5-5`) by default. **Gemini 3.8 Flash** is the second arm: set `AGENT_PROVIDER=gemini` together with Gemini model ids, so the two can be compared on price and quality later. Every agent and the scope judge run on the configured provider. @@ -31,7 +31,7 @@ The model is **Claude Haiku 5.5 on Vertex AI** (`claude-haiku-5-5`) by default. | `anyplot/plugins/` | `ScopeGuardPlugin`, `BudgetPlugin`, `ToolSafetyPlugin` and the request ledger they share | | `anyplot/output_guard.py` | The output sanitiser of every root message and plot-event line (links, HTML and long code blocks out, at most 1,200 characters) and the reply cap the ScopeGuard runs on the root's final reply before it is stored: a reply over 1,200 characters becomes the fixed refusal, the same in every language, or is cut at 1,200 characters when the turn ran the plot pipeline | | `anyplot/render/` | The render contract, the probe harness, the host gates (R1-R3, advisory G3/G5/G7/G8/G9/G10/G11/G12), PNG hardening, the render store, the `remote` (the renderer service, phase 1), `local`, `fake` and `sandbox` (an unused in-process stub) backends, `serial.py`, the one render semaphore in front of every backend, and `watermark.py`, the footer strip the artifact route and the feedback bundle add to the raw render | -| `anyplot/render/runtimes/` | The runtime registry (`runtime_for(library)`, `RUNTIME_LIBRARIES`): one `RuntimeAdapter` per library, which binds the language's code modules (normaliser, regions, readiness, validator, edits, loader, export), its error grammar and its render command for the pipeline, the theme toggle, the local backend and the eval harness; `python.py` serves matplotlib, seaborn, plotnine and altair (`PYTHON_LIBRARIES`; the last two since 2026-10-25), each with its own save rule (`anyplot/code/regions.py`, `SAVE_RULES`) and validator profile. A later language adds a runtime here, never a backend (`agentic/specs/261024-agent-all-libraries.md`) | +| `anyplot/render/runtimes/` | The runtime registry (`runtime_for(library)`, `RUNTIME_LIBRARIES`): one `RuntimeAdapter` per library, which binds the language's code modules (normaliser, regions, readiness, validator, edits, loader, export), its error grammar and its render command for the pipeline, the theme toggle, the local backend and the eval harness; `python.py` serves matplotlib, seaborn, plotnine, altair, pygal and lets-plot (`PYTHON_LIBRARIES`; plotnine and altair since 2026-10-25, pygal and `letsplot` since 2026-10-26), each with its own save rule (`anyplot/code/regions.py`, `SAVE_RULES`) and validator profile. A later language adds a runtime here, never a backend (`agentic/specs/261024-agent-all-libraries.md`) | | `anyplot/render/fonts/` | JetBrains Mono 2.304 Regular and Bold for the footer strip, unmodified, with `OFL.txt` (SIL Open Font License 1.1) and a notice with their SHA-256 values ([fonts README](anyplot/render/fonts/README.md)) | | `renderer/` | The `anyplot-renderer` service: `main.py` (`POST /render`, `GET /status`, one render slot), `executor.py` (one `sandbox do` per theme with the kill path, the byte watchdog and the launcher retry), `commands.py` (the command table: one fixed render command per language, selected by the job's `(language, library)` and never taken from the request; the harness's exec mode runs the non-Python commands; `GET /status` reports under `languages` which toolchains this image carries, and a job in a language without one answers `503 runtime_unavailable`), `auth.py` (the caller check), `settings.py` (`RENDERER_*`), `wire.py` (the JSON contract the `remote` backend shares), `Dockerfile` and `cloudbuild.yaml`. No ADK import and no `__init__.py`, so `adk web agents` does not list it as an agent | | `anyplot/opening.py`, `session_state.py`, `services.py`, `briefs.py` | Opening a session and taking in a dataset, the server-set session state, the process-wide stores, and the spec and dataset briefs | @@ -43,15 +43,15 @@ The model is **Claude Haiku 5.5 on Vertex AI** (`claude-haiku-5-5`) by default. | `evals/score.py`, `anyplot/scoring.py`, `anyplot/prompts/scorer.md` | Scores a harness run's renders with the catalogue rubric on Claude Opus: the measurement behind the quality ladder ([Score the renders with the catalogue rubric](#score-the-renders-with-the-catalogue-rubric)) | | `anyplot/cli_transport.py`, `scripts/agents-experiment.sh` | The `claude-cli` transport and the experiment runner: the live code with its Claude calls on your subscription ([Run an experiment on your Claude subscription](#run-an-experiment-on-your-claude-subscription)) | | `evals/ladder_lab.py` | Compares reviewers, feedback forms and repairers on the same seed renders through the local Claude Code CLI ([Compare reviewers, feedback forms and repairers](#compare-reviewers-feedback-forms-and-repairers-ladder-lab)) | -| `evals/make_fixtures.py` | The seeded generator of the 240 synthetic cases: 10 specs times matplotlib, seaborn, plotnine and altair times 6 datasets | +| `evals/make_fixtures.py` | The seeded generator of the 360 synthetic cases: 10 specs times matplotlib, seaborn, plotnine, altair, pygal and lets-plot times 6 datasets | | `evals/make_stress.py`, `evals/stress.py` | The seeded generator of the 23 stress cases, and the model-free static stage that `--static` runs over them ([Run the stress cases](#run-the-stress-cases)) | | `evals/cases.py`, `evals/pricing.py`, `evals/report.py` | Case loading and selection, list prices, and the summary, diff and gallery code; `report.py` also merges two runs into one blind gallery and scores its export | | `evals/import_case.py` | Turns one feedback case, a saved session bundle or a case directory copied from the bucket, into an eval case in the git-ignored `evals/.cases/` ([Import a feedback case](#import-a-feedback-case)) | | `evals/sync_cases.py` | Keeps `evals/.cases/` in line with the `agent_feedback` table: imports the promoted cases from the private case bucket, removes the retired ones, and with `--backfill` indexes cases that have no row ([Sync promoted cases from the bucket](#sync-promoted-cases-from-the-bucket)) | -| `evals/eligibility.py` | The model-free sweep of the catalogue's files of every Python library with a code profile (matplotlib, seaborn, plotnine, altair): eligible, coupled and blocked pairs, and why | +| `evals/eligibility.py` | The model-free sweep of the catalogue's files of every Python library with a code profile (matplotlib, seaborn, plotnine, altair, pygal, lets-plot): eligible, coupled and blocked pairs, and why | | `evals/scope.py`, `evals/scope.evalset.json` | The judge-only scope eval and its 219 synthetic cases: in-scope, off-topic and adversarial messages and notes pasted with a table, scored for adversarial recall and false refusals | | `evals/prep.py`, `evals/fixtures/prep/` | The live prep eval and its 51 German and English data requests (10 of them `hard`, 11 data-code cases): each through `/v1` in process with the real model, scored on the `prepare_data` operations and `generate_data` calls the root chose, and on the size of the table each `run_data_code` call stored (a `refuse` case passes when nothing was stored) ([Run the prep eval](#run-the-prep-eval)) | -| `evals/fixtures/cases/` | The eval cases: 240 generated (`<spec>-<library>-<perturbation>`), the hand-written `scatter-basic-matplotlib`, `bar-grouped-seaborn` and `scatter-basic-matplotlib-german-message` (a German follow-up that sets the session language), and 23 stress cases (`stress-<name>`) ([fixtures README](evals/fixtures/README.md)) | +| `evals/fixtures/cases/` | The eval cases: 360 generated (`<spec>-<library>-<perturbation>`), seven hand-written, among them `scatter-basic-matplotlib`, `bar-grouped-seaborn` and `scatter-basic-matplotlib-german-message` (a German follow-up that sets the session language), and 23 stress cases (`stress-<name>`) ([fixtures README](evals/fixtures/README.md)) | | `evals/baselines/` | Committed baseline reports, one per model ([baselines README](evals/baselines/README.md)) | The unit tests are in `tests/unit/agents/`; `tests/unit/agents/runtime/` drives a full "Create plot" through `/v1` with a fake renderer and scripted models for both providers, and `tests/unit/agents/evals/` runs the harness the same way. @@ -76,7 +76,7 @@ Three rules hold for everything here: | `AGENT_CLI_CONCURRENCY`, `AGENT_CLI_CALL_LOG` | `3`, unset | `claude-cli` only: CLI calls at the same time; a file that gets one JSON line per call | | `AGENT_LOCATION` | `eu` | Vertex AI location: `eu`, `us` or `global` | | `AGENT_PROJECT`, else `GOOGLE_CLOUD_PROJECT` | `anyplot` | Project that serves and bills the model calls | -| `AGENT_LIBRARIES` | `matplotlib,seaborn` | Enabled libraries; each needs a runtime in the registry (`anyplot/render/runtimes/`, `RUNTIME_LIBRARIES`: `matplotlib`, `seaborn`, `plotnine` and `altair`), others are refused at startup. The default and the deploy's `_LIBRARIES` stay `matplotlib,seaborn`; the owner enables plotnine and altair after each one's eval matrix reaches 80 % | +| `AGENT_LIBRARIES` | `matplotlib,seaborn` | Enabled libraries; each needs a runtime in the registry (`anyplot/render/runtimes/`, `RUNTIME_LIBRARIES`: `matplotlib`, `seaborn`, `plotnine`, `altair`, `pygal` and `letsplot`), others are refused at startup. The default and the deploy's `_LIBRARIES` stay `matplotlib,seaborn`; the owner enables plotnine, altair, pygal and lets-plot one by one, each after its eval matrix reaches 80 % | | `AGENT_RENDERER` | `remote` | `remote` (the renderer service), `local` (Docker, development only), `fake` (fixture PNGs, development and test only) or `sandbox` (an in-process stub, not used in phase 1) | | `AGENT_RENDER_URL` | unset | The renderer service URL; the `remote` backend refuses to start without it; `http://` only in development and test | | `AGENT_RENDER_TOKEN` | unset | Development only: an ID token for the renderer; without it the backend mints one (see [Render through the deployed renderer](#render-through-the-deployed-renderer)) | @@ -165,10 +165,10 @@ Claude runs with adaptive thinking on the root (`AGENT_ROOT_THINKING_BUDGET`, 1, ### Before you begin -1. Install the dependencies, including the four plotting libraries the renderer uses (the harness tests render plotnine and altair in process and skip them without their extras): +1. Install the dependencies, including the six plotting libraries the renderer uses. The harness tests render seaborn, plotnine, altair, pygal and lets-plot in process and skip each one without its extra. pygal's PNG export also needs the system's cairo library (`libcairo2` on Debian and Ubuntu, `cairo` in Homebrew). ```bash - uv sync --extra agents --extra test --extra lib-matplotlib --extra lib-seaborn --extra lib-plotnine --extra lib-altair + uv sync --extra agents --extra test --extra lib-matplotlib --extra lib-seaborn --extra lib-plotnine --extra lib-altair --extra lib-pygal --extra lib-letsplot ``` Never install `openai-agents` into this environment: it ships a top-level `agents` module that shadows this package. @@ -316,7 +316,7 @@ The renderer runs only on Cloud Run, because `sandbox do` exists only there. On ENVIRONMENT=development uv run uvicorn agents.renderer.main:app --port 8003 ``` -Its settings are `RENDERER_*` variables, documented in `renderer/settings.py`. The defaults are the deployed limits: a 64 MiB byte budget and 10,000 files per run, a 30-second wait for the one render slot, a 1,024 MiB `MemAvailable` floor before a render and a 512 MiB floor during one (below it the watchdog kills the sandbox), and the rlimits 60 s CPU, 50 MiB per file, 1 GiB address space and 64 processes. +Its settings are `RENDERER_*` variables, documented in `renderer/settings.py`. The defaults are the deployed limits: a 64 MiB byte budget and 10,000 files per run, a 30-second wait for the one render slot, a 1,024 MiB `MemAvailable` floor before a render and a 512 MiB floor during one (below it the watchdog kills the sandbox), and the rlimits 60 s CPU, 50 MiB per file, 1 GiB address space and 64 processes. A row of the command table (`renderer/commands.py`) can differ: altair's row runs without the address-space limit, and since 2026-10-26 lets-plot's row has its own 2048 MiB (`rlimit_as_mb`) with Arrow's system allocator and `FONTCONFIG_FILE` in its environment, because its native rasteriser aborts every 3200x1800 export under 1 GiB. `RENDERER_RLIMIT_AS_MB=0` still switches the limit off for every row. On Cloud Run the service also checks itself: it refuses every render with `503 volume_missing` when `/tmp/runs` is not a mount of its own of at most 1 GiB (the deploy's in-memory volume), and it ends its own process when a sandbox launcher outlives its kill, so Cloud Run starts a fresh instance instead of answering `503 stuck` until the instance goes idle. `GET /status` reports both. A caller that goes away, or a `POST /render/{job_id}/cancel`, stops the render in progress. `job_id` and the requested themes are an idempotency key: a replayed `POST /render` with the same payload joins the render in flight or gets the stored answer of a finished one, and another payload under the same key is refused with `409 job_conflict`, so the `remote` backend's retries never run a job's code twice. @@ -326,9 +326,9 @@ The image builds from the repository root: docker build -f agents/renderer/Dockerfile -t anyplot-renderer:dev . ``` -The image's `fonts` stage installs Debian's `fonts-noto-core` and `fonts-noto-cjk` and copies 37 allowlisted files (Noto Sans, Noto Sans CJK Regular and Bold, and the script families DejaVu Sans lacks) into `/usr/share/fonts/noto`, with their OFL notices and package versions in `/usr/share/doc/fonts-noto`; the cache bake fails when a family of `harness.FALLBACK_FAMILIES` is not found. The harness appends these families to every font lookup after the font the plot code chose, and the probe's `missing_glyphs` reports the code points no font of a text covers (gate G10). Arabic and Hebrew render shaped and right to left; the limits are in [Agent network design](../docs/concepts/agent-network.md#render). The image installs the `lib-matplotlib`, `lib-seaborn`, `lib-plotnine` and `lib-altair` extras (the last two since 2026-10-25; vl-convert renders altair in process, with no browser) and links matplotlib's DejaVu Serif and DejaVu Sans Mono into `/usr/share/fonts`, because vl-convert resolves `serif` and `monospace` only to those and draws no text without them. +The image's `fonts` stage installs Debian's `fonts-noto-core` and `fonts-noto-cjk` and copies 37 allowlisted files (Noto Sans, Noto Sans CJK Regular and Bold, and the script families DejaVu Sans lacks) into `/usr/share/fonts/noto`, with their OFL notices and package versions in `/usr/share/doc/fonts-noto`; the cache bake fails when a family of `harness.FALLBACK_FAMILIES` is not found. The harness appends these families to every font lookup after the font the plot code chose, and the probe's `missing_glyphs` reports the code points no font of a text covers (gate G10). Arabic and Hebrew render shaped and right to left; the limits are in [Agent network design](../docs/concepts/agent-network.md#render). The image installs the `lib-matplotlib`, `lib-seaborn`, `lib-plotnine`, `lib-altair`, `lib-pygal` and `lib-letsplot` extras (plotnine and altair since 2026-10-25, pygal and lets-plot since 2026-10-26). Each of the four renders in process, with no browser: vl-convert renders altair, cairosvg and libcairo render pygal, and lets-plot's Kotlin/Native bridge renders lets-plot. The image links matplotlib's DejaVu Serif and DejaVu Sans Mono into `/usr/share/fonts`, because vl-convert resolves `serif` and `monospace` only to those and draws no text without them, and since 2026-10-26 DejaVu Sans, which lets-plot draws its default text in. Since 2026-10-26 it also installs Debian's `libcairo2` for cairosvg (with `libfontconfig1` and Debian's DejaVu core fonts, which left the seaborn, plotnine and altair renders byte-identical) and copies `renderer/fonts.conf` to `/opt/anyplot/fonts.conf`: one font directory and no cache directory, for the fontconfig lets-plot's bridge links, which otherwise prints "Fontconfig error" on every export. -`renderer/cloudbuild.yaml` builds, deploys a `candidate` revision without traffic, smokes it (IAM refuses an anonymous caller; with `_SMOKE_RENDER=true`, `/status` reports the launcher and the volume and a real matplotlib render goes through the candidate, with a token minted for the service URL), and promotes it. The first build also creates the service; the deploy adds the service URL to `RENDERER_AUDIENCES` itself, and `_MIN_INSTANCES=1` keeps an instance warm. CI builds the same image before merge and renders a seaborn, a plotnine and an altair plot through the harness in it (`.github/workflows/ci-image.yml`). The deploy flags and the owner tasks are in [Agent network design](../docs/concepts/agent-network.md#serving-and-infrastructure). +`renderer/cloudbuild.yaml` builds, deploys a `candidate` revision without traffic, smokes it (IAM refuses an anonymous caller; with `_SMOKE_RENDER=true`, `/status` reports the launcher and the volume and a real matplotlib render goes through the candidate, with a token minted for the service URL), and promotes it. The first build also creates the service; the deploy adds the service URL to `RENDERER_AUDIENCES` itself, and `_MIN_INSTANCES=1` keeps an instance warm. CI builds the same image before merge and renders a seaborn, a plotnine, an altair, a pygal and a lets-plot plot through the harness in it (`.github/workflows/ci-image.yml`). The deploy flags and the owner tasks are in [Agent network design](../docs/concepts/agent-network.md#serving-and-infrastructure). ### Test @@ -402,14 +402,14 @@ Before the first case the harness renders the catalogue file of the first case o ### Run the smoke set or the full matrix -- The smoke set is 14 cases (tag `smoke`): one generated case per spec, cycling through the perturbations and alternating matplotlib and seaborn, one case each for plotnine and altair (`scatter-basic-plotnine-renamed` and `scatter-basic-altair-renamed`, since 2026-10-25), plus the hand-written `scatter-basic-matplotlib` and `bar-grouped-seaborn`. A run that holds a plotnine or altair case needs that library in `AGENT_LIBRARIES`, which the harness reads from your environment (otherwise the readiness scan blocks the session as `library-disabled`), and a renderer image that carries it (otherwise the preflight ends the run). Until both libraries are enabled by default, export `AGENT_LIBRARIES=matplotlib,seaborn,plotnine,altair` for such a run. +- The smoke set is 16 cases (tag `smoke`): one generated case per spec, cycling through the perturbations and alternating matplotlib and seaborn, one case each for plotnine and altair (`scatter-basic-plotnine-renamed` and `scatter-basic-altair-renamed`, since 2026-10-25) and for pygal and lets-plot (`scatter-basic-pygal-renamed` and `scatter-basic-letsplot-renamed`, since 2026-10-26), plus the hand-written `scatter-basic-matplotlib` and `bar-grouped-seaborn`. A run that holds a plotnine, altair, pygal or lets-plot case needs that library in `AGENT_LIBRARIES`, which the harness reads from your environment (otherwise the readiness scan blocks the session as `library-disabled`), and a renderer image that carries it (otherwise the preflight ends the run). Until these libraries are enabled by default, export `AGENT_LIBRARIES=matplotlib,seaborn,plotnine,altair,pygal,letsplot` for a smoke or full run. ```bash uv run --extra agents python -m agents.evals.matrix --cases smoke \ --renderer remote --render-url https://RENDERER_URL --gcloud-token ``` -- The full matrix is the 247 cases that are not stress cases (127 before plotnine and altair joined). Cap the spend with `--budget-usd`: +- The full matrix is the 367 cases that are not stress cases (247 before pygal and lets-plot joined, 127 before plotnine and altair). Cap the spend with `--budget-usd`: ```bash uv run --extra agents python -m agents.evals.matrix --cases full --budget-usd 4 \ @@ -454,7 +454,7 @@ The rates mean the following: - **Accept-match rate**: runs whose outcome (`ok` counts as accepted) matches the case's `expected` value; cases that expect `unknown` are left out. - **Cost per successful plot**: the whole run's list-price cost divided by the passed runs; the summary also gives the median cost of a passed run. -The diff against a baseline compares the cases both reports hold, with every repeat of each, so a smoke run is measured against the same 14 cases of a full baseline (the 12 matplotlib and seaborn ones against a baseline written before plotnine and altair joined). Each report's pass rate over all of its own runs is an extra row. With 14 cases one run is 7.1 percentage points, more than the 5-point tolerance, so a single case that flips from pass to fail is a regression on the smoke set. +The diff against a baseline compares the cases both reports hold, with every repeat of each, so a smoke run is measured against the same 16 cases of a full baseline (14 against a baseline written before pygal and lets-plot joined, and the 12 matplotlib and seaborn ones against one written before plotnine and altair). Each report's pass rate over all of its own runs is an extra row. With 16 cases one run is 6.25 percentage points, more than the 5-point tolerance, so a single case that flips from pass to fail is a regression on the smoke set. The exit code is one of the following: @@ -620,7 +620,7 @@ After you change `evals/make_stress.py`, regenerate the cases with `uv run --ext ### Run spike X -Spike X is the go or no-go for phase 1: 10 specs times matplotlib and seaborn times 6 datasets (renamed, x10, n=12, n=5000, date, decimal comma) on both arms, under $25 in total. The full matrix was those 120 generated cases plus the hand-written ones (two at spike X, three since 2026-10-12). Since 2026-10-25 the generator writes the same 10 specs and 6 datasets for plotnine and altair too, so the full matrix is 240 generated cases (10 specs times four libraries times 6 datasets) plus the hand-written ones, and `--cases full` needs `AGENT_LIBRARIES` with all four (see [Run the smoke set or the full matrix](#run-the-smoke-set-or-the-full-matrix)). To repeat spike X on its 127 cases, pass `--cases "*-matplotlib*,*-seaborn*"` instead of `--cases full` in the steps below. At list price a spike-X run is estimated at about $1 on the Claude arm and $10 to $15 on the Gemini arm; the whole matrix holds about twice as many cases. The budgets below leave $3 of the $25 for headroom, because a budget is checked between cases. +Spike X is the go or no-go for phase 1: 10 specs times matplotlib and seaborn times 6 datasets (renamed, x10, n=12, n=5000, date, decimal comma) on both arms, under $25 in total. The full matrix was those 120 generated cases plus the hand-written ones (two at spike X, three since 2026-10-12). The generator writes the same 10 specs and 6 datasets for plotnine and altair too (since 2026-10-25) and for pygal and lets-plot (since 2026-10-26), so the full matrix is 360 generated cases (10 specs times six libraries times 6 datasets) plus the hand-written ones, and `--cases full` needs `AGENT_LIBRARIES` with all six (see [Run the smoke set or the full matrix](#run-the-smoke-set-or-the-full-matrix)). To repeat spike X on its 127 cases, pass `--cases "*-matplotlib*,*-seaborn*"` instead of `--cases full` in the steps below. At list price a spike-X run is estimated at about $1 on the Claude arm and $10 to $15 on the Gemini arm; the whole matrix holds about three times as many cases. The budgets below leave $3 of the $25 for headroom, because a budget is checked between cases. 1. Count the catalogue files the network can adapt at all (no model call, about 10 seconds). The report lists the eligible, coupled and blocked pairs per library, the blocked ones by reason (SECURITY findings by rule id, a missing `THEME` block, a save target other than `f"plot-{THEME}.png"`, the map specs): @@ -738,7 +738,7 @@ The exit code is 0 when every action was done, 1 when a case was skipped, failed ### Regenerate the fixtures -The 240 generated cases come from `evals/make_fixtures.py`. After you change it, or when a NumPy upgrade changes a random stream, rerun it and commit the result: +The 360 generated cases come from `evals/make_fixtures.py`. After you change it, or when a NumPy upgrade changes a random stream, rerun it and commit the result: ```bash uv run --extra agents python -m agents.evals.make_fixtures diff --git a/agents/anyplot/code/normalise.py b/agents/anyplot/code/normalise.py index c01939283ad..01bcffbc3a6 100644 --- a/agents/anyplot/code/normalise.py +++ b/agents/anyplot/code/normalise.py @@ -22,9 +22,12 @@ files) becomes one parenthesised `from lets_plot import (...)` of exactly the names the module looks up as globals and does not bind itself (`symtable`), taken from `letsplot_names.LETS_PLOT_NAMES` without importing lets_plot, in ruff's - order-by-type. A second star import, a `global` statement or a lets-plot name read - before the file binds it leaves the star import in place with a note (0 catalogue - files, 2026-10-26). + order-by-type (natural order, `scale_x_log2` before `scale_x_log10`). The star import + stays in place with a note when it is not a module-level statement or shares its line + with other code, when the file has a second star import or a `global` statement, or + when a lets-plot name the file binds itself may be read before that binding has surely + run: above it, in the binding statement itself (`labs = labs(...)`), or outside the + `if`, loop or `try` block that binds it (0 catalogue files, 2026-10-26). 3. **Save target.** A target that is a path whose file name is the theme f-string, such as `os.path.join(script_dir, f"plot-{THEME}.png")`, `OUT / f"plot-{THEME}.png"`, `f"{script_dir}/plot-{THEME}.png"`, or a module-level name assigned one of those @@ -43,8 +46,8 @@ `ggsave` return value), is made only of `if`, `for`, `try` (each `except` only `pass`), expressions, assignments and `import shutil` or `pathlib`, and calls only `EPILOGUE_CALLS` and `EPILOGUE_METHODS` goes, with the names bound to the directory and - an `import shutil` that nothing kept uses; `png_path = ggsave(...)` whose name only fed - the epilogue becomes the bare save. Any other statement that mentions the directory + an `import shutil` that nothing kept uses; every `png_path = ggsave(...)` whose name + only fed the epilogue becomes the bare save. Any other statement that mentions the directory stays with a note, and the SECURITY validator blocks the file. 5. **HTML and SVG writes** (pygal only). A module-level `with open(<f"plot-{THEME}.html" or a path to it>, "wb" | "w") as f:` whose one statement writes `X.render()` (mode @@ -52,20 +55,25 @@ becomes `X.render_to_file(f"plot-{THEME}.html")`, which writes the same bytes (158 catalogue files; the HTML and the PNG were byte-identical on all 156 that run, 2026-10-25). Every other module-level `open()` write of the theme `.html` or `.svg` - file (a hand-built page, a post-processed SVG) and every `X.render_to_file(<theme - .svg>)` goes, unless the same target is named again elsewhere in the file, and so do - the module-level assignments that only fed a removed write, repeated until none is - left (never one that holds a save call). The SECURITY validator has no pinnable form - for an `open()` write, and the plot sandbox refuses `.svg` files. + file (a hand-built page, a post-processed SVG; besides its writes, the body may assign + names that nothing outside it reads, as heatmap-basic's `pygal_svg = chart.render(...)` + does) and every `X.render_to_file(<theme .svg>)` goes, unless the same target is named + again elsewhere in the file, and so do the module-level assignments that only fed a + removed write, repeated until none is left (never one that holds a save call). The + step then runs again until it changes nothing, because a removed feeder can free a + target that was named again. The SECURITY validator has no pinnable form for an + `open()` write, and the plot sandbox refuses `.svg` files. 6. **Guards.** A file named `matplotlib.py`, `seaborn.py` or `pygal.py` shadows the installed package when run from its own directory, so many catalogue files strip their directory from `sys.path` first. The run form is `plot.py`, so the guard goes, in three steps. `X = importlib.util.find_spec("pkg")` followed by `if X and X.origin != __file__:` whose branch holds only imports becomes those imports (the branch the run form takes), and `X` goes once unused. A module-level `try:` of - imports only, with no `except` or `else`, whose `finally:` only changes `sys.path`, - becomes its imports. Then every module-level statement that only changes `sys.path` - or `sys.modules` (an assignment to `sys.path`, `sys.dont_write_bytecode = ...`, a + imports only, with no `except` or `else`, whose `finally:` holds only guard statements + (the ones the next step removes: a change of `sys.path` or `sys.modules`, or + `sys.dont_write_bytecode = ...`), becomes its imports. Then every module-level + statement that only changes `sys.path` or `sys.modules` (an assignment to + `sys.path`, `sys.dont_write_bytecode = ...`, a `sys.path.*()` or `sys.modules.*()` call, `del sys.modules[...]`, or an `if`, `for`, `while` or `try` holding only such statements, private helper assignments and `pass`), whatever `sys` is imported as, goes. Then every module-level assignment that @@ -99,17 +107,25 @@ target within 16 px, or when a savefig takes `**kwargs`, `bbox_inches` and the dpi stay as they are and a note says why. * pygal (`pygal`): the PNG is the chart's `width` x `height` (pygal's 800x600 when - neither is set), or the output size of a `cairosvg.svg2png` save. 98 catalogue + neither is set), or the output size of a `cairosvg.svg2png` save (a literal, or a + module-level name bound once to one, as in ecg-twelve-lead). 98 catalogue charts are 4800x2700 and 4 are 3600x3600 (files from May 2026), over R2's pixel cap. A chart whose literal size has exactly the 16:9 or 1:1 aspect keeps its size, so the layout stays, and its protected save renders the target instead: `X.render_to_png(f"plot-{THEME}.png")` becomes `cairosvg.svg2png(bytestring= X.render(), write_to=f"plot-{THEME}.png", output_width=3200, output_height=1800)` - (with `import cairosvg` added where the file lacks it), and an `svg2png` save gets - the two keywords. The chart is the one the save renders (traced through `render`, - `encode`, `decode`, `replace` and module-level names bound to them), else the - file's only chart; a computed size, another aspect or several charts leave the save - alone with a note. + (with `import cairosvg` added where the file imports none above the save), and an + `svg2png` save gets the two keywords. The chart is the one the save renders (traced + through `render`, `encode`, `decode`, `replace` and module-level names bound to + them). An `svg2png` whose bytestring traces to no chart renders the root `<svg>` its + string literals build, sized by `width=` and `height=` literals or by module-level + numbers they interpolate (dendrogram-radial, histogram-2d, upset-basic and + ternary-density draw their SVG by hand at 4800x2700 or 3600x3600); failing both, + the file's only chart. A computed size, a size set after the constructor (a store to + `chart.width` or `chart.height`, a `chart.config(...)` call, a `pygal.Config` + argument, a `render()` keyword), another aspect, several charts or a save that + writes no PNG leave the save alone with a note, and the size is then unknown, never + pygal's 800x600. * lets-plot (`letsplot`): only `scale=` on the protected PNG save changes, never `ggsize` or `w`/`h`, so text and ticks keep their size relative to the plot. The size is the literal `ggsize` in the saved plot's `+` chain, else the file's only @@ -117,9 +133,13 @@ `ggbunch` without a `ggsize` of their own size themselves from their panels and are left alone with a note. lets-plot renders `floor(size * scale)` (scale 2 by default, 1 with `w`/`h` or `dpi=`; `w`/`h` in px, or in `unit` at `dpi`, 300 by default). + The model is exact for px, for `dpi=` and for the default scale; `w`/`h` in a + physical unit can land one pixel short of it (lets-plot 4.11.0 renders + `w=16, h=9, unit="in", dpi=100, scale=2` at 3200x1799, within the 16 px). The scale is the shortest decimal that renders the target exactly, else one within 16 px; when none does and the render is over R2's pixel cap, the shortest decimal - that fits it inside the nearer target (R3 pads the rest). + that fits it inside the nearer target, the largest of its length (mosaic-categorical: + 1.875, 3000x1800; R3 pads the rest). * plotnine and altair (None): plotnine sizes the canvas on its save (`width=`, `height=`, `units=`, `dpi=`, 3200x1800 in most catalogue files) and altair through its chart's `width` and `height` times `scale_factor`, padded by its PIL block, so @@ -184,6 +204,9 @@ catalogue file's `replace` on the SVG text touches its `viewBox` or a size (2026-10-26).""" PYGAL_NOT_CHARTS = frozenset({"Config"}) """Capitalised names of the pygal module that are no chart class (`pygal.Config` carries settings).""" +PYGAL_RENDER_KEYWORDS = frozenset({"is_unicode"}) +"""The one `render()` keyword that leaves the chart's config alone; every other one goes into it (`width=`).""" +PYGAL_SIZE_ATTRIBUTES = frozenset({"width", "height"}) CAIROSVG = "cairosvg" LETSPLOT_SAVE = "ggsave" @@ -223,8 +246,12 @@ _MODULE_NAME = re.compile(r"[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*") _COMMA_GAP = re.compile(r"\s*,\s*") +_DIGITS = re.compile(r"(\d+)") _LINE_TAIL = re.compile(r"\s*,?\s*(?:#.*)?") _WHITESPACE = re.compile(r"\s+") +_SVG_START_TAG = re.compile(r"<svg(?=[\s/>])([^>]*)>") # an `<svg ...>` start tag and its attributes +_SVG_PIXELS = re.compile(r"\s*(\d+(?:\.\d+)?)\s*(?:px)?\s*") +_SVG_HOLE = re.compile(r"\s*\x00(\d+)\x00\s*(?:px)?\s*") # a `{W}` of an f-string, as `_template` marks it # `[<descriptive> · ]<spec-id> · [<language> · ]<library> · anyplot.ai`, also with the # legacy `pyplots.ai`, or with the descriptive part ended by a newline instead of ` · `. _CATALOGUE_TITLE = re.compile( @@ -251,11 +278,11 @@ class Canvas: """The canvas a source renders, as far as its literals tell. `pixels` is what the library writes: for matplotlib `figsize` at `dpi`, each side - truncated to whole pixels as `RendererAgg` does; for pygal the chart's size or the - `svg2png` output size, rounded as cairosvg does; for lets-plot the plot size times - the scale, floored. `figsize` and `dpi` are matplotlib's only. `target` is the nearer - of the two canvases (the impl-review.yml rule). `note` is None exactly when - `pixels == target`. + truncated to whole pixels as `RendererAgg` does; for pygal the chart's or the root + `<svg>`'s size, or the `svg2png` output size, rounded as cairosvg does; for lets-plot + the plot size times the scale, floored. `figsize` and `dpi` are matplotlib's only. + `target` is the nearer of the two canvases (the impl-review.yml rule). `note` is None + exactly when `pixels == target`. """ figsize: tuple[Number, Number] | None @@ -488,6 +515,22 @@ def _nicest(low: Fraction, high: Fraction, accept: Callable[[float], bool]) -> s return None +def _nicest_up_to(low: Fraction, high: Fraction, accept: Callable[[float], bool]) -> str | None: + """The shortest decimal literal in `[low, high]` that `accept`s, the largest of its length (`high` itself when + it is short enough), an integer first.""" + for decimals in range(MAX_DPI_DECIMALS + 1): + scale = 10**decimals + numerator = math.floor(high * scale) + if Fraction(numerator, scale) < low: + continue + literal = str(numerator) if decimals == 0 else f"{numerator // scale}.{numerator % scale:0{decimals}d}" + if decimals and literal.endswith("0"): + continue # the same value was tried with fewer decimals + if accept(float(literal)): + return literal + return None + + def _size_value(value: object) -> tuple[Number, Number] | None: if not isinstance(value, tuple | list) or len(value) != 2: return None @@ -675,14 +718,30 @@ def _last_assignment(body: list[ast.stmt], name: str, before: int) -> ast.expr | return values[-1] if values else None -def _pygal_size(tree: ast.Module, call: ast.Call, name: str) -> tuple[tuple[Number, Number] | None, str]: - """The size of the chart the PNG save renders and where it came from, or None and why not.""" +@dataclass(frozen=True, slots=True) +class _PygalSize: + """The size the PNG save renders before any output size: `subject` is what has it, `source` where it is set.""" + + size: tuple[Number, Number] + subject: str # "pygal chart" or "hand-built SVG" + source: str # "the saved chart at line 9", "the <svg> root at line 244" + + +def _pygal_size(tree: ast.Module, call: ast.Call, name: str) -> _PygalSize | str: + """The size of what the PNG save renders and where it came from, or why it is not known. + + The chart is traced from the save through `PYGAL_PASSTHROUGH` and module-level names. + An `svg2png` whose bytestring traces to no chart takes the size of the root `<svg>` + that its string literals build (`_svg_root_size`); failing that, the file's only + chart is the one it renders. + """ aliases = _pygal_aliases(tree) node: ast.expr | None = None if name == "render_to_png" and isinstance(call.func, ast.Attribute): node = call.func.value elif name == "svg2png": node = next((kw.value for kw in call.keywords if kw.arg == "bytestring"), None) + start = node seen: set[str] = set() chart: ast.Call | None = None while node is not None: @@ -690,6 +749,8 @@ def _pygal_size(tree: ast.Module, call: ast.Call, name: str) -> tuple[tuple[Numb chart = node break if isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute) and node.func.attr in PYGAL_PASSTHROUGH: + if node.func.attr == "render" and any(kw.arg not in PYGAL_RENDER_KEYWORDS for kw in node.keywords): + return f"the render at line {node.lineno} takes keywords that may set the chart's size" node = node.func.value elif isinstance(node, ast.Name) and node.id not in seen: seen.add(node.id) @@ -698,42 +759,255 @@ def _pygal_size(tree: ast.Module, call: ast.Call, name: str) -> tuple[tuple[Numb node = None source = "the saved chart" if chart is None: + if name == "svg2png" and start is not None: + root = _svg_root_size(tree, start, call.lineno) + if root is not None: + return root charts = [node for node in ast.walk(tree) if _is_pygal_chart(node, aliases) and isinstance(node, ast.Call)] if len(charts) != 1: - return None, f"{len(charts)} pygal charts in the file, none traced from the save at line {call.lineno}" + others = f" (the file has {len(charts)})" if charts else "" + return f"no pygal chart traced from the save at line {call.lineno}{others}" chart, source = charts[0], "the file's only chart" if chart.args or any(kw.arg is None for kw in chart.keywords): - return None, f"the chart at line {chart.lineno} takes positional arguments or **kwargs" + return f"the chart at line {chart.lineno} takes positional arguments (a pygal.Config) or **kwargs" + late = _pygal_late_size(tree, chart) + if late is not None: + return late sides: list[Number] = [] for side, default in zip(("width", "height"), PYGAL_DEFAULT_SIZE, strict=True): keyword = next((kw for kw in chart.keywords if kw.arg == side), None) value = as_number(_keyword_literal(keyword)[0]) if keyword is not None else default + if value is None and keyword is not None and isinstance(keyword.value, ast.Name): + value = _module_number(tree, keyword.value.id) # contour-basic's `width=CANVAS_W` if value is None or value <= 0: - return None, f"the chart's {side}= at line {chart.lineno} is not a positive numeric literal" + return ( + f"the chart's {side}= at line {chart.lineno} is not a positive number or a module-level name bound " + "once to one" + ) sides.append(value) - return (sides[0], sides[1]), f"{source} at line {chart.lineno}" + return _PygalSize((sides[0], sides[1]), "pygal chart", f"{source} at line {chart.lineno}") -def _pygal_pixels(call: ast.Call, name: str, size: tuple[Number, Number]) -> tuple[int, int] | str: - """The PNG size the save writes for a chart of `size` (cairosvg's `int(round(...))`), or why it is not known.""" - width, height = float(size[0]), float(size[1]) - if name != "svg2png": - return round(width), round(height) +def _pygal_late_size(tree: ast.Module, chart: ast.Call) -> str | None: + """Why the chart's size may not be its constructor's, or None: a `config=` (a `pygal.Config`), a store to its + `width` or `height` (also through `.config`), or a call of its `config(...)`. pygal reads them all at render.""" + if any(kw.arg == "config" for kw in chart.keywords): + return f"the chart at line {chart.lineno} takes a pygal.Config, which may set its size" + names = { + target.id + for node in ast.walk(tree) + if isinstance(node, ast.Assign) and node.value is chart + for target in node.targets + if isinstance(target, ast.Name) + } + grown = bool(names) + while grown: # `c = chart` + aliases = { + target.id + for node in ast.walk(tree) + if isinstance(node, ast.Assign) and isinstance(node.value, ast.Name) and node.value.id in names + for target in node.targets + if isinstance(target, ast.Name) + } + grown = not aliases <= names + names |= aliases + + def is_chart(node: ast.expr) -> bool: + if isinstance(node, ast.Attribute) and node.attr == "config": + node = node.value + return isinstance(node, ast.Name) and node.id in names + + for node in ast.walk(tree): + if isinstance(node, ast.Attribute) and isinstance(node.ctx, ast.Store) and node.attr in PYGAL_SIZE_ATTRIBUTES: + if is_chart(node.value): + return f"{ast.unparse(node)} at line {node.lineno} sets the chart's size after its constructor" + elif isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute) and node.func.attr == "config": + if is_chart(node.func.value): + call = f"{ast.unparse(node.func)}(...)" + return f"{call} at line {node.lineno} may set the chart's size after its constructor" + return None + + +def _svg_root_size(tree: ast.Module, start: ast.expr, before: int) -> _PygalSize | str | None: + """The size of the root `<svg>` that the string literals feeding `start` build, or why it cannot be read. + + None when no literal holds an `<svg` start tag. The tag must be the only one among + the literals and lie within one of them; its `width=` and `height=` must be numbers + (`px` allowed) or interpolate a module-level name bound once to a number + (dendrogram-radial's `W, H = 4800, 2700`). cairosvg renders that size when the save + sets no output size. + """ + literals = _svg_literals(tree, start, before) + tags: list[tuple[ast.expr, str, list[ast.FormattedValue]]] = [] + for literal in literals: + template, holes = _template(literal) + tags += [(literal, match.group(1), holes) for match in _SVG_START_TAG.finditer(template)] + if not tags: + return None + if len(tags) > 1: + lines = ", ".join(str(line) for line in sorted({literal.lineno for literal, _, _ in tags})) + return f"no pygal chart traced from the save at line {before}, and {len(tags)} <svg> tags at line {lines}" + literal, attributes, holes = tags[0] + where = f"the <svg> root at line {literal.lineno}" + sides: list[Number] = [] + for side in ("width", "height"): + match = re.search(rf"(?<![\w:-]){side}\s*=\s*([\"'])(.*?)\1", attributes) + value = _svg_length(tree, match.group(2), holes) if match else None + if value is None: + return f"{where} has no {side}= of a number or a module-level name bound once to one" + sides.append(value) + return _PygalSize((sides[0], sides[1]), "hand-built SVG", where) + + +def _svg_literals(tree: ast.Module, start: ast.expr, before: int) -> list[ast.expr]: + """The string literals (`str` constants and f-strings) that build the text `start` evaluates to. + + They are `start`'s own and, for every name it reads, those of the statements above + line `before` (outside function and class bodies) that bind the name or extend it + (`svg = ...`, `svg += ...`, `parts.append(...)`, `.extend`, `.insert`), transitively. + A `PYGAL_PASSTHROUGH` call hands on its receiver only. + """ + statements: list[ast.stmt] = [] + pending: list[ast.stmt] = list(tree.body) + while pending: + stmt = pending.pop() + if isinstance(stmt, ast.FunctionDef | ast.AsyncFunctionDef | ast.ClassDef) or stmt.lineno >= before: + continue + statements.append(stmt) + pending.extend(child for child in ast.iter_child_nodes(stmt) if isinstance(child, ast.stmt)) + if isinstance(stmt, ast.Try): + pending.extend(inner for handler in stmt.handlers for inner in handler.body) + + def feeders(name: str) -> list[ast.expr]: + values: list[ast.expr] = [] + for stmt in statements: + if isinstance(stmt, ast.Assign) and any(_binds_name(target, name) for target in stmt.targets): + values.append(stmt.value) + elif isinstance(stmt, ast.AnnAssign | ast.AugAssign) and stmt.value is not None: + if _binds_name(stmt.target, name): + values.append(stmt.value) + elif isinstance(stmt, ast.Expr) and isinstance(stmt.value, ast.Call): + func = stmt.value.func + if isinstance(func, ast.Attribute) and func.attr in ("append", "extend", "insert"): + if isinstance(func.value, ast.Name) and func.value.id == name: + values.extend(stmt.value.args) + return values + + found: list[ast.expr] = [] + seen: set[str] = set() + stack: list[ast.AST] = [start] + while stack: + node = stack.pop() + if isinstance(node, ast.Constant): + if isinstance(node.value, str): + found.append(node) + elif isinstance(node, ast.JoinedStr): + found.append(node) + stack.extend(part.value for part in node.values if isinstance(part, ast.FormattedValue)) + elif ( + isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute) and node.func.attr in PYGAL_PASSTHROUGH + ): + stack.append(node.func.value) + elif isinstance(node, ast.Name): + if node.id not in seen: + seen.add(node.id) + stack.extend(feeders(node.id)) + elif not isinstance(node, ast.Lambda): + stack.extend(ast.iter_child_nodes(node)) + return found + + +def _binds_name(target: ast.expr, name: str) -> bool: + """Whether an assignment target binds `name`, also inside a tuple or list target.""" + if isinstance(target, ast.Tuple | ast.List): + return any(_binds_name(element, name) for element in target.elts) + return isinstance(target, ast.Name) and target.id == name + + +def _template(literal: ast.expr) -> tuple[str, list[ast.FormattedValue]]: + """A string literal's text with each `{...}` of an f-string as a `\\x00<n>\\x00` hole, and the holes.""" + if isinstance(literal, ast.Constant): + return str(literal.value), [] + parts: list[str] = [] + holes: list[ast.FormattedValue] = [] + for part in literal.values if isinstance(literal, ast.JoinedStr) else []: + if isinstance(part, ast.FormattedValue): + parts.append(f"\x00{len(holes)}\x00") + holes.append(part) + elif isinstance(part, ast.Constant): + parts.append(str(part.value)) + return "".join(parts), holes + + +def _svg_length(tree: ast.Module, text: str, holes: list[ast.FormattedValue]) -> Number | None: + """An `<svg>` width or height in px: `4800`, `4800px`, or `{W}` (and `{W}px`) of a module-level number.""" + plain = _SVG_PIXELS.fullmatch(text) + if plain: + value: Number | None = float(plain.group(1)) if "." in plain.group(1) else int(plain.group(1)) + return value if value else None + hole = _SVG_HOLE.fullmatch(text) + if hole is None: + return None + part = holes[int(hole.group(1))] + if part.conversion != -1 or part.format_spec is not None or not isinstance(part.value, ast.Name): + return None + return _module_number(tree, part.value.id) + + +def _module_number(tree: ast.Module, name: str) -> Number | None: + """The positive number a module-level `name = <literal>` (also `a, name = <literals>` or `a = name = <literal>`) + binds, when that is the only binding of `name` in the file.""" + sites = [node for bound, _, node in _binding_sites(tree) if bound == name] + if len(sites) != 1: + return None + for stmt in tree.body: + if not isinstance(stmt, ast.Assign): + continue + value = stmt.value + for target in stmt.targets: # also `W = H = 2400` + if isinstance(target, ast.Tuple) and isinstance(value, ast.Tuple) and len(target.elts) == len(value.elts): + pairs = list(zip(target.elts, value.elts, strict=True)) + else: + pairs = [(target, value)] + for element, literal in pairs: + if element is sites[0]: + number = as_number(_literal_value(literal)) + return number if number is not None and number > 0 else None + return None + + +def _pygal_output(tree: ast.Module, call: ast.Call, name: str) -> dict[str, Number] | str: + """`svg2png`'s `output_width=`, `output_height=` and `scale=` (numeric literals, or module-level names bound once + to one: ecg-twelve-lead's `WIDTH, HEIGHT = 3200, 1800`), or why one is neither.""" values: dict[str, Number] = {} + if name != "svg2png": + return values for keyword in call.keywords: if keyword.arg in ("output_width", "output_height", "scale"): value = as_number(_keyword_literal(keyword)[0]) + if value is None and isinstance(keyword.value, ast.Name): + value = _module_number(tree, keyword.value.id) if value is None: - return f"svg2png {keyword.arg}= at line {keyword.lineno} is not a numeric literal" + where = f"svg2png {keyword.arg}= at line {keyword.lineno}" + return f"{where} is not a number or a module-level name bound once to one" values[keyword.arg] = value - out_width, out_height = values.get("output_width"), values.get("output_height") + return values + + +def _pygal_pixels(output: dict[str, Number], size: tuple[Number, Number] | None) -> tuple[int, int] | None: + """The PNG size the save writes (cairosvg's `int(round(...))`): both output sizes, else `size` scaled by the one + output size or by `scale=`; None when that needs `size` and it is not known.""" + out_width, out_height = output.get("output_width"), output.get("output_height") if out_width and out_height: return round(out_width), round(out_height) + if size is None: + return None + width, height = float(size[0]), float(size[1]) if out_width: return round(out_width), round(height * out_width / width) if out_height: return round(width * out_height / height), round(out_height) - scale = values.get("scale", 1) + scale = output.get("scale", 1) return round(width * scale), round(height * scale) @@ -743,30 +1017,45 @@ def _exact_target(size: tuple[Number, Number]) -> tuple[int, int] | None: return next((target for target in TARGETS if aspect == Fraction(*target)), None) -def _measure_pygal(code: str) -> Canvas: +def _pygal_save(code: str) -> tuple[ast.Module, SourceIndex, SavefigCall, ast.Call] | str: + """The protected PNG save and its call, or why there is none that renders a PNG.""" tree = ast.parse(code) index = SourceIndex(code) - regions = find_regions(code, tree, library="pygal") - save = regions.savefig + save = find_regions(code, tree, library="pygal").savefig call = _save_call(tree, index, save) if save is not None and save.standard_target else None if save is None or call is None: - return Canvas(None, None, None, None, 'no module-level save of f"plot-{THEME}.png"') - size, source = _pygal_size(tree, call, save.name) - if size is None: - return Canvas(None, None, None, None, f"pygal canvas unknown: {source}") - pixels = _pygal_pixels(call, save.name, size) - if isinstance(pixels, str): - return Canvas(None, None, None, None, f"pygal canvas unknown: {pixels}") + return 'no module-level save of f"plot-{THEME}.png"' + if not save_rule("pygal").writes_suffix(save.name, PNG_SUFFIX): + return f"the {save.name} at {save.span.lines()} writes no PNG" + return tree, index, save, call + + +def _measure_pygal(code: str) -> Canvas: + found = _pygal_save(code) + if isinstance(found, str): + return Canvas(None, None, None, None, found) + tree, _, save, call = found + measured = _pygal_size(tree, call, save.name) + output = _pygal_output(tree, call, save.name) + if isinstance(output, str): + return Canvas(None, None, None, None, f"pygal canvas unknown: {output}") + pixels = _pygal_pixels(output, measured.size if isinstance(measured, _PygalSize) else None) + if pixels is None: + return Canvas(None, None, None, None, f"pygal canvas unknown: {measured}") target = _nearest_target(pixels) if pixels == target: return Canvas(None, None, pixels, target, None) + source = measured.source if isinstance(measured, _PygalSize) else "the svg2png output size" note = f"pygal renders {pixels[0]}x{pixels[1]} ({source}), target {target[0]}x{target[1]}" return Canvas(None, None, pixels, target, note) -def _svg2png_callee(tree: ast.Module) -> str | None: - """How the file names cairosvg's `svg2png` (`cairosvg.svg2png`, `_cairosvg.svg2png`, `svg2png`), if it does.""" +def _svg2png_callee(tree: ast.Module, before: int) -> str | None: + """How the file names cairosvg's `svg2png` (`cairosvg.svg2png`, `_cairosvg.svg2png`, `svg2png`) above line + `before`, if it does; an import below the save would come too late for it.""" for stmt in tree.body: + if stmt.lineno >= before: + break if isinstance(stmt, ast.Import): for alias in stmt.names: if alias.name == CAIROSVG: @@ -821,22 +1110,21 @@ def top(stmt: ast.Import | ast.ImportFrom) -> str: def _pygal_canvas(code: str) -> StepResult: - tree = ast.parse(code) - index = SourceIndex(code) - regions = find_regions(code, tree, library="pygal") - save = regions.savefig - call = _save_call(tree, index, save) if save is not None and save.standard_target else None - if save is None or call is None: - return code, [], ['canvas: no module-level save of f"plot-{THEME}.png"; nothing to normalise'] - size, source = _pygal_size(tree, call, save.name) - if size is None: - return code, [], [f"canvas: {source}; the PNG size is left as it is"] - pixels = _pygal_pixels(call, save.name, size) - if isinstance(pixels, str): - return code, [], [f"canvas: {pixels}; the PNG size is left as it is"] + found = _pygal_save(code) + if isinstance(found, str): + return code, [], [f"canvas: {found}; nothing to normalise"] + tree, index, save, call = found + measured = _pygal_size(tree, call, save.name) + output = _pygal_output(tree, call, save.name) + if isinstance(output, str): + return code, [], [f"canvas: {output}; the PNG size is left as it is"] + pixels = _pygal_pixels(output, measured.size if isinstance(measured, _PygalSize) else None) if pixels in TARGETS: return code, [], [] - chart = f"pygal chart {size[0]:g}x{size[1]:g} ({source})" + if pixels is None or not isinstance(measured, _PygalSize): + return code, [], [f"canvas: {measured}; the PNG size is left as it is"] + size = measured.size + chart = f"{measured.subject} {size[0]:g}x{size[1]:g} ({measured.source})" target = _exact_target(size) if target is None: return code, [], [f"canvas: {chart} has another aspect than 16:9 or 1:1; the PNG size is left as it is"] @@ -845,7 +1133,7 @@ def _pygal_canvas(code: str) -> StepResult: return code, [], [f"canvas: the save at {save.span.lines()} takes *args or **kwargs; left unchanged"] edits: list[TextEdit] = [] changes: list[str] = [] - callee = _svg2png_callee(tree) + callee = _svg2png_callee(tree, call.lineno) if save.name == "svg2png": sizes = {"output_width": tw, "output_height": th} for keyword in call.keywords: @@ -992,7 +1280,11 @@ def _letsplot_raster(tree: ast.Module, call: ast.Call) -> tuple[tuple[Fraction, def _letsplot_pixels(size: tuple[Fraction, Fraction], scale: float) -> tuple[int, int]: - """lets-plot's raster: each side times the scale, floored (formula probes of 2026-10-26).""" + """lets-plot's raster: each side times the scale, floored (formula probes of 2026-10-26). + + Exact for px, `dpi=` and the default scale; for `w`/`h` in a physical unit lets-plot + can write one pixel less (3200x1799 for `w=16, h=9, unit="in", dpi=100, scale=2`). + """ return math.floor(float(size[0]) * scale), math.floor(float(size[1]) * scale) @@ -1048,7 +1340,12 @@ def _letsplot_canvas(code: str) -> StepResult: note = f"canvas: {rendered}; no scale renders 3200x1800 or 2400x2400, so the render relies on the R3 gate" return code, [], [note] fit = min(Fraction(target[0]) / size[0], Fraction(target[1]) / size[1]) - literal = _nicest(fit * Fraction(999, 1000), fit, lambda _: True) or str(float(fit)) + + def inside(scale: float, t: tuple[int, int] = target) -> bool: + pw, ph = _letsplot_pixels(size, scale) + return pw <= t[0] and ph <= t[1] + + literal = _nicest_up_to(fit * Fraction(999, 1000), fit, inside) or str(float(fit)) how = f", inside {target[0]}x{target[1]} under R2's pixel cap" keyword = next((kw for kw in call.keywords if kw.arg == "scale"), None) if keyword is not None: @@ -1190,47 +1487,86 @@ def _global_lookups(code: str) -> tuple[set[str], set[str]]: return looked_up, bound -def _module_bindings(tree: ast.Module) -> dict[str, int]: - """The first line on which the module scope binds each name (nested function, class and lambda bodies aside).""" - first: dict[str, int] = {} - - def bind(name: str, line: int) -> None: - first[name] = min(first.get(name, line), line) +def _reads_before_binding(tree: ast.Module, names: set[str]) -> set[str]: + """The `names` the module may read where it has not surely bound them yet. - nodes: list[ast.AST] = list(tree.body) - while nodes: - node = nodes.pop() - if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef | ast.ClassDef): - bind(node.name, node.lineno) - nodes.extend(node.decorator_list) - if isinstance(node, ast.ClassDef): - nodes.extend([*node.bases, *node.keywords]) - else: - nodes.extend([*node.args.defaults, *(d for d in node.args.kw_defaults if d is not None)]) - continue - if isinstance(node, ast.Lambda): - nodes.extend([*node.args.defaults, *(d for d in node.args.kw_defaults if d is not None)]) - continue - if isinstance(node, ast.ListComp | ast.SetComp | ast.DictComp | ast.GeneratorExp): - nodes.extend(n.target for n in ast.walk(node) if isinstance(n, ast.NamedExpr)) # `:=` binds outside - nodes.append(node.generators[0].iter) - continue - if isinstance(node, ast.Name) and not isinstance(node.ctx, ast.Load): - bind(node.id, node.lineno) - elif isinstance(node, ast.alias) and node.name != "*": - bind((node.asname or node.name).split(".")[0], node.lineno) - elif isinstance(node, ast.ExceptHandler | ast.MatchAs | ast.MatchStar) and node.name: - bind(node.name, node.lineno) - elif isinstance(node, ast.MatchMapping) and node.rest: - bind(node.rest, node.lineno) - nodes.extend(ast.iter_child_nodes(node)) - return first + The statements run in order, and a read is safe once a statement that always runs + before it has bound the name: an assignment (also to a tuple or a starred target), an + import, a `def` or a `class`, at the module level or earlier in the same block. A + statement's own reads come first (`theme = theme(...)`), a function body counts where + the function is defined, and a binding inside an `if`, a loop, a `try` or a `match` + holds only inside its block (column-stratigraphic binds `margin` in a loop and reads + it there); a `with` body always runs. A `:=` binds nothing here. + """ + early: set[str] = set() + def read(node: ast.AST, bound: set[str]) -> None: + early.update( + n.id + for n in ast.walk(node) + if isinstance(n, ast.Name) and isinstance(n.ctx, ast.Load) and n.id in names and n.id not in bound + ) -def _import_order(name: str) -> tuple[int, str, str]: - """ruff's isort order-by-type: CONSTANT_CASE, then CamelCase, then the rest, case-insensitive within each.""" + def targets(node: ast.expr | None) -> set[str]: + if isinstance(node, ast.Name): + return {node.id} + if isinstance(node, ast.Tuple | ast.List): + return set().union(*(targets(element) for element in node.elts)) + return targets(node.value) if isinstance(node, ast.Starred) else set() + + def block(statements: list[ast.stmt], bound: set[str]) -> set[str]: + bound = set(bound) + for stmt in statements: + if isinstance(stmt, ast.If | ast.While): + read(stmt.test, bound) + block(stmt.body, bound) + block(stmt.orelse, bound) + elif isinstance(stmt, ast.For | ast.AsyncFor): + read(stmt.iter, bound) + block(stmt.body, bound | targets(stmt.target)) + block(stmt.orelse, bound) + elif isinstance(stmt, ast.With | ast.AsyncWith): + for item in stmt.items: + read(item.context_expr, bound) + bound |= targets(item.optional_vars) + bound = block(stmt.body, bound) + elif isinstance(stmt, ast.Try | ast.TryStar): + after_body = block(stmt.body, bound) + for handler in stmt.handlers: + if handler.type is not None: + read(handler.type, bound) + block(handler.body, bound | ({handler.name} if handler.name else set())) + block(stmt.orelse, after_body) + block(stmt.finalbody, bound) + elif isinstance(stmt, ast.Match): + read(stmt.subject, bound) + for case in stmt.cases: + read(case.pattern, bound) + if case.guard is not None: + read(case.guard, bound) + block(case.body, bound) + else: + read(stmt, bound) + if isinstance(stmt, ast.Assign): + bound |= set().union(*(targets(target) for target in stmt.targets)) + elif isinstance(stmt, ast.AnnAssign | ast.AugAssign) and stmt.value is not None: + bound |= targets(stmt.target) + elif isinstance(stmt, ast.Import | ast.ImportFrom): + bound |= {(alias.asname or alias.name).split(".")[0] for alias in stmt.names if alias.name != "*"} + elif isinstance(stmt, ast.FunctionDef | ast.AsyncFunctionDef | ast.ClassDef): + bound.add(stmt.name) + return bound + + block(tree.body, set()) + return early + + +def _import_order(name: str) -> tuple[int, list[str | int], str]: + """ruff's isort order-by-type: CONSTANT_CASE, then CamelCase, then the rest, each case-insensitive in natural + order (`scale_x_log2` before `scale_x_log10`).""" group = 0 if name.isupper() and len(name) > 1 else 1 if name[:1].isupper() else 2 - return group, name.lower(), name + natural: list[str | int] = [int(part) if part.isdigit() else part for part in _DIGITS.split(name.lower())] + return group, natural, name def _expand_star_import(code: str) -> StepResult: @@ -1255,20 +1591,9 @@ def _expand_star_import(code: str) -> StepResult: looked_up, bound = _global_lookups(code) except SyntaxError as exc: return code, [], [f"star import: symtable refuses line {exc.lineno}; {where}"] - first = _module_bindings(tree) - early = sorted( - { - node.id - for node in ast.walk(tree) - if isinstance(node, ast.Name) - and isinstance(node.ctx, ast.Load) - and node.id in LETS_PLOT_NAMES - and node.id in bound - and node.lineno < first.get(node.id, math.inf) - } - ) + early = sorted(_reads_before_binding(tree, bound & LETS_PLOT_NAMES)) if early: - return code, [], [f"star import: {', '.join(early)} is read before the file binds it; {where}"] + return code, [], [f"star import: {', '.join(early)} may be read before the file binds it; {where}"] index = SourceIndex(code) span = index.lines_span(star) statement = index.node_span(star) @@ -1386,12 +1711,12 @@ def only_moves(stmt: ast.stmt) -> bool: return True images: set[str] = set() # names bound to the directory or to a path inside it - returned: dict[str, ast.Assign] = {} # `png_path = ggsave(...)` + returned: dict[str, list[ast.Assign]] = {} # every `png_path = ggsave(...)` of each name for stmt in body: if isinstance(stmt, ast.Assign) and len(stmt.targets) == 1 and isinstance(stmt.targets[0], ast.Name): name = stmt.targets[0].id if isinstance(stmt.value, ast.Call) and _callee_name(stmt.value.func) in rule.names: - returned[name] = stmt + returned.setdefault(name, []).append(stmt) elif mentions(stmt.value, images) and only_moves(stmt): images.add(name) removed: set[int] = set() @@ -1418,7 +1743,7 @@ def kept_loads(skip: ast.stmt | None = None) -> set[str]: removed.add(id(stmt)) names_gone.append(stmt) grown = True - unwrapped = [stmt for name, stmt in returned.items() if name not in kept_loads(stmt)] + unwrapped = [stmt for name, stmts in returned.items() for stmt in stmts if name not in kept_loads(stmt)] imports_gone = [ stmt for stmt in body @@ -1550,11 +1875,15 @@ def named_again(target: ast.expr, stmt: ast.stmt) -> bool: remove |= _with_comments(index, span) changes.append(f"removed the SVG save at {span.lines()}") continue - write = _theme_write(stmt) + if not isinstance(stmt, ast.With): + continue + read_elsewhere = set().union(*(_loads(other) for other in tree.body if other is not stmt)) + write = _theme_write(stmt, read_elsewhere, rule.names) if write is None: continue - target, suffix, mode, utf8, values = write - receiver = _render_receiver(values[0], mode) if suffix == HTML_SUFFIX and len(values) == 1 and utf8 else None + target, suffix, mode, utf8, values, assignments = write + single = len(values) == 1 and not assignments + receiver = _render_receiver(values[0], mode) if suffix == HTML_SUFFIX and single and utf8 else None kind = suffix.removeprefix(".").upper() if receiver is not None: name = code[index.node_span(receiver).start : index.node_span(receiver).end] @@ -1603,9 +1932,13 @@ def named_again(target: ast.expr, stmt: ast.stmt) -> bool: return _rewrite_lines(code, remove, replace), changes, notes -def _theme_write(stmt: ast.stmt) -> tuple[ast.expr, str, str, bool, list[ast.expr]] | None: - """`(target, suffix, mode, utf8, values)` for `with open(<theme .html or .svg path>, "w"|"wb") as f:` whose body - only writes to `f` (`values` are what it writes), else None.""" +def _theme_write( + stmt: ast.stmt, read_elsewhere: set[str], saves: frozenset[str] +) -> tuple[ast.expr, str, str, bool, list[ast.expr], int] | None: + """`(target, suffix, mode, utf8, values, assignments)` for `with open(<theme .html or .svg path>, "w"|"wb") as f:` + whose body writes to `f` (`values` are what it writes) and otherwise only assigns names that no statement outside + it reads (`read_elsewhere`) with values that hold no save call (`saves`), such as heatmap-basic's + `pygal_svg = chart.render(...)` before the write; else None.""" if not (isinstance(stmt, ast.With) and len(stmt.items) == 1): return None item = stmt.items[0] @@ -1621,7 +1954,19 @@ def _theme_write(stmt: ast.stmt) -> tuple[ast.expr, str, str, bool, list[ast.exp if suffix is None or mode not in ("w", "wb") or handle is None: return None values: list[ast.expr] = [] + assignments = 0 for inner in stmt.body: + names = _assigned(inner) or ( + {inner.target.id} if isinstance(inner, ast.AugAssign) and isinstance(inner.target, ast.Name) else set() + ) + if names: + value = inner.value if isinstance(inner, ast.Assign | ast.AnnAssign | ast.AugAssign) else None + if handle in names or names & read_elsewhere or value is None: + return None + if any(isinstance(n, ast.Call) and _callee_name(n.func) in saves for n in ast.walk(value)): + return None + assignments += 1 + continue if not (isinstance(inner, ast.Expr) and _is_call(inner.value, "write") and isinstance(inner.value, ast.Call)): return None write = inner.value @@ -1630,9 +1975,11 @@ def _theme_write(stmt: ast.stmt) -> tuple[ast.expr, str, str, bool, list[ast.exp if write.func.value.id != handle or len(write.args) != 1 or write.keywords: return None values.append(write.args[0]) + if not values: + return None encodings = [kw.value for kw in call.keywords if kw.arg == "encoding"] utf8 = all(isinstance(e, ast.Constant) and str(e.value).lower() in ("utf-8", "utf8") for e in encodings) - return target, suffix, mode, utf8, values + return target, suffix, mode, utf8, values, assignments # --- guards and file paths --------------------------------------------------------------- diff --git a/agents/anyplot/code/readiness.py b/agents/anyplot/code/readiness.py index 4f390f726bd..3581ad31ae1 100644 --- a/agents/anyplot/code/readiness.py +++ b/agents/anyplot/code/readiness.py @@ -11,10 +11,12 @@ plotnine's `save` and `ggsave`, altair's `save`, pygal's `render_to_png`, `render_to_file` and `svg2png`, lets-plot's `ggsave`) writes anywhere but `f"plot-{THEME}.png"` (altair, pygal and lets-plot also `f"plot-{THEME}.html"`), a - save of a library with a save directory (`SaveRule.directory`: lets-plot's - `path="."`) does not pass it, or the last save of the PNG is missing or not a - module-level statement (`savefig-target`; a plain string such as `"plot.png"` is - reported as a single-theme target). Every blocking reason is listed; `hints` stays + save name writes another kind of file than its target (`SaveRule.writes_suffix`: + pygal's `render_to_file` writes SVG text, so only the HTML; `render_to_png` and + `svg2png` only the PNG), a save of a library with a save directory + (`SaveRule.directory`: lets-plot's `path="."`) does not pass it, or the last save of + the PNG is missing or not a module-level statement (`savefig-target`; a plain string + such as `"plot.png"` is reported as a single-theme target). Every blocking reason is listed; `hints` stays empty. What the normaliser leaves in place reaches the scan this way: a lets-plot star import or save alias it could not rewrite, a pygal `open()` write it kept and a guard it did not strip are SECURITY findings; a pygal theme `.svg` save it kept is @@ -62,10 +64,13 @@ `reasons` can also carry one `canvas:` entry for any status that is not blocked: the normaliser could not put the canvas on 3200x1800 or 2400x2400 (`normalise.measure_canvas`: matplotlib's figure size is not a literal or has another aspect, a pygal chart's size is -computed or not 16:9 or 1:1, a lets-plot grid has no `ggsize` of its own or no scale -reaches either canvas; plotnine and altair size their canvas on the save, which the -normaliser does not read), so the render relies on the R3 canvas gate and its padding -fallback. It does not change the status. +computed, set after its constructor or not 16:9 or 1:1, a lets-plot grid has no `ggsize` +of its own or no scale reaches either canvas; plotnine and altair size their canvas on +the save, which the normaliser does not read). The entry says what the render meets: a +PNG of a known size over R2's pixel cap is refused by R2; any other relies on the R3 +canvas gate and its padding fallback, except a pygal or lets-plot PNG of unknown size +(`UNKNOWN_SIZE_CANVASES`), which can land over the cap, so no padding is promised. It +does not change the status. The 13 map specs are the specs tagged both `plot_type: map` and `data_type: geospatial` in their `specification.yaml`: bubble-map-geographic, @@ -90,14 +95,17 @@ from core.spec_roles import MAP_SPECS from ..schemas import MAX_NOTE_CHARS -from .normalise import SUPPORTED_LIBRARIES, measure_canvas -from .regions import IMPRINT_NAMES, dotted_name, find_regions, save_rule +from .normalise import MAX_IMAGE_PIXELS, SUPPORTED_LIBRARIES, Canvas, measure_canvas +from .regions import HTML_SUFFIX, IMPRINT_NAMES, PNG_SUFFIX, dotted_name, find_regions, save_rule from .validate import validate_security ReadinessStatus = Literal["blocked", "coupled", "clean"] MIN_PALETTE_ENTRIES = 6 +UNKNOWN_SIZE_CANVASES = frozenset({"pygal", "letsplot"}) +"""The canvas rewrites (`SaveRule.canvas`) whose unknown size can be anything: pygal's and lets-plot's catalogue +charts render 4800x2700 or more, over R2's pixel cap, unless the normaliser sets their size.""" MAX_SECURITY_REASONS = 5 MAX_SNIPPET_CHARS = 48 MAX_LINE_SNIPPET_CHARS = 2 * MAX_SNIPPET_CHARS @@ -227,9 +235,16 @@ def scan(normalised_code: str, *, spec_id: str, library: str, enabled_libraries: if regions.theme is None: blocked.append('no-theme: no module-level THEME = os.getenv("ANYPLOT_THEME", ...)') for call in regions.savefig_calls: - if call.standard_target or (rule.html and call.html_target): - continue where = call.span.lines() + suffix = PNG_SUFFIX if call.standard_target else HTML_SUFFIX if rule.html and call.html_target else None + if suffix is not None: + if not rule.writes_suffix(call.name, suffix): + writes = rule.writes.get(call.name, "") + blocked.append( + f"savefig-target: {call.name} writes only {writes} files, not {_snippet(call.target or '')} " + f"at {where}" + ) + continue if call.literal_target is not None: target = _snippet(repr(call.literal_target)) blocked.append(f"savefig-target: single-theme {call.name} target {target} at {where}") @@ -261,10 +276,21 @@ def scan(normalised_code: str, *, spec_id: str, library: str, enabled_libraries: hints.append(_hint(prefix, items, advice)) canvas = measure_canvas(normalised_code, library=library) if canvas.note is not None: - reasons.append(_clip(f"canvas: {canvas.note}; the render relies on the R3 canvas gate and padding")) + reasons.append(_canvas_reason(canvas, library)) return Readiness("coupled" if hints else "clean", reasons, hints) +def _canvas_reason(canvas: Canvas, library: str) -> str: + """The `canvas:` reason: the note and what the render meets; R3's padding only for a PNG under R2's pixel cap.""" + if canvas.pixels is not None and canvas.pixels[0] * canvas.pixels[1] > MAX_IMAGE_PIXELS: + outcome = "R2 refuses a PNG over its pixel cap" + elif canvas.pixels is None and save_rule(library).canvas in UNKNOWN_SIZE_CANVASES: + outcome = "the PNG size shows only in the render, and R2 refuses one over its pixel cap" + else: + outcome = "the render relies on the R3 canvas gate and padding" + return _clip(f"canvas: {canvas.note}; {outcome}") + + def _security(code: str, library: str) -> list[str]: """SECURITY validator findings as blocking reasons; a validator that fails blocks too. diff --git a/agents/anyplot/code/regions.py b/agents/anyplot/code/regions.py index 97be3a47dae..454d13a96f7 100644 --- a/agents/anyplot/code/regions.py +++ b/agents/anyplot/code/regions.py @@ -86,8 +86,11 @@ class SaveRule: validator checks one by one). `html` admits a second save of exactly `f"plot-{THEME}.html"` next to the PNG, `reopens` a `.open(...)` of the PNG (altair's PIL padding block), `directory` the one literal every save passes as `path=` - (lets-plot, whose `ggsave` writes into `./lets-plot-images` without it), and `canvas` - names the normaliser's canvas rewrite for the library, None where it has none yet. + (lets-plot, whose `ggsave` writes into `./lets-plot-images` without it), `writes[name]` + the one suffix a save name may write where the names each write one kind of file + (pygal: `render_to_file` writes SVG text, so only the HTML; a name not listed writes any + target of the rule), and `canvas` names the normaliser's canvas rewrite for the library, + None where it has none yet. """ names: frozenset[str] @@ -98,6 +101,7 @@ class SaveRule: html: bool = False reopens: bool = False directory: str | None = None + writes: Mapping[str, str] = field(default_factory=lambda: MappingProxyType({})) canvas: CanvasRewrite | None = "figure" @property @@ -114,6 +118,11 @@ def target_position(self, name: str) -> int: def allowed_keywords(self, name: str) -> frozenset[str] | None: return self.keywords.get(name) + def writes_suffix(self, name: str, suffix: str) -> bool: + """Whether the save name `name` may write a file ending in `suffix` (`PNG_SUFFIX` or `HTML_SUFFIX`).""" + only = self.writes.get(name) + return only is None or only == suffix + _PLOTNINE_SAVE_KEYWORDS = frozenset({"filename", "format", "width", "height", "units", "dpi", "limitsize", "verbose"}) """`ggplot.save(filename, format, path, width, height, units, dpi, limitsize, verbose, **kwargs)` without `path=` @@ -185,10 +194,14 @@ def allowed_keywords(self, name: str) -> frozenset[str] | None: keywords=_PYGAL_SAVE_KEYWORDS, keyword_only=frozenset({"svg2png"}), html=True, + writes=MappingProxyType( + {"render_to_png": PNG_SUFFIX, "svg2png": PNG_SUFFIX, "render_to_file": HTML_SUFFIX} + ), canvas="pygal", ), - # `ggsave(plot, f"plot-{THEME}.png", path=".", scale=4)` and the same call for the HTML, in every one of the - # 325 catalogue files; the file is the second positional or `filename=`. + # `ggsave(plot, f"plot-{THEME}.png", path=".", scale=4)` and the same call for the HTML: every one of the 325 + # catalogue files saves both, the file as the second positional or `filename=`; 292 pass `path="."`, and the + # normaliser adds it to the other saves. "letsplot": SaveRule( names=frozenset({"ggsave"}), target_keywords=frozenset({"filename"}), diff --git a/agents/anyplot/code/validate.py b/agents/anyplot/code/validate.py index c54484fea73..a4e6c95115f 100644 --- a/agents/anyplot/code/validate.py +++ b/agents/anyplot/code/validate.py @@ -145,8 +145,11 @@ by `import os [as X]` must be the receiver of `X.getenv("ANYPLOT_THEME", ...)` or `X.environ.get("ANYPLOT_THEME", ...)` with the literal first argument, at most two positional arguments and no keyword other than `default`. `from os import ...` is a - banned import. Note `__file__` is a dunder, so the catalogue's `sys.path` guard fails - twice (`sys` and `__file__`); the normaliser strips that guard before eligibility. + banned import, and nothing else binds a name `import os` binds (`def os` under + `functools.wraps`, `import textwrap as os`, an `except` or `match` capture, a + parameter): each would hand the theme block another object's `getenv`. Note `__file__` + is a dunder, so the catalogue's `sys.path` guard fails twice (`sys` and `__file__`); the + normaliser strips that guard before eligibility. * **Dunders and strings.** Every identifier matching `^__\\w+__$` (names, attributes, keywords, parameters, function names) and every string or bytes literal containing a dunder identifier is a finding; `__name__ == "__main__"` guards therefore fail, which @@ -170,7 +173,9 @@ `filename=`, `fp=` or `write_to=`; `ggsave` takes the plot first and the file second, `cairosvg.svg2png` takes every argument by keyword) must be exactly the f-string `f"plot-{THEME}.png"`, for altair, pygal and lets-plot also `f"plot-{THEME}.html"`, - the second file their catalogues write; `format=` is absent or the file's own type; + the second file their catalogues write, and a pygal save writes its own kind of file + (`SaveRule.writes`: `render_to_png` and `svg2png` the PNG, `render_to_file`, which + writes SVG text, the HTML); `format=` is absent or the file's own type; there are no `**arguments`; and the saves of plotnine, altair, pygal and lets-plot take only the keywords the rule lists (the size, the dpi, altair's `scale_factor`, svg2png's input and output size), so `path=` with plotnine, which joins a directory, `webdriver=` @@ -188,7 +193,16 @@ callee of a call (`g = ggsave`, `[ggsave][0](...)` and `partial(ggsave, plot)` are `banned-call` findings in every profile): the rule matches calls by their callee's name, so a save reached under another name would write anywhere (the lets-plot draft - of 2026-10-26 showed it in the plotnine profile). + of 2026-10-26 showed it in the plotnine profile). `THEME` keeps the value of the theme + block, because every file name above is built from it and libcairo writes pygal's PNG + where the render guard never looks (the security review of 2026-10-26): the one + binding of the name is the first module-level `THEME = os.getenv("ANYPLOT_THEME", ...)` + (the shapes `regions.is_theme_assignment` accepts, after `import os`), and every other + is a `savefig-target` finding where it stands: a second, augmented or annotated + assignment, a `for`, `with`, `except`, `match`, walrus or comprehension target, an + import, a `def`, a parameter, a type alias or parameter, a `del`, and a `global` or + `nonlocal` declaration (also a `banned-statement`). plotnine's expression strings need + no such rule: their assignments land in plotnine's own lookup dict, never in the module. * **Expression strings (plotnine).** plotnine compiles and evaluates a string that is not a column name wherever it takes an aesthetic or a facet (`aes`, `after_stat`, `after_scale`, `stage`, `facet_wrap`, `facet_grid`, `qplot`), with real builtins and the @@ -308,7 +322,7 @@ `relative-import`, `os-use`, `module-value`, `banned-name`, `banned-call`, `banned-attribute`, `banned-keyword`, `rc-key`, `dunder`, `banned-statement`, `url-literal`, `string-length`, `savefig-target` (SECURITY; DATA without `savefig-target`; a plotnine expression string's finding keeps the id of the rule it broke; -pygal's config and lets-plot's rules use the ids above); +pygal's config and lets-plot's rules use the ids above, the THEME pin `savefig-target`); `placeholder-count`, `placeholder-use`, `rng`, `literal-data`, `palette-prefix` (ADAPTATION); `data-frame` (DATA). Findings are sorted by line; messages never echo more than about 60 characters of code and never echo string literal contents. @@ -328,7 +342,17 @@ from core.palette import IMPRINT from ..schemas import MAX_CODE_CHARS -from .regions import HTML_SUFFIX, SAVE_NAMES, SaveRule, is_theme_target, save_rule, save_target +from .regions import ( + HTML_SUFFIX, + PNG_SUFFIX, + SAVE_NAMES, + THEME_NAME, + SaveRule, + is_theme_assignment, + is_theme_target, + save_rule, + save_target, +) Profile = Literal["security", "adaptation", "data"] @@ -342,6 +366,10 @@ MAX_SNIPPET_CHARS = 60 PLACEHOLDER = "df = load_user_data()" THEME_VARIABLE = "ANYPLOT_THEME" +THEME_BINDING_MESSAGE = ( + 'THEME may only be bound by the theme block, THEME = os.getenv("ANYPLOT_THEME", ...) after import os: ' + 'every save writes f"plot-{THEME}..."' +) # The pure standard modules from `warnings` on were admitted by the owner (2026-10-10). # Each was walked for public names that read, load, save, open, fetch or evaluate, and @@ -1732,6 +1760,7 @@ def security(self, library: str, allowed_imports: frozenset[str], rule: SaveRule self._check_strings() self._check_save(rule) self._check_save_names() + self._check_theme_bindings() if library in EXPRESSION_LIBRARIES: self._check_expression_strings() @@ -1907,6 +1936,16 @@ def _check_os_use(self) -> None: for name in self.of(ast.Name): if name.id in self.os_names and not self._is_theme_lookup(name): self.add("os-use", f"'{name.id}' may only be used as {name.id}.getenv('{THEME_VARIABLE}', ...)", name) + # A store of the name is a `Name` above; `def os(): ...` under `@functools.wraps(g, assigned=("getenv",))` or + # `from textwrap import dedent as os` would hand the theme block another object's `getenv`. + for variable in sorted(self.os_names): + for node in self._binding_nodes(variable): + if not isinstance(node, ast.Name) and not self._is_os_import(node): + self.add("os-use", f"'{variable}' may only be bound by import os", node) + + def _is_os_import(self, node: ast.AST) -> bool: + """`node` is the alias of an `import os [as X]`.""" + return isinstance(node, ast.alias) and node.name == "os" and isinstance(self.parents.get(node), ast.Import) def _check_module_values(self) -> None: """A name bound by `import X [as Y]` only as the receiver of an attribute (module docstring). @@ -2260,13 +2299,21 @@ def _check_save(self, rule: SaveRule | None) -> None: self.add("savefig-target", f'no {rule.verb} of f"plot-{{THEME}}.png" found', None) def _check_save_call(self, call: ast.Call, rule: SaveRule, name: str) -> bool: - """The file, the format and the keywords of one save call; whether it writes the PNG.""" + """The file, the format and the keywords of one save call; whether it writes the PNG. + + A save of the PNG by a name that writes only the HTML (`render_to_file(f"plot-{THEME}.png")` writes SVG text + into the PNG) writes no PNG, so a file with no other PNG save also gets the missing-save finding. + """ target = save_target(call, rule, name) png = target is not None and _is_theme_target(target) html = rule.html and target is not None and is_theme_target(target, HTML_SUFFIX) if not (png or html): files = 'f"plot-{THEME}.png"' + (' or f"plot-{THEME}.html"' if rule.html else "") self.add("savefig-target", f"{name} target must be exactly {files}", call) + elif not rule.writes_suffix(name, PNG_SUFFIX if png else HTML_SUFFIX): + # pygal's names each write one kind of file (`SaveRule.writes`; the correctness review of 2026-10-26). + self.add("savefig-target", f'{name} writes only f"plot-{{THEME}}{rule.writes[name]}"', call) + png = False position = rule.target_position(name) if position < 0 and call.args: # `svg2png(bytestring, ...)`: the keyword-only save names its file with `write_to=` alone. @@ -2316,6 +2363,24 @@ def _check_save_names(self) -> None: if not (isinstance(parent, ast.Call) and parent.func is name): self.add("banned-call", f"'{name.id}' may only be called directly", name) + def _check_theme_bindings(self) -> None: + """`THEME` keeps the value of the theme block (module docstring, "The save"). + + The one binding allowed is the target of the first module-level `THEME = os.getenv("ANYPLOT_THEME", ...)` + (`regions.is_theme_assignment`), and only after `import os`; every other binding of the name, and a `global` or + `nonlocal` declaration of it, is a finding where it stands. + """ + block = next((statement for statement in self.tree.body if is_theme_assignment(statement)), None) + allowed: ast.AST | None = None + if "os" in self.os_names and isinstance(block, ast.Assign): + allowed = block.targets[0] + elif "os" in self.os_names and isinstance(block, ast.AnnAssign): + allowed = block.target + declarations: list[ast.Global | ast.Nonlocal] = [*self.of(ast.Global), *self.of(ast.Nonlocal)] + for node in [*self._binding_nodes(THEME_NAME), *(node for node in declarations if THEME_NAME in node.names)]: + if node is not allowed: + self.add("savefig-target", THEME_BINDING_MESSAGE, node) + def _check_expression_strings(self) -> None: """plotnine's expression arguments: literals the walk can read, each string walked as code (module docstring, "Expression strings").""" @@ -2389,14 +2454,20 @@ def _module_value(self, variable: str, read: Callable[[ast.Name], bool] | None = return None def _bindings(self, variable: str) -> int: - """How many places bind `variable`: a store or a deletion of the name, a parameter, an import, a function or + """How many places bind `variable` (`_binding_nodes`).""" + return len(self._binding_nodes(variable)) + + def _binding_nodes(self, variable: str) -> list[ast.AST]: + """The places that bind `variable`: a store or a deletion of the name, a parameter, an import, a function or class name, an exception or `match` capture, a type parameter. A `case x:` would rebind a name the walk checked as a literal (`match "open('x')": case COLUMN: ...`), so every kind counts.""" - count = sum(1 for name in self.of(ast.Name) if name.id == variable and not isinstance(name.ctx, ast.Load)) - count += sum(1 for parameter in self.of(ast.arg) if parameter.arg == variable) + nodes: list[ast.AST] = [ + name for name in self.of(ast.Name) if name.id == variable and not isinstance(name.ctx, ast.Load) + ] + nodes.extend(parameter for parameter in self.of(ast.arg) if parameter.arg == variable) imports: list[ast.Import | ast.ImportFrom] = [*self.of(ast.Import), *self.of(ast.ImportFrom)] - count += sum( - 1 for node in imports for alias in node.names if (alias.asname or alias.name.split(".")[0]) == variable + nodes.extend( + alias for node in imports for alias in node.names if (alias.asname or alias.name.split(".")[0]) == variable ) named: list[ast.AST] = [ *self.of(ast.FunctionDef), @@ -2409,9 +2480,9 @@ class name, an exception or `match` capture, a type parameter. A `case x:` would *self.of(ast.ParamSpec), *self.of(ast.TypeVarTuple), ] - count += sum(1 for node in named if getattr(node, "name", None) == variable) - count += sum(1 for node in self.of(ast.MatchMapping) if node.rest == variable) - return count + nodes.extend(node for node in named if getattr(node, "name", None) == variable) + nodes.extend(node for node in self.of(ast.MatchMapping) if node.rest == variable) + return nodes def _check_expression(self, text: str, call_name: str, node: ast.Constant) -> None: """One expression string: every parsable term walked with this profile's name, attribute, call, save and diff --git a/agents/anyplot/render/png.py b/agents/anyplot/render/png.py index 7e252d601e0..30e842d961a 100644 --- a/agents/anyplot/render/png.py +++ b/agents/anyplot/render/png.py @@ -27,9 +27,15 @@ MAX_PNG_BYTES = 10 * 1024 * 1024 MAX_PROBE_BYTES = 256 * 1024 MAX_IMAGE_PIXELS = 3200 * 1800 * 2 # twice the canvas leaves room for a drifted size, not for a bomb -# R2 fails only a canvas that is 98 % one colour. The rubric's AR-04 uses 95 %, which -# sparse dark renders reach legitimately (core/canvas.py), so R2 stays more permissive. -MAX_BACKGROUND_RATIO = 0.98 +# R2 fails only a canvas that is 99.7 % one colour: the background alone, or a title on it. +# Measured on 2026-10-26 with core.canvas.dominant_color: the sparsest eligible pygal +# render (network-directed) is 99.44 % one colour, 33 of the 195 eligible pygal renders +# reach 98 % or more, and lets-plot's point-basic is 98.38 %, while a pygal chart with +# only a title is 99.78 % and a bare pygal canvas 99.93 %. A pygal chart with axes and +# guides but no data passes (98.62 %); R2 never caught empty axes, since matplotlib's +# stay under 98 % too. So R2 refuses a canvas with nothing drawn, not a chart without +# data, and the rubric's AR-04 judges sparse renders at 95 % (core/canvas.py). +MAX_BACKGROUND_RATIO = 0.997 class PngRejected(ValueError): @@ -108,7 +114,7 @@ def harden(data: bytes) -> HardenedPng: (red, green, blue), ratio = dominant_color(rgb) if ratio >= MAX_BACKGROUND_RATIO: raise PngRejected( - f"the image is {ratio * 100:.0f}% one colour (#{red:02X}{green:02X}{blue:02X}); nothing was drawn" + f"the image is {ratio * 100:.1f}% one colour (#{red:02X}{green:02X}{blue:02X}); nothing was drawn" ) buffer = io.BytesIO() rgb.save(buffer, format="PNG", optimize=False) diff --git a/agents/anyplot/settings.py b/agents/anyplot/settings.py index 2e95ebaefc0..434da2cdd63 100644 --- a/agents/anyplot/settings.py +++ b/agents/anyplot/settings.py @@ -29,7 +29,7 @@ | `AGENT_CLI_CALL_LOG` | unset | `claude-cli` only: a file each CLI call appends one JSON line to (model, effort, seconds, ok) | | `AGENT_LOCATION` | `eu` | Vertex AI location of every model call: `eu`, `us` or `global` | | `AGENT_PROJECT`, else `GOOGLE_CLOUD_PROJECT` | `anyplot` | Google Cloud project that serves (and bills) the model calls | -| `AGENT_LIBRARIES` | `matplotlib,seaborn` | Enabled libraries; each needs a runtime in the registry (`RUNTIME_LIBRARIES`: `matplotlib`, `seaborn`, `plotnine`, `altair`). The default stays `matplotlib,seaborn`; plotnine and altair are enabled after their eval matrix passes | +| `AGENT_LIBRARIES` | `matplotlib,seaborn` | Enabled libraries; each needs a runtime in the registry (`RUNTIME_LIBRARIES`: `matplotlib`, `seaborn`, `plotnine`, `altair`, `pygal`, `letsplot`). The default stays `matplotlib,seaborn`; plotnine, altair, pygal and lets-plot are each enabled after its eval matrix passes | | `AGENT_RENDERER` | `remote` | Render backend: `remote` (the anyplot-renderer service, phase 1), `sandbox` (in-process sandboxes, not used in phase 1), `local` (development only) or `fake` (development and test only) | | `AGENT_RENDER_URL` | unset | The anyplot-renderer service URL the `remote` backend calls; `https://` outside development and test | | `AGENT_RENDER_TOKEN` | unset | Development only: an ID token for the renderer (`gcloud auth print-identity-token`); without it the backend mints one from Application Default Credentials | diff --git a/agents/evals/cases.py b/agents/evals/cases.py index bdcd0707265..841e1dddec9 100644 --- a/agents/evals/cases.py +++ b/agents/evals/cases.py @@ -15,9 +15,10 @@ `select_cases` takes the harness's `--cases` value: `smoke` (the cases tagged `smoke`: one generated matplotlib or seaborn case per spec, one plotnine and one altair case since -2026-10-25, plus the hand-written `scatter-basic-matplotlib` and `bar-grouped-seaborn`: -14), `full` (every case except the stress cases: the 240 generated and the seven -hand-written ones, 247 since 2026-10-25; 127 before plotnine and altair), `stress` (the +2026-10-25, one pygal and one lets-plot case since 2026-10-26, plus the hand-written +`scatter-basic-matplotlib` and `bar-grouped-seaborn`: 16), `full` (every case except the +stress cases: the 360 generated and the seven hand-written ones, 367 since 2026-10-26; +247 before pygal and lets-plot, 127 before plotnine and altair), `stress` (the cases tagged `stress`, from `make_stress.py`), or comma-separated shell globs over case ids (`*-seaborn-*`, `pie-basic-*`, `stress-compute-*`). The catalogue snapshot comes from `snapshot.json` or, without it, from `plots/<spec>/` in this diff --git a/agents/evals/fixtures/README.md b/agents/evals/fixtures/README.md index 0737dab3a33..26910c32fb7 100644 --- a/agents/evals/fixtures/README.md +++ b/agents/evals/fixtures/README.md @@ -12,15 +12,15 @@ Each directory under `cases/` is one case of the regression harness (`agents/eva A stress case's `case.json` also carries `bound_expected` (the gate, limit or error that must bound it), `needs_model`, `static` and `render` (what the static stage must measure), and for an injection case `marker`; `agents/evals/make_stress.py` documents each field. -There are 270 cases: +There are 390 cases: -- **240 generated cases** `<spec>-<library>-<perturbation>`: 10 specs times matplotlib, seaborn, plotnine and altair times 6 perturbations (`renamed`, `x10`, `n12`, `n5000`, `date`, `decimal-comma`), written by `agents/evals/make_fixtures.py`. plotnine and altair joined on 2026-10-25, with the same datasets and bindings as the other two libraries. Never edit them by hand: change the generator and rerun `uv run --extra agents python -m agents.evals.make_fixtures`. Its docstring lists the specs, why each was chosen, and what each perturbation does. +- **360 generated cases** `<spec>-<library>-<perturbation>`: 10 specs times matplotlib, seaborn, plotnine, altair, pygal and lets-plot (`letsplot`) times 6 perturbations (`renamed`, `x10`, `n12`, `n5000`, `date`, `decimal-comma`), written by `agents/evals/make_fixtures.py`. plotnine and altair joined on 2026-10-25 and pygal and lets-plot on 2026-10-26, each with the same datasets and bindings as the first two libraries. The readiness scan blocks two of the ten pygal files (`histogram-basic` and `line-timeseries`), so their 12 cases are blocked when the session opens until those catalogue files change. Never edit the generated cases by hand: change the generator and rerun `uv run --extra agents python -m agents.evals.make_fixtures`. Its docstring lists the specs, why each was chosen, the readiness of each spec's file per library, why the two pygal files are blocked, and what each perturbation does. - **7 hand-written cases**: `scatter-basic-matplotlib` and `bar-grouped-seaborn`, which the runtime tests also use, and `scatter-basic-matplotlib-german-message` (since 2026-10-12): German column names and a German follow-up message, `Mach die Punkte etwas größer.`, with no word about the language. The first plot comes from `create_plot`, which the scope judge never reads, so it is English; the follow-up is the session's first typed message and sets the session language to `de` (`detected`), so the second version must carry German plot text while the column names keep their spelling. The case names no `language` on purpose: it tests detection, not a choice. Each run's record holds the last `done` event's `language`. Four more (since 2026-10-15, tags `density` or `number-format`) generalise the live tests of 2026-10-14/15 and choose their `language`: `bar-grouped-matplotlib-many-categories-de` (26 invented regions times two series, where the catalogue's per-bar labels, dots and shadows crowded 52 bars; gate G11), `bar-basic-seaborn-decimals-de` and its English control `bar-basic-seaborn-decimals-en` (bar values with two decimals, which seaborn's `bar_label` wrote as `5.30` in a German plot; gate G12), and `line-multi-matplotlib-millions-de` (two population series in the millions with the follow-up `Zeig die y-Achse in Millionen, zum Beispiel 6,5 Mio.`, after an axis that read `6.0 M`; gate G12). -- **23 stress cases** `stress-<name>`, written by `agents/evals/make_stress.py` (rerun `uv run --extra agents python -m agents.evals.make_stress`): data at and one past the parser's caps, many categories, degenerate data, prompt injection, and requests that make the code compute mass data. They carry the tag `stress`; `--cases stress` selects them and `--cases full` leaves them out, so a full run keeps its 247 cases. +- **23 stress cases** `stress-<name>`, written by `agents/evals/make_stress.py` (rerun `uv run --extra agents python -m agents.evals.make_stress`): data at and one past the parser's caps, many categories, degenerate data, prompt injection, and requests that make the code compute mass data. They carry the tag `stress`; `--cases stress` selects them and `--cases full` leaves them out, so a full run keeps its 367 cases. -The tag `smoke` marks the 14 cases of `--cases smoke`: one generated case per spec, cycling through the perturbations and alternating matplotlib and seaborn; one generated case for each of plotnine and altair (since 2026-10-25: `scatter-basic-plotnine-renamed` and `scatter-basic-altair-renamed`, whose headers with a dot test each library's own column syntax); plus `scatter-basic-matplotlib` and `bar-grouped-seaborn`. A run that holds a plotnine or altair case needs that library in `AGENT_LIBRARIES` (otherwise the readiness scan blocks the session as `library-disabled`) and a renderer image that carries it (otherwise the harness's preflight render stops the run). +The tag `smoke` marks the 16 cases of `--cases smoke`: one generated case per spec, cycling through the perturbations and alternating matplotlib and seaborn; one generated case for each later library, `scatter-basic-<library>-renamed` for plotnine and altair (since 2026-10-25) and for pygal and letsplot (since 2026-10-26); plus `scatter-basic-matplotlib` and `bar-grouped-seaborn`. The `renamed` headers have spaces and a dot, which test each library's own column syntax; pygal has none, so its case tests the axis titles that pygal never takes from a column name. A run that holds a plotnine, altair, pygal or lets-plot case needs that library in `AGENT_LIBRARIES` (otherwise the readiness scan blocks the session as `library-disabled`) and a renderer image that carries it (otherwise the harness's preflight render stops the run). -86 cases open their session with `locale` `de`: the 80 generated `renamed` and `decimal-comma` cases, `bar-grouped-seaborn` (tag `german-locale`), the three German block H cases (which also choose `language` `de`) and the stress cases `cap-columns` and `mixed-decimals`. Since 2026-10-12 the locale sets no language, and their only turn is `create_plot`, so they reply and title their plots in English like every other case; their purpose is the data perturbation. `scatter-basic-matplotlib-german-message` is the case that exercises German replies and German plot text. +126 cases open their session with `locale` `de`: the 120 generated `renamed` and `decimal-comma` cases, `bar-grouped-seaborn` (tag `german-locale`), the three German block H cases (which also choose `language` `de`) and the stress cases `cap-columns` and `mixed-decimals`. Since 2026-10-12 the locale sets no language, and their only turn is `create_plot`, so they reply and title their plots in English like every other case; their purpose is the data perturbation. `scatter-basic-matplotlib-german-message` is the case that exercises German replies and German plot text. ## Stress cases: what bounds them diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-date/case.json b/agents/evals/fixtures/cases/area-basic-letsplot-date/case.json new file mode 100644 index 00000000000..9bb69aab3cc --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "area-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "x", + "column": "Date" + }, + { + "role": "y", + "column": "Energy Use (MWh)" + } + ], + "expected": "accepted", + "tags": [ + "area", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "date-axis" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, date)" +} diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-date/data.csv b/agents/evals/fixtures/cases/area-basic-letsplot-date/data.csv new file mode 100644 index 00000000000..b289097bbd6 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-date/data.csv @@ -0,0 +1,91 @@ +Date,Metered On,Energy Use (MWh) +01.01.2026,2026-01-02,147.6 +02.01.2026,2026-01-03,138.8 +03.01.2026,2026-01-04,153.7 +04.01.2026,2026-01-05,138.5 +05.01.2026,2026-01-06,135.4 +06.01.2026,2026-01-07,139.8 +07.01.2026,2026-01-08,144.9 +08.01.2026,2026-01-09,149.1 +09.01.2026,2026-01-10,145.9 +10.01.2026,2026-01-11,149.8 +11.01.2026,2026-01-12,141.8 +12.01.2026,2026-01-13,136.3 +13.01.2026,2026-01-14,147.1 +14.01.2026,2026-01-15,146.4 +15.01.2026,2026-01-16,151.6 +16.01.2026,2026-01-17,150.7 +17.01.2026,2026-01-18,151.2 +18.01.2026,2026-01-19,148.5 +19.01.2026,2026-01-20,141.4 +20.01.2026,2026-01-21,148.1 +21.01.2026,2026-01-22,135.8 +22.01.2026,2026-01-23,155.9 +23.01.2026,2026-01-24,150.1 +24.01.2026,2026-01-25,141.6 +25.01.2026,2026-01-26,142.0 +26.01.2026,2026-01-27,144.0 +27.01.2026,2026-01-28,134.5 +28.01.2026,2026-01-29,148.7 +29.01.2026,2026-01-30,150.0 +30.01.2026,2026-01-31,155.0 +31.01.2026,2026-02-01,150.4 +01.02.2026,2026-02-02,147.5 +02.02.2026,2026-02-03,137.6 +03.02.2026,2026-02-04,136.6 +04.02.2026,2026-02-05,150.9 +05.02.2026,2026-02-06,153.8 +06.02.2026,2026-02-07,155.0 +07.02.2026,2026-02-08,147.6 +08.02.2026,2026-02-09,140.9 +09.02.2026,2026-02-10,133.6 +10.02.2026,2026-02-11,137.7 +11.02.2026,2026-02-12,145.8 +12.02.2026,2026-02-13,150.2 +13.02.2026,2026-02-14,151.6 +14.02.2026,2026-02-15,144.1 +15.02.2026,2026-02-16,138.2 +16.02.2026,2026-02-17,131.3 +17.02.2026,2026-02-18,132.4 +18.02.2026,2026-02-19,147.6 +19.02.2026,2026-02-20,139.6 +20.02.2026,2026-02-21,149.7 +21.02.2026,2026-02-22,148.4 +22.02.2026,2026-02-23,147.5 +23.02.2026,2026-02-24,136.8 +24.02.2026,2026-02-25,140.6 +25.02.2026,2026-02-26,143.1 +26.02.2026,2026-02-27,146.2 +27.02.2026,2026-02-28,145.5 +28.02.2026,2026-03-01,144.4 +01.03.2026,2026-03-02,137.4 +02.03.2026,2026-03-03,138.5 +03.03.2026,2026-03-04,135.2 +04.03.2026,2026-03-05,143.3 +05.03.2026,2026-03-06,150.2 +06.03.2026,2026-03-07,150.4 +07.03.2026,2026-03-08,136.3 +08.03.2026,2026-03-09,136.5 +09.03.2026,2026-03-10,133.9 +10.03.2026,2026-03-11,126.3 +11.03.2026,2026-03-12,136.2 +12.03.2026,2026-03-13,130.1 +13.03.2026,2026-03-14,141.8 +14.03.2026,2026-03-15,134.3 +15.03.2026,2026-03-16,135.7 +16.03.2026,2026-03-17,130.6 +17.03.2026,2026-03-18,124.6 +18.03.2026,2026-03-19,135.2 +19.03.2026,2026-03-20,137.1 +20.03.2026,2026-03-21,140.5 +21.03.2026,2026-03-22,131.2 +22.03.2026,2026-03-23,124.6 +23.03.2026,2026-03-24,122.6 +24.03.2026,2026-03-25,126.2 +25.03.2026,2026-03-26,137.7 +26.03.2026,2026-03-27,130.4 +27.03.2026,2026-03-28,135.6 +28.03.2026,2026-03-29,138.5 +29.03.2026,2026-03-30,131.9 +30.03.2026,2026-03-31,121.7 +31.03.2026,2026-04-01,130.0 diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-decimal-comma/case.json b/agents/evals/fixtures/cases/area-basic-letsplot-decimal-comma/case.json new file mode 100644 index 00000000000..94558396967 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "area-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "x", + "column": "Day" + }, + { + "role": "y", + "column": "Energy Use (MWh)" + } + ], + "expected": "accepted", + "tags": [ + "area", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-decimal-comma/data.csv b/agents/evals/fixtures/cases/area-basic-letsplot-decimal-comma/data.csv new file mode 100644 index 00000000000..ea52040ab12 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-decimal-comma/data.csv @@ -0,0 +1,91 @@ +Day;Energy Use (MWh) +1;147,6 +2;138,8 +3;153,7 +4;138,5 +5;135,4 +6;139,8 +7;144,9 +8;149,1 +9;145,9 +10;149,8 +11;141,8 +12;136,3 +13;147,1 +14;146,4 +15;151,6 +16;150,7 +17;151,2 +18;148,5 +19;141,4 +20;148,1 +21;135,8 +22;155,9 +23;150,1 +24;141,6 +25;142,0 +26;144,0 +27;134,5 +28;148,7 +29;150,0 +30;155,0 +31;150,4 +32;147,5 +33;137,6 +34;136,6 +35;150,9 +36;153,8 +37;155,0 +38;147,6 +39;140,9 +40;133,6 +41;137,7 +42;145,8 +43;150,2 +44;151,6 +45;144,1 +46;138,2 +47;131,3 +48;132,4 +49;147,6 +50;139,6 +51;149,7 +52;148,4 +53;147,5 +54;136,8 +55;140,6 +56;143,1 +57;146,2 +58;145,5 +59;144,4 +60;137,4 +61;138,5 +62;135,2 +63;143,3 +64;150,2 +65;150,4 +66;136,3 +67;136,5 +68;133,9 +69;126,3 +70;136,2 +71;130,1 +72;141,8 +73;134,3 +74;135,7 +75;130,6 +76;124,6 +77;135,2 +78;137,1 +79;140,5 +80;131,2 +81;124,6 +82;122,6 +83;126,2 +84;137,7 +85;130,4 +86;135,6 +87;138,5 +88;131,9 +89;121,7 +90;130,0 diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-n12/case.json b/agents/evals/fixtures/cases/area-basic-letsplot-n12/case.json new file mode 100644 index 00000000000..b1d089657c8 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "area-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "x", + "column": "Day" + }, + { + "role": "y", + "column": "Energy Use (MWh)" + } + ], + "expected": "accepted", + "tags": [ + "area", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, n12)" +} diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-n12/data.csv b/agents/evals/fixtures/cases/area-basic-letsplot-n12/data.csv new file mode 100644 index 00000000000..8ab487a48c6 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-n12/data.csv @@ -0,0 +1,13 @@ +Day,Energy Use (MWh) +1,142.3 +2,152.9 +3,144.8 +4,140.8 +5,129.5 +6,140.3 +7,144.7 +8,146.5 +9,149.0 +10,149.5 +11,138.6 +12,137.0 diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-n5000/case.json b/agents/evals/fixtures/cases/area-basic-letsplot-n5000/case.json new file mode 100644 index 00000000000..3d272cfe1c5 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "area-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "x", + "column": "Day" + }, + { + "role": "y", + "column": "Energy Use (MWh)" + } + ], + "expected": "accepted", + "tags": [ + "area", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, n5000)" +} diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-n5000/data.csv b/agents/evals/fixtures/cases/area-basic-letsplot-n5000/data.csv new file mode 100644 index 00000000000..a171cf4f1f5 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-n5000/data.csv @@ -0,0 +1,5001 @@ +Day,Energy Use (MWh) +1,152.6 +2,147.6 +3,144.7 +4,140.0 +5,144.0 +6,141.8 +7,144.8 +8,154.8 +9,149.4 +10,152.8 +11,140.1 +12,142.6 +13,142.4 +14,142.2 +15,153.5 +16,156.7 +17,149.7 +18,147.0 +19,137.9 +20,140.0 +21,139.1 +22,150.2 +23,152.2 +24,154.5 +25,135.6 +26,138.2 +27,137.3 +28,148.6 +29,152.6 +30,159.3 +31,141.9 +32,140.9 +33,140.8 +34,138.7 +35,143.4 +36,152.8 +37,145.7 +38,154.3 +39,139.3 +40,137.4 +41,132.4 +42,146.9 +43,152.0 +44,149.4 +45,144.8 +46,136.9 +47,133.2 +48,138.0 +49,139.9 +50,149.8 +51,153.6 +52,147.5 +53,138.2 +54,139.3 +55,131.3 +56,138.8 +57,147.5 +58,146.6 +59,146.3 +60,131.8 +61,127.7 +62,128.1 +63,133.0 +64,146.9 +65,142.9 +66,136.2 +67,141.6 +68,136.3 +69,131.3 +70,135.5 +71,146.2 +72,147.6 +73,131.5 +74,132.0 +75,133.6 +76,140.8 +77,134.7 +78,144.4 +79,141.9 +80,142.4 +81,132.6 +82,131.3 +83,120.3 +84,137.3 +85,134.9 +86,137.0 +87,133.6 +88,133.2 +89,126.3 +90,123.4 +91,130.8 +92,132.8 +93,135.3 +94,127.0 +95,119.4 +96,113.8 +97,119.9 +98,124.1 +99,133.5 +100,131.7 +101,128.0 +102,123.1 +103,115.6 +104,129.6 +105,127.2 +106,124.0 +107,120.3 +108,121.1 +109,119.0 +110,118.8 +111,123.7 +112,121.2 +113,119.7 +114,135.1 +115,129.3 +116,115.5 +117,110.9 +118,111.1 +119,124.9 +120,120.2 +121,125.5 +122,115.7 +123,116.4 +124,111.7 +125,111.0 +126,110.7 +127,120.1 +128,118.6 +129,116.6 +130,111.1 +131,113.1 +132,108.9 +133,115.4 +134,111.2 +135,118.9 +136,110.9 +137,112.9 +138,113.4 +139,102.0 +140,112.2 +141,112.4 +142,119.5 +143,114.6 +144,103.8 +145,97.5 +146,102.0 +147,109.7 +148,109.5 +149,116.6 +150,102.5 +151,98.8 +152,104.5 +153,98.1 +154,102.2 +155,105.3 +156,109.0 +157,98.7 +158,102.8 +159,94.4 +160,97.4 +161,100.7 +162,102.6 +163,105.0 +164,100.6 +165,100.4 +166,100.7 +167,95.3 +168,98.0 +169,108.0 +170,106.2 +171,101.3 +172,90.5 +173,98.7 +174,96.7 +175,89.9 +176,105.3 +177,101.9 +178,105.0 +179,99.9 +180,94.1 +181,96.1 +182,97.2 +183,98.9 +184,109.6 +185,96.8 +186,96.4 +187,87.0 +188,93.2 +189,94.5 +190,106.8 +191,104.8 +192,98.3 +193,96.4 +194,96.4 +195,94.4 +196,97.6 +197,103.2 +198,110.2 +199,106.6 +200,90.3 +201,89.8 +202,91.4 +203,90.4 +204,105.1 +205,103.8 +206,97.1 +207,96.0 +208,86.6 +209,95.5 +210,95.1 +211,107.4 +212,104.1 +213,93.9 +214,90.2 +215,94.4 +216,89.8 +217,99.4 +218,100.1 +219,104.9 +220,101.4 +221,102.9 +222,88.6 +223,96.5 +224,104.1 +225,101.3 +226,101.5 +227,102.6 +228,93.5 +229,93.1 +230,94.6 +231,102.1 +232,103.1 +233,103.9 +234,103.0 +235,97.1 +236,97.7 +237,95.8 +238,107.8 +239,111.7 +240,100.7 +241,105.3 +242,104.3 +243,92.3 +244,100.1 +245,108.2 +246,110.9 +247,110.3 +248,114.3 +249,103.2 +250,98.8 +251,98.3 +252,111.6 +253,112.7 +254,111.4 +255,109.5 +256,102.7 +257,103.3 +258,97.9 +259,100.7 +260,118.3 +261,115.8 +262,116.4 +263,104.5 +264,103.4 +265,102.5 +266,109.2 +267,121.9 +268,111.9 +269,109.4 +270,113.3 +271,100.6 +272,117.3 +273,124.1 +274,119.7 +275,118.7 +276,123.0 +277,107.8 +278,110.7 +279,116.2 +280,112.6 +281,130.4 +282,125.3 +283,119.1 +284,109.4 +285,112.4 +286,120.3 +287,116.0 +288,124.6 +289,125.2 +290,124.8 +291,116.0 +292,115.2 +293,124.1 +294,126.5 +295,128.0 +296,132.5 +297,128.3 +298,119.5 +299,119.6 +300,125.9 +301,125.3 +302,128.4 +303,127.0 +304,132.2 +305,129.4 +306,117.6 +307,123.6 +308,128.9 +309,125.5 +310,125.9 +311,132.8 +312,121.3 +313,123.5 +314,127.4 +315,125.8 +316,137.3 +317,140.5 +318,124.5 +319,136.1 +320,127.6 +321,121.3 +322,134.3 +323,139.2 +324,142.1 +325,139.1 +326,128.5 +327,129.3 +328,134.4 +329,137.3 +330,141.4 +331,145.2 +332,137.5 +333,140.4 +334,137.1 +335,139.6 +336,137.3 +337,140.9 +338,149.8 +339,143.6 +340,144.1 +341,134.9 +342,132.2 +343,144.0 +344,142.8 +345,149.0 +346,140.2 +347,144.2 +348,134.1 +349,141.6 +350,147.2 +351,149.1 +352,148.7 +353,144.3 +354,136.2 +355,136.4 +356,140.6 +357,146.0 +358,148.8 +359,150.8 +360,150.3 +361,138.7 +362,148.7 +363,153.3 +364,149.6 +365,153.6 +366,155.1 +367,156.4 +368,142.2 +369,142.2 +370,138.7 +371,151.6 +372,154.1 +373,158.2 +374,149.0 +375,147.7 +376,143.4 +377,146.2 +378,150.3 +379,153.6 +380,148.4 +381,150.2 +382,139.8 +383,143.4 +384,145.6 +385,144.6 +386,155.4 +387,155.1 +388,146.2 +389,144.3 +390,147.3 +391,145.5 +392,145.8 +393,145.3 +394,157.2 +395,154.7 +396,149.4 +397,141.0 +398,146.6 +399,147.0 +400,153.9 +401,149.4 +402,159.3 +403,143.0 +404,144.0 +405,145.4 +406,150.3 +407,146.8 +408,150.2 +409,152.8 +410,151.2 +411,143.1 +412,142.6 +413,147.9 +414,160.2 +415,150.6 +416,156.0 +417,147.7 +418,139.6 +419,143.4 +420,147.0 +421,149.3 +422,150.6 +423,143.8 +424,135.7 +425,142.0 +426,135.9 +427,142.7 +428,147.3 +429,149.8 +430,149.1 +431,141.0 +432,135.3 +433,135.3 +434,136.9 +435,145.1 +436,146.4 +437,146.7 +438,140.6 +439,144.1 +440,137.3 +441,142.8 +442,146.2 +443,135.5 +444,135.4 +445,136.5 +446,129.6 +447,132.1 +448,141.1 +449,142.4 +450,146.3 +451,128.4 +452,135.4 +453,130.1 +454,135.1 +455,140.6 +456,139.7 +457,143.5 +458,128.3 +459,121.7 +460,126.9 +461,124.6 +462,140.6 +463,132.6 +464,133.3 +465,129.4 +466,126.4 +467,135.9 +468,124.7 +469,129.9 +470,135.0 +471,130.5 +472,128.1 +473,131.1 +474,125.3 +475,124.5 +476,131.0 +477,136.1 +478,127.0 +479,135.5 +480,122.9 +481,110.0 +482,126.9 +483,119.3 +484,120.0 +485,129.1 +486,131.7 +487,119.8 +488,113.7 +489,116.9 +490,121.5 +491,129.7 +492,122.5 +493,111.7 +494,119.4 +495,112.5 +496,116.4 +497,117.7 +498,115.1 +499,117.4 +500,121.5 +501,116.3 +502,109.4 +503,110.5 +504,113.8 +505,118.3 +506,120.3 +507,117.6 +508,109.0 +509,101.6 +510,112.6 +511,103.5 +512,114.0 +513,118.0 +514,111.1 +515,105.9 +516,107.0 +517,96.8 +518,111.4 +519,108.4 +520,118.6 +521,112.2 +522,100.0 +523,103.6 +524,109.3 +525,104.2 +526,109.3 +527,108.4 +528,111.6 +529,100.0 +530,103.3 +531,96.2 +532,104.5 +533,109.8 +534,108.6 +535,107.7 +536,100.9 +537,96.5 +538,99.2 +539,103.5 +540,104.1 +541,109.8 +542,104.9 +543,104.2 +544,101.5 +545,99.9 +546,107.0 +547,116.0 +548,109.4 +549,103.3 +550,97.5 +551,92.7 +552,85.8 +553,97.9 +554,110.6 +555,109.7 +556,104.3 +557,99.6 +558,89.8 +559,100.1 +560,98.0 +561,103.8 +562,102.9 +563,104.8 +564,102.3 +565,90.4 +566,91.4 +567,100.5 +568,98.2 +569,107.1 +570,103.4 +571,93.7 +572,96.6 +573,89.5 +574,96.6 +575,110.5 +576,111.3 +577,104.7 +578,97.9 +579,98.0 +580,98.4 +581,99.5 +582,105.5 +583,107.6 +584,102.9 +585,108.1 +586,92.6 +587,94.3 +588,100.0 +589,107.4 +590,108.0 +591,101.4 +592,110.6 +593,98.5 +594,90.8 +595,103.5 +596,105.4 +597,106.4 +598,103.9 +599,102.8 +600,106.7 +601,95.0 +602,100.3 +603,104.5 +604,113.3 +605,105.9 +606,108.4 +607,99.8 +608,99.6 +609,111.2 +610,113.2 +611,113.8 +612,113.5 +613,97.5 +614,102.8 +615,107.1 +616,111.2 +617,118.8 +618,117.7 +619,119.1 +620,113.3 +621,104.1 +622,114.6 +623,114.4 +624,121.4 +625,118.4 +626,114.5 +627,110.7 +628,118.2 +629,98.8 +630,107.8 +631,114.1 +632,116.3 +633,118.0 +634,118.4 +635,114.2 +636,113.0 +637,116.6 +638,123.4 +639,122.4 +640,118.9 +641,117.2 +642,114.0 +643,110.6 +644,122.5 +645,126.0 +646,132.6 +647,124.3 +648,113.8 +649,108.9 +650,122.6 +651,120.0 +652,134.1 +653,125.3 +654,119.3 +655,126.1 +656,124.0 +657,123.0 +658,128.1 +659,130.4 +660,134.8 +661,137.1 +662,124.2 +663,119.2 +664,128.9 +665,127.3 +666,128.5 +667,137.3 +668,137.2 +669,125.9 +670,129.6 +671,124.9 +672,128.5 +673,141.3 +674,136.1 +675,141.3 +676,135.1 +677,120.7 +678,124.5 +679,135.9 +680,138.9 +681,141.7 +682,138.1 +683,141.2 +684,131.8 +685,133.4 +686,140.5 +687,143.0 +688,136.5 +689,144.9 +690,134.1 +691,134.8 +692,134.5 +693,139.7 +694,152.8 +695,154.0 +696,142.8 +697,139.6 +698,142.2 +699,138.1 +700,142.5 +701,147.3 +702,149.8 +703,148.0 +704,144.8 +705,136.7 +706,138.3 +707,140.3 +708,154.3 +709,151.2 +710,154.0 +711,150.8 +712,144.3 +713,143.1 +714,139.1 +715,153.5 +716,152.5 +717,150.8 +718,144.3 +719,143.5 +720,145.8 +721,152.3 +722,152.0 +723,152.7 +724,155.2 +725,147.1 +726,135.1 +727,141.9 +728,149.9 +729,151.8 +730,153.5 +731,152.7 +732,151.4 +733,144.9 +734,151.3 +735,151.0 +736,158.1 +737,168.8 +738,155.1 +739,151.2 +740,147.8 +741,146.3 +742,150.4 +743,160.6 +744,157.9 +745,147.1 +746,140.2 +747,147.6 +748,148.0 +749,149.4 +750,161.1 +751,159.0 +752,152.2 +753,145.9 +754,151.7 +755,149.8 +756,150.6 +757,152.7 +758,158.8 +759,152.1 +760,150.9 +761,143.3 +762,149.9 +763,152.6 +764,159.8 +765,157.2 +766,153.9 +767,146.0 +768,139.9 +769,149.4 +770,148.0 +771,156.4 +772,155.5 +773,149.4 +774,141.6 +775,141.3 +776,136.0 +777,153.2 +778,159.4 +779,151.5 +780,152.8 +781,150.8 +782,150.7 +783,145.8 +784,150.0 +785,156.2 +786,158.3 +787,143.9 +788,146.5 +789,141.5 +790,132.9 +791,154.7 +792,151.8 +793,147.6 +794,144.5 +795,139.7 +796,145.5 +797,141.2 +798,142.6 +799,153.0 +800,151.2 +801,146.4 +802,145.8 +803,137.9 +804,132.9 +805,153.1 +806,142.6 +807,148.9 +808,147.5 +809,136.0 +810,139.7 +811,136.9 +812,144.7 +813,143.4 +814,145.3 +815,140.3 +816,141.6 +817,129.2 +818,132.8 +819,143.2 +820,148.0 +821,141.4 +822,142.0 +823,145.0 +824,132.0 +825,134.0 +826,134.3 +827,135.5 +828,142.0 +829,140.2 +830,134.9 +831,130.8 +832,125.0 +833,133.9 +834,136.4 +835,142.7 +836,131.2 +837,130.1 +838,133.4 +839,123.4 +840,129.7 +841,136.6 +842,141.7 +843,127.7 +844,125.7 +845,120.9 +846,120.2 +847,122.5 +848,131.9 +849,129.6 +850,122.6 +851,123.3 +852,112.9 +853,118.4 +854,127.0 +855,127.3 +856,130.9 +857,128.6 +858,114.4 +859,116.5 +860,105.8 +861,119.2 +862,122.6 +863,121.9 +864,123.7 +865,118.9 +866,114.3 +867,111.4 +868,117.9 +869,123.8 +870,121.2 +871,119.8 +872,115.9 +873,107.6 +874,114.1 +875,105.3 +876,116.5 +877,119.9 +878,119.4 +879,112.4 +880,110.7 +881,106.4 +882,113.4 +883,111.1 +884,119.1 +885,116.9 +886,108.9 +887,107.6 +888,111.2 +889,111.4 +890,119.9 +891,120.4 +892,114.9 +893,108.5 +894,104.4 +895,106.5 +896,105.0 +897,114.7 +898,117.6 +899,112.3 +900,111.9 +901,101.2 +902,101.3 +903,107.2 +904,122.3 +905,112.3 +906,99.8 +907,109.6 +908,101.0 +909,93.7 +910,100.5 +911,113.7 +912,106.1 +913,112.2 +914,100.6 +915,98.4 +916,98.0 +917,106.3 +918,113.0 +919,114.0 +920,108.7 +921,91.4 +922,94.4 +923,101.5 +924,104.0 +925,102.8 +926,112.3 +927,111.0 +928,105.1 +929,96.7 +930,102.9 +931,103.6 +932,113.5 +933,107.9 +934,105.3 +935,105.9 +936,101.0 +937,103.2 +938,106.4 +939,103.8 +940,113.7 +941,106.1 +942,104.6 +943,97.8 +944,104.1 +945,105.1 +946,112.9 +947,111.1 +948,98.6 +949,102.2 +950,100.5 +951,102.2 +952,102.3 +953,107.1 +954,106.6 +955,107.6 +956,103.7 +957,101.7 +958,102.1 +959,109.9 +960,99.3 +961,113.7 +962,103.9 +963,105.0 +964,96.8 +965,96.8 +966,109.2 +967,118.4 +968,111.1 +969,106.2 +970,109.1 +971,104.2 +972,103.4 +973,113.2 +974,115.3 +975,116.1 +976,115.9 +977,106.4 +978,100.6 +979,105.9 +980,111.1 +981,116.9 +982,126.6 +983,114.2 +984,113.2 +985,108.4 +986,110.9 +987,120.2 +988,118.8 +989,121.6 +990,117.1 +991,107.6 +992,111.7 +993,116.4 +994,117.9 +995,117.8 +996,131.3 +997,125.9 +998,124.3 +999,118.2 +1000,110.6 +1001,125.2 +1002,134.2 +1003,118.4 +1004,116.0 +1005,122.6 +1006,109.5 +1007,115.3 +1008,113.8 +1009,128.7 +1010,129.2 +1011,120.9 +1012,122.2 +1013,118.0 +1014,134.1 +1015,130.2 +1016,132.0 +1017,127.7 +1018,130.5 +1019,133.3 +1020,117.2 +1021,125.1 +1022,134.5 +1023,144.1 +1024,133.6 +1025,134.9 +1026,126.8 +1027,132.8 +1028,131.1 +1029,128.3 +1030,132.7 +1031,147.6 +1032,134.6 +1033,135.4 +1034,128.7 +1035,127.1 +1036,131.0 +1037,137.6 +1038,135.9 +1039,145.7 +1040,133.2 +1041,123.9 +1042,131.1 +1043,137.3 +1044,144.1 +1045,144.7 +1046,144.6 +1047,133.0 +1048,136.6 +1049,138.0 +1050,136.5 +1051,146.3 +1052,145.8 +1053,146.5 +1054,137.5 +1055,143.4 +1056,139.8 +1057,147.1 +1058,152.0 +1059,151.9 +1060,145.4 +1061,149.5 +1062,129.8 +1063,135.1 +1064,139.7 +1065,150.9 +1066,147.6 +1067,149.5 +1068,145.9 +1069,143.9 +1070,146.1 +1071,148.4 +1072,159.7 +1073,154.1 +1074,148.1 +1075,144.1 +1076,136.2 +1077,148.2 +1078,151.7 +1079,155.5 +1080,151.8 +1081,154.4 +1082,143.1 +1083,142.3 +1084,146.4 +1085,153.5 +1086,149.8 +1087,162.0 +1088,153.5 +1089,153.2 +1090,148.0 +1091,145.4 +1092,146.5 +1093,161.4 +1094,160.2 +1095,154.2 +1096,149.1 +1097,144.1 +1098,150.3 +1099,160.3 +1100,159.3 +1101,163.4 +1102,160.9 +1103,158.1 +1104,145.8 +1105,150.6 +1106,162.5 +1107,159.5 +1108,166.5 +1109,163.3 +1110,155.8 +1111,154.7 +1112,147.5 +1113,153.2 +1114,160.5 +1115,154.2 +1116,152.7 +1117,156.6 +1118,151.4 +1119,146.4 +1120,150.6 +1121,162.5 +1122,162.3 +1123,161.2 +1124,158.7 +1125,146.3 +1126,154.8 +1127,160.5 +1128,156.8 +1129,167.5 +1130,165.3 +1131,155.4 +1132,147.4 +1133,152.9 +1134,153.7 +1135,162.4 +1136,155.5 +1137,148.5 +1138,155.6 +1139,151.6 +1140,151.9 +1141,151.7 +1142,164.5 +1143,165.5 +1144,153.5 +1145,148.5 +1146,140.9 +1147,146.2 +1148,147.1 +1149,156.1 +1150,162.6 +1151,156.9 +1152,144.2 +1153,145.4 +1154,146.3 +1155,147.3 +1156,155.3 +1157,152.3 +1158,153.2 +1159,142.7 +1160,146.9 +1161,142.6 +1162,147.1 +1163,150.6 +1164,154.3 +1165,150.7 +1166,144.7 +1167,140.0 +1168,149.5 +1169,142.5 +1170,152.4 +1171,155.6 +1172,148.4 +1173,135.9 +1174,140.2 +1175,142.5 +1176,145.4 +1177,153.7 +1178,144.8 +1179,153.0 +1180,145.6 +1181,138.2 +1182,137.2 +1183,144.4 +1184,143.9 +1185,142.6 +1186,141.4 +1187,142.0 +1188,136.8 +1189,133.0 +1190,142.6 +1191,145.2 +1192,136.8 +1193,147.0 +1194,133.1 +1195,126.8 +1196,134.5 +1197,136.1 +1198,136.6 +1199,141.4 +1200,135.4 +1201,135.3 +1202,125.6 +1203,138.3 +1204,129.5 +1205,141.6 +1206,138.0 +1207,133.1 +1208,133.7 +1209,130.4 +1210,122.8 +1211,132.5 +1212,133.9 +1213,136.2 +1214,127.8 +1215,120.3 +1216,123.8 +1217,127.0 +1218,122.9 +1219,135.4 +1220,129.6 +1221,130.9 +1222,127.3 +1223,117.2 +1224,118.8 +1225,117.1 +1226,123.2 +1227,134.0 +1228,131.3 +1229,122.1 +1230,116.6 +1231,119.7 +1232,122.5 +1233,128.7 +1234,131.2 +1235,120.3 +1236,125.0 +1237,117.9 +1238,110.1 +1239,115.3 +1240,118.5 +1241,128.9 +1242,123.1 +1243,112.5 +1244,110.9 +1245,113.6 +1246,114.7 +1247,125.4 +1248,116.9 +1249,115.5 +1250,110.1 +1251,110.2 +1252,109.3 +1253,114.8 +1254,119.8 +1255,124.1 +1256,114.0 +1257,109.5 +1258,105.1 +1259,107.7 +1260,112.6 +1261,113.6 +1262,114.2 +1263,111.5 +1264,111.5 +1265,106.0 +1266,111.0 +1267,116.5 +1268,117.4 +1269,120.0 +1270,118.0 +1271,105.2 +1272,106.0 +1273,104.6 +1274,119.2 +1275,110.1 +1276,110.2 +1277,118.7 +1278,115.6 +1279,95.9 +1280,107.8 +1281,113.4 +1282,112.1 +1283,119.3 +1284,114.1 +1285,103.3 +1286,101.2 +1287,100.6 +1288,105.3 +1289,107.0 +1290,114.5 +1291,110.4 +1292,103.3 +1293,106.1 +1294,102.8 +1295,106.3 +1296,114.8 +1297,113.4 +1298,111.0 +1299,107.8 +1300,100.3 +1301,104.8 +1302,105.1 +1303,111.3 +1304,114.8 +1305,112.5 +1306,105.9 +1307,100.5 +1308,103.7 +1309,111.5 +1310,121.3 +1311,117.2 +1312,105.6 +1313,105.7 +1314,101.7 +1315,105.2 +1316,112.0 +1317,114.0 +1318,117.2 +1319,112.2 +1320,109.0 +1321,107.4 +1322,106.6 +1323,109.9 +1324,119.5 +1325,111.8 +1326,115.7 +1327,110.8 +1328,106.5 +1329,106.2 +1330,105.8 +1331,113.8 +1332,112.6 +1333,120.3 +1334,110.8 +1335,106.6 +1336,105.2 +1337,110.3 +1338,117.9 +1339,118.1 +1340,123.2 +1341,113.2 +1342,107.1 +1343,113.0 +1344,119.8 +1345,120.5 +1346,125.4 +1347,119.1 +1348,111.7 +1349,111.0 +1350,105.0 +1351,117.3 +1352,120.0 +1353,121.4 +1354,121.0 +1355,114.0 +1356,112.4 +1357,116.2 +1358,118.7 +1359,136.3 +1360,127.9 +1361,116.3 +1362,122.1 +1363,115.9 +1364,128.9 +1365,126.5 +1366,127.8 +1367,132.2 +1368,129.5 +1369,118.3 +1370,122.3 +1371,120.3 +1372,126.8 +1373,130.5 +1374,131.4 +1375,135.7 +1376,123.6 +1377,123.0 +1378,128.3 +1379,132.8 +1380,131.6 +1381,135.7 +1382,133.6 +1383,127.9 +1384,118.5 +1385,126.5 +1386,136.2 +1387,136.8 +1388,134.4 +1389,128.3 +1390,134.8 +1391,119.6 +1392,130.9 +1393,132.7 +1394,135.9 +1395,144.3 +1396,139.9 +1397,139.1 +1398,137.4 +1399,134.4 +1400,145.0 +1401,136.6 +1402,141.1 +1403,147.4 +1404,135.8 +1405,137.9 +1406,141.2 +1407,138.5 +1408,144.4 +1409,148.8 +1410,144.4 +1411,137.9 +1412,131.4 +1413,137.0 +1414,143.8 +1415,145.9 +1416,149.6 +1417,149.6 +1418,142.8 +1419,143.4 +1420,139.5 +1421,134.3 +1422,153.3 +1423,152.3 +1424,154.1 +1425,146.0 +1426,142.2 +1427,148.5 +1428,149.2 +1429,150.2 +1430,158.7 +1431,151.4 +1432,151.3 +1433,142.7 +1434,144.5 +1435,158.6 +1436,159.1 +1437,158.8 +1438,153.6 +1439,145.4 +1440,149.3 +1441,154.4 +1442,155.1 +1443,159.3 +1444,156.1 +1445,156.7 +1446,153.9 +1447,149.2 +1448,153.9 +1449,158.3 +1450,158.5 +1451,163.5 +1452,165.0 +1453,159.6 +1454,153.6 +1455,148.4 +1456,157.1 +1457,169.2 +1458,161.1 +1459,157.5 +1460,159.2 +1461,150.6 +1462,148.6 +1463,163.8 +1464,156.1 +1465,160.8 +1466,163.0 +1467,149.5 +1468,155.4 +1469,154.2 +1470,163.4 +1471,167.8 +1472,162.5 +1473,160.6 +1474,161.8 +1475,155.2 +1476,157.1 +1477,158.4 +1478,158.7 +1479,159.3 +1480,162.6 +1481,157.9 +1482,154.4 +1483,156.0 +1484,160.2 +1485,165.6 +1486,166.4 +1487,159.0 +1488,153.2 +1489,155.6 +1490,165.8 +1491,159.0 +1492,157.0 +1493,158.0 +1494,163.5 +1495,160.7 +1496,161.3 +1497,160.8 +1498,160.1 +1499,164.3 +1500,156.2 +1501,156.3 +1502,157.2 +1503,146.0 +1504,151.8 +1505,151.6 +1506,164.1 +1507,167.1 +1508,154.6 +1509,148.4 +1510,151.1 +1511,153.1 +1512,153.6 +1513,166.5 +1514,166.4 +1515,162.4 +1516,158.0 +1517,148.8 +1518,153.6 +1519,154.1 +1520,161.1 +1521,164.4 +1522,158.1 +1523,152.9 +1524,150.4 +1525,152.9 +1526,156.7 +1527,151.7 +1528,162.7 +1529,156.4 +1530,147.1 +1531,142.1 +1532,146.1 +1533,159.1 +1534,152.3 +1535,156.8 +1536,149.4 +1537,146.8 +1538,146.6 +1539,139.8 +1540,153.2 +1541,159.3 +1542,151.6 +1543,157.0 +1544,143.0 +1545,134.4 +1546,136.6 +1547,145.6 +1548,155.7 +1549,149.6 +1550,147.6 +1551,141.3 +1552,134.9 +1553,143.1 +1554,140.6 +1555,143.3 +1556,145.8 +1557,147.6 +1558,137.5 +1559,127.8 +1560,134.6 +1561,142.0 +1562,147.8 +1563,140.0 +1564,144.4 +1565,135.8 +1566,130.0 +1567,132.9 +1568,136.3 +1569,143.0 +1570,140.9 +1571,142.9 +1572,125.7 +1573,127.8 +1574,129.8 +1575,140.4 +1576,135.1 +1577,152.1 +1578,137.2 +1579,129.8 +1580,127.7 +1581,134.2 +1582,128.0 +1583,136.6 +1584,137.0 +1585,130.5 +1586,126.7 +1587,121.0 +1588,121.8 +1589,123.3 +1590,130.2 +1591,133.7 +1592,132.1 +1593,130.0 +1594,126.7 +1595,121.9 +1596,131.2 +1597,129.8 +1598,129.6 +1599,129.2 +1600,122.2 +1601,117.3 +1602,116.7 +1603,122.1 +1604,125.8 +1605,130.0 +1606,120.7 +1607,116.7 +1608,119.2 +1609,109.7 +1610,119.8 +1611,124.5 +1612,128.1 +1613,122.1 +1614,117.9 +1615,108.0 +1616,111.7 +1617,125.3 +1618,120.5 +1619,121.6 +1620,129.1 +1621,110.6 +1622,111.3 +1623,117.4 +1624,122.7 +1625,123.5 +1626,125.0 +1627,128.2 +1628,113.7 +1629,104.7 +1630,103.5 +1631,118.3 +1632,123.3 +1633,118.9 +1634,115.5 +1635,111.7 +1636,104.4 +1637,106.1 +1638,115.6 +1639,130.5 +1640,114.7 +1641,110.7 +1642,111.3 +1643,105.3 +1644,106.9 +1645,113.6 +1646,112.1 +1647,118.8 +1648,119.1 +1649,110.0 +1650,106.7 +1651,106.9 +1652,105.7 +1653,112.1 +1654,123.5 +1655,114.3 +1656,112.1 +1657,105.6 +1658,104.0 +1659,114.3 +1660,114.2 +1661,117.7 +1662,118.4 +1663,104.0 +1664,108.7 +1665,109.8 +1666,121.2 +1667,115.7 +1668,114.6 +1669,114.0 +1670,109.4 +1671,105.3 +1672,105.9 +1673,107.9 +1674,112.5 +1675,114.0 +1676,113.6 +1677,107.9 +1678,102.2 +1679,109.7 +1680,123.7 +1681,115.8 +1682,122.9 +1683,118.0 +1684,106.9 +1685,107.9 +1686,107.7 +1687,104.0 +1688,116.9 +1689,120.7 +1690,119.3 +1691,110.2 +1692,106.9 +1693,113.6 +1694,119.9 +1695,120.4 +1696,123.0 +1697,115.9 +1698,114.4 +1699,114.7 +1700,112.0 +1701,112.4 +1702,128.6 +1703,127.1 +1704,119.7 +1705,116.6 +1706,114.7 +1707,114.8 +1708,118.8 +1709,123.9 +1710,120.5 +1711,120.4 +1712,125.8 +1713,116.8 +1714,116.1 +1715,121.8 +1716,127.5 +1717,130.1 +1718,124.4 +1719,122.3 +1720,120.2 +1721,100.9 +1722,122.8 +1723,126.7 +1724,136.1 +1725,131.8 +1726,122.8 +1727,113.3 +1728,117.2 +1729,133.9 +1730,130.3 +1731,140.3 +1732,126.6 +1733,126.9 +1734,121.0 +1735,127.9 +1736,135.2 +1737,138.4 +1738,139.8 +1739,137.1 +1740,125.2 +1741,119.2 +1742,124.9 +1743,133.9 +1744,139.9 +1745,139.4 +1746,135.9 +1747,141.0 +1748,131.6 +1749,133.7 +1750,131.2 +1751,141.6 +1752,140.9 +1753,137.7 +1754,141.1 +1755,134.7 +1756,138.3 +1757,147.2 +1758,146.5 +1759,154.2 +1760,146.0 +1761,140.4 +1762,134.4 +1763,130.7 +1764,142.0 +1765,148.7 +1766,146.2 +1767,146.6 +1768,133.7 +1769,144.4 +1770,140.7 +1771,139.5 +1772,151.9 +1773,152.3 +1774,150.1 +1775,147.9 +1776,139.0 +1777,138.7 +1778,143.3 +1779,150.7 +1780,145.9 +1781,162.2 +1782,146.9 +1783,143.2 +1784,147.0 +1785,149.5 +1786,158.0 +1787,152.7 +1788,151.0 +1789,152.6 +1790,138.5 +1791,149.1 +1792,151.0 +1793,157.2 +1794,164.7 +1795,164.7 +1796,154.7 +1797,154.1 +1798,148.1 +1799,156.5 +1800,156.4 +1801,155.5 +1802,155.7 +1803,150.7 +1804,147.7 +1805,146.0 +1806,146.9 +1807,161.7 +1808,170.7 +1809,160.0 +1810,159.3 +1811,152.1 +1812,154.2 +1813,163.0 +1814,159.4 +1815,164.9 +1816,159.6 +1817,155.3 +1818,153.8 +1819,151.8 +1820,162.4 +1821,163.6 +1822,165.7 +1823,163.4 +1824,162.2 +1825,158.1 +1826,153.4 +1827,165.8 +1828,168.7 +1829,171.9 +1830,164.1 +1831,161.0 +1832,155.6 +1833,151.4 +1834,167.1 +1835,172.6 +1836,166.7 +1837,163.7 +1838,155.6 +1839,159.7 +1840,161.7 +1841,160.6 +1842,171.5 +1843,168.0 +1844,161.5 +1845,164.0 +1846,162.4 +1847,159.2 +1848,160.7 +1849,168.6 +1850,165.4 +1851,167.4 +1852,159.6 +1853,168.4 +1854,156.7 +1855,166.9 +1856,171.6 +1857,172.7 +1858,167.4 +1859,159.0 +1860,157.7 +1861,164.1 +1862,164.6 +1863,168.1 +1864,170.7 +1865,160.2 +1866,158.0 +1867,148.1 +1868,162.0 +1869,153.3 +1870,158.5 +1871,173.9 +1872,163.0 +1873,167.3 +1874,153.1 +1875,158.5 +1876,159.9 +1877,161.4 +1878,170.4 +1879,161.7 +1880,163.7 +1881,155.1 +1882,155.7 +1883,168.5 +1884,167.0 +1885,159.1 +1886,159.7 +1887,155.6 +1888,149.6 +1889,154.8 +1890,156.3 +1891,160.5 +1892,153.6 +1893,166.6 +1894,148.4 +1895,149.8 +1896,152.6 +1897,156.3 +1898,163.3 +1899,164.1 +1900,157.2 +1901,154.9 +1902,147.2 +1903,152.9 +1904,157.2 +1905,157.4 +1906,159.7 +1907,146.9 +1908,157.3 +1909,145.8 +1910,156.3 +1911,149.8 +1912,150.7 +1913,159.7 +1914,155.7 +1915,146.4 +1916,139.1 +1917,144.0 +1918,148.1 +1919,149.9 +1920,149.3 +1921,150.4 +1922,151.0 +1923,138.1 +1924,137.6 +1925,139.3 +1926,152.6 +1927,150.5 +1928,144.9 +1929,146.1 +1930,141.4 +1931,135.8 +1932,150.7 +1933,141.2 +1934,145.5 +1935,147.4 +1936,143.2 +1937,133.0 +1938,137.8 +1939,144.2 +1940,144.8 +1941,148.8 +1942,141.8 +1943,141.1 +1944,138.8 +1945,131.2 +1946,135.9 +1947,150.9 +1948,144.1 +1949,142.8 +1950,125.8 +1951,133.0 +1952,129.2 +1953,128.7 +1954,137.0 +1955,138.8 +1956,134.8 +1957,132.9 +1958,128.4 +1959,126.7 +1960,132.6 +1961,133.1 +1962,133.6 +1963,127.4 +1964,123.3 +1965,122.2 +1966,124.8 +1967,130.6 +1968,134.1 +1969,127.0 +1970,131.7 +1971,125.7 +1972,120.0 +1973,120.0 +1974,129.2 +1975,127.2 +1976,136.6 +1977,126.7 +1978,122.0 +1979,121.3 +1980,120.9 +1981,119.2 +1982,126.5 +1983,125.3 +1984,117.9 +1985,121.8 +1986,104.5 +1987,119.5 +1988,120.6 +1989,130.4 +1990,124.3 +1991,123.2 +1992,113.3 +1993,108.6 +1994,113.8 +1995,117.9 +1996,123.9 +1997,121.4 +1998,122.8 +1999,121.9 +2000,112.1 +2001,113.5 +2002,114.3 +2003,121.5 +2004,124.1 +2005,121.9 +2006,113.3 +2007,111.9 +2008,113.6 +2009,115.8 +2010,121.5 +2011,123.8 +2012,120.0 +2013,114.5 +2014,110.3 +2015,117.5 +2016,116.7 +2017,121.2 +2018,124.5 +2019,121.7 +2020,105.5 +2021,103.6 +2022,107.3 +2023,109.6 +2024,115.3 +2025,121.6 +2026,126.2 +2027,104.5 +2028,101.3 +2029,109.9 +2030,113.2 +2031,120.9 +2032,117.8 +2033,121.9 +2034,116.0 +2035,107.8 +2036,107.4 +2037,113.3 +2038,118.8 +2039,116.8 +2040,115.8 +2041,112.5 +2042,116.1 +2043,112.1 +2044,124.4 +2045,120.6 +2046,131.9 +2047,115.2 +2048,113.8 +2049,108.6 +2050,110.8 +2051,113.3 +2052,124.0 +2053,123.4 +2054,127.7 +2055,111.5 +2056,106.4 +2057,110.9 +2058,116.5 +2059,119.1 +2060,123.1 +2061,120.9 +2062,121.2 +2063,111.9 +2064,117.5 +2065,113.7 +2066,122.4 +2067,126.5 +2068,122.0 +2069,122.3 +2070,112.8 +2071,112.5 +2072,122.2 +2073,125.2 +2074,132.5 +2075,128.3 +2076,118.2 +2077,118.2 +2078,123.0 +2079,126.3 +2080,128.7 +2081,135.4 +2082,127.2 +2083,128.3 +2084,123.0 +2085,119.8 +2086,128.4 +2087,132.6 +2088,136.2 +2089,129.7 +2090,121.1 +2091,120.4 +2092,114.9 +2093,124.2 +2094,139.3 +2095,129.6 +2096,132.1 +2097,127.0 +2098,125.3 +2099,124.4 +2100,137.3 +2101,132.7 +2102,140.9 +2103,125.2 +2104,137.5 +2105,130.4 +2106,133.1 +2107,138.6 +2108,140.9 +2109,152.3 +2110,143.4 +2111,125.1 +2112,133.7 +2113,140.3 +2114,141.6 +2115,144.0 +2116,143.3 +2117,136.2 +2118,146.0 +2119,131.3 +2120,136.0 +2121,145.5 +2122,146.7 +2123,151.6 +2124,140.7 +2125,144.6 +2126,139.9 +2127,141.8 +2128,144.3 +2129,148.5 +2130,152.7 +2131,147.1 +2132,141.7 +2133,140.6 +2134,145.5 +2135,151.1 +2136,150.5 +2137,153.0 +2138,146.1 +2139,140.5 +2140,141.9 +2141,146.3 +2142,152.2 +2143,158.6 +2144,162.8 +2145,148.2 +2146,145.3 +2147,151.2 +2148,158.2 +2149,153.4 +2150,159.7 +2151,155.5 +2152,168.3 +2153,156.4 +2154,153.9 +2155,152.7 +2156,159.4 +2157,165.7 +2158,161.4 +2159,158.3 +2160,160.4 +2161,151.3 +2162,152.8 +2163,160.4 +2164,164.9 +2165,164.7 +2166,159.4 +2167,155.7 +2168,150.2 +2169,149.3 +2170,157.2 +2171,160.7 +2172,168.5 +2173,159.8 +2174,156.3 +2175,155.8 +2176,155.7 +2177,166.1 +2178,172.9 +2179,173.5 +2180,167.6 +2181,159.3 +2182,153.9 +2183,159.6 +2184,166.4 +2185,176.7 +2186,167.3 +2187,171.2 +2188,154.0 +2189,164.8 +2190,161.0 +2191,161.8 +2192,170.3 +2193,171.1 +2194,163.7 +2195,166.8 +2196,160.1 +2197,164.2 +2198,161.7 +2199,167.8 +2200,171.1 +2201,168.2 +2202,167.2 +2203,162.9 +2204,168.2 +2205,163.5 +2206,170.5 +2207,171.3 +2208,170.9 +2209,164.6 +2210,151.8 +2211,162.9 +2212,163.9 +2213,179.1 +2214,171.3 +2215,169.6 +2216,158.3 +2217,165.3 +2218,162.6 +2219,172.0 +2220,172.5 +2221,179.4 +2222,169.3 +2223,162.1 +2224,154.4 +2225,165.5 +2226,169.2 +2227,173.1 +2228,174.3 +2229,163.2 +2230,168.5 +2231,161.7 +2232,166.3 +2233,173.7 +2234,158.9 +2235,168.2 +2236,167.5 +2237,166.3 +2238,155.9 +2239,159.3 +2240,163.7 +2241,164.5 +2242,168.1 +2243,167.1 +2244,158.2 +2245,162.3 +2246,155.1 +2247,161.1 +2248,173.5 +2249,171.9 +2250,166.6 +2251,155.7 +2252,162.6 +2253,152.8 +2254,155.8 +2255,168.1 +2256,164.6 +2257,155.1 +2258,163.7 +2259,148.0 +2260,156.4 +2261,156.6 +2262,166.9 +2263,163.6 +2264,157.1 +2265,156.3 +2266,151.6 +2267,148.9 +2268,157.3 +2269,166.1 +2270,156.0 +2271,153.9 +2272,155.0 +2273,142.0 +2274,154.0 +2275,159.2 +2276,152.1 +2277,163.3 +2278,147.5 +2279,149.1 +2280,142.3 +2281,149.7 +2282,154.2 +2283,151.7 +2284,157.5 +2285,152.7 +2286,148.3 +2287,137.4 +2288,148.7 +2289,147.4 +2290,151.8 +2291,152.2 +2292,153.7 +2293,140.9 +2294,140.8 +2295,146.2 +2296,142.3 +2297,158.4 +2298,150.0 +2299,153.3 +2300,137.7 +2301,139.0 +2302,140.8 +2303,144.3 +2304,150.1 +2305,152.4 +2306,146.9 +2307,141.7 +2308,135.8 +2309,135.5 +2310,138.6 +2311,140.7 +2312,145.3 +2313,133.2 +2314,135.3 +2315,137.2 +2316,134.0 +2317,136.8 +2318,146.1 +2319,139.9 +2320,135.6 +2321,127.4 +2322,128.8 +2323,125.0 +2324,135.3 +2325,136.8 +2326,138.4 +2327,136.7 +2328,125.9 +2329,122.1 +2330,123.5 +2331,135.7 +2332,131.1 +2333,137.7 +2334,127.4 +2335,136.3 +2336,123.3 +2337,125.0 +2338,131.3 +2339,131.5 +2340,128.8 +2341,132.0 +2342,126.7 +2343,118.5 +2344,124.1 +2345,124.9 +2346,131.0 +2347,135.4 +2348,124.1 +2349,120.0 +2350,126.9 +2351,118.2 +2352,122.7 +2353,128.4 +2354,136.8 +2355,123.1 +2356,118.5 +2357,118.5 +2358,117.0 +2359,117.1 +2360,124.1 +2361,136.1 +2362,126.1 +2363,118.7 +2364,119.1 +2365,115.7 +2366,122.6 +2367,131.3 +2368,127.5 +2369,115.7 +2370,123.2 +2371,115.0 +2372,115.4 +2373,125.3 +2374,123.8 +2375,129.1 +2376,123.9 +2377,118.0 +2378,117.2 +2379,120.3 +2380,115.9 +2381,121.0 +2382,124.2 +2383,124.7 +2384,117.7 +2385,111.2 +2386,119.5 +2387,117.8 +2388,127.3 +2389,124.1 +2390,116.6 +2391,116.0 +2392,117.8 +2393,107.3 +2394,120.5 +2395,121.8 +2396,124.5 +2397,117.2 +2398,116.5 +2399,102.7 +2400,114.8 +2401,122.1 +2402,128.1 +2403,123.1 +2404,119.3 +2405,116.4 +2406,117.5 +2407,113.2 +2408,119.4 +2409,135.6 +2410,122.5 +2411,132.1 +2412,124.8 +2413,116.5 +2414,122.5 +2415,120.5 +2416,124.9 +2417,128.2 +2418,125.5 +2419,118.6 +2420,114.4 +2421,112.1 +2422,125.3 +2423,123.2 +2424,129.3 +2425,127.0 +2426,123.8 +2427,117.7 +2428,119.2 +2429,122.9 +2430,119.8 +2431,127.8 +2432,129.0 +2433,123.6 +2434,116.7 +2435,115.8 +2436,124.5 +2437,123.4 +2438,129.1 +2439,130.2 +2440,117.9 +2441,126.4 +2442,126.8 +2443,127.3 +2444,130.9 +2445,137.6 +2446,131.4 +2447,129.7 +2448,122.5 +2449,120.0 +2450,126.5 +2451,131.6 +2452,135.2 +2453,131.0 +2454,126.8 +2455,131.1 +2456,119.5 +2457,128.3 +2458,135.3 +2459,144.4 +2460,134.1 +2461,125.2 +2462,135.2 +2463,132.8 +2464,133.9 +2465,139.9 +2466,148.3 +2467,139.5 +2468,126.2 +2469,136.0 +2470,127.9 +2471,138.3 +2472,144.0 +2473,142.3 +2474,142.9 +2475,131.7 +2476,137.7 +2477,136.5 +2478,141.5 +2479,142.6 +2480,146.5 +2481,146.7 +2482,147.2 +2483,137.4 +2484,139.2 +2485,142.4 +2486,143.8 +2487,156.1 +2488,141.5 +2489,131.0 +2490,140.7 +2491,140.9 +2492,148.1 +2493,152.2 +2494,154.8 +2495,160.1 +2496,151.1 +2497,136.6 +2498,144.5 +2499,151.0 +2500,151.1 +2501,160.2 +2502,155.5 +2503,153.6 +2504,150.4 +2505,150.3 +2506,152.0 +2507,153.9 +2508,169.3 +2509,158.9 +2510,157.3 +2511,150.7 +2512,150.2 +2513,154.3 +2514,164.9 +2515,173.3 +2516,161.4 +2517,161.1 +2518,162.4 +2519,155.1 +2520,161.8 +2521,158.0 +2522,168.0 +2523,164.6 +2524,160.8 +2525,150.4 +2526,153.8 +2527,165.1 +2528,168.2 +2529,172.0 +2530,161.6 +2531,161.8 +2532,160.4 +2533,162.4 +2534,157.4 +2535,176.6 +2536,169.8 +2537,173.2 +2538,160.9 +2539,157.3 +2540,162.1 +2541,164.2 +2542,172.5 +2543,175.5 +2544,173.1 +2545,161.9 +2546,164.6 +2547,159.6 +2548,163.3 +2549,172.5 +2550,172.8 +2551,165.7 +2552,160.5 +2553,156.3 +2554,158.8 +2555,173.9 +2556,174.2 +2557,174.1 +2558,171.9 +2559,163.2 +2560,163.9 +2561,164.7 +2562,171.1 +2563,175.5 +2564,182.1 +2565,175.5 +2566,170.1 +2567,171.0 +2568,158.6 +2569,172.5 +2570,175.1 +2571,168.8 +2572,169.6 +2573,169.0 +2574,164.8 +2575,171.7 +2576,159.8 +2577,175.4 +2578,172.8 +2579,175.0 +2580,163.9 +2581,171.3 +2582,166.3 +2583,171.4 +2584,175.4 +2585,180.4 +2586,177.6 +2587,161.2 +2588,163.9 +2589,172.7 +2590,170.8 +2591,170.1 +2592,177.9 +2593,173.9 +2594,166.5 +2595,166.7 +2596,165.9 +2597,166.8 +2598,168.7 +2599,182.0 +2600,169.6 +2601,164.3 +2602,162.0 +2603,167.7 +2604,169.3 +2605,172.8 +2606,170.3 +2607,165.3 +2608,166.4 +2609,151.4 +2610,163.4 +2611,166.1 +2612,177.7 +2613,169.9 +2614,168.4 +2615,162.1 +2616,161.8 +2617,154.0 +2618,164.9 +2619,167.8 +2620,163.9 +2621,167.0 +2622,165.8 +2623,149.8 +2624,162.0 +2625,164.2 +2626,168.2 +2627,167.5 +2628,168.2 +2629,164.6 +2630,155.7 +2631,160.2 +2632,162.8 +2633,169.6 +2634,169.2 +2635,158.0 +2636,159.6 +2637,157.6 +2638,155.3 +2639,156.4 +2640,163.3 +2641,157.7 +2642,161.0 +2643,164.7 +2644,148.8 +2645,152.3 +2646,152.7 +2647,158.9 +2648,160.6 +2649,157.1 +2650,148.8 +2651,143.2 +2652,151.1 +2653,151.5 +2654,153.8 +2655,167.4 +2656,157.6 +2657,151.9 +2658,143.0 +2659,145.2 +2660,152.2 +2661,155.0 +2662,149.2 +2663,153.2 +2664,141.5 +2665,145.6 +2666,142.4 +2667,144.7 +2668,147.5 +2669,156.6 +2670,148.6 +2671,146.9 +2672,142.3 +2673,142.0 +2674,140.1 +2675,136.2 +2676,155.7 +2677,155.1 +2678,134.6 +2679,132.2 +2680,128.7 +2681,136.0 +2682,150.5 +2683,148.3 +2684,143.7 +2685,130.4 +2686,132.9 +2687,125.9 +2688,138.7 +2689,132.3 +2690,145.7 +2691,141.8 +2692,134.7 +2693,132.8 +2694,124.1 +2695,139.0 +2696,139.6 +2697,148.0 +2698,137.8 +2699,142.6 +2700,124.9 +2701,135.6 +2702,135.0 +2703,135.2 +2704,138.3 +2705,132.6 +2706,127.2 +2707,126.1 +2708,131.9 +2709,132.4 +2710,131.9 +2711,134.1 +2712,127.8 +2713,123.0 +2714,129.4 +2715,128.0 +2716,123.9 +2717,138.3 +2718,139.6 +2719,134.5 +2720,122.4 +2721,124.6 +2722,121.4 +2723,127.6 +2724,133.4 +2725,132.0 +2726,128.7 +2727,122.1 +2728,118.3 +2729,113.3 +2730,126.7 +2731,132.2 +2732,128.1 +2733,132.5 +2734,124.6 +2735,121.1 +2736,128.5 +2737,125.3 +2738,126.4 +2739,129.2 +2740,124.9 +2741,113.4 +2742,111.5 +2743,124.7 +2744,123.6 +2745,130.0 +2746,126.5 +2747,122.7 +2748,123.5 +2749,115.8 +2750,122.2 +2751,121.8 +2752,128.8 +2753,134.0 +2754,124.2 +2755,116.8 +2756,115.2 +2757,117.5 +2758,120.6 +2759,128.1 +2760,131.5 +2761,124.2 +2762,120.9 +2763,116.3 +2764,120.0 +2765,122.4 +2766,124.5 +2767,123.2 +2768,127.3 +2769,124.5 +2770,119.1 +2771,118.6 +2772,127.2 +2773,125.6 +2774,137.9 +2775,133.3 +2776,120.7 +2777,108.7 +2778,125.2 +2779,122.1 +2780,125.1 +2781,128.4 +2782,123.1 +2783,126.9 +2784,119.3 +2785,117.8 +2786,128.3 +2787,123.7 +2788,124.1 +2789,128.1 +2790,121.8 +2791,121.3 +2792,118.2 +2793,129.5 +2794,125.0 +2795,133.7 +2796,127.1 +2797,129.1 +2798,122.4 +2799,120.2 +2800,121.1 +2801,133.5 +2802,129.3 +2803,133.3 +2804,124.2 +2805,128.2 +2806,124.3 +2807,132.0 +2808,139.2 +2809,135.5 +2810,132.5 +2811,130.5 +2812,128.0 +2813,127.3 +2814,127.3 +2815,148.7 +2816,141.1 +2817,130.6 +2818,131.2 +2819,132.6 +2820,129.7 +2821,144.1 +2822,140.0 +2823,143.6 +2824,142.4 +2825,129.7 +2826,136.1 +2827,124.6 +2828,143.8 +2829,144.2 +2830,145.7 +2831,137.7 +2832,136.2 +2833,134.3 +2834,136.8 +2835,137.4 +2836,145.2 +2837,149.6 +2838,143.4 +2839,145.3 +2840,138.7 +2841,133.8 +2842,137.8 +2843,153.6 +2844,153.0 +2845,151.2 +2846,146.2 +2847,147.5 +2848,139.6 +2849,142.1 +2850,156.0 +2851,156.8 +2852,157.6 +2853,145.1 +2854,145.2 +2855,143.2 +2856,147.4 +2857,155.8 +2858,161.8 +2859,151.2 +2860,144.2 +2861,139.8 +2862,145.7 +2863,156.1 +2864,160.1 +2865,155.9 +2866,158.7 +2867,155.2 +2868,144.4 +2869,157.8 +2870,161.2 +2871,166.6 +2872,167.8 +2873,161.6 +2874,158.1 +2875,151.1 +2876,155.2 +2877,160.4 +2878,166.9 +2879,172.4 +2880,153.6 +2881,153.5 +2882,161.1 +2883,153.7 +2884,163.2 +2885,171.2 +2886,172.2 +2887,165.8 +2888,162.5 +2889,153.9 +2890,157.1 +2891,160.3 +2892,166.7 +2893,174.7 +2894,169.9 +2895,162.0 +2896,167.2 +2897,156.2 +2898,165.1 +2899,173.6 +2900,173.8 +2901,175.1 +2902,164.4 +2903,163.6 +2904,160.6 +2905,168.2 +2906,180.2 +2907,174.9 +2908,167.7 +2909,169.7 +2910,165.0 +2911,169.0 +2912,172.9 +2913,174.5 +2914,177.9 +2915,176.0 +2916,162.6 +2917,171.1 +2918,166.5 +2919,173.4 +2920,181.9 +2921,177.7 +2922,170.4 +2923,167.4 +2924,164.2 +2925,171.0 +2926,172.5 +2927,174.2 +2928,170.8 +2929,176.6 +2930,173.5 +2931,166.7 +2932,171.1 +2933,174.3 +2934,174.0 +2935,178.4 +2936,178.9 +2937,169.6 +2938,163.6 +2939,167.0 +2940,180.1 +2941,178.2 +2942,183.7 +2943,176.3 +2944,168.0 +2945,166.8 +2946,161.1 +2947,173.5 +2948,182.3 +2949,178.3 +2950,182.4 +2951,167.9 +2952,174.1 +2953,176.9 +2954,169.0 +2955,176.5 +2956,183.7 +2957,176.4 +2958,179.1 +2959,171.3 +2960,163.8 +2961,171.4 +2962,177.0 +2963,180.2 +2964,175.2 +2965,168.5 +2966,168.0 +2967,170.2 +2968,165.6 +2969,183.4 +2970,180.0 +2971,170.4 +2972,169.5 +2973,170.4 +2974,168.6 +2975,166.5 +2976,169.6 +2977,175.2 +2978,173.3 +2979,175.0 +2980,160.1 +2981,159.0 +2982,173.3 +2983,171.5 +2984,173.9 +2985,166.8 +2986,156.4 +2987,163.8 +2988,163.4 +2989,165.3 +2990,167.2 +2991,170.9 +2992,166.7 +2993,155.6 +2994,156.7 +2995,158.8 +2996,169.4 +2997,164.6 +2998,176.5 +2999,166.0 +3000,160.6 +3001,149.9 +3002,153.7 +3003,157.7 +3004,169.5 +3005,173.0 +3006,160.9 +3007,159.8 +3008,159.8 +3009,156.5 +3010,151.6 +3011,162.2 +3012,169.0 +3013,155.4 +3014,163.4 +3015,151.0 +3016,156.4 +3017,156.1 +3018,164.1 +3019,157.3 +3020,148.5 +3021,152.0 +3022,152.8 +3023,151.6 +3024,159.8 +3025,159.4 +3026,157.8 +3027,152.1 +3028,149.9 +3029,146.0 +3030,151.0 +3031,156.8 +3032,155.9 +3033,162.6 +3034,148.6 +3035,145.5 +3036,145.3 +3037,143.4 +3038,145.3 +3039,153.5 +3040,148.7 +3041,152.6 +3042,144.6 +3043,144.6 +3044,135.3 +3045,149.6 +3046,149.6 +3047,151.9 +3048,143.8 +3049,140.5 +3050,138.1 +3051,139.6 +3052,140.8 +3053,141.6 +3054,149.2 +3055,150.6 +3056,131.9 +3057,138.2 +3058,131.3 +3059,140.5 +3060,146.4 +3061,141.2 +3062,138.0 +3063,135.9 +3064,127.2 +3065,134.4 +3066,132.3 +3067,142.9 +3068,145.1 +3069,139.5 +3070,131.0 +3071,131.6 +3072,125.2 +3073,141.0 +3074,139.4 +3075,136.4 +3076,134.4 +3077,126.8 +3078,124.0 +3079,138.6 +3080,134.1 +3081,129.8 +3082,137.3 +3083,133.2 +3084,129.7 +3085,123.5 +3086,128.9 +3087,142.3 +3088,132.0 +3089,131.4 +3090,136.3 +3091,127.1 +3092,122.6 +3093,130.8 +3094,130.7 +3095,133.7 +3096,138.0 +3097,131.5 +3098,124.2 +3099,121.1 +3100,123.8 +3101,135.8 +3102,131.5 +3103,132.2 +3104,130.4 +3105,126.0 +3106,121.0 +3107,116.8 +3108,125.3 +3109,139.7 +3110,127.6 +3111,123.9 +3112,129.5 +3113,117.2 +3114,128.6 +3115,124.3 +3116,134.3 +3117,130.2 +3118,125.0 +3119,126.8 +3120,127.0 +3121,121.2 +3122,126.1 +3123,128.7 +3124,134.7 +3125,131.1 +3126,121.3 +3127,119.9 +3128,122.8 +3129,129.9 +3130,131.3 +3131,134.6 +3132,133.9 +3133,124.4 +3134,118.3 +3135,113.2 +3136,126.4 +3137,134.1 +3138,121.8 +3139,131.8 +3140,123.3 +3141,114.7 +3142,127.5 +3143,127.4 +3144,133.6 +3145,137.0 +3146,131.1 +3147,124.4 +3148,124.3 +3149,123.3 +3150,120.3 +3151,138.6 +3152,135.8 +3153,133.3 +3154,119.4 +3155,124.6 +3156,118.0 +3157,133.0 +3158,145.4 +3159,140.0 +3160,126.2 +3161,130.2 +3162,129.9 +3163,130.2 +3164,134.5 +3165,134.5 +3166,135.1 +3167,135.2 +3168,129.9 +3169,127.1 +3170,125.4 +3171,136.6 +3172,146.5 +3173,147.5 +3174,143.2 +3175,130.3 +3176,128.5 +3177,128.2 +3178,137.3 +3179,143.9 +3180,150.2 +3181,139.2 +3182,137.4 +3183,127.3 +3184,137.6 +3185,142.0 +3186,141.2 +3187,138.3 +3188,137.3 +3189,141.6 +3190,130.4 +3191,140.2 +3192,143.8 +3193,151.2 +3194,152.5 +3195,146.0 +3196,137.7 +3197,144.5 +3198,144.1 +3199,147.4 +3200,141.9 +3201,150.4 +3202,149.5 +3203,145.1 +3204,138.1 +3205,143.6 +3206,150.2 +3207,156.5 +3208,155.7 +3209,152.0 +3210,146.8 +3211,144.8 +3212,149.9 +3213,147.6 +3214,156.3 +3215,156.3 +3216,162.6 +3217,152.7 +3218,148.0 +3219,146.5 +3220,150.8 +3221,155.1 +3222,157.6 +3223,163.5 +3224,148.5 +3225,159.0 +3226,152.9 +3227,156.1 +3228,168.8 +3229,165.7 +3230,164.8 +3231,154.0 +3232,147.9 +3233,158.6 +3234,159.6 +3235,168.9 +3236,162.5 +3237,170.6 +3238,158.7 +3239,161.4 +3240,156.5 +3241,170.4 +3242,176.2 +3243,170.2 +3244,167.2 +3245,162.4 +3246,157.5 +3247,167.7 +3248,163.9 +3249,178.6 +3250,175.3 +3251,171.1 +3252,166.9 +3253,164.5 +3254,165.0 +3255,166.4 +3256,171.4 +3257,168.1 +3258,164.8 +3259,169.4 +3260,164.5 +3261,166.8 +3262,175.0 +3263,174.8 +3264,173.5 +3265,167.8 +3266,172.5 +3267,159.6 +3268,162.6 +3269,177.7 +3270,174.5 +3271,183.5 +3272,173.8 +3273,173.8 +3274,169.8 +3275,166.8 +3276,172.2 +3277,185.3 +3278,177.5 +3279,177.0 +3280,176.1 +3281,171.5 +3282,169.9 +3283,177.1 +3284,174.8 +3285,176.0 +3286,180.5 +3287,175.7 +3288,167.6 +3289,169.5 +3290,183.0 +3291,178.9 +3292,174.4 +3293,185.8 +3294,183.4 +3295,173.4 +3296,169.3 +3297,171.0 +3298,172.0 +3299,183.8 +3300,182.0 +3301,176.4 +3302,176.1 +3303,171.7 +3304,178.1 +3305,185.1 +3306,172.5 +3307,179.5 +3308,176.2 +3309,168.3 +3310,175.7 +3311,180.2 +3312,181.9 +3313,183.2 +3314,173.5 +3315,177.7 +3316,170.1 +3317,178.7 +3318,184.3 +3319,181.7 +3320,184.6 +3321,179.2 +3322,172.8 +3323,166.1 +3324,166.2 +3325,176.1 +3326,176.4 +3327,185.2 +3328,181.0 +3329,171.1 +3330,176.8 +3331,176.8 +3332,173.3 +3333,186.0 +3334,186.1 +3335,182.7 +3336,168.6 +3337,173.0 +3338,168.7 +3339,183.6 +3340,171.5 +3341,174.1 +3342,175.6 +3343,170.5 +3344,162.5 +3345,173.2 +3346,168.8 +3347,173.2 +3348,180.8 +3349,169.8 +3350,164.1 +3351,168.7 +3352,161.5 +3353,172.7 +3354,173.6 +3355,175.6 +3356,175.3 +3357,162.5 +3358,158.2 +3359,165.5 +3360,159.2 +3361,178.9 +3362,176.6 +3363,174.5 +3364,164.6 +3365,156.2 +3366,159.3 +3367,168.9 +3368,178.8 +3369,171.0 +3370,163.3 +3371,163.0 +3372,150.8 +3373,160.9 +3374,167.0 +3375,164.1 +3376,172.8 +3377,169.9 +3378,158.5 +3379,155.5 +3380,156.4 +3381,155.3 +3382,169.2 +3383,166.3 +3384,162.6 +3385,158.6 +3386,156.2 +3387,157.6 +3388,163.8 +3389,168.0 +3390,157.1 +3391,158.7 +3392,153.5 +3393,154.7 +3394,152.4 +3395,154.7 +3396,156.6 +3397,157.4 +3398,153.9 +3399,146.1 +3400,139.4 +3401,150.6 +3402,161.5 +3403,152.0 +3404,151.4 +3405,154.0 +3406,148.5 +3407,137.8 +3408,144.2 +3409,145.1 +3410,154.1 +3411,156.2 +3412,152.3 +3413,139.0 +3414,147.0 +3415,143.5 +3416,146.7 +3417,151.0 +3418,152.8 +3419,141.5 +3420,141.4 +3421,143.5 +3422,142.6 +3423,137.9 +3424,140.9 +3425,148.5 +3426,138.3 +3427,142.2 +3428,137.7 +3429,137.4 +3430,145.5 +3431,147.6 +3432,140.5 +3433,143.0 +3434,141.2 +3435,128.3 +3436,130.9 +3437,138.4 +3438,134.8 +3439,148.7 +3440,144.5 +3441,130.7 +3442,130.0 +3443,131.2 +3444,141.8 +3445,142.8 +3446,147.3 +3447,139.6 +3448,135.5 +3449,135.3 +3450,133.3 +3451,134.1 +3452,136.4 +3453,140.0 +3454,135.5 +3455,131.1 +3456,127.2 +3457,130.3 +3458,127.1 +3459,138.4 +3460,139.2 +3461,140.6 +3462,130.6 +3463,130.4 +3464,124.7 +3465,129.2 +3466,137.3 +3467,137.2 +3468,133.4 +3469,121.4 +3470,125.8 +3471,124.5 +3472,135.1 +3473,140.5 +3474,138.5 +3475,136.0 +3476,127.3 +3477,130.7 +3478,125.5 +3479,135.6 +3480,132.2 +3481,138.4 +3482,129.2 +3483,126.1 +3484,119.6 +3485,120.8 +3486,129.1 +3487,128.9 +3488,138.8 +3489,134.2 +3490,127.1 +3491,116.1 +3492,127.1 +3493,126.7 +3494,128.3 +3495,135.2 +3496,136.5 +3497,129.0 +3498,120.7 +3499,116.9 +3500,128.2 +3501,141.5 +3502,134.3 +3503,129.5 +3504,124.9 +3505,125.8 +3506,124.8 +3507,126.7 +3508,134.2 +3509,138.0 +3510,128.2 +3511,116.6 +3512,129.0 +3513,128.1 +3514,131.7 +3515,135.9 +3516,138.3 +3517,135.6 +3518,132.6 +3519,121.6 +3520,128.3 +3521,131.4 +3522,137.4 +3523,139.8 +3524,147.3 +3525,137.7 +3526,127.5 +3527,133.8 +3528,140.1 +3529,140.4 +3530,140.8 +3531,132.8 +3532,136.2 +3533,132.7 +3534,129.5 +3535,136.2 +3536,147.6 +3537,148.8 +3538,135.8 +3539,139.1 +3540,135.9 +3541,139.7 +3542,145.1 +3543,144.1 +3544,149.7 +3545,135.5 +3546,141.0 +3547,139.4 +3548,134.4 +3549,144.7 +3550,151.1 +3551,149.3 +3552,144.6 +3553,140.5 +3554,136.9 +3555,146.1 +3556,144.7 +3557,152.8 +3558,150.2 +3559,150.6 +3560,140.8 +3561,137.5 +3562,147.0 +3563,149.4 +3564,149.3 +3565,156.1 +3566,154.3 +3567,146.0 +3568,141.1 +3569,147.8 +3570,155.8 +3571,151.9 +3572,154.7 +3573,161.8 +3574,151.3 +3575,147.7 +3576,154.9 +3577,160.6 +3578,157.6 +3579,162.6 +3580,158.6 +3581,155.0 +3582,152.8 +3583,148.1 +3584,157.7 +3585,157.3 +3586,160.1 +3587,154.3 +3588,157.6 +3589,156.0 +3590,153.5 +3591,153.8 +3592,168.3 +3593,160.3 +3594,166.0 +3595,166.3 +3596,160.7 +3597,147.8 +3598,167.1 +3599,169.8 +3600,168.0 +3601,165.9 +3602,158.8 +3603,163.5 +3604,155.2 +3605,174.7 +3606,175.5 +3607,176.5 +3608,171.5 +3609,162.3 +3610,160.2 +3611,161.1 +3612,170.9 +3613,168.8 +3614,173.4 +3615,172.1 +3616,168.7 +3617,162.2 +3618,169.7 +3619,171.9 +3620,180.4 +3621,177.0 +3622,176.6 +3623,162.1 +3624,173.0 +3625,172.4 +3626,176.7 +3627,180.5 +3628,178.6 +3629,174.8 +3630,176.3 +3631,172.4 +3632,167.0 +3633,178.5 +3634,181.7 +3635,188.7 +3636,182.1 +3637,168.9 +3638,174.3 +3639,174.1 +3640,182.2 +3641,187.9 +3642,181.3 +3643,193.6 +3644,184.1 +3645,182.2 +3646,174.1 +3647,178.1 +3648,184.3 +3649,185.3 +3650,186.0 +3651,175.9 +3652,170.3 +3653,179.1 +3654,180.4 +3655,187.4 +3656,185.6 +3657,190.1 +3658,181.1 +3659,177.2 +3660,176.6 +3661,191.4 +3662,185.1 +3663,184.2 +3664,186.8 +3665,174.4 +3666,176.7 +3667,170.6 +3668,171.0 +3669,183.8 +3670,184.0 +3671,184.0 +3672,177.6 +3673,177.5 +3674,174.9 +3675,184.1 +3676,192.1 +3677,189.7 +3678,185.0 +3679,184.2 +3680,178.8 +3681,176.0 +3682,186.1 +3683,184.1 +3684,189.3 +3685,180.4 +3686,180.6 +3687,164.7 +3688,176.6 +3689,181.4 +3690,186.5 +3691,188.1 +3692,191.6 +3693,173.4 +3694,173.5 +3695,171.7 +3696,177.4 +3697,183.5 +3698,193.5 +3699,182.3 +3700,184.4 +3701,178.4 +3702,168.9 +3703,181.6 +3704,181.4 +3705,179.2 +3706,182.3 +3707,172.6 +3708,173.1 +3709,176.8 +3710,178.0 +3711,179.0 +3712,179.3 +3713,180.6 +3714,176.7 +3715,166.6 +3716,176.2 +3717,171.8 +3718,180.2 +3719,180.7 +3720,173.2 +3721,175.0 +3722,170.9 +3723,172.0 +3724,176.4 +3725,177.6 +3726,180.7 +3727,171.1 +3728,172.2 +3729,161.2 +3730,168.0 +3731,171.7 +3732,168.4 +3733,177.6 +3734,174.8 +3735,168.6 +3736,155.7 +3737,161.9 +3738,165.7 +3739,177.8 +3740,175.4 +3741,165.4 +3742,162.6 +3743,159.3 +3744,161.0 +3745,168.5 +3746,164.5 +3747,173.4 +3748,167.9 +3749,159.6 +3750,151.3 +3751,162.6 +3752,155.7 +3753,165.7 +3754,166.7 +3755,155.1 +3756,161.6 +3757,157.1 +3758,157.4 +3759,163.9 +3760,168.1 +3761,168.3 +3762,157.3 +3763,149.5 +3764,149.3 +3765,152.6 +3766,154.0 +3767,154.6 +3768,167.4 +3769,158.0 +3770,151.8 +3771,148.6 +3772,145.2 +3773,149.8 +3774,154.3 +3775,154.3 +3776,155.5 +3777,149.1 +3778,146.5 +3779,145.5 +3780,151.7 +3781,151.7 +3782,152.2 +3783,150.9 +3784,144.7 +3785,145.2 +3786,147.1 +3787,152.2 +3788,148.9 +3789,151.9 +3790,148.7 +3791,146.5 +3792,144.8 +3793,148.5 +3794,139.5 +3795,148.8 +3796,153.4 +3797,144.9 +3798,150.1 +3799,137.4 +3800,137.2 +3801,150.7 +3802,149.4 +3803,145.3 +3804,146.7 +3805,141.8 +3806,135.5 +3807,142.5 +3808,139.2 +3809,141.0 +3810,143.5 +3811,143.8 +3812,132.0 +3813,136.4 +3814,133.8 +3815,131.1 +3816,139.5 +3817,141.3 +3818,147.6 +3819,131.8 +3820,134.6 +3821,133.8 +3822,140.9 +3823,143.6 +3824,131.4 +3825,137.7 +3826,132.2 +3827,131.4 +3828,126.7 +3829,132.9 +3830,137.9 +3831,139.9 +3832,132.3 +3833,135.5 +3834,127.2 +3835,130.4 +3836,134.8 +3837,136.5 +3838,147.4 +3839,138.7 +3840,132.8 +3841,135.5 +3842,130.9 +3843,133.0 +3844,134.2 +3845,130.9 +3846,135.1 +3847,131.6 +3848,131.4 +3849,130.2 +3850,131.2 +3851,142.2 +3852,142.8 +3853,134.5 +3854,131.2 +3855,129.9 +3856,130.8 +3857,132.5 +3858,138.0 +3859,140.1 +3860,135.5 +3861,132.0 +3862,124.6 +3863,124.3 +3864,129.6 +3865,137.5 +3866,137.8 +3867,143.7 +3868,131.7 +3869,131.9 +3870,130.6 +3871,133.0 +3872,138.3 +3873,137.5 +3874,141.0 +3875,130.3 +3876,133.3 +3877,128.0 +3878,134.8 +3879,143.0 +3880,138.8 +3881,136.5 +3882,133.4 +3883,127.9 +3884,130.0 +3885,142.0 +3886,136.8 +3887,143.9 +3888,134.7 +3889,139.5 +3890,131.4 +3891,127.3 +3892,140.9 +3893,143.8 +3894,146.4 +3895,142.2 +3896,133.0 +3897,139.4 +3898,123.4 +3899,142.8 +3900,150.9 +3901,152.9 +3902,147.4 +3903,137.0 +3904,141.7 +3905,134.4 +3906,146.7 +3907,154.2 +3908,150.8 +3909,145.8 +3910,143.2 +3911,140.4 +3912,143.8 +3913,142.8 +3914,151.4 +3915,152.3 +3916,152.7 +3917,150.1 +3918,145.1 +3919,143.3 +3920,154.2 +3921,156.7 +3922,151.0 +3923,153.4 +3924,155.7 +3925,147.0 +3926,141.3 +3927,155.7 +3928,158.1 +3929,159.9 +3930,152.8 +3931,148.8 +3932,146.9 +3933,146.5 +3934,154.1 +3935,153.8 +3936,161.4 +3937,158.4 +3938,157.3 +3939,154.5 +3940,146.5 +3941,158.5 +3942,170.0 +3943,169.0 +3944,164.1 +3945,162.1 +3946,159.3 +3947,161.1 +3948,167.9 +3949,167.6 +3950,165.9 +3951,168.8 +3952,164.1 +3953,156.5 +3954,160.3 +3955,161.1 +3956,173.9 +3957,170.6 +3958,170.1 +3959,170.0 +3960,162.4 +3961,158.1 +3962,169.4 +3963,173.9 +3964,168.6 +3965,170.4 +3966,167.6 +3967,157.0 +3968,164.6 +3969,164.5 +3970,179.8 +3971,171.7 +3972,176.8 +3973,164.0 +3974,169.9 +3975,171.8 +3976,172.7 +3977,177.6 +3978,183.0 +3979,176.2 +3980,167.0 +3981,174.4 +3982,170.8 +3983,179.5 +3984,179.5 +3985,181.9 +3986,186.2 +3987,169.0 +3988,171.2 +3989,173.5 +3990,179.2 +3991,182.4 +3992,186.2 +3993,184.8 +3994,180.1 +3995,173.7 +3996,168.0 +3997,178.3 +3998,176.4 +3999,185.9 +4000,184.4 +4001,178.9 +4002,181.7 +4003,181.6 +4004,175.3 +4005,180.5 +4006,180.2 +4007,190.5 +4008,181.8 +4009,169.2 +4010,178.4 +4011,182.1 +4012,194.3 +4013,189.1 +4014,190.3 +4015,188.2 +4016,174.2 +4017,185.6 +4018,189.4 +4019,185.4 +4020,186.5 +4021,193.7 +4022,189.2 +4023,177.1 +4024,175.8 +4025,189.2 +4026,194.3 +4027,189.1 +4028,182.7 +4029,187.0 +4030,185.2 +4031,175.2 +4032,181.3 +4033,185.9 +4034,185.5 +4035,190.0 +4036,186.2 +4037,185.1 +4038,173.9 +4039,186.3 +4040,188.7 +4041,191.2 +4042,191.3 +4043,182.6 +4044,176.7 +4045,180.6 +4046,185.6 +4047,188.1 +4048,188.1 +4049,188.0 +4050,176.7 +4051,184.2 +4052,179.4 +4053,179.1 +4054,188.2 +4055,188.0 +4056,190.3 +4057,184.7 +4058,176.6 +4059,183.4 +4060,180.8 +4061,180.9 +4062,188.3 +4063,190.5 +4064,177.1 +4065,175.7 +4066,178.0 +4067,189.4 +4068,187.9 +4069,192.5 +4070,182.4 +4071,178.7 +4072,169.6 +4073,173.8 +4074,175.0 +4075,182.8 +4076,183.1 +4077,176.6 +4078,177.1 +4079,167.1 +4080,177.7 +4081,169.7 +4082,179.1 +4083,183.4 +4084,179.8 +4085,172.9 +4086,168.2 +4087,171.3 +4088,171.7 +4089,180.9 +4090,181.1 +4091,173.6 +4092,172.2 +4093,173.6 +4094,174.4 +4095,167.3 +4096,179.6 +4097,185.3 +4098,181.6 +4099,171.3 +4100,165.7 +4101,165.8 +4102,172.1 +4103,181.2 +4104,177.0 +4105,182.5 +4106,164.2 +4107,167.1 +4108,162.3 +4109,171.6 +4110,179.1 +4111,170.2 +4112,170.0 +4113,167.0 +4114,158.9 +4115,162.4 +4116,170.5 +4117,172.0 +4118,166.1 +4119,161.5 +4120,158.6 +4121,156.1 +4122,157.9 +4123,164.6 +4124,155.6 +4125,167.0 +4126,162.0 +4127,154.0 +4128,153.9 +4129,153.5 +4130,157.2 +4131,161.3 +4132,169.7 +4133,168.1 +4134,159.1 +4135,148.4 +4136,152.8 +4137,154.4 +4138,159.4 +4139,161.1 +4140,161.7 +4141,151.2 +4142,149.2 +4143,145.2 +4144,153.4 +4145,159.6 +4146,162.7 +4147,154.2 +4148,145.5 +4149,142.9 +4150,150.4 +4151,151.2 +4152,163.9 +4153,158.0 +4154,156.0 +4155,152.7 +4156,138.9 +4157,147.5 +4158,150.1 +4159,154.3 +4160,154.4 +4161,152.4 +4162,138.7 +4163,137.9 +4164,137.6 +4165,148.5 +4166,154.9 +4167,150.4 +4168,148.0 +4169,150.7 +4170,138.6 +4171,132.1 +4172,149.4 +4173,151.7 +4174,149.2 +4175,151.6 +4176,135.1 +4177,139.6 +4178,142.9 +4179,136.6 +4180,153.9 +4181,147.1 +4182,142.5 +4183,134.1 +4184,141.2 +4185,136.3 +4186,141.6 +4187,145.2 +4188,140.7 +4189,143.3 +4190,139.6 +4191,132.9 +4192,131.3 +4193,136.7 +4194,144.8 +4195,139.4 +4196,142.8 +4197,140.3 +4198,129.0 +4199,136.9 +4200,137.9 +4201,144.3 +4202,143.2 +4203,139.4 +4204,141.2 +4205,134.0 +4206,134.9 +4207,137.1 +4208,146.4 +4209,150.8 +4210,143.0 +4211,134.7 +4212,129.2 +4213,125.5 +4214,142.6 +4215,138.0 +4216,145.4 +4217,140.9 +4218,142.1 +4219,132.2 +4220,139.7 +4221,139.6 +4222,147.9 +4223,141.1 +4224,142.7 +4225,130.9 +4226,138.4 +4227,136.3 +4228,142.3 +4229,138.4 +4230,141.6 +4231,136.6 +4232,141.3 +4233,131.4 +4234,134.7 +4235,136.8 +4236,143.4 +4237,136.9 +4238,142.0 +4239,131.5 +4240,137.2 +4241,134.2 +4242,142.3 +4243,139.7 +4244,145.7 +4245,136.8 +4246,142.8 +4247,131.6 +4248,139.4 +4249,139.1 +4250,139.1 +4251,142.5 +4252,138.7 +4253,132.9 +4254,137.7 +4255,134.3 +4256,140.0 +4257,152.3 +4258,155.6 +4259,144.0 +4260,142.3 +4261,139.4 +4262,139.8 +4263,143.5 +4264,157.2 +4265,145.7 +4266,148.8 +4267,150.9 +4268,139.3 +4269,136.5 +4270,140.2 +4271,149.1 +4272,152.2 +4273,148.1 +4274,145.0 +4275,138.8 +4276,139.8 +4277,144.2 +4278,147.8 +4279,154.3 +4280,150.6 +4281,149.2 +4282,146.0 +4283,147.4 +4284,146.2 +4285,152.8 +4286,153.8 +4287,160.6 +4288,149.0 +4289,149.2 +4290,144.7 +4291,153.6 +4292,156.9 +4293,162.7 +4294,160.4 +4295,156.9 +4296,149.4 +4297,155.6 +4298,163.7 +4299,166.7 +4300,169.0 +4301,162.9 +4302,156.1 +4303,153.8 +4304,157.0 +4305,160.9 +4306,166.3 +4307,168.5 +4308,162.5 +4309,158.3 +4310,159.0 +4311,158.7 +4312,158.9 +4313,174.1 +4314,164.2 +4315,169.4 +4316,160.7 +4317,155.7 +4318,154.9 +4319,169.1 +4320,176.0 +4321,170.9 +4322,169.7 +4323,170.8 +4324,162.5 +4325,172.6 +4326,162.6 +4327,167.0 +4328,176.0 +4329,173.8 +4330,169.3 +4331,161.4 +4332,162.0 +4333,170.9 +4334,177.2 +4335,182.0 +4336,176.1 +4337,169.2 +4338,162.4 +4339,169.3 +4340,172.5 +4341,178.0 +4342,176.1 +4343,184.3 +4344,180.8 +4345,174.4 +4346,174.1 +4347,182.2 +4348,174.9 +4349,180.2 +4350,180.7 +4351,184.8 +4352,177.2 +4353,180.8 +4354,172.1 +4355,194.6 +4356,190.9 +4357,185.3 +4358,178.9 +4359,174.3 +4360,181.6 +4361,183.3 +4362,183.3 +4363,185.1 +4364,184.9 +4365,173.0 +4366,178.0 +4367,176.5 +4368,190.6 +4369,186.2 +4370,196.2 +4371,187.7 +4372,182.9 +4373,182.1 +4374,180.0 +4375,194.5 +4376,186.3 +4377,192.2 +4378,187.3 +4379,185.8 +4380,177.8 +4381,179.2 +4382,190.1 +4383,193.2 +4384,196.2 +4385,192.7 +4386,188.8 +4387,178.6 +4388,182.0 +4389,190.4 +4390,193.1 +4391,187.8 +4392,186.9 +4393,182.9 +4394,175.7 +4395,186.6 +4396,188.8 +4397,195.9 +4398,190.8 +4399,197.6 +4400,193.1 +4401,185.0 +4402,183.3 +4403,186.0 +4404,197.0 +4405,199.5 +4406,191.0 +4407,186.8 +4408,182.1 +4409,186.0 +4410,190.0 +4411,192.8 +4412,192.8 +4413,196.2 +4414,181.9 +4415,176.7 +4416,177.7 +4417,187.6 +4418,188.7 +4419,200.1 +4420,190.5 +4421,182.4 +4422,180.4 +4423,185.9 +4424,191.9 +4425,192.0 +4426,190.3 +4427,188.2 +4428,183.8 +4429,179.1 +4430,181.2 +4431,183.5 +4432,183.7 +4433,189.6 +4434,188.4 +4435,174.1 +4436,177.4 +4437,185.8 +4438,179.0 +4439,185.4 +4440,198.9 +4441,184.8 +4442,184.7 +4443,177.3 +4444,184.2 +4445,176.6 +4446,178.7 +4447,189.8 +4448,184.8 +4449,183.9 +4450,174.9 +4451,174.7 +4452,178.4 +4453,184.7 +4454,184.8 +4455,172.7 +4456,178.8 +4457,173.7 +4458,169.6 +4459,181.2 +4460,181.5 +4461,172.8 +4462,180.2 +4463,175.1 +4464,168.5 +4465,174.9 +4466,182.1 +4467,179.5 +4468,182.7 +4469,180.0 +4470,174.0 +4471,163.8 +4472,167.9 +4473,176.0 +4474,170.0 +4475,177.0 +4476,171.7 +4477,169.3 +4478,162.8 +4479,169.5 +4480,163.6 +4481,168.0 +4482,176.4 +4483,173.1 +4484,164.7 +4485,161.8 +4486,159.2 +4487,169.0 +4488,175.9 +4489,170.6 +4490,168.7 +4491,154.8 +4492,161.1 +4493,158.3 +4494,163.7 +4495,165.7 +4496,176.2 +4497,166.0 +4498,165.6 +4499,161.2 +4500,158.2 +4501,156.7 +4502,158.1 +4503,165.7 +4504,159.9 +4505,154.9 +4506,154.0 +4507,152.8 +4508,155.2 +4509,159.1 +4510,169.1 +4511,165.0 +4512,155.1 +4513,153.5 +4514,162.3 +4515,158.7 +4516,163.4 +4517,158.3 +4518,160.8 +4519,149.2 +4520,146.5 +4521,149.6 +4522,146.3 +4523,158.9 +4524,150.7 +4525,149.2 +4526,148.7 +4527,144.5 +4528,146.9 +4529,155.3 +4530,160.7 +4531,148.5 +4532,152.2 +4533,147.0 +4534,143.6 +4535,140.7 +4536,148.7 +4537,155.9 +4538,149.0 +4539,147.7 +4540,150.4 +4541,140.6 +4542,150.8 +4543,146.3 +4544,147.9 +4545,145.5 +4546,152.4 +4547,141.7 +4548,127.5 +4549,138.5 +4550,139.6 +4551,151.2 +4552,145.5 +4553,143.4 +4554,136.3 +4555,129.4 +4556,144.2 +4557,139.2 +4558,144.1 +4559,145.2 +4560,142.5 +4561,136.9 +4562,136.0 +4563,138.7 +4564,148.6 +4565,147.0 +4566,150.8 +4567,140.4 +4568,140.9 +4569,136.0 +4570,137.7 +4571,145.7 +4572,145.3 +4573,138.8 +4574,146.1 +4575,138.5 +4576,130.4 +4577,136.0 +4578,141.3 +4579,153.3 +4580,145.1 +4581,144.6 +4582,140.6 +4583,134.7 +4584,138.0 +4585,141.2 +4586,143.5 +4587,151.8 +4588,142.6 +4589,145.5 +4590,126.6 +4591,144.3 +4592,135.0 +4593,146.8 +4594,147.8 +4595,143.8 +4596,137.2 +4597,133.4 +4598,137.8 +4599,144.4 +4600,139.9 +4601,149.2 +4602,145.4 +4603,142.2 +4604,138.8 +4605,141.5 +4606,144.9 +4607,143.7 +4608,142.9 +4609,145.9 +4610,146.2 +4611,135.6 +4612,143.9 +4613,147.8 +4614,145.7 +4615,154.3 +4616,148.4 +4617,145.9 +4618,141.0 +4619,136.3 +4620,143.9 +4621,147.2 +4622,148.4 +4623,151.4 +4624,141.2 +4625,145.6 +4626,138.9 +4627,147.8 +4628,154.0 +4629,162.6 +4630,150.8 +4631,146.9 +4632,145.0 +4633,140.4 +4634,154.4 +4635,165.6 +4636,161.6 +4637,152.7 +4638,144.0 +4639,138.4 +4640,144.2 +4641,157.3 +4642,156.3 +4643,152.0 +4644,160.0 +4645,152.5 +4646,151.4 +4647,152.0 +4648,150.3 +4649,169.2 +4650,160.8 +4651,152.7 +4652,162.1 +4653,147.9 +4654,145.8 +4655,158.3 +4656,166.1 +4657,170.4 +4658,164.5 +4659,153.9 +4660,155.5 +4661,150.9 +4662,163.9 +4663,164.4 +4664,165.6 +4665,163.2 +4666,157.7 +4667,160.0 +4668,154.7 +4669,160.9 +4670,167.7 +4671,177.3 +4672,160.9 +4673,166.9 +4674,158.6 +4675,159.5 +4676,169.0 +4677,165.7 +4678,175.4 +4679,174.9 +4680,170.0 +4681,163.3 +4682,156.9 +4683,172.5 +4684,175.9 +4685,171.8 +4686,168.3 +4687,163.6 +4688,162.4 +4689,169.2 +4690,173.9 +4691,176.0 +4692,179.8 +4693,181.2 +4694,168.8 +4695,167.2 +4696,174.7 +4697,170.3 +4698,181.0 +4699,182.3 +4700,181.4 +4701,179.3 +4702,170.6 +4703,181.2 +4704,180.4 +4705,185.7 +4706,186.7 +4707,182.4 +4708,183.1 +4709,174.1 +4710,177.4 +4711,185.6 +4712,180.7 +4713,184.5 +4714,185.2 +4715,179.2 +4716,174.6 +4717,173.7 +4718,182.1 +4719,187.2 +4720,182.6 +4721,189.8 +4722,185.4 +4723,181.1 +4724,186.0 +4725,179.3 +4726,191.3 +4727,188.9 +4728,185.2 +4729,188.2 +4730,186.0 +4731,185.9 +4732,186.9 +4733,196.0 +4734,198.0 +4735,190.9 +4736,189.8 +4737,183.3 +4738,183.1 +4739,189.5 +4740,196.4 +4741,192.5 +4742,202.5 +4743,187.1 +4744,185.4 +4745,183.0 +4746,193.8 +4747,196.3 +4748,185.5 +4749,191.7 +4750,189.8 +4751,186.4 +4752,185.7 +4753,180.2 +4754,197.1 +4755,197.7 +4756,197.4 +4757,186.6 +4758,185.3 +4759,188.7 +4760,184.2 +4761,200.3 +4762,201.6 +4763,194.4 +4764,190.5 +4765,192.6 +4766,185.4 +4767,188.1 +4768,199.9 +4769,199.4 +4770,190.1 +4771,189.5 +4772,193.3 +4773,186.2 +4774,190.8 +4775,201.6 +4776,198.4 +4777,194.6 +4778,195.6 +4779,185.6 +4780,187.1 +4781,197.2 +4782,199.5 +4783,199.1 +4784,196.6 +4785,190.9 +4786,191.1 +4787,184.6 +4788,197.4 +4789,202.3 +4790,190.4 +4791,197.9 +4792,184.5 +4793,187.5 +4794,193.6 +4795,188.1 +4796,200.2 +4797,202.2 +4798,189.0 +4799,188.5 +4800,186.5 +4801,188.3 +4802,193.2 +4803,192.0 +4804,197.7 +4805,195.5 +4806,187.1 +4807,182.1 +4808,179.9 +4809,185.8 +4810,192.1 +4811,188.9 +4812,191.9 +4813,186.5 +4814,178.4 +4815,185.8 +4816,190.9 +4817,192.0 +4818,189.9 +4819,188.3 +4820,184.9 +4821,167.6 +4822,176.7 +4823,176.5 +4824,181.5 +4825,185.4 +4826,185.7 +4827,174.0 +4828,178.5 +4829,166.6 +4830,182.7 +4831,190.4 +4832,184.0 +4833,175.3 +4834,178.8 +4835,165.7 +4836,172.0 +4837,166.1 +4838,178.0 +4839,185.4 +4840,181.2 +4841,166.1 +4842,169.4 +4843,176.2 +4844,172.6 +4845,187.4 +4846,182.0 +4847,179.0 +4848,165.3 +4849,172.6 +4850,167.8 +4851,166.1 +4852,171.7 +4853,179.6 +4854,172.4 +4855,169.6 +4856,160.7 +4857,158.4 +4858,170.5 +4859,174.8 +4860,166.1 +4861,171.7 +4862,167.4 +4863,150.6 +4864,162.7 +4865,163.0 +4866,168.7 +4867,173.0 +4868,168.5 +4869,157.5 +4870,155.5 +4871,160.8 +4872,166.5 +4873,168.5 +4874,168.8 +4875,164.0 +4876,160.9 +4877,156.3 +4878,154.0 +4879,156.5 +4880,166.9 +4881,164.6 +4882,160.9 +4883,154.1 +4884,155.4 +4885,150.2 +4886,157.0 +4887,158.4 +4888,170.7 +4889,155.8 +4890,151.9 +4891,153.3 +4892,150.2 +4893,152.0 +4894,156.8 +4895,155.4 +4896,150.7 +4897,156.4 +4898,149.6 +4899,148.6 +4900,155.0 +4901,155.2 +4902,153.9 +4903,158.7 +4904,149.1 +4905,142.0 +4906,146.1 +4907,150.4 +4908,159.1 +4909,146.6 +4910,158.8 +4911,142.2 +4912,148.5 +4913,144.2 +4914,152.2 +4915,158.8 +4916,153.5 +4917,147.2 +4918,143.6 +4919,139.5 +4920,139.1 +4921,148.6 +4922,145.9 +4923,148.1 +4924,147.1 +4925,149.9 +4926,138.7 +4927,144.5 +4928,150.9 +4929,151.5 +4930,152.8 +4931,143.1 +4932,137.2 +4933,135.9 +4934,131.1 +4935,146.8 +4936,148.2 +4937,156.4 +4938,147.3 +4939,151.4 +4940,138.8 +4941,136.9 +4942,143.4 +4943,147.6 +4944,150.9 +4945,146.2 +4946,144.6 +4947,140.5 +4948,133.8 +4949,143.9 +4950,155.5 +4951,150.9 +4952,146.8 +4953,140.8 +4954,140.8 +4955,136.0 +4956,149.3 +4957,152.0 +4958,146.7 +4959,148.6 +4960,145.3 +4961,140.9 +4962,141.2 +4963,145.4 +4964,145.4 +4965,148.4 +4966,149.5 +4967,154.1 +4968,142.3 +4969,135.9 +4970,145.3 +4971,152.6 +4972,153.5 +4973,154.0 +4974,148.9 +4975,142.1 +4976,141.4 +4977,155.4 +4978,158.7 +4979,152.9 +4980,147.1 +4981,144.3 +4982,138.9 +4983,142.9 +4984,151.7 +4985,152.3 +4986,151.8 +4987,155.9 +4988,145.7 +4989,139.1 +4990,151.2 +4991,146.3 +4992,161.6 +4993,159.3 +4994,156.5 +4995,155.1 +4996,146.8 +4997,147.8 +4998,148.7 +4999,160.2 +5000,166.8 diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-renamed/case.json b/agents/evals/fixtures/cases/area-basic-letsplot-renamed/case.json new file mode 100644 index 00000000000..3780b0de52a --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-renamed/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "area-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "x", + "column": "tag_nr" + }, + { + "role": "y", + "column": "energieverbrauch_mwh" + } + ], + "expected": "accepted", + "tags": [ + "area", + "renamed", + "synthetic", + "renamed-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, renamed)" +} diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-renamed/data.csv b/agents/evals/fixtures/cases/area-basic-letsplot-renamed/data.csv new file mode 100644 index 00000000000..75a7dc51523 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-renamed/data.csv @@ -0,0 +1,91 @@ +tag_nr,energieverbrauch_mwh +1,147.6 +2,138.8 +3,153.7 +4,138.5 +5,135.4 +6,139.8 +7,144.9 +8,149.1 +9,145.9 +10,149.8 +11,141.8 +12,136.3 +13,147.1 +14,146.4 +15,151.6 +16,150.7 +17,151.2 +18,148.5 +19,141.4 +20,148.1 +21,135.8 +22,155.9 +23,150.1 +24,141.6 +25,142.0 +26,144.0 +27,134.5 +28,148.7 +29,150.0 +30,155.0 +31,150.4 +32,147.5 +33,137.6 +34,136.6 +35,150.9 +36,153.8 +37,155.0 +38,147.6 +39,140.9 +40,133.6 +41,137.7 +42,145.8 +43,150.2 +44,151.6 +45,144.1 +46,138.2 +47,131.3 +48,132.4 +49,147.6 +50,139.6 +51,149.7 +52,148.4 +53,147.5 +54,136.8 +55,140.6 +56,143.1 +57,146.2 +58,145.5 +59,144.4 +60,137.4 +61,138.5 +62,135.2 +63,143.3 +64,150.2 +65,150.4 +66,136.3 +67,136.5 +68,133.9 +69,126.3 +70,136.2 +71,130.1 +72,141.8 +73,134.3 +74,135.7 +75,130.6 +76,124.6 +77,135.2 +78,137.1 +79,140.5 +80,131.2 +81,124.6 +82,122.6 +83,126.2 +84,137.7 +85,130.4 +86,135.6 +87,138.5 +88,131.9 +89,121.7 +90,130.0 diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-x10/case.json b/agents/evals/fixtures/cases/area-basic-letsplot-x10/case.json new file mode 100644 index 00000000000..ef99ed2397a --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "area-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "x", + "column": "Day" + }, + { + "role": "y", + "column": "Energy Use (MWh)" + } + ], + "expected": "accepted", + "tags": [ + "area", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, x10)" +} diff --git a/agents/evals/fixtures/cases/area-basic-letsplot-x10/data.csv b/agents/evals/fixtures/cases/area-basic-letsplot-x10/data.csv new file mode 100644 index 00000000000..f682e5e763f --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-letsplot-x10/data.csv @@ -0,0 +1,91 @@ +Day,Energy Use (MWh) +1,1475.9 +2,1388.3 +3,1537.1 +4,1385.2 +5,1353.8 +6,1398.0 +7,1449.3 +8,1491.3 +9,1458.8 +10,1497.6 +11,1417.8 +12,1362.7 +13,1470.7 +14,1463.8 +15,1515.9 +16,1507.2 +17,1512.1 +18,1485.4 +19,1413.7 +20,1480.8 +21,1357.7 +22,1559.1 +23,1500.7 +24,1415.7 +25,1419.6 +26,1439.9 +27,1344.7 +28,1487.3 +29,1500.4 +30,1550.3 +31,1503.8 +32,1474.9 +33,1376.2 +34,1365.8 +35,1509.0 +36,1538.3 +37,1549.6 +38,1475.8 +39,1409.0 +40,1336.1 +41,1377.1 +42,1457.7 +43,1501.7 +44,1515.7 +45,1441.2 +46,1381.8 +47,1313.3 +48,1324.1 +49,1476.4 +50,1396.2 +51,1497.0 +52,1483.5 +53,1475.3 +54,1367.9 +55,1406.2 +56,1431.5 +57,1461.8 +58,1455.4 +59,1443.5 +60,1374.5 +61,1385.0 +62,1352.2 +63,1432.8 +64,1502.3 +65,1504.2 +66,1363.2 +67,1364.6 +68,1339.4 +69,1263.1 +70,1361.9 +71,1300.9 +72,1417.7 +73,1343.3 +74,1357.0 +75,1306.4 +76,1246.5 +77,1352.1 +78,1370.6 +79,1404.8 +80,1311.9 +81,1246.4 +82,1226.3 +83,1262.0 +84,1377.2 +85,1303.9 +86,1356.0 +87,1384.5 +88,1319.0 +89,1217.3 +90,1300.0 diff --git a/agents/evals/fixtures/cases/area-basic-pygal-date/case.json b/agents/evals/fixtures/cases/area-basic-pygal-date/case.json new file mode 100644 index 00000000000..cf30e93bc98 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "area-basic", + "library": "pygal", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "x", + "column": "Date" + }, + { + "role": "y", + "column": "Energy Use (MWh)" + } + ], + "expected": "accepted", + "tags": [ + "area", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "date-axis" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, date)" +} diff --git a/agents/evals/fixtures/cases/area-basic-pygal-date/data.csv b/agents/evals/fixtures/cases/area-basic-pygal-date/data.csv new file mode 100644 index 00000000000..b289097bbd6 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-date/data.csv @@ -0,0 +1,91 @@ +Date,Metered On,Energy Use (MWh) +01.01.2026,2026-01-02,147.6 +02.01.2026,2026-01-03,138.8 +03.01.2026,2026-01-04,153.7 +04.01.2026,2026-01-05,138.5 +05.01.2026,2026-01-06,135.4 +06.01.2026,2026-01-07,139.8 +07.01.2026,2026-01-08,144.9 +08.01.2026,2026-01-09,149.1 +09.01.2026,2026-01-10,145.9 +10.01.2026,2026-01-11,149.8 +11.01.2026,2026-01-12,141.8 +12.01.2026,2026-01-13,136.3 +13.01.2026,2026-01-14,147.1 +14.01.2026,2026-01-15,146.4 +15.01.2026,2026-01-16,151.6 +16.01.2026,2026-01-17,150.7 +17.01.2026,2026-01-18,151.2 +18.01.2026,2026-01-19,148.5 +19.01.2026,2026-01-20,141.4 +20.01.2026,2026-01-21,148.1 +21.01.2026,2026-01-22,135.8 +22.01.2026,2026-01-23,155.9 +23.01.2026,2026-01-24,150.1 +24.01.2026,2026-01-25,141.6 +25.01.2026,2026-01-26,142.0 +26.01.2026,2026-01-27,144.0 +27.01.2026,2026-01-28,134.5 +28.01.2026,2026-01-29,148.7 +29.01.2026,2026-01-30,150.0 +30.01.2026,2026-01-31,155.0 +31.01.2026,2026-02-01,150.4 +01.02.2026,2026-02-02,147.5 +02.02.2026,2026-02-03,137.6 +03.02.2026,2026-02-04,136.6 +04.02.2026,2026-02-05,150.9 +05.02.2026,2026-02-06,153.8 +06.02.2026,2026-02-07,155.0 +07.02.2026,2026-02-08,147.6 +08.02.2026,2026-02-09,140.9 +09.02.2026,2026-02-10,133.6 +10.02.2026,2026-02-11,137.7 +11.02.2026,2026-02-12,145.8 +12.02.2026,2026-02-13,150.2 +13.02.2026,2026-02-14,151.6 +14.02.2026,2026-02-15,144.1 +15.02.2026,2026-02-16,138.2 +16.02.2026,2026-02-17,131.3 +17.02.2026,2026-02-18,132.4 +18.02.2026,2026-02-19,147.6 +19.02.2026,2026-02-20,139.6 +20.02.2026,2026-02-21,149.7 +21.02.2026,2026-02-22,148.4 +22.02.2026,2026-02-23,147.5 +23.02.2026,2026-02-24,136.8 +24.02.2026,2026-02-25,140.6 +25.02.2026,2026-02-26,143.1 +26.02.2026,2026-02-27,146.2 +27.02.2026,2026-02-28,145.5 +28.02.2026,2026-03-01,144.4 +01.03.2026,2026-03-02,137.4 +02.03.2026,2026-03-03,138.5 +03.03.2026,2026-03-04,135.2 +04.03.2026,2026-03-05,143.3 +05.03.2026,2026-03-06,150.2 +06.03.2026,2026-03-07,150.4 +07.03.2026,2026-03-08,136.3 +08.03.2026,2026-03-09,136.5 +09.03.2026,2026-03-10,133.9 +10.03.2026,2026-03-11,126.3 +11.03.2026,2026-03-12,136.2 +12.03.2026,2026-03-13,130.1 +13.03.2026,2026-03-14,141.8 +14.03.2026,2026-03-15,134.3 +15.03.2026,2026-03-16,135.7 +16.03.2026,2026-03-17,130.6 +17.03.2026,2026-03-18,124.6 +18.03.2026,2026-03-19,135.2 +19.03.2026,2026-03-20,137.1 +20.03.2026,2026-03-21,140.5 +21.03.2026,2026-03-22,131.2 +22.03.2026,2026-03-23,124.6 +23.03.2026,2026-03-24,122.6 +24.03.2026,2026-03-25,126.2 +25.03.2026,2026-03-26,137.7 +26.03.2026,2026-03-27,130.4 +27.03.2026,2026-03-28,135.6 +28.03.2026,2026-03-29,138.5 +29.03.2026,2026-03-30,131.9 +30.03.2026,2026-03-31,121.7 +31.03.2026,2026-04-01,130.0 diff --git a/agents/evals/fixtures/cases/area-basic-pygal-decimal-comma/case.json b/agents/evals/fixtures/cases/area-basic-pygal-decimal-comma/case.json new file mode 100644 index 00000000000..9581af0803a --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "area-basic", + "library": "pygal", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "x", + "column": "Day" + }, + { + "role": "y", + "column": "Energy Use (MWh)" + } + ], + "expected": "accepted", + "tags": [ + "area", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/area-basic-pygal-decimal-comma/data.csv b/agents/evals/fixtures/cases/area-basic-pygal-decimal-comma/data.csv new file mode 100644 index 00000000000..ea52040ab12 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-decimal-comma/data.csv @@ -0,0 +1,91 @@ +Day;Energy Use (MWh) +1;147,6 +2;138,8 +3;153,7 +4;138,5 +5;135,4 +6;139,8 +7;144,9 +8;149,1 +9;145,9 +10;149,8 +11;141,8 +12;136,3 +13;147,1 +14;146,4 +15;151,6 +16;150,7 +17;151,2 +18;148,5 +19;141,4 +20;148,1 +21;135,8 +22;155,9 +23;150,1 +24;141,6 +25;142,0 +26;144,0 +27;134,5 +28;148,7 +29;150,0 +30;155,0 +31;150,4 +32;147,5 +33;137,6 +34;136,6 +35;150,9 +36;153,8 +37;155,0 +38;147,6 +39;140,9 +40;133,6 +41;137,7 +42;145,8 +43;150,2 +44;151,6 +45;144,1 +46;138,2 +47;131,3 +48;132,4 +49;147,6 +50;139,6 +51;149,7 +52;148,4 +53;147,5 +54;136,8 +55;140,6 +56;143,1 +57;146,2 +58;145,5 +59;144,4 +60;137,4 +61;138,5 +62;135,2 +63;143,3 +64;150,2 +65;150,4 +66;136,3 +67;136,5 +68;133,9 +69;126,3 +70;136,2 +71;130,1 +72;141,8 +73;134,3 +74;135,7 +75;130,6 +76;124,6 +77;135,2 +78;137,1 +79;140,5 +80;131,2 +81;124,6 +82;122,6 +83;126,2 +84;137,7 +85;130,4 +86;135,6 +87;138,5 +88;131,9 +89;121,7 +90;130,0 diff --git a/agents/evals/fixtures/cases/area-basic-pygal-n12/case.json b/agents/evals/fixtures/cases/area-basic-pygal-n12/case.json new file mode 100644 index 00000000000..dc45b1ebce1 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "area-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "x", + "column": "Day" + }, + { + "role": "y", + "column": "Energy Use (MWh)" + } + ], + "expected": "accepted", + "tags": [ + "area", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, n12)" +} diff --git a/agents/evals/fixtures/cases/area-basic-pygal-n12/data.csv b/agents/evals/fixtures/cases/area-basic-pygal-n12/data.csv new file mode 100644 index 00000000000..8ab487a48c6 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-n12/data.csv @@ -0,0 +1,13 @@ +Day,Energy Use (MWh) +1,142.3 +2,152.9 +3,144.8 +4,140.8 +5,129.5 +6,140.3 +7,144.7 +8,146.5 +9,149.0 +10,149.5 +11,138.6 +12,137.0 diff --git a/agents/evals/fixtures/cases/area-basic-pygal-n5000/case.json b/agents/evals/fixtures/cases/area-basic-pygal-n5000/case.json new file mode 100644 index 00000000000..f16bfc8ec5e --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "area-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "x", + "column": "Day" + }, + { + "role": "y", + "column": "Energy Use (MWh)" + } + ], + "expected": "accepted", + "tags": [ + "area", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, n5000)" +} diff --git a/agents/evals/fixtures/cases/area-basic-pygal-n5000/data.csv b/agents/evals/fixtures/cases/area-basic-pygal-n5000/data.csv new file mode 100644 index 00000000000..a171cf4f1f5 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-n5000/data.csv @@ -0,0 +1,5001 @@ +Day,Energy Use (MWh) +1,152.6 +2,147.6 +3,144.7 +4,140.0 +5,144.0 +6,141.8 +7,144.8 +8,154.8 +9,149.4 +10,152.8 +11,140.1 +12,142.6 +13,142.4 +14,142.2 +15,153.5 +16,156.7 +17,149.7 +18,147.0 +19,137.9 +20,140.0 +21,139.1 +22,150.2 +23,152.2 +24,154.5 +25,135.6 +26,138.2 +27,137.3 +28,148.6 +29,152.6 +30,159.3 +31,141.9 +32,140.9 +33,140.8 +34,138.7 +35,143.4 +36,152.8 +37,145.7 +38,154.3 +39,139.3 +40,137.4 +41,132.4 +42,146.9 +43,152.0 +44,149.4 +45,144.8 +46,136.9 +47,133.2 +48,138.0 +49,139.9 +50,149.8 +51,153.6 +52,147.5 +53,138.2 +54,139.3 +55,131.3 +56,138.8 +57,147.5 +58,146.6 +59,146.3 +60,131.8 +61,127.7 +62,128.1 +63,133.0 +64,146.9 +65,142.9 +66,136.2 +67,141.6 +68,136.3 +69,131.3 +70,135.5 +71,146.2 +72,147.6 +73,131.5 +74,132.0 +75,133.6 +76,140.8 +77,134.7 +78,144.4 +79,141.9 +80,142.4 +81,132.6 +82,131.3 +83,120.3 +84,137.3 +85,134.9 +86,137.0 +87,133.6 +88,133.2 +89,126.3 +90,123.4 +91,130.8 +92,132.8 +93,135.3 +94,127.0 +95,119.4 +96,113.8 +97,119.9 +98,124.1 +99,133.5 +100,131.7 +101,128.0 +102,123.1 +103,115.6 +104,129.6 +105,127.2 +106,124.0 +107,120.3 +108,121.1 +109,119.0 +110,118.8 +111,123.7 +112,121.2 +113,119.7 +114,135.1 +115,129.3 +116,115.5 +117,110.9 +118,111.1 +119,124.9 +120,120.2 +121,125.5 +122,115.7 +123,116.4 +124,111.7 +125,111.0 +126,110.7 +127,120.1 +128,118.6 +129,116.6 +130,111.1 +131,113.1 +132,108.9 +133,115.4 +134,111.2 +135,118.9 +136,110.9 +137,112.9 +138,113.4 +139,102.0 +140,112.2 +141,112.4 +142,119.5 +143,114.6 +144,103.8 +145,97.5 +146,102.0 +147,109.7 +148,109.5 +149,116.6 +150,102.5 +151,98.8 +152,104.5 +153,98.1 +154,102.2 +155,105.3 +156,109.0 +157,98.7 +158,102.8 +159,94.4 +160,97.4 +161,100.7 +162,102.6 +163,105.0 +164,100.6 +165,100.4 +166,100.7 +167,95.3 +168,98.0 +169,108.0 +170,106.2 +171,101.3 +172,90.5 +173,98.7 +174,96.7 +175,89.9 +176,105.3 +177,101.9 +178,105.0 +179,99.9 +180,94.1 +181,96.1 +182,97.2 +183,98.9 +184,109.6 +185,96.8 +186,96.4 +187,87.0 +188,93.2 +189,94.5 +190,106.8 +191,104.8 +192,98.3 +193,96.4 +194,96.4 +195,94.4 +196,97.6 +197,103.2 +198,110.2 +199,106.6 +200,90.3 +201,89.8 +202,91.4 +203,90.4 +204,105.1 +205,103.8 +206,97.1 +207,96.0 +208,86.6 +209,95.5 +210,95.1 +211,107.4 +212,104.1 +213,93.9 +214,90.2 +215,94.4 +216,89.8 +217,99.4 +218,100.1 +219,104.9 +220,101.4 +221,102.9 +222,88.6 +223,96.5 +224,104.1 +225,101.3 +226,101.5 +227,102.6 +228,93.5 +229,93.1 +230,94.6 +231,102.1 +232,103.1 +233,103.9 +234,103.0 +235,97.1 +236,97.7 +237,95.8 +238,107.8 +239,111.7 +240,100.7 +241,105.3 +242,104.3 +243,92.3 +244,100.1 +245,108.2 +246,110.9 +247,110.3 +248,114.3 +249,103.2 +250,98.8 +251,98.3 +252,111.6 +253,112.7 +254,111.4 +255,109.5 +256,102.7 +257,103.3 +258,97.9 +259,100.7 +260,118.3 +261,115.8 +262,116.4 +263,104.5 +264,103.4 +265,102.5 +266,109.2 +267,121.9 +268,111.9 +269,109.4 +270,113.3 +271,100.6 +272,117.3 +273,124.1 +274,119.7 +275,118.7 +276,123.0 +277,107.8 +278,110.7 +279,116.2 +280,112.6 +281,130.4 +282,125.3 +283,119.1 +284,109.4 +285,112.4 +286,120.3 +287,116.0 +288,124.6 +289,125.2 +290,124.8 +291,116.0 +292,115.2 +293,124.1 +294,126.5 +295,128.0 +296,132.5 +297,128.3 +298,119.5 +299,119.6 +300,125.9 +301,125.3 +302,128.4 +303,127.0 +304,132.2 +305,129.4 +306,117.6 +307,123.6 +308,128.9 +309,125.5 +310,125.9 +311,132.8 +312,121.3 +313,123.5 +314,127.4 +315,125.8 +316,137.3 +317,140.5 +318,124.5 +319,136.1 +320,127.6 +321,121.3 +322,134.3 +323,139.2 +324,142.1 +325,139.1 +326,128.5 +327,129.3 +328,134.4 +329,137.3 +330,141.4 +331,145.2 +332,137.5 +333,140.4 +334,137.1 +335,139.6 +336,137.3 +337,140.9 +338,149.8 +339,143.6 +340,144.1 +341,134.9 +342,132.2 +343,144.0 +344,142.8 +345,149.0 +346,140.2 +347,144.2 +348,134.1 +349,141.6 +350,147.2 +351,149.1 +352,148.7 +353,144.3 +354,136.2 +355,136.4 +356,140.6 +357,146.0 +358,148.8 +359,150.8 +360,150.3 +361,138.7 +362,148.7 +363,153.3 +364,149.6 +365,153.6 +366,155.1 +367,156.4 +368,142.2 +369,142.2 +370,138.7 +371,151.6 +372,154.1 +373,158.2 +374,149.0 +375,147.7 +376,143.4 +377,146.2 +378,150.3 +379,153.6 +380,148.4 +381,150.2 +382,139.8 +383,143.4 +384,145.6 +385,144.6 +386,155.4 +387,155.1 +388,146.2 +389,144.3 +390,147.3 +391,145.5 +392,145.8 +393,145.3 +394,157.2 +395,154.7 +396,149.4 +397,141.0 +398,146.6 +399,147.0 +400,153.9 +401,149.4 +402,159.3 +403,143.0 +404,144.0 +405,145.4 +406,150.3 +407,146.8 +408,150.2 +409,152.8 +410,151.2 +411,143.1 +412,142.6 +413,147.9 +414,160.2 +415,150.6 +416,156.0 +417,147.7 +418,139.6 +419,143.4 +420,147.0 +421,149.3 +422,150.6 +423,143.8 +424,135.7 +425,142.0 +426,135.9 +427,142.7 +428,147.3 +429,149.8 +430,149.1 +431,141.0 +432,135.3 +433,135.3 +434,136.9 +435,145.1 +436,146.4 +437,146.7 +438,140.6 +439,144.1 +440,137.3 +441,142.8 +442,146.2 +443,135.5 +444,135.4 +445,136.5 +446,129.6 +447,132.1 +448,141.1 +449,142.4 +450,146.3 +451,128.4 +452,135.4 +453,130.1 +454,135.1 +455,140.6 +456,139.7 +457,143.5 +458,128.3 +459,121.7 +460,126.9 +461,124.6 +462,140.6 +463,132.6 +464,133.3 +465,129.4 +466,126.4 +467,135.9 +468,124.7 +469,129.9 +470,135.0 +471,130.5 +472,128.1 +473,131.1 +474,125.3 +475,124.5 +476,131.0 +477,136.1 +478,127.0 +479,135.5 +480,122.9 +481,110.0 +482,126.9 +483,119.3 +484,120.0 +485,129.1 +486,131.7 +487,119.8 +488,113.7 +489,116.9 +490,121.5 +491,129.7 +492,122.5 +493,111.7 +494,119.4 +495,112.5 +496,116.4 +497,117.7 +498,115.1 +499,117.4 +500,121.5 +501,116.3 +502,109.4 +503,110.5 +504,113.8 +505,118.3 +506,120.3 +507,117.6 +508,109.0 +509,101.6 +510,112.6 +511,103.5 +512,114.0 +513,118.0 +514,111.1 +515,105.9 +516,107.0 +517,96.8 +518,111.4 +519,108.4 +520,118.6 +521,112.2 +522,100.0 +523,103.6 +524,109.3 +525,104.2 +526,109.3 +527,108.4 +528,111.6 +529,100.0 +530,103.3 +531,96.2 +532,104.5 +533,109.8 +534,108.6 +535,107.7 +536,100.9 +537,96.5 +538,99.2 +539,103.5 +540,104.1 +541,109.8 +542,104.9 +543,104.2 +544,101.5 +545,99.9 +546,107.0 +547,116.0 +548,109.4 +549,103.3 +550,97.5 +551,92.7 +552,85.8 +553,97.9 +554,110.6 +555,109.7 +556,104.3 +557,99.6 +558,89.8 +559,100.1 +560,98.0 +561,103.8 +562,102.9 +563,104.8 +564,102.3 +565,90.4 +566,91.4 +567,100.5 +568,98.2 +569,107.1 +570,103.4 +571,93.7 +572,96.6 +573,89.5 +574,96.6 +575,110.5 +576,111.3 +577,104.7 +578,97.9 +579,98.0 +580,98.4 +581,99.5 +582,105.5 +583,107.6 +584,102.9 +585,108.1 +586,92.6 +587,94.3 +588,100.0 +589,107.4 +590,108.0 +591,101.4 +592,110.6 +593,98.5 +594,90.8 +595,103.5 +596,105.4 +597,106.4 +598,103.9 +599,102.8 +600,106.7 +601,95.0 +602,100.3 +603,104.5 +604,113.3 +605,105.9 +606,108.4 +607,99.8 +608,99.6 +609,111.2 +610,113.2 +611,113.8 +612,113.5 +613,97.5 +614,102.8 +615,107.1 +616,111.2 +617,118.8 +618,117.7 +619,119.1 +620,113.3 +621,104.1 +622,114.6 +623,114.4 +624,121.4 +625,118.4 +626,114.5 +627,110.7 +628,118.2 +629,98.8 +630,107.8 +631,114.1 +632,116.3 +633,118.0 +634,118.4 +635,114.2 +636,113.0 +637,116.6 +638,123.4 +639,122.4 +640,118.9 +641,117.2 +642,114.0 +643,110.6 +644,122.5 +645,126.0 +646,132.6 +647,124.3 +648,113.8 +649,108.9 +650,122.6 +651,120.0 +652,134.1 +653,125.3 +654,119.3 +655,126.1 +656,124.0 +657,123.0 +658,128.1 +659,130.4 +660,134.8 +661,137.1 +662,124.2 +663,119.2 +664,128.9 +665,127.3 +666,128.5 +667,137.3 +668,137.2 +669,125.9 +670,129.6 +671,124.9 +672,128.5 +673,141.3 +674,136.1 +675,141.3 +676,135.1 +677,120.7 +678,124.5 +679,135.9 +680,138.9 +681,141.7 +682,138.1 +683,141.2 +684,131.8 +685,133.4 +686,140.5 +687,143.0 +688,136.5 +689,144.9 +690,134.1 +691,134.8 +692,134.5 +693,139.7 +694,152.8 +695,154.0 +696,142.8 +697,139.6 +698,142.2 +699,138.1 +700,142.5 +701,147.3 +702,149.8 +703,148.0 +704,144.8 +705,136.7 +706,138.3 +707,140.3 +708,154.3 +709,151.2 +710,154.0 +711,150.8 +712,144.3 +713,143.1 +714,139.1 +715,153.5 +716,152.5 +717,150.8 +718,144.3 +719,143.5 +720,145.8 +721,152.3 +722,152.0 +723,152.7 +724,155.2 +725,147.1 +726,135.1 +727,141.9 +728,149.9 +729,151.8 +730,153.5 +731,152.7 +732,151.4 +733,144.9 +734,151.3 +735,151.0 +736,158.1 +737,168.8 +738,155.1 +739,151.2 +740,147.8 +741,146.3 +742,150.4 +743,160.6 +744,157.9 +745,147.1 +746,140.2 +747,147.6 +748,148.0 +749,149.4 +750,161.1 +751,159.0 +752,152.2 +753,145.9 +754,151.7 +755,149.8 +756,150.6 +757,152.7 +758,158.8 +759,152.1 +760,150.9 +761,143.3 +762,149.9 +763,152.6 +764,159.8 +765,157.2 +766,153.9 +767,146.0 +768,139.9 +769,149.4 +770,148.0 +771,156.4 +772,155.5 +773,149.4 +774,141.6 +775,141.3 +776,136.0 +777,153.2 +778,159.4 +779,151.5 +780,152.8 +781,150.8 +782,150.7 +783,145.8 +784,150.0 +785,156.2 +786,158.3 +787,143.9 +788,146.5 +789,141.5 +790,132.9 +791,154.7 +792,151.8 +793,147.6 +794,144.5 +795,139.7 +796,145.5 +797,141.2 +798,142.6 +799,153.0 +800,151.2 +801,146.4 +802,145.8 +803,137.9 +804,132.9 +805,153.1 +806,142.6 +807,148.9 +808,147.5 +809,136.0 +810,139.7 +811,136.9 +812,144.7 +813,143.4 +814,145.3 +815,140.3 +816,141.6 +817,129.2 +818,132.8 +819,143.2 +820,148.0 +821,141.4 +822,142.0 +823,145.0 +824,132.0 +825,134.0 +826,134.3 +827,135.5 +828,142.0 +829,140.2 +830,134.9 +831,130.8 +832,125.0 +833,133.9 +834,136.4 +835,142.7 +836,131.2 +837,130.1 +838,133.4 +839,123.4 +840,129.7 +841,136.6 +842,141.7 +843,127.7 +844,125.7 +845,120.9 +846,120.2 +847,122.5 +848,131.9 +849,129.6 +850,122.6 +851,123.3 +852,112.9 +853,118.4 +854,127.0 +855,127.3 +856,130.9 +857,128.6 +858,114.4 +859,116.5 +860,105.8 +861,119.2 +862,122.6 +863,121.9 +864,123.7 +865,118.9 +866,114.3 +867,111.4 +868,117.9 +869,123.8 +870,121.2 +871,119.8 +872,115.9 +873,107.6 +874,114.1 +875,105.3 +876,116.5 +877,119.9 +878,119.4 +879,112.4 +880,110.7 +881,106.4 +882,113.4 +883,111.1 +884,119.1 +885,116.9 +886,108.9 +887,107.6 +888,111.2 +889,111.4 +890,119.9 +891,120.4 +892,114.9 +893,108.5 +894,104.4 +895,106.5 +896,105.0 +897,114.7 +898,117.6 +899,112.3 +900,111.9 +901,101.2 +902,101.3 +903,107.2 +904,122.3 +905,112.3 +906,99.8 +907,109.6 +908,101.0 +909,93.7 +910,100.5 +911,113.7 +912,106.1 +913,112.2 +914,100.6 +915,98.4 +916,98.0 +917,106.3 +918,113.0 +919,114.0 +920,108.7 +921,91.4 +922,94.4 +923,101.5 +924,104.0 +925,102.8 +926,112.3 +927,111.0 +928,105.1 +929,96.7 +930,102.9 +931,103.6 +932,113.5 +933,107.9 +934,105.3 +935,105.9 +936,101.0 +937,103.2 +938,106.4 +939,103.8 +940,113.7 +941,106.1 +942,104.6 +943,97.8 +944,104.1 +945,105.1 +946,112.9 +947,111.1 +948,98.6 +949,102.2 +950,100.5 +951,102.2 +952,102.3 +953,107.1 +954,106.6 +955,107.6 +956,103.7 +957,101.7 +958,102.1 +959,109.9 +960,99.3 +961,113.7 +962,103.9 +963,105.0 +964,96.8 +965,96.8 +966,109.2 +967,118.4 +968,111.1 +969,106.2 +970,109.1 +971,104.2 +972,103.4 +973,113.2 +974,115.3 +975,116.1 +976,115.9 +977,106.4 +978,100.6 +979,105.9 +980,111.1 +981,116.9 +982,126.6 +983,114.2 +984,113.2 +985,108.4 +986,110.9 +987,120.2 +988,118.8 +989,121.6 +990,117.1 +991,107.6 +992,111.7 +993,116.4 +994,117.9 +995,117.8 +996,131.3 +997,125.9 +998,124.3 +999,118.2 +1000,110.6 +1001,125.2 +1002,134.2 +1003,118.4 +1004,116.0 +1005,122.6 +1006,109.5 +1007,115.3 +1008,113.8 +1009,128.7 +1010,129.2 +1011,120.9 +1012,122.2 +1013,118.0 +1014,134.1 +1015,130.2 +1016,132.0 +1017,127.7 +1018,130.5 +1019,133.3 +1020,117.2 +1021,125.1 +1022,134.5 +1023,144.1 +1024,133.6 +1025,134.9 +1026,126.8 +1027,132.8 +1028,131.1 +1029,128.3 +1030,132.7 +1031,147.6 +1032,134.6 +1033,135.4 +1034,128.7 +1035,127.1 +1036,131.0 +1037,137.6 +1038,135.9 +1039,145.7 +1040,133.2 +1041,123.9 +1042,131.1 +1043,137.3 +1044,144.1 +1045,144.7 +1046,144.6 +1047,133.0 +1048,136.6 +1049,138.0 +1050,136.5 +1051,146.3 +1052,145.8 +1053,146.5 +1054,137.5 +1055,143.4 +1056,139.8 +1057,147.1 +1058,152.0 +1059,151.9 +1060,145.4 +1061,149.5 +1062,129.8 +1063,135.1 +1064,139.7 +1065,150.9 +1066,147.6 +1067,149.5 +1068,145.9 +1069,143.9 +1070,146.1 +1071,148.4 +1072,159.7 +1073,154.1 +1074,148.1 +1075,144.1 +1076,136.2 +1077,148.2 +1078,151.7 +1079,155.5 +1080,151.8 +1081,154.4 +1082,143.1 +1083,142.3 +1084,146.4 +1085,153.5 +1086,149.8 +1087,162.0 +1088,153.5 +1089,153.2 +1090,148.0 +1091,145.4 +1092,146.5 +1093,161.4 +1094,160.2 +1095,154.2 +1096,149.1 +1097,144.1 +1098,150.3 +1099,160.3 +1100,159.3 +1101,163.4 +1102,160.9 +1103,158.1 +1104,145.8 +1105,150.6 +1106,162.5 +1107,159.5 +1108,166.5 +1109,163.3 +1110,155.8 +1111,154.7 +1112,147.5 +1113,153.2 +1114,160.5 +1115,154.2 +1116,152.7 +1117,156.6 +1118,151.4 +1119,146.4 +1120,150.6 +1121,162.5 +1122,162.3 +1123,161.2 +1124,158.7 +1125,146.3 +1126,154.8 +1127,160.5 +1128,156.8 +1129,167.5 +1130,165.3 +1131,155.4 +1132,147.4 +1133,152.9 +1134,153.7 +1135,162.4 +1136,155.5 +1137,148.5 +1138,155.6 +1139,151.6 +1140,151.9 +1141,151.7 +1142,164.5 +1143,165.5 +1144,153.5 +1145,148.5 +1146,140.9 +1147,146.2 +1148,147.1 +1149,156.1 +1150,162.6 +1151,156.9 +1152,144.2 +1153,145.4 +1154,146.3 +1155,147.3 +1156,155.3 +1157,152.3 +1158,153.2 +1159,142.7 +1160,146.9 +1161,142.6 +1162,147.1 +1163,150.6 +1164,154.3 +1165,150.7 +1166,144.7 +1167,140.0 +1168,149.5 +1169,142.5 +1170,152.4 +1171,155.6 +1172,148.4 +1173,135.9 +1174,140.2 +1175,142.5 +1176,145.4 +1177,153.7 +1178,144.8 +1179,153.0 +1180,145.6 +1181,138.2 +1182,137.2 +1183,144.4 +1184,143.9 +1185,142.6 +1186,141.4 +1187,142.0 +1188,136.8 +1189,133.0 +1190,142.6 +1191,145.2 +1192,136.8 +1193,147.0 +1194,133.1 +1195,126.8 +1196,134.5 +1197,136.1 +1198,136.6 +1199,141.4 +1200,135.4 +1201,135.3 +1202,125.6 +1203,138.3 +1204,129.5 +1205,141.6 +1206,138.0 +1207,133.1 +1208,133.7 +1209,130.4 +1210,122.8 +1211,132.5 +1212,133.9 +1213,136.2 +1214,127.8 +1215,120.3 +1216,123.8 +1217,127.0 +1218,122.9 +1219,135.4 +1220,129.6 +1221,130.9 +1222,127.3 +1223,117.2 +1224,118.8 +1225,117.1 +1226,123.2 +1227,134.0 +1228,131.3 +1229,122.1 +1230,116.6 +1231,119.7 +1232,122.5 +1233,128.7 +1234,131.2 +1235,120.3 +1236,125.0 +1237,117.9 +1238,110.1 +1239,115.3 +1240,118.5 +1241,128.9 +1242,123.1 +1243,112.5 +1244,110.9 +1245,113.6 +1246,114.7 +1247,125.4 +1248,116.9 +1249,115.5 +1250,110.1 +1251,110.2 +1252,109.3 +1253,114.8 +1254,119.8 +1255,124.1 +1256,114.0 +1257,109.5 +1258,105.1 +1259,107.7 +1260,112.6 +1261,113.6 +1262,114.2 +1263,111.5 +1264,111.5 +1265,106.0 +1266,111.0 +1267,116.5 +1268,117.4 +1269,120.0 +1270,118.0 +1271,105.2 +1272,106.0 +1273,104.6 +1274,119.2 +1275,110.1 +1276,110.2 +1277,118.7 +1278,115.6 +1279,95.9 +1280,107.8 +1281,113.4 +1282,112.1 +1283,119.3 +1284,114.1 +1285,103.3 +1286,101.2 +1287,100.6 +1288,105.3 +1289,107.0 +1290,114.5 +1291,110.4 +1292,103.3 +1293,106.1 +1294,102.8 +1295,106.3 +1296,114.8 +1297,113.4 +1298,111.0 +1299,107.8 +1300,100.3 +1301,104.8 +1302,105.1 +1303,111.3 +1304,114.8 +1305,112.5 +1306,105.9 +1307,100.5 +1308,103.7 +1309,111.5 +1310,121.3 +1311,117.2 +1312,105.6 +1313,105.7 +1314,101.7 +1315,105.2 +1316,112.0 +1317,114.0 +1318,117.2 +1319,112.2 +1320,109.0 +1321,107.4 +1322,106.6 +1323,109.9 +1324,119.5 +1325,111.8 +1326,115.7 +1327,110.8 +1328,106.5 +1329,106.2 +1330,105.8 +1331,113.8 +1332,112.6 +1333,120.3 +1334,110.8 +1335,106.6 +1336,105.2 +1337,110.3 +1338,117.9 +1339,118.1 +1340,123.2 +1341,113.2 +1342,107.1 +1343,113.0 +1344,119.8 +1345,120.5 +1346,125.4 +1347,119.1 +1348,111.7 +1349,111.0 +1350,105.0 +1351,117.3 +1352,120.0 +1353,121.4 +1354,121.0 +1355,114.0 +1356,112.4 +1357,116.2 +1358,118.7 +1359,136.3 +1360,127.9 +1361,116.3 +1362,122.1 +1363,115.9 +1364,128.9 +1365,126.5 +1366,127.8 +1367,132.2 +1368,129.5 +1369,118.3 +1370,122.3 +1371,120.3 +1372,126.8 +1373,130.5 +1374,131.4 +1375,135.7 +1376,123.6 +1377,123.0 +1378,128.3 +1379,132.8 +1380,131.6 +1381,135.7 +1382,133.6 +1383,127.9 +1384,118.5 +1385,126.5 +1386,136.2 +1387,136.8 +1388,134.4 +1389,128.3 +1390,134.8 +1391,119.6 +1392,130.9 +1393,132.7 +1394,135.9 +1395,144.3 +1396,139.9 +1397,139.1 +1398,137.4 +1399,134.4 +1400,145.0 +1401,136.6 +1402,141.1 +1403,147.4 +1404,135.8 +1405,137.9 +1406,141.2 +1407,138.5 +1408,144.4 +1409,148.8 +1410,144.4 +1411,137.9 +1412,131.4 +1413,137.0 +1414,143.8 +1415,145.9 +1416,149.6 +1417,149.6 +1418,142.8 +1419,143.4 +1420,139.5 +1421,134.3 +1422,153.3 +1423,152.3 +1424,154.1 +1425,146.0 +1426,142.2 +1427,148.5 +1428,149.2 +1429,150.2 +1430,158.7 +1431,151.4 +1432,151.3 +1433,142.7 +1434,144.5 +1435,158.6 +1436,159.1 +1437,158.8 +1438,153.6 +1439,145.4 +1440,149.3 +1441,154.4 +1442,155.1 +1443,159.3 +1444,156.1 +1445,156.7 +1446,153.9 +1447,149.2 +1448,153.9 +1449,158.3 +1450,158.5 +1451,163.5 +1452,165.0 +1453,159.6 +1454,153.6 +1455,148.4 +1456,157.1 +1457,169.2 +1458,161.1 +1459,157.5 +1460,159.2 +1461,150.6 +1462,148.6 +1463,163.8 +1464,156.1 +1465,160.8 +1466,163.0 +1467,149.5 +1468,155.4 +1469,154.2 +1470,163.4 +1471,167.8 +1472,162.5 +1473,160.6 +1474,161.8 +1475,155.2 +1476,157.1 +1477,158.4 +1478,158.7 +1479,159.3 +1480,162.6 +1481,157.9 +1482,154.4 +1483,156.0 +1484,160.2 +1485,165.6 +1486,166.4 +1487,159.0 +1488,153.2 +1489,155.6 +1490,165.8 +1491,159.0 +1492,157.0 +1493,158.0 +1494,163.5 +1495,160.7 +1496,161.3 +1497,160.8 +1498,160.1 +1499,164.3 +1500,156.2 +1501,156.3 +1502,157.2 +1503,146.0 +1504,151.8 +1505,151.6 +1506,164.1 +1507,167.1 +1508,154.6 +1509,148.4 +1510,151.1 +1511,153.1 +1512,153.6 +1513,166.5 +1514,166.4 +1515,162.4 +1516,158.0 +1517,148.8 +1518,153.6 +1519,154.1 +1520,161.1 +1521,164.4 +1522,158.1 +1523,152.9 +1524,150.4 +1525,152.9 +1526,156.7 +1527,151.7 +1528,162.7 +1529,156.4 +1530,147.1 +1531,142.1 +1532,146.1 +1533,159.1 +1534,152.3 +1535,156.8 +1536,149.4 +1537,146.8 +1538,146.6 +1539,139.8 +1540,153.2 +1541,159.3 +1542,151.6 +1543,157.0 +1544,143.0 +1545,134.4 +1546,136.6 +1547,145.6 +1548,155.7 +1549,149.6 +1550,147.6 +1551,141.3 +1552,134.9 +1553,143.1 +1554,140.6 +1555,143.3 +1556,145.8 +1557,147.6 +1558,137.5 +1559,127.8 +1560,134.6 +1561,142.0 +1562,147.8 +1563,140.0 +1564,144.4 +1565,135.8 +1566,130.0 +1567,132.9 +1568,136.3 +1569,143.0 +1570,140.9 +1571,142.9 +1572,125.7 +1573,127.8 +1574,129.8 +1575,140.4 +1576,135.1 +1577,152.1 +1578,137.2 +1579,129.8 +1580,127.7 +1581,134.2 +1582,128.0 +1583,136.6 +1584,137.0 +1585,130.5 +1586,126.7 +1587,121.0 +1588,121.8 +1589,123.3 +1590,130.2 +1591,133.7 +1592,132.1 +1593,130.0 +1594,126.7 +1595,121.9 +1596,131.2 +1597,129.8 +1598,129.6 +1599,129.2 +1600,122.2 +1601,117.3 +1602,116.7 +1603,122.1 +1604,125.8 +1605,130.0 +1606,120.7 +1607,116.7 +1608,119.2 +1609,109.7 +1610,119.8 +1611,124.5 +1612,128.1 +1613,122.1 +1614,117.9 +1615,108.0 +1616,111.7 +1617,125.3 +1618,120.5 +1619,121.6 +1620,129.1 +1621,110.6 +1622,111.3 +1623,117.4 +1624,122.7 +1625,123.5 +1626,125.0 +1627,128.2 +1628,113.7 +1629,104.7 +1630,103.5 +1631,118.3 +1632,123.3 +1633,118.9 +1634,115.5 +1635,111.7 +1636,104.4 +1637,106.1 +1638,115.6 +1639,130.5 +1640,114.7 +1641,110.7 +1642,111.3 +1643,105.3 +1644,106.9 +1645,113.6 +1646,112.1 +1647,118.8 +1648,119.1 +1649,110.0 +1650,106.7 +1651,106.9 +1652,105.7 +1653,112.1 +1654,123.5 +1655,114.3 +1656,112.1 +1657,105.6 +1658,104.0 +1659,114.3 +1660,114.2 +1661,117.7 +1662,118.4 +1663,104.0 +1664,108.7 +1665,109.8 +1666,121.2 +1667,115.7 +1668,114.6 +1669,114.0 +1670,109.4 +1671,105.3 +1672,105.9 +1673,107.9 +1674,112.5 +1675,114.0 +1676,113.6 +1677,107.9 +1678,102.2 +1679,109.7 +1680,123.7 +1681,115.8 +1682,122.9 +1683,118.0 +1684,106.9 +1685,107.9 +1686,107.7 +1687,104.0 +1688,116.9 +1689,120.7 +1690,119.3 +1691,110.2 +1692,106.9 +1693,113.6 +1694,119.9 +1695,120.4 +1696,123.0 +1697,115.9 +1698,114.4 +1699,114.7 +1700,112.0 +1701,112.4 +1702,128.6 +1703,127.1 +1704,119.7 +1705,116.6 +1706,114.7 +1707,114.8 +1708,118.8 +1709,123.9 +1710,120.5 +1711,120.4 +1712,125.8 +1713,116.8 +1714,116.1 +1715,121.8 +1716,127.5 +1717,130.1 +1718,124.4 +1719,122.3 +1720,120.2 +1721,100.9 +1722,122.8 +1723,126.7 +1724,136.1 +1725,131.8 +1726,122.8 +1727,113.3 +1728,117.2 +1729,133.9 +1730,130.3 +1731,140.3 +1732,126.6 +1733,126.9 +1734,121.0 +1735,127.9 +1736,135.2 +1737,138.4 +1738,139.8 +1739,137.1 +1740,125.2 +1741,119.2 +1742,124.9 +1743,133.9 +1744,139.9 +1745,139.4 +1746,135.9 +1747,141.0 +1748,131.6 +1749,133.7 +1750,131.2 +1751,141.6 +1752,140.9 +1753,137.7 +1754,141.1 +1755,134.7 +1756,138.3 +1757,147.2 +1758,146.5 +1759,154.2 +1760,146.0 +1761,140.4 +1762,134.4 +1763,130.7 +1764,142.0 +1765,148.7 +1766,146.2 +1767,146.6 +1768,133.7 +1769,144.4 +1770,140.7 +1771,139.5 +1772,151.9 +1773,152.3 +1774,150.1 +1775,147.9 +1776,139.0 +1777,138.7 +1778,143.3 +1779,150.7 +1780,145.9 +1781,162.2 +1782,146.9 +1783,143.2 +1784,147.0 +1785,149.5 +1786,158.0 +1787,152.7 +1788,151.0 +1789,152.6 +1790,138.5 +1791,149.1 +1792,151.0 +1793,157.2 +1794,164.7 +1795,164.7 +1796,154.7 +1797,154.1 +1798,148.1 +1799,156.5 +1800,156.4 +1801,155.5 +1802,155.7 +1803,150.7 +1804,147.7 +1805,146.0 +1806,146.9 +1807,161.7 +1808,170.7 +1809,160.0 +1810,159.3 +1811,152.1 +1812,154.2 +1813,163.0 +1814,159.4 +1815,164.9 +1816,159.6 +1817,155.3 +1818,153.8 +1819,151.8 +1820,162.4 +1821,163.6 +1822,165.7 +1823,163.4 +1824,162.2 +1825,158.1 +1826,153.4 +1827,165.8 +1828,168.7 +1829,171.9 +1830,164.1 +1831,161.0 +1832,155.6 +1833,151.4 +1834,167.1 +1835,172.6 +1836,166.7 +1837,163.7 +1838,155.6 +1839,159.7 +1840,161.7 +1841,160.6 +1842,171.5 +1843,168.0 +1844,161.5 +1845,164.0 +1846,162.4 +1847,159.2 +1848,160.7 +1849,168.6 +1850,165.4 +1851,167.4 +1852,159.6 +1853,168.4 +1854,156.7 +1855,166.9 +1856,171.6 +1857,172.7 +1858,167.4 +1859,159.0 +1860,157.7 +1861,164.1 +1862,164.6 +1863,168.1 +1864,170.7 +1865,160.2 +1866,158.0 +1867,148.1 +1868,162.0 +1869,153.3 +1870,158.5 +1871,173.9 +1872,163.0 +1873,167.3 +1874,153.1 +1875,158.5 +1876,159.9 +1877,161.4 +1878,170.4 +1879,161.7 +1880,163.7 +1881,155.1 +1882,155.7 +1883,168.5 +1884,167.0 +1885,159.1 +1886,159.7 +1887,155.6 +1888,149.6 +1889,154.8 +1890,156.3 +1891,160.5 +1892,153.6 +1893,166.6 +1894,148.4 +1895,149.8 +1896,152.6 +1897,156.3 +1898,163.3 +1899,164.1 +1900,157.2 +1901,154.9 +1902,147.2 +1903,152.9 +1904,157.2 +1905,157.4 +1906,159.7 +1907,146.9 +1908,157.3 +1909,145.8 +1910,156.3 +1911,149.8 +1912,150.7 +1913,159.7 +1914,155.7 +1915,146.4 +1916,139.1 +1917,144.0 +1918,148.1 +1919,149.9 +1920,149.3 +1921,150.4 +1922,151.0 +1923,138.1 +1924,137.6 +1925,139.3 +1926,152.6 +1927,150.5 +1928,144.9 +1929,146.1 +1930,141.4 +1931,135.8 +1932,150.7 +1933,141.2 +1934,145.5 +1935,147.4 +1936,143.2 +1937,133.0 +1938,137.8 +1939,144.2 +1940,144.8 +1941,148.8 +1942,141.8 +1943,141.1 +1944,138.8 +1945,131.2 +1946,135.9 +1947,150.9 +1948,144.1 +1949,142.8 +1950,125.8 +1951,133.0 +1952,129.2 +1953,128.7 +1954,137.0 +1955,138.8 +1956,134.8 +1957,132.9 +1958,128.4 +1959,126.7 +1960,132.6 +1961,133.1 +1962,133.6 +1963,127.4 +1964,123.3 +1965,122.2 +1966,124.8 +1967,130.6 +1968,134.1 +1969,127.0 +1970,131.7 +1971,125.7 +1972,120.0 +1973,120.0 +1974,129.2 +1975,127.2 +1976,136.6 +1977,126.7 +1978,122.0 +1979,121.3 +1980,120.9 +1981,119.2 +1982,126.5 +1983,125.3 +1984,117.9 +1985,121.8 +1986,104.5 +1987,119.5 +1988,120.6 +1989,130.4 +1990,124.3 +1991,123.2 +1992,113.3 +1993,108.6 +1994,113.8 +1995,117.9 +1996,123.9 +1997,121.4 +1998,122.8 +1999,121.9 +2000,112.1 +2001,113.5 +2002,114.3 +2003,121.5 +2004,124.1 +2005,121.9 +2006,113.3 +2007,111.9 +2008,113.6 +2009,115.8 +2010,121.5 +2011,123.8 +2012,120.0 +2013,114.5 +2014,110.3 +2015,117.5 +2016,116.7 +2017,121.2 +2018,124.5 +2019,121.7 +2020,105.5 +2021,103.6 +2022,107.3 +2023,109.6 +2024,115.3 +2025,121.6 +2026,126.2 +2027,104.5 +2028,101.3 +2029,109.9 +2030,113.2 +2031,120.9 +2032,117.8 +2033,121.9 +2034,116.0 +2035,107.8 +2036,107.4 +2037,113.3 +2038,118.8 +2039,116.8 +2040,115.8 +2041,112.5 +2042,116.1 +2043,112.1 +2044,124.4 +2045,120.6 +2046,131.9 +2047,115.2 +2048,113.8 +2049,108.6 +2050,110.8 +2051,113.3 +2052,124.0 +2053,123.4 +2054,127.7 +2055,111.5 +2056,106.4 +2057,110.9 +2058,116.5 +2059,119.1 +2060,123.1 +2061,120.9 +2062,121.2 +2063,111.9 +2064,117.5 +2065,113.7 +2066,122.4 +2067,126.5 +2068,122.0 +2069,122.3 +2070,112.8 +2071,112.5 +2072,122.2 +2073,125.2 +2074,132.5 +2075,128.3 +2076,118.2 +2077,118.2 +2078,123.0 +2079,126.3 +2080,128.7 +2081,135.4 +2082,127.2 +2083,128.3 +2084,123.0 +2085,119.8 +2086,128.4 +2087,132.6 +2088,136.2 +2089,129.7 +2090,121.1 +2091,120.4 +2092,114.9 +2093,124.2 +2094,139.3 +2095,129.6 +2096,132.1 +2097,127.0 +2098,125.3 +2099,124.4 +2100,137.3 +2101,132.7 +2102,140.9 +2103,125.2 +2104,137.5 +2105,130.4 +2106,133.1 +2107,138.6 +2108,140.9 +2109,152.3 +2110,143.4 +2111,125.1 +2112,133.7 +2113,140.3 +2114,141.6 +2115,144.0 +2116,143.3 +2117,136.2 +2118,146.0 +2119,131.3 +2120,136.0 +2121,145.5 +2122,146.7 +2123,151.6 +2124,140.7 +2125,144.6 +2126,139.9 +2127,141.8 +2128,144.3 +2129,148.5 +2130,152.7 +2131,147.1 +2132,141.7 +2133,140.6 +2134,145.5 +2135,151.1 +2136,150.5 +2137,153.0 +2138,146.1 +2139,140.5 +2140,141.9 +2141,146.3 +2142,152.2 +2143,158.6 +2144,162.8 +2145,148.2 +2146,145.3 +2147,151.2 +2148,158.2 +2149,153.4 +2150,159.7 +2151,155.5 +2152,168.3 +2153,156.4 +2154,153.9 +2155,152.7 +2156,159.4 +2157,165.7 +2158,161.4 +2159,158.3 +2160,160.4 +2161,151.3 +2162,152.8 +2163,160.4 +2164,164.9 +2165,164.7 +2166,159.4 +2167,155.7 +2168,150.2 +2169,149.3 +2170,157.2 +2171,160.7 +2172,168.5 +2173,159.8 +2174,156.3 +2175,155.8 +2176,155.7 +2177,166.1 +2178,172.9 +2179,173.5 +2180,167.6 +2181,159.3 +2182,153.9 +2183,159.6 +2184,166.4 +2185,176.7 +2186,167.3 +2187,171.2 +2188,154.0 +2189,164.8 +2190,161.0 +2191,161.8 +2192,170.3 +2193,171.1 +2194,163.7 +2195,166.8 +2196,160.1 +2197,164.2 +2198,161.7 +2199,167.8 +2200,171.1 +2201,168.2 +2202,167.2 +2203,162.9 +2204,168.2 +2205,163.5 +2206,170.5 +2207,171.3 +2208,170.9 +2209,164.6 +2210,151.8 +2211,162.9 +2212,163.9 +2213,179.1 +2214,171.3 +2215,169.6 +2216,158.3 +2217,165.3 +2218,162.6 +2219,172.0 +2220,172.5 +2221,179.4 +2222,169.3 +2223,162.1 +2224,154.4 +2225,165.5 +2226,169.2 +2227,173.1 +2228,174.3 +2229,163.2 +2230,168.5 +2231,161.7 +2232,166.3 +2233,173.7 +2234,158.9 +2235,168.2 +2236,167.5 +2237,166.3 +2238,155.9 +2239,159.3 +2240,163.7 +2241,164.5 +2242,168.1 +2243,167.1 +2244,158.2 +2245,162.3 +2246,155.1 +2247,161.1 +2248,173.5 +2249,171.9 +2250,166.6 +2251,155.7 +2252,162.6 +2253,152.8 +2254,155.8 +2255,168.1 +2256,164.6 +2257,155.1 +2258,163.7 +2259,148.0 +2260,156.4 +2261,156.6 +2262,166.9 +2263,163.6 +2264,157.1 +2265,156.3 +2266,151.6 +2267,148.9 +2268,157.3 +2269,166.1 +2270,156.0 +2271,153.9 +2272,155.0 +2273,142.0 +2274,154.0 +2275,159.2 +2276,152.1 +2277,163.3 +2278,147.5 +2279,149.1 +2280,142.3 +2281,149.7 +2282,154.2 +2283,151.7 +2284,157.5 +2285,152.7 +2286,148.3 +2287,137.4 +2288,148.7 +2289,147.4 +2290,151.8 +2291,152.2 +2292,153.7 +2293,140.9 +2294,140.8 +2295,146.2 +2296,142.3 +2297,158.4 +2298,150.0 +2299,153.3 +2300,137.7 +2301,139.0 +2302,140.8 +2303,144.3 +2304,150.1 +2305,152.4 +2306,146.9 +2307,141.7 +2308,135.8 +2309,135.5 +2310,138.6 +2311,140.7 +2312,145.3 +2313,133.2 +2314,135.3 +2315,137.2 +2316,134.0 +2317,136.8 +2318,146.1 +2319,139.9 +2320,135.6 +2321,127.4 +2322,128.8 +2323,125.0 +2324,135.3 +2325,136.8 +2326,138.4 +2327,136.7 +2328,125.9 +2329,122.1 +2330,123.5 +2331,135.7 +2332,131.1 +2333,137.7 +2334,127.4 +2335,136.3 +2336,123.3 +2337,125.0 +2338,131.3 +2339,131.5 +2340,128.8 +2341,132.0 +2342,126.7 +2343,118.5 +2344,124.1 +2345,124.9 +2346,131.0 +2347,135.4 +2348,124.1 +2349,120.0 +2350,126.9 +2351,118.2 +2352,122.7 +2353,128.4 +2354,136.8 +2355,123.1 +2356,118.5 +2357,118.5 +2358,117.0 +2359,117.1 +2360,124.1 +2361,136.1 +2362,126.1 +2363,118.7 +2364,119.1 +2365,115.7 +2366,122.6 +2367,131.3 +2368,127.5 +2369,115.7 +2370,123.2 +2371,115.0 +2372,115.4 +2373,125.3 +2374,123.8 +2375,129.1 +2376,123.9 +2377,118.0 +2378,117.2 +2379,120.3 +2380,115.9 +2381,121.0 +2382,124.2 +2383,124.7 +2384,117.7 +2385,111.2 +2386,119.5 +2387,117.8 +2388,127.3 +2389,124.1 +2390,116.6 +2391,116.0 +2392,117.8 +2393,107.3 +2394,120.5 +2395,121.8 +2396,124.5 +2397,117.2 +2398,116.5 +2399,102.7 +2400,114.8 +2401,122.1 +2402,128.1 +2403,123.1 +2404,119.3 +2405,116.4 +2406,117.5 +2407,113.2 +2408,119.4 +2409,135.6 +2410,122.5 +2411,132.1 +2412,124.8 +2413,116.5 +2414,122.5 +2415,120.5 +2416,124.9 +2417,128.2 +2418,125.5 +2419,118.6 +2420,114.4 +2421,112.1 +2422,125.3 +2423,123.2 +2424,129.3 +2425,127.0 +2426,123.8 +2427,117.7 +2428,119.2 +2429,122.9 +2430,119.8 +2431,127.8 +2432,129.0 +2433,123.6 +2434,116.7 +2435,115.8 +2436,124.5 +2437,123.4 +2438,129.1 +2439,130.2 +2440,117.9 +2441,126.4 +2442,126.8 +2443,127.3 +2444,130.9 +2445,137.6 +2446,131.4 +2447,129.7 +2448,122.5 +2449,120.0 +2450,126.5 +2451,131.6 +2452,135.2 +2453,131.0 +2454,126.8 +2455,131.1 +2456,119.5 +2457,128.3 +2458,135.3 +2459,144.4 +2460,134.1 +2461,125.2 +2462,135.2 +2463,132.8 +2464,133.9 +2465,139.9 +2466,148.3 +2467,139.5 +2468,126.2 +2469,136.0 +2470,127.9 +2471,138.3 +2472,144.0 +2473,142.3 +2474,142.9 +2475,131.7 +2476,137.7 +2477,136.5 +2478,141.5 +2479,142.6 +2480,146.5 +2481,146.7 +2482,147.2 +2483,137.4 +2484,139.2 +2485,142.4 +2486,143.8 +2487,156.1 +2488,141.5 +2489,131.0 +2490,140.7 +2491,140.9 +2492,148.1 +2493,152.2 +2494,154.8 +2495,160.1 +2496,151.1 +2497,136.6 +2498,144.5 +2499,151.0 +2500,151.1 +2501,160.2 +2502,155.5 +2503,153.6 +2504,150.4 +2505,150.3 +2506,152.0 +2507,153.9 +2508,169.3 +2509,158.9 +2510,157.3 +2511,150.7 +2512,150.2 +2513,154.3 +2514,164.9 +2515,173.3 +2516,161.4 +2517,161.1 +2518,162.4 +2519,155.1 +2520,161.8 +2521,158.0 +2522,168.0 +2523,164.6 +2524,160.8 +2525,150.4 +2526,153.8 +2527,165.1 +2528,168.2 +2529,172.0 +2530,161.6 +2531,161.8 +2532,160.4 +2533,162.4 +2534,157.4 +2535,176.6 +2536,169.8 +2537,173.2 +2538,160.9 +2539,157.3 +2540,162.1 +2541,164.2 +2542,172.5 +2543,175.5 +2544,173.1 +2545,161.9 +2546,164.6 +2547,159.6 +2548,163.3 +2549,172.5 +2550,172.8 +2551,165.7 +2552,160.5 +2553,156.3 +2554,158.8 +2555,173.9 +2556,174.2 +2557,174.1 +2558,171.9 +2559,163.2 +2560,163.9 +2561,164.7 +2562,171.1 +2563,175.5 +2564,182.1 +2565,175.5 +2566,170.1 +2567,171.0 +2568,158.6 +2569,172.5 +2570,175.1 +2571,168.8 +2572,169.6 +2573,169.0 +2574,164.8 +2575,171.7 +2576,159.8 +2577,175.4 +2578,172.8 +2579,175.0 +2580,163.9 +2581,171.3 +2582,166.3 +2583,171.4 +2584,175.4 +2585,180.4 +2586,177.6 +2587,161.2 +2588,163.9 +2589,172.7 +2590,170.8 +2591,170.1 +2592,177.9 +2593,173.9 +2594,166.5 +2595,166.7 +2596,165.9 +2597,166.8 +2598,168.7 +2599,182.0 +2600,169.6 +2601,164.3 +2602,162.0 +2603,167.7 +2604,169.3 +2605,172.8 +2606,170.3 +2607,165.3 +2608,166.4 +2609,151.4 +2610,163.4 +2611,166.1 +2612,177.7 +2613,169.9 +2614,168.4 +2615,162.1 +2616,161.8 +2617,154.0 +2618,164.9 +2619,167.8 +2620,163.9 +2621,167.0 +2622,165.8 +2623,149.8 +2624,162.0 +2625,164.2 +2626,168.2 +2627,167.5 +2628,168.2 +2629,164.6 +2630,155.7 +2631,160.2 +2632,162.8 +2633,169.6 +2634,169.2 +2635,158.0 +2636,159.6 +2637,157.6 +2638,155.3 +2639,156.4 +2640,163.3 +2641,157.7 +2642,161.0 +2643,164.7 +2644,148.8 +2645,152.3 +2646,152.7 +2647,158.9 +2648,160.6 +2649,157.1 +2650,148.8 +2651,143.2 +2652,151.1 +2653,151.5 +2654,153.8 +2655,167.4 +2656,157.6 +2657,151.9 +2658,143.0 +2659,145.2 +2660,152.2 +2661,155.0 +2662,149.2 +2663,153.2 +2664,141.5 +2665,145.6 +2666,142.4 +2667,144.7 +2668,147.5 +2669,156.6 +2670,148.6 +2671,146.9 +2672,142.3 +2673,142.0 +2674,140.1 +2675,136.2 +2676,155.7 +2677,155.1 +2678,134.6 +2679,132.2 +2680,128.7 +2681,136.0 +2682,150.5 +2683,148.3 +2684,143.7 +2685,130.4 +2686,132.9 +2687,125.9 +2688,138.7 +2689,132.3 +2690,145.7 +2691,141.8 +2692,134.7 +2693,132.8 +2694,124.1 +2695,139.0 +2696,139.6 +2697,148.0 +2698,137.8 +2699,142.6 +2700,124.9 +2701,135.6 +2702,135.0 +2703,135.2 +2704,138.3 +2705,132.6 +2706,127.2 +2707,126.1 +2708,131.9 +2709,132.4 +2710,131.9 +2711,134.1 +2712,127.8 +2713,123.0 +2714,129.4 +2715,128.0 +2716,123.9 +2717,138.3 +2718,139.6 +2719,134.5 +2720,122.4 +2721,124.6 +2722,121.4 +2723,127.6 +2724,133.4 +2725,132.0 +2726,128.7 +2727,122.1 +2728,118.3 +2729,113.3 +2730,126.7 +2731,132.2 +2732,128.1 +2733,132.5 +2734,124.6 +2735,121.1 +2736,128.5 +2737,125.3 +2738,126.4 +2739,129.2 +2740,124.9 +2741,113.4 +2742,111.5 +2743,124.7 +2744,123.6 +2745,130.0 +2746,126.5 +2747,122.7 +2748,123.5 +2749,115.8 +2750,122.2 +2751,121.8 +2752,128.8 +2753,134.0 +2754,124.2 +2755,116.8 +2756,115.2 +2757,117.5 +2758,120.6 +2759,128.1 +2760,131.5 +2761,124.2 +2762,120.9 +2763,116.3 +2764,120.0 +2765,122.4 +2766,124.5 +2767,123.2 +2768,127.3 +2769,124.5 +2770,119.1 +2771,118.6 +2772,127.2 +2773,125.6 +2774,137.9 +2775,133.3 +2776,120.7 +2777,108.7 +2778,125.2 +2779,122.1 +2780,125.1 +2781,128.4 +2782,123.1 +2783,126.9 +2784,119.3 +2785,117.8 +2786,128.3 +2787,123.7 +2788,124.1 +2789,128.1 +2790,121.8 +2791,121.3 +2792,118.2 +2793,129.5 +2794,125.0 +2795,133.7 +2796,127.1 +2797,129.1 +2798,122.4 +2799,120.2 +2800,121.1 +2801,133.5 +2802,129.3 +2803,133.3 +2804,124.2 +2805,128.2 +2806,124.3 +2807,132.0 +2808,139.2 +2809,135.5 +2810,132.5 +2811,130.5 +2812,128.0 +2813,127.3 +2814,127.3 +2815,148.7 +2816,141.1 +2817,130.6 +2818,131.2 +2819,132.6 +2820,129.7 +2821,144.1 +2822,140.0 +2823,143.6 +2824,142.4 +2825,129.7 +2826,136.1 +2827,124.6 +2828,143.8 +2829,144.2 +2830,145.7 +2831,137.7 +2832,136.2 +2833,134.3 +2834,136.8 +2835,137.4 +2836,145.2 +2837,149.6 +2838,143.4 +2839,145.3 +2840,138.7 +2841,133.8 +2842,137.8 +2843,153.6 +2844,153.0 +2845,151.2 +2846,146.2 +2847,147.5 +2848,139.6 +2849,142.1 +2850,156.0 +2851,156.8 +2852,157.6 +2853,145.1 +2854,145.2 +2855,143.2 +2856,147.4 +2857,155.8 +2858,161.8 +2859,151.2 +2860,144.2 +2861,139.8 +2862,145.7 +2863,156.1 +2864,160.1 +2865,155.9 +2866,158.7 +2867,155.2 +2868,144.4 +2869,157.8 +2870,161.2 +2871,166.6 +2872,167.8 +2873,161.6 +2874,158.1 +2875,151.1 +2876,155.2 +2877,160.4 +2878,166.9 +2879,172.4 +2880,153.6 +2881,153.5 +2882,161.1 +2883,153.7 +2884,163.2 +2885,171.2 +2886,172.2 +2887,165.8 +2888,162.5 +2889,153.9 +2890,157.1 +2891,160.3 +2892,166.7 +2893,174.7 +2894,169.9 +2895,162.0 +2896,167.2 +2897,156.2 +2898,165.1 +2899,173.6 +2900,173.8 +2901,175.1 +2902,164.4 +2903,163.6 +2904,160.6 +2905,168.2 +2906,180.2 +2907,174.9 +2908,167.7 +2909,169.7 +2910,165.0 +2911,169.0 +2912,172.9 +2913,174.5 +2914,177.9 +2915,176.0 +2916,162.6 +2917,171.1 +2918,166.5 +2919,173.4 +2920,181.9 +2921,177.7 +2922,170.4 +2923,167.4 +2924,164.2 +2925,171.0 +2926,172.5 +2927,174.2 +2928,170.8 +2929,176.6 +2930,173.5 +2931,166.7 +2932,171.1 +2933,174.3 +2934,174.0 +2935,178.4 +2936,178.9 +2937,169.6 +2938,163.6 +2939,167.0 +2940,180.1 +2941,178.2 +2942,183.7 +2943,176.3 +2944,168.0 +2945,166.8 +2946,161.1 +2947,173.5 +2948,182.3 +2949,178.3 +2950,182.4 +2951,167.9 +2952,174.1 +2953,176.9 +2954,169.0 +2955,176.5 +2956,183.7 +2957,176.4 +2958,179.1 +2959,171.3 +2960,163.8 +2961,171.4 +2962,177.0 +2963,180.2 +2964,175.2 +2965,168.5 +2966,168.0 +2967,170.2 +2968,165.6 +2969,183.4 +2970,180.0 +2971,170.4 +2972,169.5 +2973,170.4 +2974,168.6 +2975,166.5 +2976,169.6 +2977,175.2 +2978,173.3 +2979,175.0 +2980,160.1 +2981,159.0 +2982,173.3 +2983,171.5 +2984,173.9 +2985,166.8 +2986,156.4 +2987,163.8 +2988,163.4 +2989,165.3 +2990,167.2 +2991,170.9 +2992,166.7 +2993,155.6 +2994,156.7 +2995,158.8 +2996,169.4 +2997,164.6 +2998,176.5 +2999,166.0 +3000,160.6 +3001,149.9 +3002,153.7 +3003,157.7 +3004,169.5 +3005,173.0 +3006,160.9 +3007,159.8 +3008,159.8 +3009,156.5 +3010,151.6 +3011,162.2 +3012,169.0 +3013,155.4 +3014,163.4 +3015,151.0 +3016,156.4 +3017,156.1 +3018,164.1 +3019,157.3 +3020,148.5 +3021,152.0 +3022,152.8 +3023,151.6 +3024,159.8 +3025,159.4 +3026,157.8 +3027,152.1 +3028,149.9 +3029,146.0 +3030,151.0 +3031,156.8 +3032,155.9 +3033,162.6 +3034,148.6 +3035,145.5 +3036,145.3 +3037,143.4 +3038,145.3 +3039,153.5 +3040,148.7 +3041,152.6 +3042,144.6 +3043,144.6 +3044,135.3 +3045,149.6 +3046,149.6 +3047,151.9 +3048,143.8 +3049,140.5 +3050,138.1 +3051,139.6 +3052,140.8 +3053,141.6 +3054,149.2 +3055,150.6 +3056,131.9 +3057,138.2 +3058,131.3 +3059,140.5 +3060,146.4 +3061,141.2 +3062,138.0 +3063,135.9 +3064,127.2 +3065,134.4 +3066,132.3 +3067,142.9 +3068,145.1 +3069,139.5 +3070,131.0 +3071,131.6 +3072,125.2 +3073,141.0 +3074,139.4 +3075,136.4 +3076,134.4 +3077,126.8 +3078,124.0 +3079,138.6 +3080,134.1 +3081,129.8 +3082,137.3 +3083,133.2 +3084,129.7 +3085,123.5 +3086,128.9 +3087,142.3 +3088,132.0 +3089,131.4 +3090,136.3 +3091,127.1 +3092,122.6 +3093,130.8 +3094,130.7 +3095,133.7 +3096,138.0 +3097,131.5 +3098,124.2 +3099,121.1 +3100,123.8 +3101,135.8 +3102,131.5 +3103,132.2 +3104,130.4 +3105,126.0 +3106,121.0 +3107,116.8 +3108,125.3 +3109,139.7 +3110,127.6 +3111,123.9 +3112,129.5 +3113,117.2 +3114,128.6 +3115,124.3 +3116,134.3 +3117,130.2 +3118,125.0 +3119,126.8 +3120,127.0 +3121,121.2 +3122,126.1 +3123,128.7 +3124,134.7 +3125,131.1 +3126,121.3 +3127,119.9 +3128,122.8 +3129,129.9 +3130,131.3 +3131,134.6 +3132,133.9 +3133,124.4 +3134,118.3 +3135,113.2 +3136,126.4 +3137,134.1 +3138,121.8 +3139,131.8 +3140,123.3 +3141,114.7 +3142,127.5 +3143,127.4 +3144,133.6 +3145,137.0 +3146,131.1 +3147,124.4 +3148,124.3 +3149,123.3 +3150,120.3 +3151,138.6 +3152,135.8 +3153,133.3 +3154,119.4 +3155,124.6 +3156,118.0 +3157,133.0 +3158,145.4 +3159,140.0 +3160,126.2 +3161,130.2 +3162,129.9 +3163,130.2 +3164,134.5 +3165,134.5 +3166,135.1 +3167,135.2 +3168,129.9 +3169,127.1 +3170,125.4 +3171,136.6 +3172,146.5 +3173,147.5 +3174,143.2 +3175,130.3 +3176,128.5 +3177,128.2 +3178,137.3 +3179,143.9 +3180,150.2 +3181,139.2 +3182,137.4 +3183,127.3 +3184,137.6 +3185,142.0 +3186,141.2 +3187,138.3 +3188,137.3 +3189,141.6 +3190,130.4 +3191,140.2 +3192,143.8 +3193,151.2 +3194,152.5 +3195,146.0 +3196,137.7 +3197,144.5 +3198,144.1 +3199,147.4 +3200,141.9 +3201,150.4 +3202,149.5 +3203,145.1 +3204,138.1 +3205,143.6 +3206,150.2 +3207,156.5 +3208,155.7 +3209,152.0 +3210,146.8 +3211,144.8 +3212,149.9 +3213,147.6 +3214,156.3 +3215,156.3 +3216,162.6 +3217,152.7 +3218,148.0 +3219,146.5 +3220,150.8 +3221,155.1 +3222,157.6 +3223,163.5 +3224,148.5 +3225,159.0 +3226,152.9 +3227,156.1 +3228,168.8 +3229,165.7 +3230,164.8 +3231,154.0 +3232,147.9 +3233,158.6 +3234,159.6 +3235,168.9 +3236,162.5 +3237,170.6 +3238,158.7 +3239,161.4 +3240,156.5 +3241,170.4 +3242,176.2 +3243,170.2 +3244,167.2 +3245,162.4 +3246,157.5 +3247,167.7 +3248,163.9 +3249,178.6 +3250,175.3 +3251,171.1 +3252,166.9 +3253,164.5 +3254,165.0 +3255,166.4 +3256,171.4 +3257,168.1 +3258,164.8 +3259,169.4 +3260,164.5 +3261,166.8 +3262,175.0 +3263,174.8 +3264,173.5 +3265,167.8 +3266,172.5 +3267,159.6 +3268,162.6 +3269,177.7 +3270,174.5 +3271,183.5 +3272,173.8 +3273,173.8 +3274,169.8 +3275,166.8 +3276,172.2 +3277,185.3 +3278,177.5 +3279,177.0 +3280,176.1 +3281,171.5 +3282,169.9 +3283,177.1 +3284,174.8 +3285,176.0 +3286,180.5 +3287,175.7 +3288,167.6 +3289,169.5 +3290,183.0 +3291,178.9 +3292,174.4 +3293,185.8 +3294,183.4 +3295,173.4 +3296,169.3 +3297,171.0 +3298,172.0 +3299,183.8 +3300,182.0 +3301,176.4 +3302,176.1 +3303,171.7 +3304,178.1 +3305,185.1 +3306,172.5 +3307,179.5 +3308,176.2 +3309,168.3 +3310,175.7 +3311,180.2 +3312,181.9 +3313,183.2 +3314,173.5 +3315,177.7 +3316,170.1 +3317,178.7 +3318,184.3 +3319,181.7 +3320,184.6 +3321,179.2 +3322,172.8 +3323,166.1 +3324,166.2 +3325,176.1 +3326,176.4 +3327,185.2 +3328,181.0 +3329,171.1 +3330,176.8 +3331,176.8 +3332,173.3 +3333,186.0 +3334,186.1 +3335,182.7 +3336,168.6 +3337,173.0 +3338,168.7 +3339,183.6 +3340,171.5 +3341,174.1 +3342,175.6 +3343,170.5 +3344,162.5 +3345,173.2 +3346,168.8 +3347,173.2 +3348,180.8 +3349,169.8 +3350,164.1 +3351,168.7 +3352,161.5 +3353,172.7 +3354,173.6 +3355,175.6 +3356,175.3 +3357,162.5 +3358,158.2 +3359,165.5 +3360,159.2 +3361,178.9 +3362,176.6 +3363,174.5 +3364,164.6 +3365,156.2 +3366,159.3 +3367,168.9 +3368,178.8 +3369,171.0 +3370,163.3 +3371,163.0 +3372,150.8 +3373,160.9 +3374,167.0 +3375,164.1 +3376,172.8 +3377,169.9 +3378,158.5 +3379,155.5 +3380,156.4 +3381,155.3 +3382,169.2 +3383,166.3 +3384,162.6 +3385,158.6 +3386,156.2 +3387,157.6 +3388,163.8 +3389,168.0 +3390,157.1 +3391,158.7 +3392,153.5 +3393,154.7 +3394,152.4 +3395,154.7 +3396,156.6 +3397,157.4 +3398,153.9 +3399,146.1 +3400,139.4 +3401,150.6 +3402,161.5 +3403,152.0 +3404,151.4 +3405,154.0 +3406,148.5 +3407,137.8 +3408,144.2 +3409,145.1 +3410,154.1 +3411,156.2 +3412,152.3 +3413,139.0 +3414,147.0 +3415,143.5 +3416,146.7 +3417,151.0 +3418,152.8 +3419,141.5 +3420,141.4 +3421,143.5 +3422,142.6 +3423,137.9 +3424,140.9 +3425,148.5 +3426,138.3 +3427,142.2 +3428,137.7 +3429,137.4 +3430,145.5 +3431,147.6 +3432,140.5 +3433,143.0 +3434,141.2 +3435,128.3 +3436,130.9 +3437,138.4 +3438,134.8 +3439,148.7 +3440,144.5 +3441,130.7 +3442,130.0 +3443,131.2 +3444,141.8 +3445,142.8 +3446,147.3 +3447,139.6 +3448,135.5 +3449,135.3 +3450,133.3 +3451,134.1 +3452,136.4 +3453,140.0 +3454,135.5 +3455,131.1 +3456,127.2 +3457,130.3 +3458,127.1 +3459,138.4 +3460,139.2 +3461,140.6 +3462,130.6 +3463,130.4 +3464,124.7 +3465,129.2 +3466,137.3 +3467,137.2 +3468,133.4 +3469,121.4 +3470,125.8 +3471,124.5 +3472,135.1 +3473,140.5 +3474,138.5 +3475,136.0 +3476,127.3 +3477,130.7 +3478,125.5 +3479,135.6 +3480,132.2 +3481,138.4 +3482,129.2 +3483,126.1 +3484,119.6 +3485,120.8 +3486,129.1 +3487,128.9 +3488,138.8 +3489,134.2 +3490,127.1 +3491,116.1 +3492,127.1 +3493,126.7 +3494,128.3 +3495,135.2 +3496,136.5 +3497,129.0 +3498,120.7 +3499,116.9 +3500,128.2 +3501,141.5 +3502,134.3 +3503,129.5 +3504,124.9 +3505,125.8 +3506,124.8 +3507,126.7 +3508,134.2 +3509,138.0 +3510,128.2 +3511,116.6 +3512,129.0 +3513,128.1 +3514,131.7 +3515,135.9 +3516,138.3 +3517,135.6 +3518,132.6 +3519,121.6 +3520,128.3 +3521,131.4 +3522,137.4 +3523,139.8 +3524,147.3 +3525,137.7 +3526,127.5 +3527,133.8 +3528,140.1 +3529,140.4 +3530,140.8 +3531,132.8 +3532,136.2 +3533,132.7 +3534,129.5 +3535,136.2 +3536,147.6 +3537,148.8 +3538,135.8 +3539,139.1 +3540,135.9 +3541,139.7 +3542,145.1 +3543,144.1 +3544,149.7 +3545,135.5 +3546,141.0 +3547,139.4 +3548,134.4 +3549,144.7 +3550,151.1 +3551,149.3 +3552,144.6 +3553,140.5 +3554,136.9 +3555,146.1 +3556,144.7 +3557,152.8 +3558,150.2 +3559,150.6 +3560,140.8 +3561,137.5 +3562,147.0 +3563,149.4 +3564,149.3 +3565,156.1 +3566,154.3 +3567,146.0 +3568,141.1 +3569,147.8 +3570,155.8 +3571,151.9 +3572,154.7 +3573,161.8 +3574,151.3 +3575,147.7 +3576,154.9 +3577,160.6 +3578,157.6 +3579,162.6 +3580,158.6 +3581,155.0 +3582,152.8 +3583,148.1 +3584,157.7 +3585,157.3 +3586,160.1 +3587,154.3 +3588,157.6 +3589,156.0 +3590,153.5 +3591,153.8 +3592,168.3 +3593,160.3 +3594,166.0 +3595,166.3 +3596,160.7 +3597,147.8 +3598,167.1 +3599,169.8 +3600,168.0 +3601,165.9 +3602,158.8 +3603,163.5 +3604,155.2 +3605,174.7 +3606,175.5 +3607,176.5 +3608,171.5 +3609,162.3 +3610,160.2 +3611,161.1 +3612,170.9 +3613,168.8 +3614,173.4 +3615,172.1 +3616,168.7 +3617,162.2 +3618,169.7 +3619,171.9 +3620,180.4 +3621,177.0 +3622,176.6 +3623,162.1 +3624,173.0 +3625,172.4 +3626,176.7 +3627,180.5 +3628,178.6 +3629,174.8 +3630,176.3 +3631,172.4 +3632,167.0 +3633,178.5 +3634,181.7 +3635,188.7 +3636,182.1 +3637,168.9 +3638,174.3 +3639,174.1 +3640,182.2 +3641,187.9 +3642,181.3 +3643,193.6 +3644,184.1 +3645,182.2 +3646,174.1 +3647,178.1 +3648,184.3 +3649,185.3 +3650,186.0 +3651,175.9 +3652,170.3 +3653,179.1 +3654,180.4 +3655,187.4 +3656,185.6 +3657,190.1 +3658,181.1 +3659,177.2 +3660,176.6 +3661,191.4 +3662,185.1 +3663,184.2 +3664,186.8 +3665,174.4 +3666,176.7 +3667,170.6 +3668,171.0 +3669,183.8 +3670,184.0 +3671,184.0 +3672,177.6 +3673,177.5 +3674,174.9 +3675,184.1 +3676,192.1 +3677,189.7 +3678,185.0 +3679,184.2 +3680,178.8 +3681,176.0 +3682,186.1 +3683,184.1 +3684,189.3 +3685,180.4 +3686,180.6 +3687,164.7 +3688,176.6 +3689,181.4 +3690,186.5 +3691,188.1 +3692,191.6 +3693,173.4 +3694,173.5 +3695,171.7 +3696,177.4 +3697,183.5 +3698,193.5 +3699,182.3 +3700,184.4 +3701,178.4 +3702,168.9 +3703,181.6 +3704,181.4 +3705,179.2 +3706,182.3 +3707,172.6 +3708,173.1 +3709,176.8 +3710,178.0 +3711,179.0 +3712,179.3 +3713,180.6 +3714,176.7 +3715,166.6 +3716,176.2 +3717,171.8 +3718,180.2 +3719,180.7 +3720,173.2 +3721,175.0 +3722,170.9 +3723,172.0 +3724,176.4 +3725,177.6 +3726,180.7 +3727,171.1 +3728,172.2 +3729,161.2 +3730,168.0 +3731,171.7 +3732,168.4 +3733,177.6 +3734,174.8 +3735,168.6 +3736,155.7 +3737,161.9 +3738,165.7 +3739,177.8 +3740,175.4 +3741,165.4 +3742,162.6 +3743,159.3 +3744,161.0 +3745,168.5 +3746,164.5 +3747,173.4 +3748,167.9 +3749,159.6 +3750,151.3 +3751,162.6 +3752,155.7 +3753,165.7 +3754,166.7 +3755,155.1 +3756,161.6 +3757,157.1 +3758,157.4 +3759,163.9 +3760,168.1 +3761,168.3 +3762,157.3 +3763,149.5 +3764,149.3 +3765,152.6 +3766,154.0 +3767,154.6 +3768,167.4 +3769,158.0 +3770,151.8 +3771,148.6 +3772,145.2 +3773,149.8 +3774,154.3 +3775,154.3 +3776,155.5 +3777,149.1 +3778,146.5 +3779,145.5 +3780,151.7 +3781,151.7 +3782,152.2 +3783,150.9 +3784,144.7 +3785,145.2 +3786,147.1 +3787,152.2 +3788,148.9 +3789,151.9 +3790,148.7 +3791,146.5 +3792,144.8 +3793,148.5 +3794,139.5 +3795,148.8 +3796,153.4 +3797,144.9 +3798,150.1 +3799,137.4 +3800,137.2 +3801,150.7 +3802,149.4 +3803,145.3 +3804,146.7 +3805,141.8 +3806,135.5 +3807,142.5 +3808,139.2 +3809,141.0 +3810,143.5 +3811,143.8 +3812,132.0 +3813,136.4 +3814,133.8 +3815,131.1 +3816,139.5 +3817,141.3 +3818,147.6 +3819,131.8 +3820,134.6 +3821,133.8 +3822,140.9 +3823,143.6 +3824,131.4 +3825,137.7 +3826,132.2 +3827,131.4 +3828,126.7 +3829,132.9 +3830,137.9 +3831,139.9 +3832,132.3 +3833,135.5 +3834,127.2 +3835,130.4 +3836,134.8 +3837,136.5 +3838,147.4 +3839,138.7 +3840,132.8 +3841,135.5 +3842,130.9 +3843,133.0 +3844,134.2 +3845,130.9 +3846,135.1 +3847,131.6 +3848,131.4 +3849,130.2 +3850,131.2 +3851,142.2 +3852,142.8 +3853,134.5 +3854,131.2 +3855,129.9 +3856,130.8 +3857,132.5 +3858,138.0 +3859,140.1 +3860,135.5 +3861,132.0 +3862,124.6 +3863,124.3 +3864,129.6 +3865,137.5 +3866,137.8 +3867,143.7 +3868,131.7 +3869,131.9 +3870,130.6 +3871,133.0 +3872,138.3 +3873,137.5 +3874,141.0 +3875,130.3 +3876,133.3 +3877,128.0 +3878,134.8 +3879,143.0 +3880,138.8 +3881,136.5 +3882,133.4 +3883,127.9 +3884,130.0 +3885,142.0 +3886,136.8 +3887,143.9 +3888,134.7 +3889,139.5 +3890,131.4 +3891,127.3 +3892,140.9 +3893,143.8 +3894,146.4 +3895,142.2 +3896,133.0 +3897,139.4 +3898,123.4 +3899,142.8 +3900,150.9 +3901,152.9 +3902,147.4 +3903,137.0 +3904,141.7 +3905,134.4 +3906,146.7 +3907,154.2 +3908,150.8 +3909,145.8 +3910,143.2 +3911,140.4 +3912,143.8 +3913,142.8 +3914,151.4 +3915,152.3 +3916,152.7 +3917,150.1 +3918,145.1 +3919,143.3 +3920,154.2 +3921,156.7 +3922,151.0 +3923,153.4 +3924,155.7 +3925,147.0 +3926,141.3 +3927,155.7 +3928,158.1 +3929,159.9 +3930,152.8 +3931,148.8 +3932,146.9 +3933,146.5 +3934,154.1 +3935,153.8 +3936,161.4 +3937,158.4 +3938,157.3 +3939,154.5 +3940,146.5 +3941,158.5 +3942,170.0 +3943,169.0 +3944,164.1 +3945,162.1 +3946,159.3 +3947,161.1 +3948,167.9 +3949,167.6 +3950,165.9 +3951,168.8 +3952,164.1 +3953,156.5 +3954,160.3 +3955,161.1 +3956,173.9 +3957,170.6 +3958,170.1 +3959,170.0 +3960,162.4 +3961,158.1 +3962,169.4 +3963,173.9 +3964,168.6 +3965,170.4 +3966,167.6 +3967,157.0 +3968,164.6 +3969,164.5 +3970,179.8 +3971,171.7 +3972,176.8 +3973,164.0 +3974,169.9 +3975,171.8 +3976,172.7 +3977,177.6 +3978,183.0 +3979,176.2 +3980,167.0 +3981,174.4 +3982,170.8 +3983,179.5 +3984,179.5 +3985,181.9 +3986,186.2 +3987,169.0 +3988,171.2 +3989,173.5 +3990,179.2 +3991,182.4 +3992,186.2 +3993,184.8 +3994,180.1 +3995,173.7 +3996,168.0 +3997,178.3 +3998,176.4 +3999,185.9 +4000,184.4 +4001,178.9 +4002,181.7 +4003,181.6 +4004,175.3 +4005,180.5 +4006,180.2 +4007,190.5 +4008,181.8 +4009,169.2 +4010,178.4 +4011,182.1 +4012,194.3 +4013,189.1 +4014,190.3 +4015,188.2 +4016,174.2 +4017,185.6 +4018,189.4 +4019,185.4 +4020,186.5 +4021,193.7 +4022,189.2 +4023,177.1 +4024,175.8 +4025,189.2 +4026,194.3 +4027,189.1 +4028,182.7 +4029,187.0 +4030,185.2 +4031,175.2 +4032,181.3 +4033,185.9 +4034,185.5 +4035,190.0 +4036,186.2 +4037,185.1 +4038,173.9 +4039,186.3 +4040,188.7 +4041,191.2 +4042,191.3 +4043,182.6 +4044,176.7 +4045,180.6 +4046,185.6 +4047,188.1 +4048,188.1 +4049,188.0 +4050,176.7 +4051,184.2 +4052,179.4 +4053,179.1 +4054,188.2 +4055,188.0 +4056,190.3 +4057,184.7 +4058,176.6 +4059,183.4 +4060,180.8 +4061,180.9 +4062,188.3 +4063,190.5 +4064,177.1 +4065,175.7 +4066,178.0 +4067,189.4 +4068,187.9 +4069,192.5 +4070,182.4 +4071,178.7 +4072,169.6 +4073,173.8 +4074,175.0 +4075,182.8 +4076,183.1 +4077,176.6 +4078,177.1 +4079,167.1 +4080,177.7 +4081,169.7 +4082,179.1 +4083,183.4 +4084,179.8 +4085,172.9 +4086,168.2 +4087,171.3 +4088,171.7 +4089,180.9 +4090,181.1 +4091,173.6 +4092,172.2 +4093,173.6 +4094,174.4 +4095,167.3 +4096,179.6 +4097,185.3 +4098,181.6 +4099,171.3 +4100,165.7 +4101,165.8 +4102,172.1 +4103,181.2 +4104,177.0 +4105,182.5 +4106,164.2 +4107,167.1 +4108,162.3 +4109,171.6 +4110,179.1 +4111,170.2 +4112,170.0 +4113,167.0 +4114,158.9 +4115,162.4 +4116,170.5 +4117,172.0 +4118,166.1 +4119,161.5 +4120,158.6 +4121,156.1 +4122,157.9 +4123,164.6 +4124,155.6 +4125,167.0 +4126,162.0 +4127,154.0 +4128,153.9 +4129,153.5 +4130,157.2 +4131,161.3 +4132,169.7 +4133,168.1 +4134,159.1 +4135,148.4 +4136,152.8 +4137,154.4 +4138,159.4 +4139,161.1 +4140,161.7 +4141,151.2 +4142,149.2 +4143,145.2 +4144,153.4 +4145,159.6 +4146,162.7 +4147,154.2 +4148,145.5 +4149,142.9 +4150,150.4 +4151,151.2 +4152,163.9 +4153,158.0 +4154,156.0 +4155,152.7 +4156,138.9 +4157,147.5 +4158,150.1 +4159,154.3 +4160,154.4 +4161,152.4 +4162,138.7 +4163,137.9 +4164,137.6 +4165,148.5 +4166,154.9 +4167,150.4 +4168,148.0 +4169,150.7 +4170,138.6 +4171,132.1 +4172,149.4 +4173,151.7 +4174,149.2 +4175,151.6 +4176,135.1 +4177,139.6 +4178,142.9 +4179,136.6 +4180,153.9 +4181,147.1 +4182,142.5 +4183,134.1 +4184,141.2 +4185,136.3 +4186,141.6 +4187,145.2 +4188,140.7 +4189,143.3 +4190,139.6 +4191,132.9 +4192,131.3 +4193,136.7 +4194,144.8 +4195,139.4 +4196,142.8 +4197,140.3 +4198,129.0 +4199,136.9 +4200,137.9 +4201,144.3 +4202,143.2 +4203,139.4 +4204,141.2 +4205,134.0 +4206,134.9 +4207,137.1 +4208,146.4 +4209,150.8 +4210,143.0 +4211,134.7 +4212,129.2 +4213,125.5 +4214,142.6 +4215,138.0 +4216,145.4 +4217,140.9 +4218,142.1 +4219,132.2 +4220,139.7 +4221,139.6 +4222,147.9 +4223,141.1 +4224,142.7 +4225,130.9 +4226,138.4 +4227,136.3 +4228,142.3 +4229,138.4 +4230,141.6 +4231,136.6 +4232,141.3 +4233,131.4 +4234,134.7 +4235,136.8 +4236,143.4 +4237,136.9 +4238,142.0 +4239,131.5 +4240,137.2 +4241,134.2 +4242,142.3 +4243,139.7 +4244,145.7 +4245,136.8 +4246,142.8 +4247,131.6 +4248,139.4 +4249,139.1 +4250,139.1 +4251,142.5 +4252,138.7 +4253,132.9 +4254,137.7 +4255,134.3 +4256,140.0 +4257,152.3 +4258,155.6 +4259,144.0 +4260,142.3 +4261,139.4 +4262,139.8 +4263,143.5 +4264,157.2 +4265,145.7 +4266,148.8 +4267,150.9 +4268,139.3 +4269,136.5 +4270,140.2 +4271,149.1 +4272,152.2 +4273,148.1 +4274,145.0 +4275,138.8 +4276,139.8 +4277,144.2 +4278,147.8 +4279,154.3 +4280,150.6 +4281,149.2 +4282,146.0 +4283,147.4 +4284,146.2 +4285,152.8 +4286,153.8 +4287,160.6 +4288,149.0 +4289,149.2 +4290,144.7 +4291,153.6 +4292,156.9 +4293,162.7 +4294,160.4 +4295,156.9 +4296,149.4 +4297,155.6 +4298,163.7 +4299,166.7 +4300,169.0 +4301,162.9 +4302,156.1 +4303,153.8 +4304,157.0 +4305,160.9 +4306,166.3 +4307,168.5 +4308,162.5 +4309,158.3 +4310,159.0 +4311,158.7 +4312,158.9 +4313,174.1 +4314,164.2 +4315,169.4 +4316,160.7 +4317,155.7 +4318,154.9 +4319,169.1 +4320,176.0 +4321,170.9 +4322,169.7 +4323,170.8 +4324,162.5 +4325,172.6 +4326,162.6 +4327,167.0 +4328,176.0 +4329,173.8 +4330,169.3 +4331,161.4 +4332,162.0 +4333,170.9 +4334,177.2 +4335,182.0 +4336,176.1 +4337,169.2 +4338,162.4 +4339,169.3 +4340,172.5 +4341,178.0 +4342,176.1 +4343,184.3 +4344,180.8 +4345,174.4 +4346,174.1 +4347,182.2 +4348,174.9 +4349,180.2 +4350,180.7 +4351,184.8 +4352,177.2 +4353,180.8 +4354,172.1 +4355,194.6 +4356,190.9 +4357,185.3 +4358,178.9 +4359,174.3 +4360,181.6 +4361,183.3 +4362,183.3 +4363,185.1 +4364,184.9 +4365,173.0 +4366,178.0 +4367,176.5 +4368,190.6 +4369,186.2 +4370,196.2 +4371,187.7 +4372,182.9 +4373,182.1 +4374,180.0 +4375,194.5 +4376,186.3 +4377,192.2 +4378,187.3 +4379,185.8 +4380,177.8 +4381,179.2 +4382,190.1 +4383,193.2 +4384,196.2 +4385,192.7 +4386,188.8 +4387,178.6 +4388,182.0 +4389,190.4 +4390,193.1 +4391,187.8 +4392,186.9 +4393,182.9 +4394,175.7 +4395,186.6 +4396,188.8 +4397,195.9 +4398,190.8 +4399,197.6 +4400,193.1 +4401,185.0 +4402,183.3 +4403,186.0 +4404,197.0 +4405,199.5 +4406,191.0 +4407,186.8 +4408,182.1 +4409,186.0 +4410,190.0 +4411,192.8 +4412,192.8 +4413,196.2 +4414,181.9 +4415,176.7 +4416,177.7 +4417,187.6 +4418,188.7 +4419,200.1 +4420,190.5 +4421,182.4 +4422,180.4 +4423,185.9 +4424,191.9 +4425,192.0 +4426,190.3 +4427,188.2 +4428,183.8 +4429,179.1 +4430,181.2 +4431,183.5 +4432,183.7 +4433,189.6 +4434,188.4 +4435,174.1 +4436,177.4 +4437,185.8 +4438,179.0 +4439,185.4 +4440,198.9 +4441,184.8 +4442,184.7 +4443,177.3 +4444,184.2 +4445,176.6 +4446,178.7 +4447,189.8 +4448,184.8 +4449,183.9 +4450,174.9 +4451,174.7 +4452,178.4 +4453,184.7 +4454,184.8 +4455,172.7 +4456,178.8 +4457,173.7 +4458,169.6 +4459,181.2 +4460,181.5 +4461,172.8 +4462,180.2 +4463,175.1 +4464,168.5 +4465,174.9 +4466,182.1 +4467,179.5 +4468,182.7 +4469,180.0 +4470,174.0 +4471,163.8 +4472,167.9 +4473,176.0 +4474,170.0 +4475,177.0 +4476,171.7 +4477,169.3 +4478,162.8 +4479,169.5 +4480,163.6 +4481,168.0 +4482,176.4 +4483,173.1 +4484,164.7 +4485,161.8 +4486,159.2 +4487,169.0 +4488,175.9 +4489,170.6 +4490,168.7 +4491,154.8 +4492,161.1 +4493,158.3 +4494,163.7 +4495,165.7 +4496,176.2 +4497,166.0 +4498,165.6 +4499,161.2 +4500,158.2 +4501,156.7 +4502,158.1 +4503,165.7 +4504,159.9 +4505,154.9 +4506,154.0 +4507,152.8 +4508,155.2 +4509,159.1 +4510,169.1 +4511,165.0 +4512,155.1 +4513,153.5 +4514,162.3 +4515,158.7 +4516,163.4 +4517,158.3 +4518,160.8 +4519,149.2 +4520,146.5 +4521,149.6 +4522,146.3 +4523,158.9 +4524,150.7 +4525,149.2 +4526,148.7 +4527,144.5 +4528,146.9 +4529,155.3 +4530,160.7 +4531,148.5 +4532,152.2 +4533,147.0 +4534,143.6 +4535,140.7 +4536,148.7 +4537,155.9 +4538,149.0 +4539,147.7 +4540,150.4 +4541,140.6 +4542,150.8 +4543,146.3 +4544,147.9 +4545,145.5 +4546,152.4 +4547,141.7 +4548,127.5 +4549,138.5 +4550,139.6 +4551,151.2 +4552,145.5 +4553,143.4 +4554,136.3 +4555,129.4 +4556,144.2 +4557,139.2 +4558,144.1 +4559,145.2 +4560,142.5 +4561,136.9 +4562,136.0 +4563,138.7 +4564,148.6 +4565,147.0 +4566,150.8 +4567,140.4 +4568,140.9 +4569,136.0 +4570,137.7 +4571,145.7 +4572,145.3 +4573,138.8 +4574,146.1 +4575,138.5 +4576,130.4 +4577,136.0 +4578,141.3 +4579,153.3 +4580,145.1 +4581,144.6 +4582,140.6 +4583,134.7 +4584,138.0 +4585,141.2 +4586,143.5 +4587,151.8 +4588,142.6 +4589,145.5 +4590,126.6 +4591,144.3 +4592,135.0 +4593,146.8 +4594,147.8 +4595,143.8 +4596,137.2 +4597,133.4 +4598,137.8 +4599,144.4 +4600,139.9 +4601,149.2 +4602,145.4 +4603,142.2 +4604,138.8 +4605,141.5 +4606,144.9 +4607,143.7 +4608,142.9 +4609,145.9 +4610,146.2 +4611,135.6 +4612,143.9 +4613,147.8 +4614,145.7 +4615,154.3 +4616,148.4 +4617,145.9 +4618,141.0 +4619,136.3 +4620,143.9 +4621,147.2 +4622,148.4 +4623,151.4 +4624,141.2 +4625,145.6 +4626,138.9 +4627,147.8 +4628,154.0 +4629,162.6 +4630,150.8 +4631,146.9 +4632,145.0 +4633,140.4 +4634,154.4 +4635,165.6 +4636,161.6 +4637,152.7 +4638,144.0 +4639,138.4 +4640,144.2 +4641,157.3 +4642,156.3 +4643,152.0 +4644,160.0 +4645,152.5 +4646,151.4 +4647,152.0 +4648,150.3 +4649,169.2 +4650,160.8 +4651,152.7 +4652,162.1 +4653,147.9 +4654,145.8 +4655,158.3 +4656,166.1 +4657,170.4 +4658,164.5 +4659,153.9 +4660,155.5 +4661,150.9 +4662,163.9 +4663,164.4 +4664,165.6 +4665,163.2 +4666,157.7 +4667,160.0 +4668,154.7 +4669,160.9 +4670,167.7 +4671,177.3 +4672,160.9 +4673,166.9 +4674,158.6 +4675,159.5 +4676,169.0 +4677,165.7 +4678,175.4 +4679,174.9 +4680,170.0 +4681,163.3 +4682,156.9 +4683,172.5 +4684,175.9 +4685,171.8 +4686,168.3 +4687,163.6 +4688,162.4 +4689,169.2 +4690,173.9 +4691,176.0 +4692,179.8 +4693,181.2 +4694,168.8 +4695,167.2 +4696,174.7 +4697,170.3 +4698,181.0 +4699,182.3 +4700,181.4 +4701,179.3 +4702,170.6 +4703,181.2 +4704,180.4 +4705,185.7 +4706,186.7 +4707,182.4 +4708,183.1 +4709,174.1 +4710,177.4 +4711,185.6 +4712,180.7 +4713,184.5 +4714,185.2 +4715,179.2 +4716,174.6 +4717,173.7 +4718,182.1 +4719,187.2 +4720,182.6 +4721,189.8 +4722,185.4 +4723,181.1 +4724,186.0 +4725,179.3 +4726,191.3 +4727,188.9 +4728,185.2 +4729,188.2 +4730,186.0 +4731,185.9 +4732,186.9 +4733,196.0 +4734,198.0 +4735,190.9 +4736,189.8 +4737,183.3 +4738,183.1 +4739,189.5 +4740,196.4 +4741,192.5 +4742,202.5 +4743,187.1 +4744,185.4 +4745,183.0 +4746,193.8 +4747,196.3 +4748,185.5 +4749,191.7 +4750,189.8 +4751,186.4 +4752,185.7 +4753,180.2 +4754,197.1 +4755,197.7 +4756,197.4 +4757,186.6 +4758,185.3 +4759,188.7 +4760,184.2 +4761,200.3 +4762,201.6 +4763,194.4 +4764,190.5 +4765,192.6 +4766,185.4 +4767,188.1 +4768,199.9 +4769,199.4 +4770,190.1 +4771,189.5 +4772,193.3 +4773,186.2 +4774,190.8 +4775,201.6 +4776,198.4 +4777,194.6 +4778,195.6 +4779,185.6 +4780,187.1 +4781,197.2 +4782,199.5 +4783,199.1 +4784,196.6 +4785,190.9 +4786,191.1 +4787,184.6 +4788,197.4 +4789,202.3 +4790,190.4 +4791,197.9 +4792,184.5 +4793,187.5 +4794,193.6 +4795,188.1 +4796,200.2 +4797,202.2 +4798,189.0 +4799,188.5 +4800,186.5 +4801,188.3 +4802,193.2 +4803,192.0 +4804,197.7 +4805,195.5 +4806,187.1 +4807,182.1 +4808,179.9 +4809,185.8 +4810,192.1 +4811,188.9 +4812,191.9 +4813,186.5 +4814,178.4 +4815,185.8 +4816,190.9 +4817,192.0 +4818,189.9 +4819,188.3 +4820,184.9 +4821,167.6 +4822,176.7 +4823,176.5 +4824,181.5 +4825,185.4 +4826,185.7 +4827,174.0 +4828,178.5 +4829,166.6 +4830,182.7 +4831,190.4 +4832,184.0 +4833,175.3 +4834,178.8 +4835,165.7 +4836,172.0 +4837,166.1 +4838,178.0 +4839,185.4 +4840,181.2 +4841,166.1 +4842,169.4 +4843,176.2 +4844,172.6 +4845,187.4 +4846,182.0 +4847,179.0 +4848,165.3 +4849,172.6 +4850,167.8 +4851,166.1 +4852,171.7 +4853,179.6 +4854,172.4 +4855,169.6 +4856,160.7 +4857,158.4 +4858,170.5 +4859,174.8 +4860,166.1 +4861,171.7 +4862,167.4 +4863,150.6 +4864,162.7 +4865,163.0 +4866,168.7 +4867,173.0 +4868,168.5 +4869,157.5 +4870,155.5 +4871,160.8 +4872,166.5 +4873,168.5 +4874,168.8 +4875,164.0 +4876,160.9 +4877,156.3 +4878,154.0 +4879,156.5 +4880,166.9 +4881,164.6 +4882,160.9 +4883,154.1 +4884,155.4 +4885,150.2 +4886,157.0 +4887,158.4 +4888,170.7 +4889,155.8 +4890,151.9 +4891,153.3 +4892,150.2 +4893,152.0 +4894,156.8 +4895,155.4 +4896,150.7 +4897,156.4 +4898,149.6 +4899,148.6 +4900,155.0 +4901,155.2 +4902,153.9 +4903,158.7 +4904,149.1 +4905,142.0 +4906,146.1 +4907,150.4 +4908,159.1 +4909,146.6 +4910,158.8 +4911,142.2 +4912,148.5 +4913,144.2 +4914,152.2 +4915,158.8 +4916,153.5 +4917,147.2 +4918,143.6 +4919,139.5 +4920,139.1 +4921,148.6 +4922,145.9 +4923,148.1 +4924,147.1 +4925,149.9 +4926,138.7 +4927,144.5 +4928,150.9 +4929,151.5 +4930,152.8 +4931,143.1 +4932,137.2 +4933,135.9 +4934,131.1 +4935,146.8 +4936,148.2 +4937,156.4 +4938,147.3 +4939,151.4 +4940,138.8 +4941,136.9 +4942,143.4 +4943,147.6 +4944,150.9 +4945,146.2 +4946,144.6 +4947,140.5 +4948,133.8 +4949,143.9 +4950,155.5 +4951,150.9 +4952,146.8 +4953,140.8 +4954,140.8 +4955,136.0 +4956,149.3 +4957,152.0 +4958,146.7 +4959,148.6 +4960,145.3 +4961,140.9 +4962,141.2 +4963,145.4 +4964,145.4 +4965,148.4 +4966,149.5 +4967,154.1 +4968,142.3 +4969,135.9 +4970,145.3 +4971,152.6 +4972,153.5 +4973,154.0 +4974,148.9 +4975,142.1 +4976,141.4 +4977,155.4 +4978,158.7 +4979,152.9 +4980,147.1 +4981,144.3 +4982,138.9 +4983,142.9 +4984,151.7 +4985,152.3 +4986,151.8 +4987,155.9 +4988,145.7 +4989,139.1 +4990,151.2 +4991,146.3 +4992,161.6 +4993,159.3 +4994,156.5 +4995,155.1 +4996,146.8 +4997,147.8 +4998,148.7 +4999,160.2 +5000,166.8 diff --git a/agents/evals/fixtures/cases/area-basic-pygal-renamed/case.json b/agents/evals/fixtures/cases/area-basic-pygal-renamed/case.json new file mode 100644 index 00000000000..c3ab7aa0010 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-renamed/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "area-basic", + "library": "pygal", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "x", + "column": "tag_nr" + }, + { + "role": "y", + "column": "energieverbrauch_mwh" + } + ], + "expected": "accepted", + "tags": [ + "area", + "renamed", + "synthetic", + "renamed-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, renamed)" +} diff --git a/agents/evals/fixtures/cases/area-basic-pygal-renamed/data.csv b/agents/evals/fixtures/cases/area-basic-pygal-renamed/data.csv new file mode 100644 index 00000000000..75a7dc51523 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-renamed/data.csv @@ -0,0 +1,91 @@ +tag_nr,energieverbrauch_mwh +1,147.6 +2,138.8 +3,153.7 +4,138.5 +5,135.4 +6,139.8 +7,144.9 +8,149.1 +9,145.9 +10,149.8 +11,141.8 +12,136.3 +13,147.1 +14,146.4 +15,151.6 +16,150.7 +17,151.2 +18,148.5 +19,141.4 +20,148.1 +21,135.8 +22,155.9 +23,150.1 +24,141.6 +25,142.0 +26,144.0 +27,134.5 +28,148.7 +29,150.0 +30,155.0 +31,150.4 +32,147.5 +33,137.6 +34,136.6 +35,150.9 +36,153.8 +37,155.0 +38,147.6 +39,140.9 +40,133.6 +41,137.7 +42,145.8 +43,150.2 +44,151.6 +45,144.1 +46,138.2 +47,131.3 +48,132.4 +49,147.6 +50,139.6 +51,149.7 +52,148.4 +53,147.5 +54,136.8 +55,140.6 +56,143.1 +57,146.2 +58,145.5 +59,144.4 +60,137.4 +61,138.5 +62,135.2 +63,143.3 +64,150.2 +65,150.4 +66,136.3 +67,136.5 +68,133.9 +69,126.3 +70,136.2 +71,130.1 +72,141.8 +73,134.3 +74,135.7 +75,130.6 +76,124.6 +77,135.2 +78,137.1 +79,140.5 +80,131.2 +81,124.6 +82,122.6 +83,126.2 +84,137.7 +85,130.4 +86,135.6 +87,138.5 +88,131.9 +89,121.7 +90,130.0 diff --git a/agents/evals/fixtures/cases/area-basic-pygal-x10/case.json b/agents/evals/fixtures/cases/area-basic-pygal-x10/case.json new file mode 100644 index 00000000000..1a93389c9b9 --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "area-basic", + "library": "pygal", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "x", + "column": "Day" + }, + { + "role": "y", + "column": "Energy Use (MWh)" + } + ], + "expected": "accepted", + "tags": [ + "area", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 707, x10)" +} diff --git a/agents/evals/fixtures/cases/area-basic-pygal-x10/data.csv b/agents/evals/fixtures/cases/area-basic-pygal-x10/data.csv new file mode 100644 index 00000000000..f682e5e763f --- /dev/null +++ b/agents/evals/fixtures/cases/area-basic-pygal-x10/data.csv @@ -0,0 +1,91 @@ +Day,Energy Use (MWh) +1,1475.9 +2,1388.3 +3,1537.1 +4,1385.2 +5,1353.8 +6,1398.0 +7,1449.3 +8,1491.3 +9,1458.8 +10,1497.6 +11,1417.8 +12,1362.7 +13,1470.7 +14,1463.8 +15,1515.9 +16,1507.2 +17,1512.1 +18,1485.4 +19,1413.7 +20,1480.8 +21,1357.7 +22,1559.1 +23,1500.7 +24,1415.7 +25,1419.6 +26,1439.9 +27,1344.7 +28,1487.3 +29,1500.4 +30,1550.3 +31,1503.8 +32,1474.9 +33,1376.2 +34,1365.8 +35,1509.0 +36,1538.3 +37,1549.6 +38,1475.8 +39,1409.0 +40,1336.1 +41,1377.1 +42,1457.7 +43,1501.7 +44,1515.7 +45,1441.2 +46,1381.8 +47,1313.3 +48,1324.1 +49,1476.4 +50,1396.2 +51,1497.0 +52,1483.5 +53,1475.3 +54,1367.9 +55,1406.2 +56,1431.5 +57,1461.8 +58,1455.4 +59,1443.5 +60,1374.5 +61,1385.0 +62,1352.2 +63,1432.8 +64,1502.3 +65,1504.2 +66,1363.2 +67,1364.6 +68,1339.4 +69,1263.1 +70,1361.9 +71,1300.9 +72,1417.7 +73,1343.3 +74,1357.0 +75,1306.4 +76,1246.5 +77,1352.1 +78,1370.6 +79,1404.8 +80,1311.9 +81,1246.4 +82,1226.3 +83,1262.0 +84,1377.2 +85,1303.9 +86,1356.0 +87,1384.5 +88,1319.0 +89,1217.3 +90,1300.0 diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-date/case.json b/agents/evals/fixtures/cases/bar-grouped-letsplot-date/case.json new file mode 100644 index 00000000000..0d5da5c83ea --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-date/case.json @@ -0,0 +1,30 @@ +{ + "spec_id": "bar-grouped", + "library": "letsplot", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "category", + "column": "Subject" + }, + { + "role": "group", + "column": "Grade Level" + }, + { + "role": "value", + "column": "Test Score" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, date)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-date/data.csv b/agents/evals/fixtures/cases/bar-grouped-letsplot-date/data.csv new file mode 100644 index 00000000000..c6a44301168 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-date/data.csv @@ -0,0 +1,16 @@ +Subject,Grade Level,Test Score,Exam Date,Graded On +Mathematics,Grade 7,66.1,21.01.2026,2026-01-23 +Mathematics,Grade 8,69.9,13.06.2026,2026-06-15 +Mathematics,Grade 9,71.8,22.05.2026,2026-05-22 +Physics,Grade 7,64.6,23.01.2026,2026-01-24 +Physics,Grade 8,65.3,21.02.2026,2026-02-21 +Physics,Grade 9,74.1,23.04.2026,2026-04-25 +Chemistry,Grade 7,63.4,22.04.2026,2026-04-23 +Chemistry,Grade 8,66.5,17.03.2026,2026-03-20 +Chemistry,Grade 9,68.7,01.02.2026,2026-02-04 +Biology,Grade 7,73.0,10.03.2026,2026-03-10 +Biology,Grade 8,72.1,03.03.2026,2026-03-04 +Biology,Grade 9,80.7,20.06.2026,2026-06-23 +History,Grade 7,73.0,10.02.2026,2026-02-13 +History,Grade 8,79.9,30.05.2026,2026-05-31 +History,Grade 9,85.8,03.06.2026,2026-06-05 diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-decimal-comma/case.json b/agents/evals/fixtures/cases/bar-grouped-letsplot-decimal-comma/case.json new file mode 100644 index 00000000000..c64baa51a5b --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-decimal-comma/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "bar-grouped", + "library": "letsplot", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "category", + "column": "Subject" + }, + { + "role": "group", + "column": "Grade Level" + }, + { + "role": "value", + "column": "Test Score" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-decimal-comma/data.csv b/agents/evals/fixtures/cases/bar-grouped-letsplot-decimal-comma/data.csv new file mode 100644 index 00000000000..5a4fdf74c57 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-decimal-comma/data.csv @@ -0,0 +1,16 @@ +Subject;Grade Level;Test Score +Mathematics;Grade 7;66,1 +Mathematics;Grade 8;69,9 +Mathematics;Grade 9;71,8 +Physics;Grade 7;64,6 +Physics;Grade 8;65,3 +Physics;Grade 9;74,1 +Chemistry;Grade 7;63,4 +Chemistry;Grade 8;66,5 +Chemistry;Grade 9;68,7 +Biology;Grade 7;73,0 +Biology;Grade 8;72,1 +Biology;Grade 9;80,7 +History;Grade 7;73,0 +History;Grade 8;79,9 +History;Grade 9;85,8 diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-n12/case.json b/agents/evals/fixtures/cases/bar-grouped-letsplot-n12/case.json new file mode 100644 index 00000000000..c710f740fbe --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-n12/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "bar-grouped", + "library": "letsplot", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "category", + "column": "Subject" + }, + { + "role": "group", + "column": "Grade Level" + }, + { + "role": "value", + "column": "Test Score" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, n12)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-n12/data.csv b/agents/evals/fixtures/cases/bar-grouped-letsplot-n12/data.csv new file mode 100644 index 00000000000..056babdf94d --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-n12/data.csv @@ -0,0 +1,13 @@ +Subject,Grade Level,Test Score +Mathematics,Grade 7,66.1 +Mathematics,Grade 8,70.9 +Mathematics,Grade 9,75.3 +Physics,Grade 7,66.7 +Physics,Grade 8,63.5 +Physics,Grade 9,73.7 +Chemistry,Grade 7,69.1 +Chemistry,Grade 8,69.7 +Chemistry,Grade 9,75.1 +Biology,Grade 7,71.7 +Biology,Grade 8,76.4 +Biology,Grade 9,77.3 diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-n5000/case.json b/agents/evals/fixtures/cases/bar-grouped-letsplot-n5000/case.json new file mode 100644 index 00000000000..55ca6561385 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-n5000/case.json @@ -0,0 +1,29 @@ +{ + "spec_id": "bar-grouped", + "library": "letsplot", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "category", + "column": "Subject" + }, + { + "role": "group", + "column": "Grade Level" + }, + { + "role": "value", + "column": "Test Score" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "n5000", + "synthetic", + "large", + "aggregation" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, n5000)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-n5000/data.csv b/agents/evals/fixtures/cases/bar-grouped-letsplot-n5000/data.csv new file mode 100644 index 00000000000..aaee49deb42 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-n5000/data.csv @@ -0,0 +1,5001 @@ +Subject,Grade Level,Test Score +History,Grade 9,91.7 +Physics,Grade 9,48.8 +Mathematics,Grade 8,61.5 +Mathematics,Grade 9,66.2 +Mathematics,Grade 9,63.3 +Physics,Grade 9,69.9 +History,Grade 8,84.7 +Biology,Grade 8,67.7 +Chemistry,Grade 9,71.1 +Mathematics,Grade 9,60.9 +Physics,Grade 9,62.6 +History,Grade 8,92.3 +Physics,Grade 7,48.6 +Biology,Grade 7,68.0 +Mathematics,Grade 9,71.5 +Physics,Grade 9,60.5 +History,Grade 9,68.7 +Biology,Grade 8,73.5 +Biology,Grade 9,77.4 +Biology,Grade 8,95.1 +History,Grade 8,78.0 +Mathematics,Grade 9,72.4 +History,Grade 7,75.8 +Chemistry,Grade 9,81.9 +History,Grade 7,76.0 +Physics,Grade 8,69.9 +Chemistry,Grade 9,70.7 +Chemistry,Grade 8,88.3 +Mathematics,Grade 9,58.3 +History,Grade 9,85.1 +Biology,Grade 8,69.9 +Physics,Grade 8,63.3 +Mathematics,Grade 9,84.1 +Chemistry,Grade 9,66.6 +Physics,Grade 9,63.1 +Mathematics,Grade 7,85.8 +Mathematics,Grade 8,78.7 +Biology,Grade 8,73.1 +History,Grade 8,66.1 +Biology,Grade 7,81.5 +History,Grade 7,88.2 +Chemistry,Grade 7,52.9 +Physics,Grade 8,67.4 +History,Grade 9,79.3 +Biology,Grade 9,67.5 +Mathematics,Grade 7,62.9 +Mathematics,Grade 7,51.0 +Biology,Grade 8,54.8 +History,Grade 8,59.6 +Chemistry,Grade 9,67.6 +Chemistry,Grade 8,64.8 +Chemistry,Grade 9,70.0 +Mathematics,Grade 7,56.8 +Biology,Grade 9,77.2 +Chemistry,Grade 9,71.6 +Biology,Grade 9,94.1 +Chemistry,Grade 7,77.2 +History,Grade 9,73.5 +Mathematics,Grade 7,70.7 +Chemistry,Grade 9,82.5 +Biology,Grade 9,72.3 +Biology,Grade 7,60.8 +Chemistry,Grade 7,53.3 +History,Grade 8,84.6 +History,Grade 8,62.9 +Physics,Grade 7,63.9 +Biology,Grade 7,78.5 +Physics,Grade 7,66.2 +Physics,Grade 9,70.0 +History,Grade 9,84.4 +Mathematics,Grade 7,76.4 +Chemistry,Grade 8,68.6 +History,Grade 9,89.7 +Chemistry,Grade 8,84.3 +History,Grade 9,78.1 +Biology,Grade 8,69.9 +Physics,Grade 8,49.0 +Mathematics,Grade 7,72.8 +History,Grade 8,86.4 +Biology,Grade 7,69.5 +History,Grade 8,98.4 +Physics,Grade 7,68.3 +Chemistry,Grade 9,75.0 +Biology,Grade 8,73.0 +Chemistry,Grade 8,65.2 +Mathematics,Grade 7,51.3 +Mathematics,Grade 9,83.3 +Mathematics,Grade 8,67.1 +History,Grade 8,56.2 +Mathematics,Grade 8,73.6 +Biology,Grade 7,71.5 +History,Grade 9,74.1 +Biology,Grade 7,63.5 +Mathematics,Grade 9,61.6 +Physics,Grade 9,76.8 +Biology,Grade 8,53.8 +Chemistry,Grade 7,40.9 +Physics,Grade 7,62.0 +Biology,Grade 7,50.8 +Physics,Grade 9,76.4 +Mathematics,Grade 8,73.7 +Chemistry,Grade 7,78.4 +Mathematics,Grade 7,75.8 +Chemistry,Grade 8,82.7 +History,Grade 7,69.4 +Biology,Grade 8,75.3 +Chemistry,Grade 8,69.0 +Biology,Grade 9,79.7 +Physics,Grade 7,74.9 +Biology,Grade 8,81.0 +Physics,Grade 7,60.5 +History,Grade 8,87.0 +Physics,Grade 9,67.6 +Physics,Grade 8,70.6 +Mathematics,Grade 9,65.6 +Physics,Grade 7,64.4 +History,Grade 9,70.0 +Biology,Grade 8,63.2 +Mathematics,Grade 8,67.5 +Physics,Grade 7,65.1 +Biology,Grade 7,64.2 +Physics,Grade 7,53.9 +History,Grade 9,68.4 +Mathematics,Grade 8,82.0 +History,Grade 8,71.2 +Physics,Grade 8,67.2 +Mathematics,Grade 7,77.1 +History,Grade 9,88.4 +Physics,Grade 9,65.3 +History,Grade 7,84.8 +Chemistry,Grade 9,49.8 +Biology,Grade 8,76.5 +History,Grade 8,57.1 +Mathematics,Grade 9,78.0 +Biology,Grade 8,74.5 +Chemistry,Grade 9,63.0 +History,Grade 8,78.8 +Mathematics,Grade 7,68.3 +History,Grade 7,72.9 +Biology,Grade 8,87.5 +Biology,Grade 8,52.9 +History,Grade 9,91.8 +Biology,Grade 8,90.5 +Chemistry,Grade 7,64.1 +History,Grade 8,93.8 +Chemistry,Grade 7,87.8 +Biology,Grade 8,73.8 +Biology,Grade 7,57.7 +History,Grade 7,97.9 +Biology,Grade 9,67.9 +Chemistry,Grade 9,88.7 +Chemistry,Grade 9,82.9 +Mathematics,Grade 9,89.3 +Chemistry,Grade 9,76.8 +Mathematics,Grade 7,70.6 +Chemistry,Grade 7,54.0 +History,Grade 9,64.5 +Physics,Grade 8,69.2 +History,Grade 8,85.5 +Physics,Grade 7,61.3 +Chemistry,Grade 7,68.1 +Physics,Grade 9,65.0 +Chemistry,Grade 9,77.2 +Physics,Grade 7,70.0 +Physics,Grade 8,41.4 +Physics,Grade 7,56.8 +Physics,Grade 7,60.7 +History,Grade 7,68.3 +History,Grade 9,87.0 +Biology,Grade 9,89.1 +Chemistry,Grade 8,85.2 +History,Grade 7,92.6 +Mathematics,Grade 9,74.2 +Biology,Grade 7,72.5 +Chemistry,Grade 9,59.7 +Chemistry,Grade 7,54.6 +History,Grade 8,71.8 +Chemistry,Grade 9,57.0 +Mathematics,Grade 9,67.4 +Biology,Grade 9,74.6 +History,Grade 9,78.5 +Biology,Grade 8,76.9 +Mathematics,Grade 8,72.5 +Chemistry,Grade 7,67.8 +History,Grade 7,51.3 +Biology,Grade 7,76.8 +Chemistry,Grade 7,46.4 +Biology,Grade 9,75.4 +History,Grade 8,67.2 +Chemistry,Grade 9,69.1 +Physics,Grade 7,56.2 +Biology,Grade 7,69.6 +Physics,Grade 8,76.7 +Chemistry,Grade 7,67.4 +Chemistry,Grade 8,95.3 +Chemistry,Grade 8,65.5 +Chemistry,Grade 7,71.9 +History,Grade 7,60.6 +Mathematics,Grade 7,76.0 +Physics,Grade 7,60.0 +Chemistry,Grade 8,50.1 +Chemistry,Grade 7,64.6 +Chemistry,Grade 9,70.4 +Chemistry,Grade 9,90.6 +History,Grade 7,64.8 +Chemistry,Grade 7,76.7 +History,Grade 8,83.1 +Physics,Grade 8,76.1 +History,Grade 8,80.0 +Physics,Grade 9,73.7 +Chemistry,Grade 9,90.4 +History,Grade 8,89.7 +Mathematics,Grade 9,83.9 +Biology,Grade 9,65.4 +Physics,Grade 7,57.8 +Physics,Grade 9,62.8 +Physics,Grade 9,71.3 +Chemistry,Grade 8,88.8 +Biology,Grade 9,88.0 +Mathematics,Grade 9,70.8 +History,Grade 7,90.7 +Biology,Grade 7,64.3 +Mathematics,Grade 7,60.2 +Physics,Grade 8,52.6 +Mathematics,Grade 8,80.6 +Chemistry,Grade 7,53.2 +Physics,Grade 9,47.7 +History,Grade 9,71.9 +Chemistry,Grade 9,64.3 +Mathematics,Grade 9,70.7 +Physics,Grade 9,64.0 +Physics,Grade 9,66.3 +Biology,Grade 9,67.5 +Mathematics,Grade 9,58.3 +Chemistry,Grade 9,78.2 +Mathematics,Grade 7,57.9 +History,Grade 7,70.8 +Physics,Grade 7,57.4 +Biology,Grade 7,68.5 +Mathematics,Grade 7,63.9 +Biology,Grade 9,80.3 +Physics,Grade 7,52.6 +History,Grade 7,66.7 +Chemistry,Grade 7,43.2 +Mathematics,Grade 9,78.4 +Chemistry,Grade 9,68.3 +History,Grade 7,81.7 +Physics,Grade 8,43.2 +Chemistry,Grade 9,57.0 +Chemistry,Grade 8,51.2 +Chemistry,Grade 7,84.6 +Mathematics,Grade 8,78.4 +History,Grade 8,84.8 +Mathematics,Grade 9,64.4 +Physics,Grade 8,64.4 +History,Grade 7,74.8 +Physics,Grade 8,72.5 +Biology,Grade 8,62.1 +Physics,Grade 7,89.3 +Mathematics,Grade 8,62.2 +Physics,Grade 9,69.9 +Chemistry,Grade 7,68.5 +Physics,Grade 9,39.4 +Biology,Grade 7,95.7 +History,Grade 7,56.9 +History,Grade 8,80.9 +History,Grade 8,81.5 +Biology,Grade 8,79.5 +Chemistry,Grade 8,69.5 +Chemistry,Grade 9,72.4 +Mathematics,Grade 8,62.2 +Chemistry,Grade 8,61.4 +Biology,Grade 9,83.6 +History,Grade 8,86.5 +Physics,Grade 7,76.7 +Physics,Grade 7,47.1 +History,Grade 7,77.8 +Physics,Grade 9,75.8 +Biology,Grade 9,72.8 +History,Grade 9,83.4 +Chemistry,Grade 9,90.8 +Biology,Grade 8,75.0 +Physics,Grade 8,80.1 +Biology,Grade 7,54.8 +Biology,Grade 8,89.6 +History,Grade 7,68.4 +Physics,Grade 8,53.4 +Biology,Grade 9,95.6 +History,Grade 7,79.5 +Chemistry,Grade 7,91.9 +Biology,Grade 8,83.1 +Physics,Grade 9,74.3 +Chemistry,Grade 8,71.7 +Biology,Grade 9,96.6 +History,Grade 9,77.6 +Mathematics,Grade 7,73.7 +Biology,Grade 9,84.2 +Biology,Grade 8,57.8 +Mathematics,Grade 9,80.1 +Physics,Grade 9,78.0 +Physics,Grade 9,83.0 +Physics,Grade 7,73.2 +Biology,Grade 7,50.9 +History,Grade 8,81.7 +Biology,Grade 8,100.0 +Chemistry,Grade 7,69.6 +History,Grade 7,72.0 +Physics,Grade 8,85.9 +Chemistry,Grade 9,74.6 +History,Grade 9,69.3 +Physics,Grade 7,62.5 +Biology,Grade 9,77.8 +Physics,Grade 9,75.3 +Mathematics,Grade 9,65.1 +Chemistry,Grade 7,69.2 +Biology,Grade 8,52.2 +Mathematics,Grade 8,72.6 +Mathematics,Grade 8,78.0 +Mathematics,Grade 7,63.9 +Mathematics,Grade 8,54.6 +Chemistry,Grade 7,65.8 +Chemistry,Grade 9,86.2 +Biology,Grade 8,56.2 +Physics,Grade 8,63.0 +Mathematics,Grade 8,91.1 +Biology,Grade 8,59.2 +History,Grade 7,88.5 +Biology,Grade 7,69.1 +History,Grade 7,80.1 +Mathematics,Grade 8,51.8 +Physics,Grade 8,71.0 +Biology,Grade 9,86.5 +Physics,Grade 9,61.8 +Biology,Grade 9,83.2 +Chemistry,Grade 8,68.3 +History,Grade 8,76.6 +Biology,Grade 7,78.3 +Biology,Grade 9,62.1 +Physics,Grade 7,65.9 +Biology,Grade 9,89.7 +Physics,Grade 9,65.0 +Biology,Grade 7,72.6 +Mathematics,Grade 7,88.8 +Chemistry,Grade 9,56.5 +Chemistry,Grade 7,58.6 +Biology,Grade 7,74.5 +Biology,Grade 8,75.2 +Chemistry,Grade 8,52.4 +Mathematics,Grade 9,76.3 +Biology,Grade 9,72.3 +History,Grade 8,84.3 +Mathematics,Grade 9,56.0 +Chemistry,Grade 9,57.4 +Mathematics,Grade 8,45.3 +Mathematics,Grade 7,87.1 +Biology,Grade 8,72.5 +History,Grade 8,79.5 +History,Grade 9,86.8 +Physics,Grade 9,47.5 +Physics,Grade 8,64.9 +History,Grade 9,70.5 +History,Grade 8,88.6 +Mathematics,Grade 8,84.4 +Biology,Grade 8,61.8 +History,Grade 9,88.8 +History,Grade 9,61.0 +History,Grade 8,75.5 +Mathematics,Grade 8,73.8 +History,Grade 7,77.4 +Mathematics,Grade 9,73.6 +Biology,Grade 7,65.3 +Biology,Grade 8,77.6 +History,Grade 9,77.1 +Mathematics,Grade 8,58.2 +Physics,Grade 8,68.1 +Physics,Grade 7,69.6 +History,Grade 9,77.6 +History,Grade 8,94.0 +Mathematics,Grade 7,68.8 +Mathematics,Grade 7,96.2 +Mathematics,Grade 7,66.6 +Biology,Grade 7,67.0 +History,Grade 9,74.9 +Chemistry,Grade 8,74.8 +History,Grade 8,95.3 +History,Grade 8,89.0 +History,Grade 9,79.8 +Chemistry,Grade 7,65.1 +Mathematics,Grade 7,74.4 +History,Grade 8,85.0 +Mathematics,Grade 7,86.1 +History,Grade 9,75.4 +Mathematics,Grade 8,58.3 +Chemistry,Grade 7,54.1 +History,Grade 7,83.2 +Physics,Grade 8,61.6 +Mathematics,Grade 7,88.0 +Physics,Grade 8,75.3 +Chemistry,Grade 8,72.9 +Biology,Grade 9,56.5 +Physics,Grade 7,78.6 +History,Grade 9,81.5 +Mathematics,Grade 9,73.0 +History,Grade 7,66.6 +Physics,Grade 7,46.2 +Biology,Grade 8,82.9 +Physics,Grade 9,78.2 +History,Grade 8,88.0 +History,Grade 7,72.3 +Chemistry,Grade 7,64.8 +History,Grade 7,83.3 +Biology,Grade 7,81.2 +Chemistry,Grade 7,76.6 +Physics,Grade 9,60.1 +History,Grade 8,66.2 +Biology,Grade 8,91.5 +Mathematics,Grade 8,74.7 +History,Grade 9,85.0 +Chemistry,Grade 8,60.8 +History,Grade 7,88.8 +Biology,Grade 9,68.3 +Chemistry,Grade 9,79.0 +Mathematics,Grade 8,76.3 +Physics,Grade 7,65.4 +Chemistry,Grade 9,75.8 +Chemistry,Grade 8,50.2 +Physics,Grade 8,63.9 +Biology,Grade 8,73.3 +Mathematics,Grade 8,63.2 +Chemistry,Grade 8,50.5 +Mathematics,Grade 8,74.5 +Physics,Grade 9,67.3 +History,Grade 8,89.0 +History,Grade 7,61.5 +History,Grade 7,68.7 +Mathematics,Grade 9,71.4 +Chemistry,Grade 7,54.2 +Physics,Grade 7,68.1 +Biology,Grade 9,87.4 +Physics,Grade 9,70.9 +Chemistry,Grade 9,56.3 +History,Grade 7,89.3 +History,Grade 8,97.4 +Mathematics,Grade 8,86.8 +Mathematics,Grade 8,66.5 +Chemistry,Grade 8,70.1 +Chemistry,Grade 8,84.1 +Biology,Grade 7,71.8 +History,Grade 8,62.4 +History,Grade 8,75.2 +History,Grade 8,71.9 +Mathematics,Grade 9,78.4 +Mathematics,Grade 9,85.3 +History,Grade 7,89.1 +History,Grade 8,62.2 +Biology,Grade 7,81.2 +Chemistry,Grade 9,76.6 +Mathematics,Grade 9,62.9 +Physics,Grade 9,61.3 +Chemistry,Grade 7,58.7 +Chemistry,Grade 7,66.1 +Biology,Grade 9,66.3 +Biology,Grade 9,79.1 +History,Grade 8,75.0 +History,Grade 9,65.1 +Biology,Grade 9,70.4 +Biology,Grade 9,84.9 +Chemistry,Grade 7,57.1 +Biology,Grade 9,77.4 +History,Grade 8,75.9 +Biology,Grade 7,86.9 +Chemistry,Grade 9,70.7 +History,Grade 8,70.6 +Chemistry,Grade 7,50.8 +Chemistry,Grade 8,60.9 +Biology,Grade 9,60.1 +Chemistry,Grade 8,77.2 +Mathematics,Grade 7,44.4 +Biology,Grade 7,76.1 +Biology,Grade 7,55.3 +Biology,Grade 7,73.7 +Biology,Grade 7,71.2 +History,Grade 8,65.3 +Mathematics,Grade 8,62.1 +History,Grade 9,77.5 +Chemistry,Grade 7,63.8 +Physics,Grade 7,69.8 +Physics,Grade 8,61.8 +Biology,Grade 8,66.4 +Biology,Grade 7,89.4 +Biology,Grade 7,93.9 +Biology,Grade 7,78.9 +History,Grade 8,83.0 +Chemistry,Grade 8,73.9 +Mathematics,Grade 8,54.3 +History,Grade 9,66.6 +Physics,Grade 8,63.7 +History,Grade 7,74.3 +Mathematics,Grade 7,70.7 +Chemistry,Grade 7,82.6 +Mathematics,Grade 7,73.7 +Mathematics,Grade 7,66.6 +Physics,Grade 7,63.5 +Biology,Grade 9,71.0 +History,Grade 8,81.2 +History,Grade 9,90.6 +Mathematics,Grade 7,56.5 +Biology,Grade 7,74.1 +Chemistry,Grade 8,86.7 +Mathematics,Grade 8,70.9 +Biology,Grade 7,80.7 +Physics,Grade 7,70.9 +Mathematics,Grade 9,87.5 +Chemistry,Grade 9,62.5 +Physics,Grade 9,58.9 +Biology,Grade 7,62.6 +Mathematics,Grade 8,80.5 +History,Grade 7,74.1 +Biology,Grade 9,80.0 +History,Grade 7,71.9 +Chemistry,Grade 8,85.5 +Chemistry,Grade 9,67.1 +History,Grade 9,79.3 +Biology,Grade 8,67.3 +Physics,Grade 8,65.5 +Biology,Grade 9,72.8 +History,Grade 7,71.3 +History,Grade 9,77.6 +Mathematics,Grade 7,68.3 +Mathematics,Grade 8,82.9 +Mathematics,Grade 7,70.3 +Chemistry,Grade 7,47.8 +Mathematics,Grade 8,61.3 +Biology,Grade 9,84.4 +Chemistry,Grade 8,74.2 +History,Grade 8,65.5 +Chemistry,Grade 8,55.4 +Physics,Grade 9,76.6 +Physics,Grade 7,47.1 +Mathematics,Grade 9,59.7 +History,Grade 9,87.5 +Physics,Grade 8,54.2 +Chemistry,Grade 9,65.3 +Chemistry,Grade 8,62.4 +History,Grade 9,62.8 +History,Grade 7,73.4 +History,Grade 7,72.8 +Biology,Grade 8,71.4 +Biology,Grade 9,78.4 +Chemistry,Grade 7,66.7 +Physics,Grade 7,65.3 +Mathematics,Grade 9,64.3 +History,Grade 7,65.1 +History,Grade 8,83.7 +Chemistry,Grade 8,53.4 +Physics,Grade 9,91.5 +Chemistry,Grade 8,63.4 +Chemistry,Grade 7,66.5 +Physics,Grade 9,70.0 +History,Grade 7,68.8 +Physics,Grade 9,71.1 +History,Grade 8,69.7 +Chemistry,Grade 9,87.4 +History,Grade 8,72.0 +Chemistry,Grade 9,56.8 +Chemistry,Grade 7,67.6 +History,Grade 9,79.9 +Mathematics,Grade 8,59.3 +Physics,Grade 9,61.6 +Biology,Grade 8,96.1 +Biology,Grade 9,59.6 +Mathematics,Grade 7,64.3 +Biology,Grade 9,78.6 +Chemistry,Grade 8,57.4 +History,Grade 9,95.1 +Chemistry,Grade 8,82.3 +Biology,Grade 9,69.2 +Chemistry,Grade 8,61.5 +History,Grade 9,89.5 +History,Grade 7,70.4 +Biology,Grade 7,72.1 +Chemistry,Grade 9,67.3 +Physics,Grade 9,65.0 +Biology,Grade 7,72.0 +History,Grade 8,89.2 +Biology,Grade 8,71.6 +History,Grade 9,73.1 +Physics,Grade 9,56.3 +Biology,Grade 9,65.2 +Mathematics,Grade 7,54.0 +History,Grade 7,85.3 +Chemistry,Grade 7,72.6 +History,Grade 8,72.2 +Physics,Grade 8,72.5 +Physics,Grade 8,64.1 +Chemistry,Grade 7,52.8 +Mathematics,Grade 9,84.7 +Chemistry,Grade 7,80.5 +Biology,Grade 8,70.3 +Chemistry,Grade 7,74.6 +History,Grade 7,82.5 +Mathematics,Grade 8,72.2 +History,Grade 9,77.9 +Chemistry,Grade 8,77.4 +Mathematics,Grade 7,59.5 +Physics,Grade 9,80.7 +History,Grade 7,67.1 +Mathematics,Grade 8,85.2 +Chemistry,Grade 9,78.4 +Physics,Grade 9,78.3 +History,Grade 8,77.5 +History,Grade 7,69.4 +Chemistry,Grade 9,74.9 +Mathematics,Grade 7,56.9 +History,Grade 8,72.7 +Mathematics,Grade 8,75.9 +Physics,Grade 9,59.3 +Physics,Grade 7,63.4 +Biology,Grade 7,83.5 +History,Grade 7,58.0 +Mathematics,Grade 7,81.6 +Physics,Grade 8,74.4 +Mathematics,Grade 9,74.7 +History,Grade 9,82.6 +Chemistry,Grade 8,73.2 +History,Grade 7,67.5 +Biology,Grade 8,83.2 +History,Grade 8,73.8 +Biology,Grade 8,71.0 +Mathematics,Grade 9,76.6 +Biology,Grade 7,51.5 +Mathematics,Grade 8,67.5 +Biology,Grade 9,73.6 +History,Grade 7,85.6 +Biology,Grade 9,67.9 +History,Grade 9,99.1 +Biology,Grade 8,56.6 +Physics,Grade 8,58.9 +History,Grade 9,63.7 +Biology,Grade 7,61.8 +History,Grade 9,92.0 +Chemistry,Grade 9,66.8 +Chemistry,Grade 8,74.2 +History,Grade 9,94.8 +Chemistry,Grade 7,65.6 +History,Grade 8,94.5 +Chemistry,Grade 9,58.9 +Physics,Grade 8,44.0 +Physics,Grade 8,59.8 +Biology,Grade 9,71.2 +Chemistry,Grade 9,74.5 +Chemistry,Grade 8,67.8 +Chemistry,Grade 8,59.3 +Mathematics,Grade 7,69.9 +Physics,Grade 8,67.0 +Chemistry,Grade 7,54.8 +History,Grade 8,71.2 +Mathematics,Grade 7,74.8 +History,Grade 8,43.6 +Mathematics,Grade 9,57.4 +Chemistry,Grade 9,68.5 +Physics,Grade 8,66.5 +Biology,Grade 8,70.8 +Mathematics,Grade 8,62.3 +Biology,Grade 8,89.6 +Biology,Grade 9,70.3 +Physics,Grade 7,68.9 +Biology,Grade 9,95.5 +Physics,Grade 8,59.5 +Biology,Grade 7,85.5 +Physics,Grade 9,72.1 +Biology,Grade 7,72.9 +History,Grade 7,86.0 +Chemistry,Grade 7,63.4 +History,Grade 9,69.7 +Physics,Grade 9,71.7 +Biology,Grade 9,68.3 +Chemistry,Grade 8,80.2 +Chemistry,Grade 8,67.4 +Biology,Grade 9,75.2 +History,Grade 7,79.5 +Physics,Grade 9,81.1 +Biology,Grade 7,76.7 +History,Grade 7,71.1 +History,Grade 7,77.6 +Physics,Grade 9,75.0 +Chemistry,Grade 9,98.4 +History,Grade 8,83.7 +History,Grade 7,78.4 +Physics,Grade 8,73.7 +Biology,Grade 7,76.1 +Mathematics,Grade 8,62.0 +Biology,Grade 9,64.2 +History,Grade 9,78.2 +Mathematics,Grade 7,83.9 +Biology,Grade 8,83.4 +Physics,Grade 8,65.4 +Biology,Grade 8,69.6 +Physics,Grade 7,67.2 +History,Grade 7,84.8 +Biology,Grade 9,76.2 +Chemistry,Grade 7,51.6 +Biology,Grade 9,73.6 +Chemistry,Grade 7,68.9 +Biology,Grade 8,79.8 +Physics,Grade 8,60.0 +Chemistry,Grade 8,42.4 +Mathematics,Grade 9,87.8 +Physics,Grade 9,58.1 +Mathematics,Grade 7,66.8 +Mathematics,Grade 8,79.3 +Physics,Grade 9,69.7 +Physics,Grade 8,55.0 +Mathematics,Grade 8,77.2 +Chemistry,Grade 7,51.0 +Chemistry,Grade 9,81.0 +Biology,Grade 9,68.9 +Mathematics,Grade 8,76.5 +Physics,Grade 9,64.5 +Mathematics,Grade 8,74.4 +History,Grade 7,54.9 +Mathematics,Grade 7,75.5 +Mathematics,Grade 9,66.2 +Mathematics,Grade 7,72.6 +Chemistry,Grade 8,52.1 +Biology,Grade 8,67.2 +Biology,Grade 9,70.8 +History,Grade 8,92.6 +Mathematics,Grade 9,83.0 +History,Grade 7,80.5 +Biology,Grade 8,58.6 +Biology,Grade 9,67.0 +Physics,Grade 8,58.7 +Chemistry,Grade 7,37.2 +Physics,Grade 9,66.0 +Mathematics,Grade 9,66.4 +Mathematics,Grade 9,46.6 +History,Grade 9,81.4 +History,Grade 7,76.8 +Chemistry,Grade 7,71.1 +Biology,Grade 8,79.4 +Biology,Grade 8,63.0 +Mathematics,Grade 9,95.2 +Physics,Grade 7,57.3 +Chemistry,Grade 9,83.4 +History,Grade 9,90.8 +Mathematics,Grade 7,93.3 +Mathematics,Grade 8,71.5 +Mathematics,Grade 9,62.0 +Physics,Grade 9,74.3 +History,Grade 8,85.5 +Physics,Grade 9,56.1 +Physics,Grade 7,67.6 +History,Grade 9,81.4 +Physics,Grade 9,69.8 +History,Grade 8,88.3 +Physics,Grade 9,70.5 +Physics,Grade 8,72.7 +Biology,Grade 7,62.6 +Biology,Grade 8,78.1 +Physics,Grade 8,79.8 +History,Grade 7,60.7 +History,Grade 7,64.9 +Physics,Grade 9,75.0 +Chemistry,Grade 9,70.1 +Biology,Grade 8,65.5 +History,Grade 9,100.0 +Biology,Grade 8,73.8 +Biology,Grade 8,60.9 +Mathematics,Grade 7,77.5 +Biology,Grade 8,49.8 +History,Grade 8,84.2 +History,Grade 8,69.5 +History,Grade 8,61.7 +Biology,Grade 8,84.6 +Physics,Grade 7,50.4 +Biology,Grade 8,79.3 +Chemistry,Grade 8,69.8 +Mathematics,Grade 7,79.7 +History,Grade 7,90.8 +Biology,Grade 7,84.2 +Biology,Grade 9,73.6 +Biology,Grade 9,63.8 +Biology,Grade 9,61.2 +Biology,Grade 9,85.4 +Biology,Grade 8,76.7 +Chemistry,Grade 9,67.4 +History,Grade 8,58.3 +History,Grade 9,90.8 +Biology,Grade 7,59.2 +Mathematics,Grade 7,73.0 +Chemistry,Grade 7,63.5 +Mathematics,Grade 9,64.6 +History,Grade 7,71.3 +Mathematics,Grade 7,72.3 +History,Grade 7,49.6 +Physics,Grade 8,73.2 +Physics,Grade 7,60.2 +Biology,Grade 8,87.8 +History,Grade 9,99.5 +History,Grade 9,81.2 +Chemistry,Grade 7,67.0 +History,Grade 9,87.3 +Chemistry,Grade 9,55.5 +Chemistry,Grade 8,78.5 +History,Grade 7,70.1 +Chemistry,Grade 9,79.0 +Biology,Grade 7,59.5 +Physics,Grade 7,75.2 +History,Grade 8,84.2 +Physics,Grade 7,79.1 +Chemistry,Grade 9,61.8 +Physics,Grade 9,77.4 +Chemistry,Grade 8,54.0 +Physics,Grade 7,73.4 +Physics,Grade 9,56.6 +History,Grade 8,58.6 +Mathematics,Grade 8,65.9 +History,Grade 8,83.0 +Biology,Grade 8,67.0 +Biology,Grade 9,92.8 +Biology,Grade 7,64.3 +Mathematics,Grade 9,65.3 +History,Grade 8,73.5 +Mathematics,Grade 9,69.6 +Chemistry,Grade 9,65.6 +Biology,Grade 8,93.3 +Biology,Grade 7,71.2 +Biology,Grade 9,80.9 +Mathematics,Grade 8,66.2 +Physics,Grade 7,69.9 +Mathematics,Grade 9,69.0 +Biology,Grade 9,84.2 +Mathematics,Grade 8,100.0 +Mathematics,Grade 8,73.9 +Physics,Grade 8,78.5 +Physics,Grade 8,62.0 +History,Grade 7,85.8 +History,Grade 7,65.4 +Mathematics,Grade 8,71.8 +Physics,Grade 9,54.2 +Biology,Grade 9,100.0 +Chemistry,Grade 9,54.9 +Biology,Grade 8,100.0 +Chemistry,Grade 9,72.0 +Biology,Grade 9,68.5 +Physics,Grade 9,87.8 +Mathematics,Grade 7,50.2 +Mathematics,Grade 8,80.2 +Physics,Grade 7,56.9 +Chemistry,Grade 7,65.6 +Mathematics,Grade 8,51.6 +Chemistry,Grade 8,89.2 +Chemistry,Grade 8,76.3 +History,Grade 7,79.9 +History,Grade 9,98.5 +Physics,Grade 8,43.8 +Biology,Grade 9,87.5 +History,Grade 8,81.8 +Mathematics,Grade 8,60.4 +Physics,Grade 8,78.2 +Mathematics,Grade 7,67.1 +History,Grade 7,72.8 +Chemistry,Grade 9,83.3 +Physics,Grade 7,74.7 +History,Grade 7,71.6 +History,Grade 7,75.5 +Chemistry,Grade 9,95.4 +Chemistry,Grade 8,76.1 +Biology,Grade 9,77.9 +History,Grade 8,82.5 +Mathematics,Grade 7,57.7 +History,Grade 9,74.2 +Physics,Grade 8,63.8 +History,Grade 9,81.4 +Biology,Grade 8,93.2 +Physics,Grade 8,57.3 +Physics,Grade 9,84.1 +History,Grade 9,92.7 +Biology,Grade 7,79.1 +Physics,Grade 8,62.8 +History,Grade 7,83.2 +Physics,Grade 8,54.3 +Biology,Grade 8,82.5 +History,Grade 8,61.8 +Mathematics,Grade 8,75.7 +Chemistry,Grade 8,70.0 +History,Grade 8,63.1 +Mathematics,Grade 9,86.2 +History,Grade 9,96.3 +Physics,Grade 9,68.0 +Physics,Grade 9,67.3 +Chemistry,Grade 7,80.2 +Mathematics,Grade 9,71.9 +Physics,Grade 9,42.4 +Mathematics,Grade 9,76.4 +Biology,Grade 8,74.2 +Mathematics,Grade 8,94.2 +Chemistry,Grade 7,63.0 +Biology,Grade 8,87.0 +History,Grade 8,83.2 +Biology,Grade 9,68.5 +Mathematics,Grade 8,78.8 +Mathematics,Grade 8,62.4 +History,Grade 9,67.3 +Physics,Grade 7,63.7 +History,Grade 9,74.0 +Physics,Grade 7,59.9 +Physics,Grade 7,77.3 +Chemistry,Grade 8,74.0 +History,Grade 8,76.8 +Mathematics,Grade 8,85.4 +Biology,Grade 7,71.8 +History,Grade 7,78.2 +Mathematics,Grade 8,85.8 +Physics,Grade 7,83.6 +Physics,Grade 8,62.4 +Physics,Grade 8,63.0 +Biology,Grade 8,73.5 +History,Grade 7,64.8 +Mathematics,Grade 7,67.7 +Mathematics,Grade 7,79.3 +Mathematics,Grade 7,63.7 +Mathematics,Grade 8,79.8 +Biology,Grade 9,77.2 +History,Grade 7,81.8 +History,Grade 7,75.3 +Physics,Grade 9,82.5 +Chemistry,Grade 9,76.9 +Physics,Grade 9,83.4 +History,Grade 7,82.5 +Mathematics,Grade 8,67.4 +Physics,Grade 9,62.2 +Chemistry,Grade 9,75.9 +Physics,Grade 9,70.4 +Physics,Grade 7,65.9 +Physics,Grade 8,59.4 +Chemistry,Grade 7,59.3 +Chemistry,Grade 7,65.7 +History,Grade 9,76.2 +Chemistry,Grade 9,68.8 +Physics,Grade 8,71.1 +Mathematics,Grade 8,71.5 +History,Grade 7,69.2 +Biology,Grade 8,71.5 +Biology,Grade 7,78.5 +Chemistry,Grade 9,65.0 +Biology,Grade 9,76.2 +Chemistry,Grade 7,75.1 +Chemistry,Grade 9,57.8 +Chemistry,Grade 8,66.8 +Chemistry,Grade 8,80.0 +History,Grade 9,87.7 +Mathematics,Grade 8,63.7 +Mathematics,Grade 7,86.9 +History,Grade 7,88.5 +Physics,Grade 7,68.3 +Mathematics,Grade 8,67.8 +Biology,Grade 9,72.2 +Chemistry,Grade 9,62.5 +Mathematics,Grade 9,71.3 +Physics,Grade 8,79.6 +History,Grade 8,62.2 +Chemistry,Grade 7,60.5 +Mathematics,Grade 8,80.6 +Chemistry,Grade 8,94.3 +Mathematics,Grade 7,74.3 +Mathematics,Grade 7,67.8 +History,Grade 9,100.0 +Physics,Grade 8,58.0 +Biology,Grade 7,88.5 +Chemistry,Grade 7,67.0 +Mathematics,Grade 7,44.8 +Mathematics,Grade 7,65.7 +History,Grade 8,75.8 +History,Grade 9,91.2 +Biology,Grade 7,71.0 +History,Grade 8,91.6 +Chemistry,Grade 7,49.0 +Chemistry,Grade 8,54.6 +History,Grade 7,74.4 +History,Grade 8,83.3 +History,Grade 9,66.8 +Biology,Grade 7,48.3 +Chemistry,Grade 9,69.2 +Mathematics,Grade 9,98.0 +Biology,Grade 9,82.4 +Chemistry,Grade 9,73.9 +Mathematics,Grade 7,61.0 +Mathematics,Grade 9,87.2 +Biology,Grade 9,70.7 +Biology,Grade 7,88.8 +History,Grade 9,100.0 +History,Grade 9,89.6 +Mathematics,Grade 8,61.6 +History,Grade 7,72.5 +Mathematics,Grade 7,92.1 +Physics,Grade 7,64.3 +History,Grade 9,74.4 +History,Grade 8,100.0 +Physics,Grade 9,68.6 +Chemistry,Grade 9,68.3 +Chemistry,Grade 7,67.3 +Physics,Grade 9,64.2 +History,Grade 9,92.0 +Physics,Grade 9,70.8 +History,Grade 9,81.7 +Mathematics,Grade 9,78.8 +Physics,Grade 7,84.5 +Biology,Grade 9,66.0 +Chemistry,Grade 7,82.8 +History,Grade 8,63.8 +History,Grade 9,75.2 +Mathematics,Grade 9,73.4 +Biology,Grade 9,97.3 +Mathematics,Grade 7,52.8 +Mathematics,Grade 8,66.7 +Biology,Grade 7,62.3 +History,Grade 7,83.9 +Biology,Grade 9,72.3 +Chemistry,Grade 9,72.7 +History,Grade 7,71.7 +Physics,Grade 8,59.2 +History,Grade 7,64.3 +History,Grade 7,57.4 +Physics,Grade 8,75.9 +Physics,Grade 7,79.6 +Biology,Grade 9,85.3 +Mathematics,Grade 8,62.8 +Biology,Grade 9,76.3 +History,Grade 8,81.3 +Chemistry,Grade 9,64.0 +Mathematics,Grade 7,72.2 +Physics,Grade 9,77.7 +Biology,Grade 7,77.4 +Mathematics,Grade 8,70.1 +Biology,Grade 7,65.6 +Mathematics,Grade 8,89.6 +History,Grade 9,87.7 +Physics,Grade 8,78.1 +Physics,Grade 7,47.8 +Biology,Grade 9,70.2 +Mathematics,Grade 9,65.8 +Physics,Grade 8,74.7 +Physics,Grade 7,65.7 +Chemistry,Grade 9,73.4 +Physics,Grade 8,68.6 +Chemistry,Grade 8,66.5 +Physics,Grade 7,58.5 +History,Grade 8,77.2 +Physics,Grade 7,59.1 +History,Grade 9,73.4 +Mathematics,Grade 7,72.4 +Chemistry,Grade 8,59.3 +History,Grade 8,74.5 +Chemistry,Grade 9,80.9 +Biology,Grade 9,79.1 +Biology,Grade 9,86.6 +Mathematics,Grade 9,76.6 +Mathematics,Grade 9,83.3 +Physics,Grade 8,74.1 +Chemistry,Grade 9,66.1 +History,Grade 7,60.3 +Mathematics,Grade 9,91.2 +Physics,Grade 7,74.6 +Biology,Grade 8,81.5 +Biology,Grade 7,79.1 +Mathematics,Grade 8,68.9 +Chemistry,Grade 7,69.0 +Physics,Grade 8,81.2 +Physics,Grade 8,58.9 +Physics,Grade 7,65.7 +Physics,Grade 9,85.2 +Mathematics,Grade 7,50.3 +History,Grade 7,95.4 +Biology,Grade 7,73.0 +Mathematics,Grade 8,58.5 +History,Grade 7,78.2 +Chemistry,Grade 7,51.1 +History,Grade 7,59.9 +History,Grade 9,80.2 +Biology,Grade 8,73.6 +Biology,Grade 8,74.5 +Physics,Grade 9,70.3 +Chemistry,Grade 9,79.0 +Chemistry,Grade 9,92.8 +Chemistry,Grade 8,78.2 +Biology,Grade 9,98.4 +Chemistry,Grade 8,65.7 +Mathematics,Grade 8,50.1 +Physics,Grade 9,70.9 +Mathematics,Grade 7,73.0 +Mathematics,Grade 8,83.6 +Biology,Grade 9,59.6 +History,Grade 7,57.9 +Biology,Grade 7,66.0 +Mathematics,Grade 7,84.3 +History,Grade 8,54.5 +Biology,Grade 7,77.7 +History,Grade 8,77.9 +Mathematics,Grade 9,64.0 +Mathematics,Grade 7,77.1 +Biology,Grade 9,86.1 +Biology,Grade 7,76.2 +Chemistry,Grade 9,90.4 +Chemistry,Grade 8,81.8 +History,Grade 9,79.8 +Physics,Grade 9,70.0 +Physics,Grade 8,63.6 +Physics,Grade 8,73.0 +Chemistry,Grade 9,59.4 +Biology,Grade 8,91.9 +Physics,Grade 8,55.9 +Physics,Grade 9,72.5 +Chemistry,Grade 8,71.6 +Biology,Grade 8,84.3 +Chemistry,Grade 9,75.7 +Chemistry,Grade 7,71.9 +Physics,Grade 9,69.5 +Physics,Grade 8,58.2 +Chemistry,Grade 7,72.1 +Biology,Grade 8,75.4 +History,Grade 8,63.7 +Chemistry,Grade 7,67.3 +Chemistry,Grade 7,64.5 +History,Grade 9,100.0 +Mathematics,Grade 8,69.6 +History,Grade 9,72.8 +Mathematics,Grade 7,61.1 +Physics,Grade 9,79.0 +Biology,Grade 7,76.3 +Biology,Grade 8,96.4 +History,Grade 9,97.7 +Physics,Grade 8,78.2 +Biology,Grade 9,75.0 +Mathematics,Grade 9,63.1 +Chemistry,Grade 9,82.3 +Physics,Grade 9,71.0 +Physics,Grade 7,63.5 +Chemistry,Grade 8,70.9 +Chemistry,Grade 7,67.8 +Physics,Grade 7,53.3 +Mathematics,Grade 7,84.1 +History,Grade 9,86.5 +Biology,Grade 8,72.8 +History,Grade 9,79.3 +History,Grade 8,64.6 +Chemistry,Grade 9,89.9 +Biology,Grade 9,100.0 +Chemistry,Grade 7,61.7 +Mathematics,Grade 7,61.9 +Physics,Grade 9,75.5 +Biology,Grade 7,58.1 +Physics,Grade 8,77.3 +Physics,Grade 7,46.7 +Chemistry,Grade 9,76.5 +History,Grade 8,78.5 +Biology,Grade 7,68.4 +Mathematics,Grade 8,69.7 +History,Grade 7,60.4 +Mathematics,Grade 7,74.6 +Physics,Grade 8,62.4 +Physics,Grade 9,66.0 +History,Grade 9,77.7 +Mathematics,Grade 9,80.2 +Mathematics,Grade 9,63.6 +History,Grade 8,80.2 +History,Grade 8,73.2 +Chemistry,Grade 8,71.3 +Biology,Grade 9,61.9 +Physics,Grade 8,72.5 +Physics,Grade 7,41.3 +Mathematics,Grade 8,60.8 +History,Grade 9,82.1 +Biology,Grade 9,100.0 +Chemistry,Grade 7,82.6 +Mathematics,Grade 7,81.8 +Biology,Grade 7,72.9 +Biology,Grade 7,62.6 +Chemistry,Grade 7,79.4 +Mathematics,Grade 9,69.8 +Biology,Grade 9,64.1 +History,Grade 8,66.3 +Chemistry,Grade 8,56.1 +Biology,Grade 7,77.6 +Physics,Grade 7,72.3 +Physics,Grade 8,58.8 +Physics,Grade 8,68.2 +History,Grade 9,76.7 +Chemistry,Grade 9,70.8 +Chemistry,Grade 7,58.5 +Mathematics,Grade 8,82.1 +Physics,Grade 8,53.9 +Chemistry,Grade 9,73.7 +Physics,Grade 7,64.9 +History,Grade 9,85.5 +Chemistry,Grade 9,75.7 +Physics,Grade 9,76.9 +Biology,Grade 9,68.5 +Biology,Grade 9,84.1 +History,Grade 7,84.4 +Mathematics,Grade 7,68.0 +Physics,Grade 8,81.0 +History,Grade 7,84.2 +Physics,Grade 9,54.9 +Chemistry,Grade 8,85.8 +Biology,Grade 7,68.0 +Physics,Grade 8,51.0 +Mathematics,Grade 9,43.9 +Chemistry,Grade 7,57.8 +Biology,Grade 7,75.9 +Chemistry,Grade 9,68.6 +Physics,Grade 7,79.7 +History,Grade 9,80.0 +Chemistry,Grade 9,71.5 +Biology,Grade 8,61.5 +Biology,Grade 9,100.0 +Chemistry,Grade 8,79.5 +Mathematics,Grade 9,64.3 +History,Grade 9,64.8 +History,Grade 7,75.3 +Biology,Grade 8,74.4 +Biology,Grade 8,70.3 +Mathematics,Grade 8,65.5 +Mathematics,Grade 8,82.9 +Physics,Grade 8,63.8 +Biology,Grade 7,65.6 +Physics,Grade 9,59.1 +Physics,Grade 8,64.2 +Physics,Grade 7,51.1 +History,Grade 9,100.0 +Biology,Grade 7,55.7 +Mathematics,Grade 8,68.1 +Biology,Grade 8,71.4 +History,Grade 8,76.3 +History,Grade 9,65.1 +Biology,Grade 7,75.4 +Biology,Grade 8,80.2 +Mathematics,Grade 8,70.1 +Physics,Grade 7,84.3 +Mathematics,Grade 7,56.8 +History,Grade 8,78.5 +History,Grade 8,80.3 +Chemistry,Grade 7,42.4 +Chemistry,Grade 9,69.7 +Mathematics,Grade 9,89.2 +Physics,Grade 8,87.5 +Mathematics,Grade 9,60.8 +History,Grade 8,61.5 +Mathematics,Grade 9,87.0 +Chemistry,Grade 8,61.9 +Chemistry,Grade 8,77.4 +Mathematics,Grade 8,66.5 +Biology,Grade 8,88.6 +Mathematics,Grade 7,65.6 +Mathematics,Grade 8,62.4 +Mathematics,Grade 8,85.8 +Physics,Grade 7,66.5 +Biology,Grade 8,77.9 +Biology,Grade 7,87.5 +Biology,Grade 7,73.9 +Biology,Grade 8,69.0 +Physics,Grade 8,89.5 +Physics,Grade 9,84.2 +Biology,Grade 9,68.7 +Biology,Grade 8,64.8 +Mathematics,Grade 9,75.7 +Mathematics,Grade 8,65.9 +History,Grade 7,82.3 +Chemistry,Grade 8,51.2 +Chemistry,Grade 7,56.3 +History,Grade 8,73.3 +Mathematics,Grade 9,85.1 +Biology,Grade 8,92.5 +Mathematics,Grade 7,58.9 +Biology,Grade 9,83.9 +Physics,Grade 8,67.6 +Chemistry,Grade 8,57.1 +History,Grade 8,61.4 +Physics,Grade 9,74.1 +Mathematics,Grade 7,67.1 +Chemistry,Grade 8,68.5 +Mathematics,Grade 7,75.1 +Mathematics,Grade 9,59.6 +History,Grade 9,75.5 +History,Grade 8,70.1 +Chemistry,Grade 8,66.0 +Biology,Grade 9,66.3 +Mathematics,Grade 7,71.5 +History,Grade 7,65.5 +Physics,Grade 8,58.6 +Biology,Grade 9,76.2 +History,Grade 8,90.7 +Biology,Grade 7,56.1 +Chemistry,Grade 9,50.7 +Mathematics,Grade 9,80.2 +Chemistry,Grade 8,59.6 +Chemistry,Grade 9,75.5 +History,Grade 9,100.0 +History,Grade 7,71.4 +Physics,Grade 9,76.4 +Biology,Grade 7,66.0 +Physics,Grade 9,79.7 +Chemistry,Grade 8,58.0 +Physics,Grade 9,78.7 +Chemistry,Grade 7,85.3 +Biology,Grade 8,66.1 +Mathematics,Grade 9,77.4 +Biology,Grade 7,79.8 +Biology,Grade 7,63.1 +History,Grade 9,89.9 +Mathematics,Grade 8,61.7 +History,Grade 8,97.8 +Chemistry,Grade 7,66.1 +History,Grade 9,87.3 +Chemistry,Grade 7,55.3 +Biology,Grade 8,73.2 +Physics,Grade 7,68.3 +Physics,Grade 8,60.4 +Biology,Grade 9,100.0 +Physics,Grade 9,66.7 +Physics,Grade 8,68.2 +Chemistry,Grade 8,68.6 +Chemistry,Grade 7,73.6 +History,Grade 8,78.5 +Mathematics,Grade 9,60.2 +Mathematics,Grade 9,70.0 +Physics,Grade 7,46.6 +Chemistry,Grade 9,67.3 +Biology,Grade 9,60.0 +Chemistry,Grade 8,53.8 +Chemistry,Grade 9,74.4 +History,Grade 7,94.8 +History,Grade 8,80.6 +Chemistry,Grade 9,65.8 +History,Grade 7,47.9 +Chemistry,Grade 8,58.0 +Physics,Grade 9,61.3 +History,Grade 7,75.7 +Mathematics,Grade 8,72.1 +History,Grade 7,77.8 +Mathematics,Grade 9,67.7 +Physics,Grade 7,40.1 +History,Grade 7,78.0 +Mathematics,Grade 7,72.7 +Mathematics,Grade 7,56.9 +History,Grade 8,73.2 +Chemistry,Grade 7,71.1 +History,Grade 7,79.9 +Chemistry,Grade 7,75.7 +Mathematics,Grade 7,70.5 +History,Grade 7,78.2 +Chemistry,Grade 9,59.4 +History,Grade 8,75.5 +Physics,Grade 8,65.5 +History,Grade 8,85.7 +Biology,Grade 7,80.1 +Biology,Grade 7,72.1 +Chemistry,Grade 8,79.1 +Physics,Grade 7,44.8 +Chemistry,Grade 9,76.7 +Chemistry,Grade 8,65.6 +History,Grade 7,68.0 +History,Grade 9,86.7 +Biology,Grade 8,83.9 +Physics,Grade 9,71.5 +Biology,Grade 9,74.2 +Mathematics,Grade 7,51.6 +Biology,Grade 7,72.0 +Physics,Grade 7,58.9 +History,Grade 8,81.3 +Physics,Grade 9,67.3 +Mathematics,Grade 7,69.4 +Biology,Grade 8,58.1 +Mathematics,Grade 8,69.6 +Physics,Grade 7,63.1 +History,Grade 7,71.5 +Chemistry,Grade 7,63.9 +Mathematics,Grade 9,92.8 +History,Grade 7,86.1 +Chemistry,Grade 9,71.6 +Mathematics,Grade 8,65.6 +Biology,Grade 9,76.7 +Chemistry,Grade 8,68.8 +Chemistry,Grade 8,55.8 +Physics,Grade 8,60.5 +History,Grade 7,85.0 +Biology,Grade 8,85.0 +History,Grade 9,84.3 +Mathematics,Grade 8,76.0 +History,Grade 9,70.3 +Biology,Grade 7,76.1 +Mathematics,Grade 9,64.7 +Chemistry,Grade 9,77.1 +Mathematics,Grade 8,72.7 +Physics,Grade 7,54.6 +Biology,Grade 9,93.4 +History,Grade 9,98.4 +Chemistry,Grade 8,80.8 +Mathematics,Grade 9,61.5 +Mathematics,Grade 9,69.9 +Physics,Grade 7,76.9 +Mathematics,Grade 7,56.0 +Biology,Grade 7,74.8 +Mathematics,Grade 8,56.1 +Chemistry,Grade 7,56.7 +History,Grade 9,86.0 +Biology,Grade 8,76.3 +Chemistry,Grade 8,50.7 +History,Grade 7,73.9 +Biology,Grade 8,86.7 +Biology,Grade 7,80.3 +Chemistry,Grade 9,71.0 +Physics,Grade 9,70.3 +History,Grade 9,77.1 +History,Grade 7,76.4 +History,Grade 8,73.6 +Mathematics,Grade 7,55.3 +Mathematics,Grade 8,72.4 +Physics,Grade 9,50.1 +Mathematics,Grade 8,73.5 +Mathematics,Grade 9,71.9 +Biology,Grade 7,81.4 +Chemistry,Grade 7,71.9 +Physics,Grade 8,62.9 +Biology,Grade 9,87.7 +Physics,Grade 7,68.0 +History,Grade 8,85.1 +Biology,Grade 8,92.7 +History,Grade 9,77.3 +Physics,Grade 9,64.8 +Mathematics,Grade 9,65.8 +Mathematics,Grade 9,90.1 +Mathematics,Grade 8,62.0 +Physics,Grade 7,69.6 +Biology,Grade 8,81.4 +Chemistry,Grade 9,85.7 +Biology,Grade 8,78.7 +History,Grade 7,80.9 +Biology,Grade 9,93.2 +Mathematics,Grade 7,57.3 +Physics,Grade 8,49.4 +Mathematics,Grade 8,92.1 +Chemistry,Grade 8,66.6 +Biology,Grade 8,70.7 +Mathematics,Grade 9,83.5 +Mathematics,Grade 7,69.4 +Physics,Grade 8,63.8 +Biology,Grade 7,81.1 +Chemistry,Grade 9,70.0 +Chemistry,Grade 8,71.4 +Chemistry,Grade 7,72.9 +Physics,Grade 8,58.6 +Physics,Grade 8,68.6 +Chemistry,Grade 8,76.7 +Physics,Grade 8,69.8 +Biology,Grade 9,78.3 +History,Grade 9,78.2 +Mathematics,Grade 7,60.1 +Chemistry,Grade 8,59.6 +Mathematics,Grade 8,79.6 +Biology,Grade 9,79.8 +Physics,Grade 9,78.0 +Mathematics,Grade 9,80.2 +Chemistry,Grade 8,72.5 +Biology,Grade 9,79.4 +Biology,Grade 7,80.5 +Biology,Grade 9,70.1 +Biology,Grade 8,68.2 +Mathematics,Grade 8,67.5 +Chemistry,Grade 7,64.6 +Physics,Grade 8,92.0 +Mathematics,Grade 9,80.8 +Mathematics,Grade 8,71.1 +Mathematics,Grade 9,80.0 +History,Grade 9,71.8 +Mathematics,Grade 7,72.1 +Biology,Grade 7,60.6 +Mathematics,Grade 7,73.3 +History,Grade 7,96.4 +Mathematics,Grade 8,64.8 +History,Grade 8,68.6 +History,Grade 9,78.2 +Biology,Grade 8,77.2 +Mathematics,Grade 8,56.3 +Chemistry,Grade 8,79.3 +Mathematics,Grade 7,77.7 +Physics,Grade 7,69.5 +Biology,Grade 9,70.5 +Chemistry,Grade 9,73.3 +Mathematics,Grade 7,64.1 +Chemistry,Grade 7,77.1 +History,Grade 8,85.5 +Physics,Grade 7,50.0 +Physics,Grade 8,73.3 +Mathematics,Grade 9,72.1 +Physics,Grade 7,61.2 +Biology,Grade 8,68.8 +History,Grade 9,71.5 +Mathematics,Grade 8,95.2 +Biology,Grade 9,86.3 +Mathematics,Grade 7,52.3 +Mathematics,Grade 8,74.6 +History,Grade 9,49.3 +History,Grade 8,88.0 +Physics,Grade 8,81.2 +Biology,Grade 7,67.2 +Physics,Grade 9,69.6 +Physics,Grade 7,59.2 +Chemistry,Grade 9,43.9 +Chemistry,Grade 8,65.1 +History,Grade 7,84.0 +History,Grade 7,87.8 +Physics,Grade 7,71.9 +Mathematics,Grade 9,69.3 +Physics,Grade 7,63.4 +Physics,Grade 8,65.2 +Biology,Grade 8,99.6 +Biology,Grade 7,77.0 +Mathematics,Grade 9,82.8 +History,Grade 9,85.3 +Biology,Grade 8,69.4 +Chemistry,Grade 7,72.3 +Chemistry,Grade 7,68.4 +Mathematics,Grade 8,76.3 +Mathematics,Grade 8,64.3 +Mathematics,Grade 9,85.6 +Biology,Grade 9,84.0 +History,Grade 9,63.5 +Chemistry,Grade 7,65.0 +Physics,Grade 9,49.1 +Mathematics,Grade 9,84.7 +Physics,Grade 8,58.4 +Physics,Grade 7,67.6 +Physics,Grade 8,68.3 +History,Grade 9,82.4 +Mathematics,Grade 7,81.1 +History,Grade 7,72.6 +History,Grade 8,70.8 +History,Grade 9,79.7 +Physics,Grade 9,85.7 +Chemistry,Grade 8,83.2 +Biology,Grade 9,53.2 +Chemistry,Grade 9,90.5 +Physics,Grade 9,73.2 +Mathematics,Grade 8,78.6 +Biology,Grade 8,100.0 +Biology,Grade 9,74.0 +History,Grade 9,91.7 +Physics,Grade 7,57.0 +Chemistry,Grade 8,67.3 +History,Grade 7,79.4 +Chemistry,Grade 7,53.3 +Biology,Grade 8,61.6 +Biology,Grade 8,81.3 +History,Grade 9,83.8 +Biology,Grade 9,81.4 +Biology,Grade 9,80.8 +Biology,Grade 9,98.3 +History,Grade 7,65.0 +Chemistry,Grade 7,63.7 +Physics,Grade 9,66.4 +Chemistry,Grade 9,84.1 +Chemistry,Grade 8,84.8 +Chemistry,Grade 7,67.4 +History,Grade 8,61.1 +Biology,Grade 7,70.0 +History,Grade 9,78.8 +Physics,Grade 7,70.2 +Chemistry,Grade 7,68.5 +History,Grade 8,82.2 +Biology,Grade 9,83.9 +Biology,Grade 9,74.9 +Mathematics,Grade 9,70.8 +History,Grade 8,79.7 +Physics,Grade 7,70.2 +Physics,Grade 8,69.3 +Biology,Grade 7,70.4 +Physics,Grade 9,62.6 +History,Grade 8,76.6 +Chemistry,Grade 8,65.5 +Chemistry,Grade 9,80.7 +Mathematics,Grade 8,65.0 +Biology,Grade 9,75.7 +Mathematics,Grade 7,57.2 +Chemistry,Grade 7,59.4 +Biology,Grade 8,95.2 +Chemistry,Grade 9,79.5 +Physics,Grade 9,72.0 +Mathematics,Grade 8,80.9 +Biology,Grade 8,75.5 +History,Grade 9,97.4 +History,Grade 9,71.7 +Mathematics,Grade 8,62.2 +Chemistry,Grade 9,88.1 +Physics,Grade 9,77.1 +Mathematics,Grade 9,62.7 +Mathematics,Grade 7,80.0 +History,Grade 7,79.3 +Physics,Grade 9,68.5 +History,Grade 7,87.4 +Biology,Grade 8,100.0 +Mathematics,Grade 7,68.9 +Chemistry,Grade 9,64.6 +History,Grade 8,62.6 +History,Grade 7,71.5 +Physics,Grade 8,70.4 +Biology,Grade 7,66.6 +Mathematics,Grade 9,78.6 +History,Grade 9,84.1 +Chemistry,Grade 8,64.7 +Physics,Grade 8,77.3 +Mathematics,Grade 9,60.7 +Chemistry,Grade 8,75.3 +Physics,Grade 9,57.7 +History,Grade 9,61.7 +Mathematics,Grade 8,86.5 +Mathematics,Grade 7,55.2 +Biology,Grade 9,77.2 +Mathematics,Grade 8,100.0 +History,Grade 8,89.5 +History,Grade 9,87.1 +Biology,Grade 9,68.1 +History,Grade 7,81.3 +Chemistry,Grade 7,78.0 +Chemistry,Grade 7,76.8 +Physics,Grade 9,90.3 +Biology,Grade 8,74.9 +Mathematics,Grade 8,62.6 +History,Grade 9,65.5 +Mathematics,Grade 8,68.9 +Mathematics,Grade 7,47.7 +Biology,Grade 9,72.6 +Mathematics,Grade 8,84.9 +Biology,Grade 7,80.7 +Biology,Grade 7,97.4 +Physics,Grade 9,42.6 +Mathematics,Grade 9,72.7 +Physics,Grade 8,69.0 +Mathematics,Grade 7,48.0 +Biology,Grade 7,58.1 +Chemistry,Grade 9,76.6 +History,Grade 9,88.8 +Physics,Grade 7,51.5 +Mathematics,Grade 9,77.6 +Biology,Grade 7,65.5 +Mathematics,Grade 7,57.8 +Biology,Grade 9,67.4 +Mathematics,Grade 8,71.7 +History,Grade 8,56.9 +Chemistry,Grade 7,61.9 +Mathematics,Grade 8,82.9 +Mathematics,Grade 8,75.5 +Physics,Grade 7,60.9 +Chemistry,Grade 9,63.9 +History,Grade 7,81.0 +Chemistry,Grade 8,69.7 +Mathematics,Grade 7,60.4 +Mathematics,Grade 9,70.2 +Biology,Grade 7,77.4 +Physics,Grade 7,80.5 +Mathematics,Grade 9,73.2 +Mathematics,Grade 9,60.6 +Chemistry,Grade 9,91.5 +Physics,Grade 7,68.9 +Biology,Grade 7,89.6 +Mathematics,Grade 9,68.9 +History,Grade 7,69.1 +Biology,Grade 8,77.8 +Biology,Grade 8,96.9 +Chemistry,Grade 9,61.7 +History,Grade 8,86.4 +Physics,Grade 8,56.8 +Mathematics,Grade 7,78.8 +History,Grade 7,59.6 +Biology,Grade 8,60.1 +Physics,Grade 7,34.3 +History,Grade 8,78.8 +Chemistry,Grade 8,73.0 +Physics,Grade 9,54.0 +Physics,Grade 8,56.8 +Biology,Grade 7,58.9 +Physics,Grade 8,68.9 +Biology,Grade 7,75.5 +Mathematics,Grade 8,82.1 +Physics,Grade 9,54.6 +Mathematics,Grade 9,82.8 +Mathematics,Grade 7,79.1 +History,Grade 9,76.7 +Biology,Grade 8,73.2 +Physics,Grade 9,57.9 +Chemistry,Grade 7,65.6 +Mathematics,Grade 9,80.4 +Biology,Grade 9,89.5 +History,Grade 8,73.6 +History,Grade 8,76.1 +Physics,Grade 9,72.9 +History,Grade 8,90.6 +Biology,Grade 8,75.2 +Chemistry,Grade 7,61.9 +Physics,Grade 9,74.3 +Biology,Grade 8,67.8 +Physics,Grade 8,71.7 +Chemistry,Grade 9,73.2 +Mathematics,Grade 8,77.8 +Chemistry,Grade 9,60.4 +History,Grade 9,49.6 +History,Grade 7,72.4 +Mathematics,Grade 8,86.2 +Biology,Grade 8,77.9 +Biology,Grade 7,77.5 +Physics,Grade 8,72.8 +Mathematics,Grade 7,69.4 +History,Grade 8,86.8 +History,Grade 8,77.7 +Chemistry,Grade 8,70.5 +Mathematics,Grade 9,99.7 +Chemistry,Grade 9,58.9 +Biology,Grade 7,77.1 +History,Grade 9,67.7 +Chemistry,Grade 7,72.9 +Chemistry,Grade 8,60.8 +Biology,Grade 9,74.1 +History,Grade 9,65.9 +Biology,Grade 8,73.3 +Physics,Grade 8,52.3 +Mathematics,Grade 7,48.6 +Chemistry,Grade 9,73.6 +Chemistry,Grade 7,55.5 +Mathematics,Grade 7,52.1 +History,Grade 7,86.6 +History,Grade 7,75.3 +Physics,Grade 8,72.5 +Mathematics,Grade 9,78.2 +Chemistry,Grade 8,76.2 +Chemistry,Grade 8,79.8 +Chemistry,Grade 8,78.2 +History,Grade 7,78.8 +Chemistry,Grade 8,56.8 +Physics,Grade 8,66.0 +Biology,Grade 9,85.1 +Physics,Grade 7,44.0 +Mathematics,Grade 9,74.1 +Chemistry,Grade 9,75.5 +Physics,Grade 9,85.5 +Chemistry,Grade 8,79.5 +Physics,Grade 7,69.5 +Mathematics,Grade 8,57.4 +Mathematics,Grade 8,83.8 +Biology,Grade 7,59.8 +Physics,Grade 9,57.6 +Chemistry,Grade 9,57.9 +Biology,Grade 9,83.3 +Biology,Grade 9,74.9 +Physics,Grade 9,69.6 +History,Grade 9,89.6 +Physics,Grade 9,57.7 +Biology,Grade 8,54.3 +Chemistry,Grade 7,48.8 +Physics,Grade 9,52.2 +Chemistry,Grade 7,62.5 +Physics,Grade 9,83.9 +Biology,Grade 7,91.0 +Mathematics,Grade 8,70.5 +Mathematics,Grade 9,77.3 +Mathematics,Grade 8,74.9 +Physics,Grade 9,74.5 +Chemistry,Grade 7,60.8 +History,Grade 8,76.6 +Chemistry,Grade 8,46.8 +Mathematics,Grade 9,79.5 +Physics,Grade 8,59.6 +Biology,Grade 8,81.8 +Biology,Grade 8,75.7 +Biology,Grade 8,77.4 +Mathematics,Grade 8,85.2 +History,Grade 9,92.3 +Chemistry,Grade 8,72.2 +Mathematics,Grade 8,55.4 +Mathematics,Grade 8,75.9 +Mathematics,Grade 9,48.8 +Physics,Grade 7,61.0 +History,Grade 9,87.4 +Physics,Grade 7,53.2 +Chemistry,Grade 8,76.3 +History,Grade 9,99.5 +History,Grade 8,80.8 +Mathematics,Grade 8,75.3 +History,Grade 7,83.3 +Mathematics,Grade 8,53.7 +Physics,Grade 8,52.3 +Mathematics,Grade 9,89.2 +Mathematics,Grade 9,80.1 +Mathematics,Grade 9,77.1 +Biology,Grade 8,65.9 +History,Grade 8,100.0 +Physics,Grade 9,64.9 +Physics,Grade 7,87.5 +Mathematics,Grade 7,80.6 +Physics,Grade 8,72.5 +Mathematics,Grade 8,75.2 +History,Grade 8,67.2 +Biology,Grade 8,72.6 +Chemistry,Grade 8,70.4 +Mathematics,Grade 9,77.4 +Chemistry,Grade 9,67.2 +Chemistry,Grade 7,79.0 +Biology,Grade 7,93.1 +Chemistry,Grade 9,73.6 +History,Grade 7,89.4 +History,Grade 7,70.4 +Mathematics,Grade 9,59.0 +Mathematics,Grade 9,65.3 +Mathematics,Grade 9,69.8 +Chemistry,Grade 8,86.4 +Biology,Grade 9,100.0 +Biology,Grade 8,79.8 +Physics,Grade 9,76.9 +Biology,Grade 9,77.5 +Physics,Grade 7,55.8 +Physics,Grade 7,43.9 +Physics,Grade 8,64.7 +History,Grade 9,91.3 +Mathematics,Grade 7,71.8 +Biology,Grade 8,65.7 +Chemistry,Grade 9,85.9 +Chemistry,Grade 8,72.7 +Chemistry,Grade 8,76.5 +Biology,Grade 8,85.2 +History,Grade 8,88.1 +Biology,Grade 9,70.6 +Chemistry,Grade 9,80.4 +Physics,Grade 8,72.0 +Chemistry,Grade 7,70.0 +Mathematics,Grade 9,53.3 +Chemistry,Grade 8,75.7 +Physics,Grade 9,62.1 +Mathematics,Grade 9,71.9 +History,Grade 7,89.4 +Physics,Grade 8,71.4 +History,Grade 9,88.3 +Physics,Grade 8,91.5 +Physics,Grade 9,70.0 +Chemistry,Grade 7,43.3 +History,Grade 8,80.6 +Chemistry,Grade 7,72.1 +Physics,Grade 8,55.2 +Physics,Grade 8,69.1 +Physics,Grade 8,83.1 +Biology,Grade 8,89.8 +Mathematics,Grade 8,53.4 +History,Grade 7,80.9 +History,Grade 9,69.5 +Physics,Grade 7,66.4 +Biology,Grade 7,55.2 +History,Grade 8,78.4 +Mathematics,Grade 9,58.2 +Chemistry,Grade 8,70.0 +Biology,Grade 7,58.4 +Biology,Grade 7,49.1 +Mathematics,Grade 7,63.6 +Mathematics,Grade 7,82.1 +Physics,Grade 7,54.2 +Mathematics,Grade 8,73.1 +History,Grade 8,73.4 +History,Grade 8,79.3 +Mathematics,Grade 9,73.0 +Biology,Grade 8,81.3 +Mathematics,Grade 8,64.3 +History,Grade 7,75.8 +Chemistry,Grade 8,77.3 +Biology,Grade 8,77.4 +Chemistry,Grade 8,65.9 +Physics,Grade 8,63.0 +Chemistry,Grade 8,80.6 +Chemistry,Grade 8,71.3 +History,Grade 9,77.5 +Biology,Grade 7,65.7 +Physics,Grade 8,51.8 +Physics,Grade 8,62.0 +Biology,Grade 8,66.7 +Physics,Grade 9,52.5 +Biology,Grade 9,86.5 +Biology,Grade 7,77.7 +Physics,Grade 8,55.2 +History,Grade 7,58.4 +Biology,Grade 7,65.4 +Physics,Grade 8,57.3 +History,Grade 7,73.3 +Biology,Grade 7,77.1 +Biology,Grade 9,67.8 +History,Grade 8,92.5 +History,Grade 8,72.5 +Mathematics,Grade 7,76.4 +Mathematics,Grade 9,73.9 +History,Grade 7,80.6 +Mathematics,Grade 8,59.9 +Chemistry,Grade 8,56.5 +Chemistry,Grade 7,49.3 +Physics,Grade 8,97.9 +Chemistry,Grade 7,72.6 +Mathematics,Grade 8,65.6 +Mathematics,Grade 8,87.5 +Mathematics,Grade 7,77.2 +Mathematics,Grade 8,80.5 +Mathematics,Grade 8,74.6 +History,Grade 7,79.6 +Mathematics,Grade 7,54.4 +Mathematics,Grade 8,75.0 +Physics,Grade 7,57.5 +Chemistry,Grade 9,86.4 +Chemistry,Grade 8,63.4 +Physics,Grade 8,72.8 +Mathematics,Grade 8,48.0 +Biology,Grade 8,57.9 +Physics,Grade 9,69.0 +History,Grade 9,75.8 +Physics,Grade 7,70.6 +Physics,Grade 7,70.2 +Chemistry,Grade 7,67.7 +History,Grade 7,90.1 +Mathematics,Grade 9,68.6 +Mathematics,Grade 8,80.2 +Physics,Grade 8,49.6 +History,Grade 9,70.7 +Chemistry,Grade 9,69.0 +Physics,Grade 9,77.2 +Mathematics,Grade 7,67.8 +History,Grade 7,74.2 +Physics,Grade 8,65.4 +Biology,Grade 8,81.5 +History,Grade 9,84.2 +Chemistry,Grade 9,53.7 +Biology,Grade 9,76.6 +Physics,Grade 7,75.2 +History,Grade 9,98.9 +Physics,Grade 8,72.1 +Physics,Grade 7,78.0 +Chemistry,Grade 7,53.6 +Chemistry,Grade 7,64.9 +Mathematics,Grade 7,61.5 +Chemistry,Grade 7,70.9 +Mathematics,Grade 8,67.7 +Physics,Grade 8,56.2 +History,Grade 9,79.0 +History,Grade 8,75.1 +Physics,Grade 7,74.7 +Mathematics,Grade 8,62.9 +Chemistry,Grade 7,69.2 +Biology,Grade 7,69.6 +Physics,Grade 7,35.6 +Biology,Grade 8,68.7 +Physics,Grade 7,76.2 +Biology,Grade 8,68.7 +History,Grade 9,84.3 +Biology,Grade 8,81.2 +Biology,Grade 9,85.7 +Biology,Grade 9,98.6 +Chemistry,Grade 9,57.3 +Physics,Grade 8,78.1 +Mathematics,Grade 7,61.1 +Biology,Grade 7,83.9 +Mathematics,Grade 9,82.9 +Biology,Grade 8,74.5 +Physics,Grade 7,71.6 +Physics,Grade 9,64.6 +Chemistry,Grade 7,40.5 +Mathematics,Grade 9,100.0 +Biology,Grade 7,62.4 +Biology,Grade 9,97.2 +History,Grade 8,93.8 +Biology,Grade 7,77.8 +History,Grade 9,85.9 +Physics,Grade 7,84.7 +Chemistry,Grade 9,66.9 +Mathematics,Grade 8,76.3 +Mathematics,Grade 7,79.0 +Mathematics,Grade 7,68.4 +Mathematics,Grade 7,66.0 +Mathematics,Grade 7,73.5 +Physics,Grade 7,63.7 +Biology,Grade 8,70.6 +Biology,Grade 7,69.2 +Physics,Grade 7,61.5 +Physics,Grade 8,64.2 +Chemistry,Grade 8,58.8 +Mathematics,Grade 9,94.9 +Chemistry,Grade 9,77.5 +Physics,Grade 7,62.3 +Biology,Grade 9,69.2 +History,Grade 7,71.2 +Physics,Grade 8,63.6 +Chemistry,Grade 9,78.4 +Chemistry,Grade 9,68.9 +Mathematics,Grade 7,57.9 +History,Grade 9,81.1 +Biology,Grade 7,75.1 +Mathematics,Grade 7,46.5 +History,Grade 7,74.0 +Mathematics,Grade 8,82.2 +History,Grade 7,70.1 +Chemistry,Grade 7,73.4 +Physics,Grade 7,71.0 +Physics,Grade 8,57.3 +Biology,Grade 8,82.0 +Biology,Grade 9,61.4 +Physics,Grade 9,65.5 +History,Grade 8,62.1 +History,Grade 9,85.4 +Biology,Grade 8,92.7 +History,Grade 9,88.5 +Chemistry,Grade 7,74.6 +Biology,Grade 7,58.6 +Chemistry,Grade 8,70.0 +Mathematics,Grade 7,93.4 +Physics,Grade 9,86.0 +History,Grade 7,76.1 +History,Grade 8,78.0 +Biology,Grade 7,84.3 +History,Grade 8,81.6 +Chemistry,Grade 9,66.4 +History,Grade 8,100.0 +Biology,Grade 7,84.5 +History,Grade 7,73.9 +Mathematics,Grade 7,45.7 +Physics,Grade 9,66.9 +Biology,Grade 9,70.6 +History,Grade 7,69.7 +Biology,Grade 9,68.0 +Physics,Grade 8,62.3 +Chemistry,Grade 8,81.5 +Chemistry,Grade 7,69.7 +Biology,Grade 9,64.8 +Biology,Grade 9,67.9 +Mathematics,Grade 7,69.7 +Chemistry,Grade 7,42.2 +Physics,Grade 9,85.2 +Biology,Grade 8,80.6 +Physics,Grade 8,89.2 +Biology,Grade 7,68.5 +Chemistry,Grade 9,87.5 +Biology,Grade 9,72.1 +History,Grade 7,64.0 +Mathematics,Grade 7,79.3 +Biology,Grade 8,62.6 +Mathematics,Grade 9,64.3 +Chemistry,Grade 7,60.6 +Mathematics,Grade 7,62.4 +Physics,Grade 9,96.4 +Biology,Grade 7,67.9 +History,Grade 7,68.3 +Biology,Grade 8,95.7 +Biology,Grade 7,62.7 +Chemistry,Grade 7,52.0 +History,Grade 8,98.4 +Biology,Grade 7,76.1 +Physics,Grade 9,77.7 +Biology,Grade 7,60.0 +Biology,Grade 9,87.1 +Chemistry,Grade 8,90.5 +Physics,Grade 9,75.8 +History,Grade 9,70.9 +Chemistry,Grade 8,57.9 +Mathematics,Grade 8,73.0 +Biology,Grade 9,80.6 +Mathematics,Grade 7,67.0 +Physics,Grade 9,72.7 +Chemistry,Grade 8,71.6 +Physics,Grade 7,81.1 +History,Grade 8,69.9 +History,Grade 9,97.4 +History,Grade 9,75.4 +History,Grade 9,95.0 +Mathematics,Grade 7,70.4 +History,Grade 9,73.0 +Physics,Grade 8,73.2 +Chemistry,Grade 8,71.1 +Biology,Grade 8,93.0 +History,Grade 8,55.8 +Biology,Grade 9,78.9 +Biology,Grade 8,76.5 +Physics,Grade 7,62.8 +Mathematics,Grade 7,86.5 +Physics,Grade 8,51.8 +Physics,Grade 9,61.0 +Biology,Grade 8,72.9 +Mathematics,Grade 8,83.9 +Physics,Grade 8,83.6 +Physics,Grade 9,72.8 +Chemistry,Grade 9,60.0 +Chemistry,Grade 7,68.4 +Physics,Grade 8,54.2 +Chemistry,Grade 9,56.7 +History,Grade 7,63.3 +Physics,Grade 8,80.3 +Physics,Grade 9,74.8 +Physics,Grade 7,68.8 +Physics,Grade 7,70.5 +History,Grade 9,78.2 +Chemistry,Grade 7,72.9 +Chemistry,Grade 9,81.3 +Chemistry,Grade 7,84.1 +Mathematics,Grade 9,91.7 +Biology,Grade 8,70.3 +Chemistry,Grade 7,64.1 +Mathematics,Grade 9,52.4 +Chemistry,Grade 9,68.2 +Mathematics,Grade 9,72.0 +Biology,Grade 9,78.6 +Chemistry,Grade 8,96.6 +Chemistry,Grade 8,79.8 +Chemistry,Grade 8,61.6 +Physics,Grade 7,66.9 +Physics,Grade 9,74.6 +Chemistry,Grade 8,78.7 +Biology,Grade 7,78.4 +History,Grade 9,67.4 +History,Grade 8,64.8 +Biology,Grade 9,76.0 +Biology,Grade 8,61.9 +Chemistry,Grade 7,58.8 +History,Grade 8,82.9 +History,Grade 9,87.6 +Physics,Grade 7,37.6 +Chemistry,Grade 8,77.4 +Physics,Grade 7,62.3 +Mathematics,Grade 7,80.6 +Mathematics,Grade 9,71.2 +Physics,Grade 8,84.7 +Mathematics,Grade 7,64.0 +History,Grade 7,63.6 +History,Grade 7,92.9 +Biology,Grade 7,94.8 +Mathematics,Grade 9,76.9 +Chemistry,Grade 7,59.0 +Biology,Grade 9,71.4 +History,Grade 8,85.0 +Biology,Grade 8,73.3 +Chemistry,Grade 8,68.0 +Mathematics,Grade 9,62.5 +Chemistry,Grade 7,73.9 +Physics,Grade 7,66.6 +Chemistry,Grade 9,86.7 +Physics,Grade 8,71.6 +History,Grade 7,65.2 +Chemistry,Grade 8,65.9 +Chemistry,Grade 8,75.3 +Mathematics,Grade 8,76.3 +Biology,Grade 8,59.6 +Physics,Grade 7,64.5 +Physics,Grade 8,47.8 +History,Grade 9,87.2 +Physics,Grade 9,53.4 +Biology,Grade 8,71.7 +History,Grade 9,83.7 +Biology,Grade 8,67.1 +History,Grade 9,84.4 +Mathematics,Grade 7,62.9 +Physics,Grade 9,68.8 +Mathematics,Grade 9,66.9 +Physics,Grade 8,74.1 +Biology,Grade 7,75.9 +Chemistry,Grade 8,73.9 +History,Grade 8,80.1 +Mathematics,Grade 8,66.3 +Physics,Grade 8,58.3 +Mathematics,Grade 7,75.6 +Physics,Grade 9,79.2 +Biology,Grade 9,81.3 +Mathematics,Grade 9,75.6 +Biology,Grade 9,83.1 +Biology,Grade 9,74.3 +Physics,Grade 9,71.2 +Mathematics,Grade 7,63.0 +History,Grade 7,77.4 +History,Grade 8,91.3 +Physics,Grade 8,73.3 +History,Grade 9,85.7 +Mathematics,Grade 9,64.7 +Mathematics,Grade 7,76.5 +Physics,Grade 8,62.9 +Chemistry,Grade 7,56.0 +Physics,Grade 8,72.6 +History,Grade 9,80.3 +Physics,Grade 7,65.1 +Physics,Grade 7,61.6 +Biology,Grade 7,52.0 +Chemistry,Grade 7,71.3 +Chemistry,Grade 8,73.6 +History,Grade 7,78.8 +Biology,Grade 8,84.6 +History,Grade 8,74.4 +History,Grade 8,100.0 +Biology,Grade 7,70.2 +Mathematics,Grade 7,57.1 +Biology,Grade 7,68.1 +Biology,Grade 9,84.7 +Physics,Grade 9,93.2 +Biology,Grade 8,75.4 +Chemistry,Grade 7,68.1 +Mathematics,Grade 9,51.3 +Biology,Grade 9,93.6 +Biology,Grade 9,58.3 +Chemistry,Grade 7,55.7 +Chemistry,Grade 9,63.7 +Mathematics,Grade 8,98.0 +Mathematics,Grade 9,76.9 +Chemistry,Grade 8,79.7 +Chemistry,Grade 7,70.6 +Mathematics,Grade 8,66.3 +Chemistry,Grade 7,81.1 +Chemistry,Grade 8,57.1 +Chemistry,Grade 7,100.0 +Mathematics,Grade 9,74.9 +Biology,Grade 8,73.5 +Mathematics,Grade 8,54.1 +Physics,Grade 8,54.9 +Mathematics,Grade 7,58.8 +History,Grade 9,73.3 +History,Grade 8,67.3 +Chemistry,Grade 9,69.2 +Physics,Grade 7,68.3 +History,Grade 7,76.4 +Biology,Grade 9,62.9 +Physics,Grade 8,70.7 +Chemistry,Grade 9,73.8 +Chemistry,Grade 9,86.6 +Chemistry,Grade 9,44.1 +Biology,Grade 7,83.7 +Biology,Grade 9,91.3 +Mathematics,Grade 9,68.6 +History,Grade 7,54.0 +Chemistry,Grade 9,50.7 +Biology,Grade 8,65.8 +Physics,Grade 7,68.5 +Chemistry,Grade 7,65.1 +Chemistry,Grade 8,76.8 +Biology,Grade 7,85.4 +Mathematics,Grade 8,51.9 +Mathematics,Grade 7,80.5 +Chemistry,Grade 9,64.2 +History,Grade 9,67.0 +Physics,Grade 9,58.4 +History,Grade 9,72.7 +Physics,Grade 9,76.0 +Mathematics,Grade 9,60.0 +History,Grade 7,77.6 +Mathematics,Grade 9,74.3 +Physics,Grade 7,70.9 +Physics,Grade 7,70.7 +History,Grade 8,67.0 +Biology,Grade 8,72.2 +Mathematics,Grade 9,74.8 +Mathematics,Grade 8,74.8 +History,Grade 9,85.1 +Biology,Grade 7,66.3 +Biology,Grade 7,56.8 +Physics,Grade 9,76.2 +History,Grade 8,77.7 +History,Grade 8,75.6 +History,Grade 7,76.6 +Physics,Grade 7,59.5 +Biology,Grade 9,85.7 +Biology,Grade 8,70.1 +History,Grade 7,82.1 +History,Grade 7,79.1 +Chemistry,Grade 7,45.0 +Biology,Grade 9,81.8 +Chemistry,Grade 8,70.5 +Mathematics,Grade 9,93.2 +Chemistry,Grade 7,80.7 +Biology,Grade 9,68.2 +Biology,Grade 7,70.8 +History,Grade 9,51.9 +History,Grade 8,73.7 +Physics,Grade 8,77.0 +Mathematics,Grade 9,74.5 +Physics,Grade 9,54.4 +Biology,Grade 8,100.0 +Physics,Grade 8,70.4 +Physics,Grade 7,65.0 +Biology,Grade 9,61.9 +Physics,Grade 7,49.7 +Chemistry,Grade 8,86.8 +Physics,Grade 9,61.2 +Biology,Grade 9,80.6 +History,Grade 9,83.7 +Biology,Grade 8,77.9 +Physics,Grade 9,76.5 +Mathematics,Grade 8,71.2 +Mathematics,Grade 7,69.9 +Chemistry,Grade 8,69.5 +Chemistry,Grade 9,97.2 +Physics,Grade 8,45.5 +Chemistry,Grade 7,69.4 +History,Grade 8,97.3 +Biology,Grade 9,71.2 +Mathematics,Grade 8,71.6 +Chemistry,Grade 8,74.6 +Mathematics,Grade 7,56.2 +Physics,Grade 8,75.5 +History,Grade 9,100.0 +History,Grade 7,82.4 +Physics,Grade 8,85.2 +Mathematics,Grade 8,70.2 +Physics,Grade 8,70.4 +Physics,Grade 8,77.9 +Mathematics,Grade 7,86.7 +History,Grade 7,77.5 +History,Grade 7,81.1 +Mathematics,Grade 8,72.5 +Chemistry,Grade 7,59.2 +Biology,Grade 8,78.0 +History,Grade 9,100.0 +Mathematics,Grade 7,76.5 +Biology,Grade 7,68.2 +Mathematics,Grade 9,76.8 +Biology,Grade 8,62.4 +History,Grade 8,98.7 +History,Grade 8,67.5 +History,Grade 9,81.0 +Physics,Grade 7,53.3 +Chemistry,Grade 8,65.9 +Mathematics,Grade 9,61.5 +Chemistry,Grade 7,53.0 +Chemistry,Grade 7,47.7 +Physics,Grade 9,93.7 +Mathematics,Grade 7,70.3 +Physics,Grade 7,76.4 +Physics,Grade 7,52.5 +History,Grade 8,67.6 +Mathematics,Grade 8,54.3 +History,Grade 8,79.2 +Chemistry,Grade 8,62.2 +Biology,Grade 8,66.1 +Physics,Grade 7,77.0 +Biology,Grade 7,63.8 +Physics,Grade 8,80.3 +Chemistry,Grade 8,69.4 +Physics,Grade 8,58.7 +History,Grade 9,76.1 +Mathematics,Grade 8,64.9 +Chemistry,Grade 8,59.9 +Chemistry,Grade 7,63.3 +Biology,Grade 7,66.2 +History,Grade 7,75.6 +Biology,Grade 7,56.5 +Biology,Grade 9,84.3 +Chemistry,Grade 8,60.1 +Physics,Grade 9,73.5 +Biology,Grade 9,78.6 +Mathematics,Grade 8,57.8 +History,Grade 7,60.7 +Physics,Grade 9,65.9 +Mathematics,Grade 7,69.5 +Biology,Grade 8,80.7 +Mathematics,Grade 7,76.1 +History,Grade 8,72.8 +Chemistry,Grade 9,58.2 +Mathematics,Grade 7,56.0 +History,Grade 9,81.1 +History,Grade 8,77.3 +Chemistry,Grade 7,57.9 +Mathematics,Grade 7,78.5 +History,Grade 9,80.3 +Chemistry,Grade 7,57.4 +Physics,Grade 8,62.5 +Physics,Grade 8,56.1 +Chemistry,Grade 7,79.7 +Chemistry,Grade 7,59.8 +Biology,Grade 9,82.3 +Physics,Grade 8,80.8 +History,Grade 7,77.5 +Biology,Grade 7,60.3 +Mathematics,Grade 7,54.4 +Mathematics,Grade 7,54.3 +Chemistry,Grade 9,67.4 +Mathematics,Grade 9,79.5 +Physics,Grade 8,49.6 +Physics,Grade 7,83.9 +History,Grade 8,75.0 +Chemistry,Grade 8,59.9 +Mathematics,Grade 8,55.1 +History,Grade 8,73.9 +Biology,Grade 8,75.9 +Biology,Grade 9,81.6 +Chemistry,Grade 9,69.8 +History,Grade 9,77.9 +History,Grade 8,80.8 +Biology,Grade 7,95.7 +Mathematics,Grade 9,66.7 +Physics,Grade 8,47.2 +Chemistry,Grade 9,81.8 +Chemistry,Grade 7,76.1 +Biology,Grade 9,61.8 +Physics,Grade 7,79.9 +Chemistry,Grade 8,72.9 +Physics,Grade 9,60.4 +History,Grade 7,73.9 +Biology,Grade 8,73.2 +Chemistry,Grade 7,69.5 +Mathematics,Grade 7,62.5 +Biology,Grade 7,69.6 +Chemistry,Grade 7,59.6 +History,Grade 7,69.7 +History,Grade 8,53.4 +Mathematics,Grade 7,59.3 +Mathematics,Grade 9,80.8 +Mathematics,Grade 7,69.5 +Biology,Grade 9,90.9 +Biology,Grade 7,60.6 +Biology,Grade 7,80.9 +Mathematics,Grade 9,80.4 +Chemistry,Grade 8,63.6 +Physics,Grade 8,38.7 +Biology,Grade 9,62.1 +History,Grade 7,77.6 +History,Grade 8,86.1 +Biology,Grade 7,76.6 +Mathematics,Grade 7,63.2 +Chemistry,Grade 9,54.0 +Mathematics,Grade 8,57.6 +Mathematics,Grade 9,81.2 +Physics,Grade 7,56.6 +Chemistry,Grade 8,67.6 +History,Grade 8,82.7 +Mathematics,Grade 8,61.2 +Mathematics,Grade 7,52.6 +Biology,Grade 7,70.0 +Physics,Grade 7,65.3 +Mathematics,Grade 9,71.0 +History,Grade 7,57.5 +Mathematics,Grade 7,65.3 +Biology,Grade 7,51.1 +Chemistry,Grade 9,74.2 +History,Grade 9,76.1 +Mathematics,Grade 7,62.5 +History,Grade 7,75.0 +Chemistry,Grade 7,71.2 +History,Grade 8,83.0 +Physics,Grade 8,69.9 +Chemistry,Grade 7,46.7 +History,Grade 9,83.3 +Biology,Grade 9,100.0 +Biology,Grade 7,67.3 +Physics,Grade 7,55.9 +Mathematics,Grade 7,66.5 +Physics,Grade 8,71.2 +Biology,Grade 7,73.4 +Mathematics,Grade 8,64.4 +Chemistry,Grade 7,72.7 +History,Grade 9,76.1 +Chemistry,Grade 9,63.8 +Chemistry,Grade 9,77.2 +Chemistry,Grade 7,68.9 +Chemistry,Grade 9,84.0 +History,Grade 8,61.3 +History,Grade 9,94.1 +History,Grade 7,73.7 +Chemistry,Grade 7,51.5 +Chemistry,Grade 9,80.5 +Biology,Grade 8,93.5 +History,Grade 7,73.7 +Chemistry,Grade 9,52.5 +Mathematics,Grade 8,84.0 +Mathematics,Grade 8,75.2 +Physics,Grade 8,71.7 +History,Grade 9,59.1 +History,Grade 7,73.6 +Biology,Grade 7,75.1 +Biology,Grade 7,85.1 +Physics,Grade 8,59.8 +Biology,Grade 9,50.5 +Biology,Grade 7,79.1 +Physics,Grade 7,60.8 +Chemistry,Grade 7,73.8 +Chemistry,Grade 8,68.5 +Biology,Grade 9,61.4 +Biology,Grade 7,65.1 +History,Grade 8,70.0 +Chemistry,Grade 7,69.9 +Chemistry,Grade 7,58.0 +Biology,Grade 9,97.5 +Mathematics,Grade 9,80.0 +Chemistry,Grade 7,65.8 +History,Grade 9,66.4 +Biology,Grade 7,83.9 +Chemistry,Grade 9,78.5 +Mathematics,Grade 7,66.4 +Biology,Grade 8,95.1 +Biology,Grade 9,100.0 +Biology,Grade 8,50.5 +History,Grade 7,97.3 +Biology,Grade 9,80.3 +Biology,Grade 8,69.6 +History,Grade 9,75.7 +Mathematics,Grade 7,73.7 +Physics,Grade 8,60.9 +Chemistry,Grade 7,79.0 +Physics,Grade 9,56.2 +Chemistry,Grade 7,52.0 +History,Grade 7,72.4 +Mathematics,Grade 7,65.8 +Chemistry,Grade 7,67.0 +Chemistry,Grade 7,46.7 +History,Grade 8,89.4 +Mathematics,Grade 8,64.9 +Mathematics,Grade 7,68.0 +Mathematics,Grade 8,60.9 +Mathematics,Grade 9,70.9 +Biology,Grade 8,56.7 +History,Grade 7,72.0 +Biology,Grade 9,66.8 +History,Grade 7,83.9 +Physics,Grade 8,50.0 +Physics,Grade 7,51.6 +History,Grade 8,85.1 +History,Grade 9,69.4 +Biology,Grade 9,84.5 +History,Grade 9,78.2 +Chemistry,Grade 9,77.7 +Biology,Grade 7,74.4 +Chemistry,Grade 8,69.5 +Mathematics,Grade 9,88.0 +Physics,Grade 7,63.4 +History,Grade 9,66.5 +Physics,Grade 7,60.4 +History,Grade 9,87.4 +History,Grade 8,76.6 +Physics,Grade 7,75.2 +Mathematics,Grade 8,66.5 +Chemistry,Grade 7,74.6 +Physics,Grade 9,65.2 +History,Grade 8,68.5 +Biology,Grade 7,77.6 +History,Grade 8,76.2 +History,Grade 8,75.7 +History,Grade 8,63.6 +Mathematics,Grade 8,77.5 +Biology,Grade 8,83.5 +History,Grade 7,77.2 +Biology,Grade 8,85.5 +Mathematics,Grade 8,63.3 +History,Grade 9,89.7 +Mathematics,Grade 9,66.4 +Biology,Grade 8,71.2 +Physics,Grade 7,59.1 +Biology,Grade 8,71.3 +Chemistry,Grade 7,80.6 +Chemistry,Grade 7,62.6 +History,Grade 9,72.8 +History,Grade 7,82.5 +Chemistry,Grade 7,69.5 +History,Grade 9,79.2 +Chemistry,Grade 7,62.4 +History,Grade 9,96.1 +Chemistry,Grade 9,68.0 +Mathematics,Grade 9,73.5 +Mathematics,Grade 9,76.9 +Biology,Grade 8,80.0 +Mathematics,Grade 9,71.7 +Chemistry,Grade 8,73.7 +Chemistry,Grade 9,68.3 +Physics,Grade 9,44.2 +Physics,Grade 9,55.1 +Biology,Grade 8,78.0 +Biology,Grade 8,45.9 +Mathematics,Grade 7,73.7 +Biology,Grade 9,68.3 +Biology,Grade 8,89.8 +Chemistry,Grade 7,66.5 +Physics,Grade 7,71.0 +Biology,Grade 8,94.2 +Physics,Grade 9,71.3 +History,Grade 7,76.4 +Chemistry,Grade 7,55.7 +Biology,Grade 8,81.3 +Physics,Grade 7,61.5 +History,Grade 7,65.4 +Mathematics,Grade 8,79.1 +Physics,Grade 9,71.7 +Mathematics,Grade 9,86.3 +Chemistry,Grade 7,55.8 +Biology,Grade 7,70.5 +Biology,Grade 8,57.9 +Biology,Grade 7,80.1 +Biology,Grade 7,72.7 +Biology,Grade 7,83.1 +Chemistry,Grade 9,59.2 +History,Grade 8,88.5 +Chemistry,Grade 9,57.5 +Physics,Grade 9,75.1 +Physics,Grade 7,70.1 +Chemistry,Grade 9,96.3 +Biology,Grade 8,76.0 +History,Grade 8,78.1 +Biology,Grade 9,75.1 +Mathematics,Grade 7,64.8 +Biology,Grade 8,78.1 +Chemistry,Grade 8,83.9 +Physics,Grade 9,70.8 +Biology,Grade 9,72.5 +Physics,Grade 8,65.9 +History,Grade 8,83.2 +Physics,Grade 7,70.8 +Chemistry,Grade 8,58.8 +Biology,Grade 8,90.3 +Physics,Grade 7,71.7 +Chemistry,Grade 8,100.0 +History,Grade 8,70.1 +Chemistry,Grade 7,52.4 +Mathematics,Grade 7,93.0 +Chemistry,Grade 7,78.2 +Physics,Grade 9,65.0 +Chemistry,Grade 9,63.2 +Mathematics,Grade 7,73.4 +Chemistry,Grade 8,93.7 +Biology,Grade 9,76.8 +History,Grade 8,100.0 +History,Grade 9,93.5 +Chemistry,Grade 8,54.8 +Chemistry,Grade 7,74.7 +Chemistry,Grade 9,73.7 +Biology,Grade 9,74.3 +Chemistry,Grade 7,98.6 +Mathematics,Grade 9,78.7 +Biology,Grade 7,63.0 +Mathematics,Grade 7,81.9 +Chemistry,Grade 9,79.0 +Chemistry,Grade 7,63.1 +History,Grade 9,73.2 +Mathematics,Grade 7,50.5 +Biology,Grade 8,74.0 +Biology,Grade 7,90.9 +Mathematics,Grade 8,61.9 +History,Grade 8,79.4 +Biology,Grade 9,74.5 +Biology,Grade 8,74.4 +Mathematics,Grade 7,62.0 +History,Grade 9,82.8 +Mathematics,Grade 9,89.7 +History,Grade 9,50.7 +Physics,Grade 8,76.0 +Chemistry,Grade 9,68.8 +Chemistry,Grade 7,48.7 +Biology,Grade 7,57.2 +Physics,Grade 7,70.7 +History,Grade 8,88.0 +History,Grade 7,67.4 +Chemistry,Grade 9,85.2 +History,Grade 8,64.2 +Mathematics,Grade 7,76.9 +Physics,Grade 7,51.2 +Chemistry,Grade 9,74.9 +Physics,Grade 9,64.6 +Mathematics,Grade 7,71.7 +Mathematics,Grade 8,71.3 +Chemistry,Grade 8,75.0 +Mathematics,Grade 7,71.2 +Biology,Grade 7,84.5 +Mathematics,Grade 8,64.6 +Physics,Grade 9,62.4 +History,Grade 8,88.8 +Physics,Grade 9,73.7 +Chemistry,Grade 7,65.0 +Physics,Grade 9,68.0 +History,Grade 8,81.5 +Mathematics,Grade 9,86.5 +Physics,Grade 7,71.2 +Chemistry,Grade 9,74.7 +History,Grade 9,100.0 +Biology,Grade 7,57.1 +History,Grade 9,75.7 +Chemistry,Grade 8,86.2 +Mathematics,Grade 8,91.5 +Chemistry,Grade 9,80.2 +Mathematics,Grade 7,58.2 +Physics,Grade 9,81.9 +Physics,Grade 9,66.9 +Biology,Grade 9,86.6 +Mathematics,Grade 8,58.2 +Biology,Grade 7,72.5 +History,Grade 7,82.7 +History,Grade 9,74.1 +Biology,Grade 7,81.6 +Chemistry,Grade 8,74.1 +Biology,Grade 8,69.3 +History,Grade 7,73.3 +History,Grade 7,77.8 +Biology,Grade 7,66.4 +Physics,Grade 8,76.3 +Physics,Grade 8,69.4 +History,Grade 7,87.1 +Biology,Grade 8,67.7 +Chemistry,Grade 7,70.5 +Biology,Grade 7,58.4 +Physics,Grade 9,72.6 +Biology,Grade 8,82.8 +Mathematics,Grade 9,76.7 +History,Grade 7,88.4 +Chemistry,Grade 7,55.5 +Physics,Grade 7,79.8 +Biology,Grade 8,75.8 +Physics,Grade 9,63.7 +Biology,Grade 7,71.7 +Chemistry,Grade 7,76.4 +Mathematics,Grade 9,83.3 +Physics,Grade 9,67.9 +Biology,Grade 9,83.2 +Mathematics,Grade 7,44.4 +Physics,Grade 7,77.3 +History,Grade 7,62.9 +Chemistry,Grade 7,66.4 +Mathematics,Grade 7,59.7 +Chemistry,Grade 8,69.7 +Physics,Grade 9,71.1 +Chemistry,Grade 7,76.1 +Chemistry,Grade 9,72.1 +Physics,Grade 8,65.0 +Physics,Grade 7,51.7 +Mathematics,Grade 8,85.5 +Physics,Grade 8,78.6 +Physics,Grade 7,63.8 +Chemistry,Grade 8,52.7 +History,Grade 8,83.5 +Biology,Grade 8,88.7 +Biology,Grade 7,74.9 +Mathematics,Grade 7,68.0 +Mathematics,Grade 8,69.3 +History,Grade 7,58.8 +Chemistry,Grade 7,55.5 +Biology,Grade 7,94.7 +Physics,Grade 7,63.6 +History,Grade 7,84.2 +History,Grade 9,100.0 +Mathematics,Grade 9,76.6 +Physics,Grade 9,69.8 +Physics,Grade 9,60.0 +Physics,Grade 9,55.3 +Mathematics,Grade 8,67.6 +Biology,Grade 7,84.0 +Mathematics,Grade 9,71.1 +Physics,Grade 9,56.3 +Biology,Grade 9,97.0 +Mathematics,Grade 8,83.0 +Physics,Grade 8,74.4 +Chemistry,Grade 7,65.1 +History,Grade 8,57.4 +History,Grade 8,81.8 +Physics,Grade 8,81.1 +Mathematics,Grade 9,83.7 +History,Grade 8,56.2 +History,Grade 8,69.6 +Biology,Grade 7,67.2 +Chemistry,Grade 9,62.8 +Mathematics,Grade 8,78.3 +Physics,Grade 7,65.7 +Chemistry,Grade 7,58.3 +Chemistry,Grade 9,65.7 +History,Grade 8,69.6 +Physics,Grade 8,60.7 +Biology,Grade 7,69.3 +Chemistry,Grade 7,79.4 +Mathematics,Grade 9,94.1 +Physics,Grade 8,75.6 +History,Grade 9,54.2 +Mathematics,Grade 8,68.8 +Biology,Grade 7,64.8 +History,Grade 7,60.2 +Physics,Grade 7,58.9 +Mathematics,Grade 7,57.6 +Biology,Grade 7,63.4 +Chemistry,Grade 9,59.6 +Mathematics,Grade 9,77.4 +Chemistry,Grade 8,62.4 +Mathematics,Grade 9,71.5 +Physics,Grade 8,74.0 +Physics,Grade 9,93.9 +History,Grade 7,68.3 +Biology,Grade 9,62.5 +Physics,Grade 9,76.9 +Biology,Grade 8,89.2 +Mathematics,Grade 9,77.8 +History,Grade 7,95.4 +Mathematics,Grade 9,86.2 +History,Grade 8,59.1 +Physics,Grade 9,56.9 +Physics,Grade 8,66.6 +Physics,Grade 7,53.9 +Physics,Grade 8,78.1 +Biology,Grade 9,72.7 +History,Grade 9,88.9 +Biology,Grade 9,81.0 +Chemistry,Grade 8,69.9 +Physics,Grade 9,55.8 +Mathematics,Grade 9,79.4 +Chemistry,Grade 8,69.3 +Chemistry,Grade 7,77.8 +Mathematics,Grade 9,58.5 +History,Grade 9,85.3 +Physics,Grade 8,57.6 +History,Grade 7,66.9 +Physics,Grade 8,70.5 +Physics,Grade 8,49.3 +History,Grade 8,69.9 +Chemistry,Grade 7,55.6 +Physics,Grade 8,60.4 +Physics,Grade 9,67.3 +Biology,Grade 9,88.7 +History,Grade 8,77.1 +Physics,Grade 9,76.8 +History,Grade 8,76.8 +History,Grade 7,87.3 +Chemistry,Grade 8,71.2 +Biology,Grade 9,72.9 +History,Grade 7,80.2 +Physics,Grade 8,71.2 +Chemistry,Grade 8,67.9 +Chemistry,Grade 7,72.0 +Chemistry,Grade 8,57.3 +Chemistry,Grade 8,80.3 +History,Grade 7,77.4 +History,Grade 8,92.3 +Chemistry,Grade 7,60.2 +History,Grade 8,68.7 +Mathematics,Grade 8,80.1 +Chemistry,Grade 7,61.7 +Physics,Grade 9,58.4 +Mathematics,Grade 9,56.7 +Biology,Grade 9,68.4 +History,Grade 9,86.1 +Chemistry,Grade 8,65.3 +Biology,Grade 9,72.3 +Mathematics,Grade 7,81.6 +Biology,Grade 8,59.2 +Chemistry,Grade 9,71.8 +Mathematics,Grade 8,71.1 +History,Grade 7,94.0 +Chemistry,Grade 8,62.6 +History,Grade 7,83.4 +Biology,Grade 9,82.9 +Biology,Grade 9,91.1 +History,Grade 7,78.0 +Mathematics,Grade 9,67.6 +Mathematics,Grade 8,67.0 +Mathematics,Grade 9,78.6 +Mathematics,Grade 7,63.4 +Physics,Grade 9,89.4 +Mathematics,Grade 9,69.1 +Biology,Grade 8,83.8 +Biology,Grade 8,72.0 +Mathematics,Grade 9,90.8 +Biology,Grade 7,54.4 +History,Grade 9,73.7 +Biology,Grade 8,66.7 +Mathematics,Grade 9,96.3 +Biology,Grade 8,77.8 +Biology,Grade 7,78.8 +History,Grade 7,78.8 +Mathematics,Grade 8,76.7 +Physics,Grade 8,79.1 +Physics,Grade 8,58.8 +Mathematics,Grade 7,69.0 +Chemistry,Grade 7,44.1 +Mathematics,Grade 9,78.5 +History,Grade 7,73.9 +Chemistry,Grade 7,67.0 +History,Grade 8,78.4 +Mathematics,Grade 9,65.0 +Physics,Grade 8,46.1 +History,Grade 8,70.2 +Mathematics,Grade 8,75.8 +Biology,Grade 7,59.5 +Chemistry,Grade 9,91.2 +Biology,Grade 8,92.9 +History,Grade 7,93.1 +Physics,Grade 9,81.1 +Mathematics,Grade 8,66.4 +Physics,Grade 8,46.4 +Mathematics,Grade 9,72.4 +Chemistry,Grade 9,81.8 +History,Grade 8,68.8 +Biology,Grade 8,79.2 +Physics,Grade 8,66.5 +Physics,Grade 9,64.7 +Biology,Grade 7,79.7 +History,Grade 7,89.2 +Biology,Grade 8,79.0 +Biology,Grade 8,58.7 +Physics,Grade 9,69.5 +Mathematics,Grade 7,85.6 +Mathematics,Grade 7,38.1 +Mathematics,Grade 7,72.1 +Biology,Grade 7,68.1 +Biology,Grade 7,80.8 +Physics,Grade 8,66.4 +Physics,Grade 9,57.2 +History,Grade 8,70.8 +Physics,Grade 8,73.2 +Biology,Grade 8,87.4 +Biology,Grade 9,82.8 +Biology,Grade 9,74.0 +Mathematics,Grade 9,59.9 +Physics,Grade 7,71.4 +Mathematics,Grade 9,72.1 +Physics,Grade 7,74.1 +Mathematics,Grade 8,58.5 +Mathematics,Grade 8,75.7 +History,Grade 9,74.7 +Biology,Grade 7,78.1 +History,Grade 7,58.3 +History,Grade 7,65.9 +Chemistry,Grade 7,49.5 +Mathematics,Grade 9,97.7 +Mathematics,Grade 9,89.4 +Chemistry,Grade 8,70.7 +History,Grade 8,56.4 +Biology,Grade 9,72.8 +Mathematics,Grade 9,79.7 +Physics,Grade 9,55.3 +Mathematics,Grade 8,57.8 +History,Grade 9,87.8 +Chemistry,Grade 8,70.8 +Chemistry,Grade 8,78.1 +Mathematics,Grade 7,58.9 +Mathematics,Grade 8,77.3 +History,Grade 8,78.1 +Physics,Grade 8,69.7 +Mathematics,Grade 8,64.9 +History,Grade 7,60.4 +Chemistry,Grade 7,74.3 +Physics,Grade 9,57.4 +History,Grade 8,65.7 +Mathematics,Grade 8,60.9 +Mathematics,Grade 8,81.9 +Chemistry,Grade 7,66.9 +Mathematics,Grade 9,86.8 +Mathematics,Grade 7,51.9 +Chemistry,Grade 8,60.7 +Physics,Grade 8,68.0 +Mathematics,Grade 7,54.5 +Chemistry,Grade 7,73.3 +Biology,Grade 7,72.9 +Physics,Grade 8,74.5 +History,Grade 7,54.3 +History,Grade 9,85.1 +Physics,Grade 9,62.1 +History,Grade 9,72.9 +Mathematics,Grade 7,76.8 +Physics,Grade 7,59.9 +Chemistry,Grade 8,69.5 +Chemistry,Grade 7,57.6 +Mathematics,Grade 7,65.5 +Mathematics,Grade 9,84.8 +Physics,Grade 9,65.0 +History,Grade 7,61.8 +Mathematics,Grade 9,61.2 +Chemistry,Grade 7,79.1 +Mathematics,Grade 7,100.0 +History,Grade 8,74.6 +Mathematics,Grade 9,65.9 +Mathematics,Grade 9,90.6 +Biology,Grade 9,82.7 +Mathematics,Grade 7,60.6 +Biology,Grade 8,88.0 +History,Grade 9,79.3 +Biology,Grade 9,74.4 +Chemistry,Grade 9,78.8 +Physics,Grade 9,71.2 +Biology,Grade 9,79.9 +Chemistry,Grade 7,90.1 +Mathematics,Grade 8,64.5 +Mathematics,Grade 9,54.9 +Physics,Grade 9,44.8 +Biology,Grade 8,70.9 +History,Grade 7,75.8 +Biology,Grade 8,74.1 +Physics,Grade 7,58.8 +History,Grade 9,93.0 +Chemistry,Grade 8,73.1 +Physics,Grade 8,58.7 +Biology,Grade 9,74.0 +Chemistry,Grade 9,69.2 +Mathematics,Grade 9,92.4 +History,Grade 9,79.7 +Mathematics,Grade 7,90.1 +History,Grade 9,69.8 +Biology,Grade 8,91.0 +Chemistry,Grade 9,56.8 +Chemistry,Grade 7,64.6 +Mathematics,Grade 7,78.6 +History,Grade 9,62.6 +Biology,Grade 8,72.5 +Biology,Grade 7,75.7 +Mathematics,Grade 8,67.7 +History,Grade 8,69.5 +Chemistry,Grade 9,82.1 +Physics,Grade 7,67.6 +History,Grade 9,100.0 +History,Grade 7,69.0 +Chemistry,Grade 9,79.0 +Physics,Grade 8,72.8 +Physics,Grade 8,73.3 +Biology,Grade 9,65.6 +History,Grade 8,77.5 +Biology,Grade 7,71.4 +Biology,Grade 9,83.6 +Physics,Grade 9,86.6 +Chemistry,Grade 9,68.9 +Mathematics,Grade 9,79.5 +History,Grade 7,63.1 +Physics,Grade 9,68.5 +History,Grade 8,84.2 +Chemistry,Grade 7,79.2 +Physics,Grade 7,55.6 +Biology,Grade 7,61.2 +History,Grade 9,81.0 +History,Grade 7,75.2 +Mathematics,Grade 8,78.1 +History,Grade 8,63.2 +Chemistry,Grade 9,80.4 +Biology,Grade 8,80.8 +Physics,Grade 9,56.9 +History,Grade 7,70.3 +History,Grade 8,76.3 +Chemistry,Grade 7,52.8 +History,Grade 9,67.6 +Mathematics,Grade 9,71.2 +Mathematics,Grade 9,82.9 +Biology,Grade 9,70.1 +Chemistry,Grade 7,76.4 +Physics,Grade 7,44.9 +Biology,Grade 9,73.7 +Biology,Grade 7,73.7 +Mathematics,Grade 7,79.1 +Physics,Grade 9,73.0 +History,Grade 7,84.9 +History,Grade 8,78.5 +History,Grade 7,87.9 +Physics,Grade 8,81.8 +History,Grade 8,71.7 +Mathematics,Grade 7,61.9 +Biology,Grade 9,70.0 +Biology,Grade 9,86.7 +Chemistry,Grade 8,56.3 +Mathematics,Grade 8,85.7 +Physics,Grade 7,54.6 +History,Grade 8,62.9 +History,Grade 7,71.2 +Physics,Grade 8,76.5 +Chemistry,Grade 8,74.5 +History,Grade 9,80.4 +Chemistry,Grade 9,81.3 +History,Grade 8,75.1 +Physics,Grade 9,79.4 +Biology,Grade 8,78.8 +History,Grade 8,70.9 +History,Grade 8,72.5 +Mathematics,Grade 9,91.1 +Biology,Grade 7,66.2 +Physics,Grade 7,56.8 +Chemistry,Grade 7,77.3 +History,Grade 7,62.1 +Biology,Grade 8,67.0 +Chemistry,Grade 9,81.4 +Chemistry,Grade 9,56.2 +Biology,Grade 9,100.0 +Mathematics,Grade 7,47.6 +History,Grade 8,69.2 +Biology,Grade 7,65.8 +Physics,Grade 8,53.9 +History,Grade 8,76.7 +Chemistry,Grade 9,70.6 +Mathematics,Grade 9,67.6 +Physics,Grade 9,60.3 +History,Grade 8,78.9 +Chemistry,Grade 9,67.4 +Physics,Grade 8,77.8 +Mathematics,Grade 8,70.1 +History,Grade 9,74.1 +Mathematics,Grade 7,88.9 +Physics,Grade 7,67.8 +Chemistry,Grade 8,67.3 +Mathematics,Grade 7,50.7 +Chemistry,Grade 8,66.4 +Biology,Grade 8,87.9 +Physics,Grade 7,59.8 +History,Grade 7,78.3 +Chemistry,Grade 8,65.3 +History,Grade 7,73.4 +History,Grade 8,89.9 +History,Grade 9,74.0 +Mathematics,Grade 9,72.3 +Mathematics,Grade 7,82.9 +Physics,Grade 7,72.5 +History,Grade 7,62.9 +History,Grade 8,72.8 +History,Grade 8,66.2 +Physics,Grade 7,72.3 +Mathematics,Grade 7,67.3 +Biology,Grade 9,83.0 +History,Grade 9,90.7 +Physics,Grade 8,57.8 +History,Grade 8,75.0 +Physics,Grade 7,53.6 +History,Grade 7,77.5 +Mathematics,Grade 9,65.4 +Physics,Grade 8,56.2 +Mathematics,Grade 9,82.0 +Biology,Grade 8,76.9 +Chemistry,Grade 9,62.3 +Chemistry,Grade 7,62.7 +History,Grade 7,83.7 +Biology,Grade 7,78.9 +Chemistry,Grade 8,93.0 +History,Grade 7,82.7 +History,Grade 9,93.4 +Mathematics,Grade 7,63.2 +Physics,Grade 9,70.6 +Chemistry,Grade 9,56.7 +Biology,Grade 7,74.2 +History,Grade 7,72.5 +Mathematics,Grade 8,65.9 +Biology,Grade 9,79.6 +Chemistry,Grade 7,69.2 +Physics,Grade 8,57.0 +Chemistry,Grade 9,60.9 +Biology,Grade 7,82.7 +Biology,Grade 9,76.0 +Biology,Grade 9,78.3 +History,Grade 7,78.0 +Physics,Grade 8,59.7 +Mathematics,Grade 8,76.0 +Physics,Grade 9,55.6 +History,Grade 8,89.1 +Biology,Grade 9,65.8 +History,Grade 9,74.8 +Chemistry,Grade 8,51.1 +Mathematics,Grade 7,69.6 +Mathematics,Grade 7,61.9 +Physics,Grade 7,51.6 +Chemistry,Grade 7,77.9 +Physics,Grade 9,65.4 +Physics,Grade 8,75.0 +Chemistry,Grade 7,76.1 +Physics,Grade 7,59.6 +Mathematics,Grade 8,74.7 +Physics,Grade 7,63.8 +Chemistry,Grade 7,58.8 +Physics,Grade 9,85.8 +Biology,Grade 7,68.6 +Mathematics,Grade 8,56.1 +Chemistry,Grade 7,60.3 +Biology,Grade 7,87.2 +Physics,Grade 7,52.4 +Physics,Grade 9,78.7 +Mathematics,Grade 9,80.2 +Chemistry,Grade 9,66.6 +History,Grade 8,88.9 +History,Grade 8,99.1 +Biology,Grade 8,87.7 +Biology,Grade 7,71.1 +Biology,Grade 9,84.6 +History,Grade 9,90.2 +Mathematics,Grade 9,69.5 +History,Grade 7,69.8 +Chemistry,Grade 8,45.5 +Physics,Grade 8,57.4 +Physics,Grade 8,51.3 +Chemistry,Grade 7,65.4 +Biology,Grade 9,72.9 +Mathematics,Grade 7,61.3 +Mathematics,Grade 9,69.9 +Physics,Grade 8,50.2 +Physics,Grade 9,66.5 +Chemistry,Grade 8,66.4 +Chemistry,Grade 9,85.0 +Chemistry,Grade 7,85.1 +Mathematics,Grade 8,70.3 +Mathematics,Grade 9,83.3 +Mathematics,Grade 9,75.7 +Mathematics,Grade 9,88.8 +Mathematics,Grade 7,73.6 +History,Grade 7,78.4 +Biology,Grade 8,82.8 +Physics,Grade 9,84.4 +Mathematics,Grade 7,61.1 +Mathematics,Grade 8,64.0 +Biology,Grade 8,79.4 +Chemistry,Grade 9,77.8 +Chemistry,Grade 8,60.7 +Biology,Grade 9,87.2 +History,Grade 8,96.5 +Mathematics,Grade 8,66.4 +Mathematics,Grade 7,68.2 +History,Grade 8,86.3 +Biology,Grade 7,94.3 +Chemistry,Grade 9,78.9 +Biology,Grade 9,81.4 +History,Grade 7,92.7 +History,Grade 7,78.8 +Chemistry,Grade 9,68.9 +Physics,Grade 7,68.9 +History,Grade 7,74.6 +History,Grade 7,66.0 +Physics,Grade 9,57.9 +Chemistry,Grade 8,82.2 +Chemistry,Grade 7,51.3 +Physics,Grade 7,56.5 +History,Grade 7,60.7 +Biology,Grade 7,85.1 +Physics,Grade 8,64.9 +Physics,Grade 8,69.8 +History,Grade 9,78.0 +Physics,Grade 8,70.9 +Biology,Grade 7,66.5 +Biology,Grade 8,61.8 +Chemistry,Grade 9,58.0 +Physics,Grade 8,64.8 +Physics,Grade 8,40.5 +Mathematics,Grade 7,74.5 +Chemistry,Grade 9,60.2 +Chemistry,Grade 8,67.9 +History,Grade 7,99.0 +Chemistry,Grade 9,70.3 +History,Grade 8,70.2 +Chemistry,Grade 9,64.0 +History,Grade 7,87.6 +Physics,Grade 7,76.3 +Biology,Grade 9,83.5 +History,Grade 7,68.1 +Chemistry,Grade 8,85.1 +History,Grade 9,80.0 +Physics,Grade 9,80.7 +History,Grade 7,87.2 +Physics,Grade 9,74.6 +Chemistry,Grade 9,67.0 +Mathematics,Grade 9,61.8 +History,Grade 8,66.7 +Chemistry,Grade 7,54.3 +Chemistry,Grade 9,100.0 +Physics,Grade 8,42.7 +Mathematics,Grade 7,84.4 +Mathematics,Grade 9,47.5 +Physics,Grade 8,82.5 +Biology,Grade 9,81.0 +Mathematics,Grade 7,52.1 +Chemistry,Grade 9,51.1 +Mathematics,Grade 7,62.8 +History,Grade 9,79.3 +History,Grade 7,66.4 +Mathematics,Grade 9,74.1 +Chemistry,Grade 9,73.6 +Biology,Grade 8,75.2 +Chemistry,Grade 8,64.8 +Physics,Grade 8,54.1 +Chemistry,Grade 7,88.3 +Chemistry,Grade 7,62.8 +Mathematics,Grade 8,71.3 +Mathematics,Grade 7,89.7 +History,Grade 8,100.0 +Biology,Grade 9,68.2 +Chemistry,Grade 7,82.5 +Mathematics,Grade 7,66.7 +Chemistry,Grade 7,42.2 +Mathematics,Grade 8,64.3 +Chemistry,Grade 9,63.7 +Chemistry,Grade 9,88.1 +Biology,Grade 8,87.4 +Mathematics,Grade 9,71.7 +Biology,Grade 9,65.6 +History,Grade 8,81.3 +Chemistry,Grade 7,60.5 +Chemistry,Grade 8,79.8 +Physics,Grade 7,55.1 +History,Grade 9,72.0 +Chemistry,Grade 9,77.7 +Biology,Grade 7,93.0 +History,Grade 8,84.6 +Physics,Grade 9,66.7 +Mathematics,Grade 7,80.4 +History,Grade 7,82.0 +History,Grade 9,69.4 +Physics,Grade 7,68.5 +Physics,Grade 9,65.9 +Chemistry,Grade 8,76.8 +Mathematics,Grade 8,61.4 +Biology,Grade 7,73.8 +Mathematics,Grade 7,65.3 +Biology,Grade 7,53.3 +Biology,Grade 9,86.3 +History,Grade 9,83.8 +History,Grade 9,69.6 +Biology,Grade 9,72.9 +History,Grade 9,79.6 +Chemistry,Grade 8,64.8 +Mathematics,Grade 8,77.1 +Physics,Grade 7,65.8 +Mathematics,Grade 9,55.0 +Mathematics,Grade 7,79.4 +Biology,Grade 7,72.2 +Physics,Grade 9,59.8 +Chemistry,Grade 8,67.8 +History,Grade 8,62.3 +Biology,Grade 8,73.9 +Chemistry,Grade 9,76.7 +Biology,Grade 8,72.0 +Chemistry,Grade 8,76.5 +History,Grade 8,54.9 +Mathematics,Grade 8,69.1 +Physics,Grade 7,69.5 +Biology,Grade 9,100.0 +Biology,Grade 9,78.9 +Mathematics,Grade 7,76.4 +Chemistry,Grade 9,68.3 +Mathematics,Grade 7,62.2 +History,Grade 8,71.6 +History,Grade 7,71.1 +Physics,Grade 8,69.2 +Physics,Grade 7,51.9 +Chemistry,Grade 8,58.2 +Biology,Grade 8,79.6 +Biology,Grade 8,100.0 +History,Grade 8,79.1 +Physics,Grade 7,68.8 +History,Grade 7,68.7 +Biology,Grade 8,65.6 +Mathematics,Grade 7,68.7 +History,Grade 7,69.8 +Biology,Grade 9,91.1 +Mathematics,Grade 7,73.8 +Mathematics,Grade 8,48.5 +Physics,Grade 8,57.5 +Biology,Grade 7,67.3 +Mathematics,Grade 7,73.7 +Mathematics,Grade 7,74.0 +Biology,Grade 8,73.5 +Chemistry,Grade 8,79.2 +Chemistry,Grade 8,70.1 +Mathematics,Grade 7,49.1 +Physics,Grade 9,55.8 +Chemistry,Grade 7,64.7 +Biology,Grade 8,91.6 +Physics,Grade 8,80.9 +Mathematics,Grade 9,84.8 +Biology,Grade 9,83.9 +History,Grade 7,69.7 +Chemistry,Grade 7,66.4 +History,Grade 7,79.4 +Biology,Grade 7,59.8 +Biology,Grade 8,79.4 +Chemistry,Grade 7,84.2 +Biology,Grade 7,61.9 +Mathematics,Grade 9,65.4 +Physics,Grade 9,58.9 +Biology,Grade 7,57.2 +Mathematics,Grade 7,61.4 +Mathematics,Grade 9,61.1 +Chemistry,Grade 9,67.0 +Biology,Grade 7,62.9 +Chemistry,Grade 8,71.1 +History,Grade 8,65.8 +Chemistry,Grade 8,48.8 +Biology,Grade 9,82.2 +Chemistry,Grade 7,62.1 +Chemistry,Grade 7,62.1 +Chemistry,Grade 9,83.4 +History,Grade 9,79.1 +Biology,Grade 9,94.7 +Mathematics,Grade 8,57.8 +Chemistry,Grade 8,68.4 +Mathematics,Grade 9,86.4 +Chemistry,Grade 9,71.4 +Biology,Grade 8,84.9 +History,Grade 7,76.7 +Mathematics,Grade 9,88.1 +History,Grade 9,73.4 +Physics,Grade 7,56.6 +History,Grade 7,60.4 +Biology,Grade 8,68.3 +Chemistry,Grade 7,62.7 +Biology,Grade 9,65.1 +Biology,Grade 7,80.2 +Chemistry,Grade 7,72.6 +Mathematics,Grade 9,85.1 +Mathematics,Grade 8,80.0 +Physics,Grade 7,62.3 +History,Grade 9,87.2 +History,Grade 8,71.8 +Physics,Grade 7,76.6 +Biology,Grade 8,64.6 +Mathematics,Grade 7,85.3 +Biology,Grade 8,58.9 +Mathematics,Grade 7,54.5 +History,Grade 8,86.4 +Physics,Grade 9,80.9 +Chemistry,Grade 7,66.0 +Biology,Grade 7,73.9 +Physics,Grade 8,59.4 +Chemistry,Grade 8,70.1 +Mathematics,Grade 7,60.4 +History,Grade 9,76.0 +Mathematics,Grade 8,81.7 +Chemistry,Grade 7,69.3 +Biology,Grade 9,70.6 +Mathematics,Grade 7,75.2 +Biology,Grade 7,67.7 +Biology,Grade 9,87.4 +Chemistry,Grade 7,64.1 +Mathematics,Grade 7,67.3 +History,Grade 8,100.0 +Physics,Grade 7,54.5 +Mathematics,Grade 7,41.9 +Biology,Grade 7,75.8 +Chemistry,Grade 9,58.7 +Physics,Grade 7,53.4 +History,Grade 7,83.0 +Biology,Grade 8,71.5 +Biology,Grade 7,96.8 +Biology,Grade 7,58.2 +Biology,Grade 8,89.3 +History,Grade 9,83.0 +Physics,Grade 9,47.7 +Chemistry,Grade 7,68.6 +Physics,Grade 9,80.4 +History,Grade 8,78.7 +Mathematics,Grade 8,70.6 +History,Grade 9,86.5 +Physics,Grade 9,76.8 +Physics,Grade 9,66.1 +Chemistry,Grade 9,64.0 +Mathematics,Grade 9,66.9 +Chemistry,Grade 7,80.4 +Chemistry,Grade 7,63.2 +Biology,Grade 8,76.5 +Biology,Grade 9,71.5 +Physics,Grade 8,47.2 +History,Grade 9,44.3 +History,Grade 8,67.4 +Biology,Grade 7,54.8 +Chemistry,Grade 8,67.6 +Mathematics,Grade 9,63.0 +Biology,Grade 9,76.1 +Chemistry,Grade 8,85.8 +Biology,Grade 8,67.4 +Biology,Grade 8,84.9 +Biology,Grade 9,60.5 +Mathematics,Grade 7,63.5 +Biology,Grade 9,87.3 +Chemistry,Grade 7,45.3 +Chemistry,Grade 7,52.2 +History,Grade 9,100.0 +Biology,Grade 7,72.1 +Biology,Grade 9,74.9 +History,Grade 7,73.6 +Chemistry,Grade 7,47.2 +Physics,Grade 7,78.7 +Biology,Grade 9,89.9 +Chemistry,Grade 9,77.1 +Physics,Grade 7,81.4 +Mathematics,Grade 7,43.2 +History,Grade 9,91.2 +Mathematics,Grade 7,89.8 +Biology,Grade 8,83.0 +Physics,Grade 7,64.1 +Chemistry,Grade 9,94.4 +History,Grade 7,72.2 +Physics,Grade 7,55.3 +History,Grade 9,76.0 +Physics,Grade 7,66.1 +Physics,Grade 7,62.7 +Biology,Grade 9,66.8 +History,Grade 8,82.0 +Biology,Grade 8,55.7 +Mathematics,Grade 7,73.2 +History,Grade 9,85.0 +Biology,Grade 8,80.8 +Biology,Grade 8,77.2 +Chemistry,Grade 8,85.8 +History,Grade 7,79.0 +History,Grade 7,67.1 +History,Grade 9,84.5 +Chemistry,Grade 7,57.0 +Mathematics,Grade 9,68.6 +Physics,Grade 7,61.4 +History,Grade 7,63.9 +Chemistry,Grade 7,46.6 +History,Grade 8,64.2 +History,Grade 7,73.0 +Chemistry,Grade 8,61.0 +Biology,Grade 7,91.7 +Mathematics,Grade 8,68.7 +Mathematics,Grade 7,64.9 +Physics,Grade 9,83.6 +Biology,Grade 8,70.0 +History,Grade 7,54.9 +History,Grade 7,68.2 +Chemistry,Grade 8,64.8 +History,Grade 9,73.8 +Mathematics,Grade 8,82.6 +History,Grade 8,78.1 +History,Grade 7,65.7 +Biology,Grade 9,59.8 +Chemistry,Grade 8,81.9 +Chemistry,Grade 7,72.7 +Biology,Grade 9,87.5 +History,Grade 8,79.1 +Mathematics,Grade 9,74.5 +Chemistry,Grade 8,48.4 +Chemistry,Grade 9,72.0 +Biology,Grade 8,77.2 +Biology,Grade 9,86.8 +History,Grade 7,80.9 +History,Grade 7,82.8 +Physics,Grade 9,54.4 +Physics,Grade 8,63.5 +Chemistry,Grade 8,73.1 +Biology,Grade 7,87.1 +Mathematics,Grade 9,79.3 +Physics,Grade 9,70.1 +History,Grade 9,77.4 +Physics,Grade 7,78.0 +Chemistry,Grade 7,45.9 +Biology,Grade 9,83.8 +History,Grade 7,82.2 +History,Grade 7,56.9 +Biology,Grade 7,72.8 +Mathematics,Grade 9,85.5 +Chemistry,Grade 8,69.8 +Chemistry,Grade 8,77.7 +Physics,Grade 9,70.1 +Mathematics,Grade 8,92.1 +Chemistry,Grade 8,81.9 +Mathematics,Grade 8,69.4 +History,Grade 9,64.5 +Biology,Grade 9,78.7 +Biology,Grade 7,51.3 +Physics,Grade 8,62.5 +Physics,Grade 8,67.0 +Chemistry,Grade 8,77.2 +History,Grade 9,72.2 +Mathematics,Grade 9,54.3 +Biology,Grade 7,77.0 +History,Grade 7,82.2 +Mathematics,Grade 9,55.0 +Physics,Grade 8,67.3 +Mathematics,Grade 8,69.2 +Mathematics,Grade 7,58.6 +Physics,Grade 7,72.5 +Mathematics,Grade 7,58.9 +Biology,Grade 7,71.6 +Chemistry,Grade 8,89.1 +Mathematics,Grade 9,53.5 +Chemistry,Grade 7,54.2 +Mathematics,Grade 8,66.4 +Biology,Grade 9,72.8 +Biology,Grade 9,61.4 +Physics,Grade 7,60.1 +Physics,Grade 7,79.2 +Mathematics,Grade 9,73.2 +Chemistry,Grade 7,78.6 +Biology,Grade 7,75.8 +Chemistry,Grade 8,69.7 +History,Grade 9,83.3 +Chemistry,Grade 9,62.4 +Mathematics,Grade 8,66.4 +Physics,Grade 8,75.1 +History,Grade 7,52.3 +Physics,Grade 7,54.0 +Mathematics,Grade 8,56.6 +Biology,Grade 8,81.1 +Chemistry,Grade 9,99.5 +Chemistry,Grade 7,72.7 +History,Grade 7,70.1 +Physics,Grade 8,49.2 +Mathematics,Grade 8,62.0 +Biology,Grade 7,81.0 +History,Grade 9,75.6 +History,Grade 7,73.2 +Physics,Grade 7,62.0 +History,Grade 9,75.7 +Physics,Grade 9,69.4 +History,Grade 9,90.8 +Biology,Grade 7,76.2 +History,Grade 7,88.1 +History,Grade 8,86.7 +Physics,Grade 7,68.2 +History,Grade 9,75.7 +Physics,Grade 8,67.7 +Chemistry,Grade 7,56.1 +Mathematics,Grade 8,67.5 +History,Grade 8,91.3 +History,Grade 7,89.7 +Mathematics,Grade 7,84.7 +Mathematics,Grade 8,78.1 +Mathematics,Grade 9,87.9 +Chemistry,Grade 8,62.7 +Mathematics,Grade 7,73.0 +Mathematics,Grade 8,69.1 +Biology,Grade 9,76.1 +History,Grade 9,73.1 +Biology,Grade 7,86.6 +Chemistry,Grade 9,77.9 +Chemistry,Grade 9,59.7 +Chemistry,Grade 7,91.7 +Mathematics,Grade 8,76.5 +Physics,Grade 8,60.2 +Mathematics,Grade 7,74.2 +Chemistry,Grade 8,50.1 +Chemistry,Grade 8,65.7 +Chemistry,Grade 8,72.0 +Chemistry,Grade 9,70.1 +History,Grade 7,69.4 +History,Grade 9,77.6 +Chemistry,Grade 9,73.0 +Physics,Grade 7,81.7 +Mathematics,Grade 9,65.9 +Physics,Grade 7,52.9 +Mathematics,Grade 8,70.9 +Biology,Grade 8,86.6 +Chemistry,Grade 8,63.9 +History,Grade 9,91.9 +Physics,Grade 7,51.9 +Physics,Grade 8,64.0 +Physics,Grade 9,67.4 +Chemistry,Grade 7,69.2 +Biology,Grade 9,83.6 +Physics,Grade 7,76.8 +Mathematics,Grade 8,70.3 +Biology,Grade 9,86.5 +Mathematics,Grade 9,78.9 +History,Grade 8,72.9 +Mathematics,Grade 7,74.0 +Mathematics,Grade 9,70.6 +Chemistry,Grade 7,50.7 +Biology,Grade 9,100.0 +History,Grade 9,81.7 +Physics,Grade 9,76.4 +Mathematics,Grade 9,92.9 +Biology,Grade 7,76.0 +Physics,Grade 8,89.8 +Biology,Grade 8,82.6 +Mathematics,Grade 7,60.6 +Physics,Grade 9,52.6 +Mathematics,Grade 9,78.8 +Physics,Grade 7,59.7 +Biology,Grade 9,71.5 +Biology,Grade 8,54.6 +Mathematics,Grade 7,54.6 +Biology,Grade 7,48.8 +Biology,Grade 8,84.1 +History,Grade 8,80.8 +Mathematics,Grade 9,66.8 +Physics,Grade 7,68.0 +History,Grade 8,57.3 +Chemistry,Grade 9,61.8 +Physics,Grade 9,69.7 +Physics,Grade 8,85.2 +Chemistry,Grade 8,84.0 +History,Grade 9,71.8 +Physics,Grade 7,69.1 +Biology,Grade 9,74.0 +Physics,Grade 9,50.0 +Chemistry,Grade 9,63.5 +Mathematics,Grade 8,79.1 +Mathematics,Grade 8,76.9 +Biology,Grade 7,68.3 +Physics,Grade 9,60.7 +Chemistry,Grade 8,86.8 +Chemistry,Grade 9,75.1 +Chemistry,Grade 9,85.1 +Mathematics,Grade 7,47.2 +History,Grade 7,61.2 +Mathematics,Grade 8,67.7 +History,Grade 7,66.6 +Physics,Grade 9,83.5 +Physics,Grade 7,61.0 +Mathematics,Grade 8,64.0 +Biology,Grade 9,67.9 +Physics,Grade 8,57.0 +History,Grade 7,66.2 +Physics,Grade 7,65.5 +Chemistry,Grade 7,69.0 +Mathematics,Grade 8,96.8 +History,Grade 7,85.5 +Chemistry,Grade 7,76.0 +Physics,Grade 9,58.5 +History,Grade 9,86.2 +Physics,Grade 8,71.5 +Physics,Grade 7,51.7 +Biology,Grade 8,77.3 +History,Grade 7,75.5 +Biology,Grade 8,87.6 +Chemistry,Grade 8,53.1 +History,Grade 7,71.4 +History,Grade 8,89.2 +Mathematics,Grade 8,70.9 +Chemistry,Grade 9,66.1 +Biology,Grade 9,88.7 +Mathematics,Grade 7,72.4 +Physics,Grade 9,71.3 +Mathematics,Grade 8,60.0 +Chemistry,Grade 7,59.1 +Biology,Grade 8,80.7 +Physics,Grade 8,74.3 +Physics,Grade 7,63.9 +Biology,Grade 8,70.6 +Physics,Grade 8,91.2 +Chemistry,Grade 8,68.4 +Mathematics,Grade 7,71.3 +Chemistry,Grade 9,70.4 +Mathematics,Grade 7,62.5 +Mathematics,Grade 7,67.1 +Chemistry,Grade 7,54.5 +Chemistry,Grade 9,68.3 +History,Grade 8,66.4 +History,Grade 8,93.3 +History,Grade 7,58.9 +Chemistry,Grade 8,71.3 +Biology,Grade 9,77.6 +Physics,Grade 7,81.0 +Biology,Grade 9,65.4 +Mathematics,Grade 7,73.9 +Mathematics,Grade 8,71.1 +Biology,Grade 9,81.0 +Mathematics,Grade 7,57.0 +Chemistry,Grade 7,68.0 +History,Grade 9,95.2 +Chemistry,Grade 7,78.6 +History,Grade 9,94.3 +History,Grade 8,74.5 +Mathematics,Grade 9,65.7 +Mathematics,Grade 9,60.7 +Physics,Grade 8,75.1 +Biology,Grade 9,86.7 +Chemistry,Grade 9,78.0 +Chemistry,Grade 9,67.3 +Biology,Grade 7,79.5 +History,Grade 7,69.5 +Physics,Grade 8,88.9 +Biology,Grade 9,94.2 +Chemistry,Grade 8,68.9 +Chemistry,Grade 9,80.4 +Mathematics,Grade 7,74.2 +Mathematics,Grade 9,61.8 +Mathematics,Grade 8,71.7 +Mathematics,Grade 9,55.3 +Chemistry,Grade 9,72.1 +Physics,Grade 9,83.6 +Chemistry,Grade 8,71.5 +Biology,Grade 8,54.0 +Chemistry,Grade 7,62.6 +History,Grade 9,67.8 +Mathematics,Grade 8,70.0 +Mathematics,Grade 8,68.1 +Mathematics,Grade 8,72.2 +Biology,Grade 7,67.0 +Mathematics,Grade 7,79.8 +Physics,Grade 8,65.8 +Chemistry,Grade 7,75.2 +Mathematics,Grade 8,70.0 +Chemistry,Grade 9,66.7 +Biology,Grade 9,67.9 +History,Grade 8,78.7 +Biology,Grade 7,83.4 +Chemistry,Grade 9,65.4 +Mathematics,Grade 9,66.3 +Mathematics,Grade 9,56.3 +Biology,Grade 9,77.3 +Physics,Grade 8,61.5 +Physics,Grade 7,42.7 +Chemistry,Grade 8,62.8 +Mathematics,Grade 7,67.8 +Physics,Grade 9,88.2 +Biology,Grade 8,61.3 +Mathematics,Grade 9,63.4 +Mathematics,Grade 8,69.6 +History,Grade 7,74.9 +Chemistry,Grade 9,85.6 +History,Grade 9,93.0 +Biology,Grade 7,65.1 +Biology,Grade 9,90.5 +Mathematics,Grade 8,84.6 +Chemistry,Grade 9,75.4 +History,Grade 7,93.9 +Chemistry,Grade 7,74.8 +Mathematics,Grade 9,89.2 +Biology,Grade 7,57.3 +Mathematics,Grade 7,81.7 +Biology,Grade 7,90.9 +Biology,Grade 7,80.6 +History,Grade 7,61.2 +Mathematics,Grade 9,73.9 +History,Grade 7,84.9 +Mathematics,Grade 8,57.2 +Mathematics,Grade 9,77.8 +Biology,Grade 9,83.1 +Chemistry,Grade 8,64.1 +History,Grade 9,72.3 +Chemistry,Grade 7,56.9 +Biology,Grade 7,64.5 +Physics,Grade 7,77.1 +History,Grade 8,82.2 +History,Grade 8,74.2 +Chemistry,Grade 8,78.5 +History,Grade 9,91.7 +History,Grade 9,83.4 +Chemistry,Grade 8,67.6 +Biology,Grade 8,90.3 +Biology,Grade 9,86.2 +Mathematics,Grade 7,56.4 +History,Grade 8,76.8 +History,Grade 9,96.9 +History,Grade 9,75.1 +Physics,Grade 8,74.1 +Mathematics,Grade 8,93.3 +Physics,Grade 9,82.6 +History,Grade 8,84.8 +History,Grade 7,64.8 +Chemistry,Grade 9,84.0 +Mathematics,Grade 9,90.5 +Mathematics,Grade 7,58.7 +History,Grade 8,86.3 +Biology,Grade 8,79.4 +Mathematics,Grade 8,65.0 +Biology,Grade 7,66.1 +Mathematics,Grade 9,86.6 +Physics,Grade 9,87.5 +Biology,Grade 8,90.9 +History,Grade 9,89.3 +History,Grade 7,75.4 +Biology,Grade 7,68.5 +Biology,Grade 9,67.3 +Mathematics,Grade 8,90.0 +History,Grade 7,81.0 +Biology,Grade 8,45.7 +Mathematics,Grade 7,90.2 +Chemistry,Grade 8,71.3 +Mathematics,Grade 8,51.1 +Biology,Grade 8,63.2 +Mathematics,Grade 7,73.5 +Chemistry,Grade 9,84.6 +History,Grade 8,67.4 +Chemistry,Grade 9,53.0 +Mathematics,Grade 8,66.1 +History,Grade 8,87.4 +Mathematics,Grade 8,65.4 +History,Grade 8,66.1 +Chemistry,Grade 7,51.4 +Mathematics,Grade 9,86.3 +Biology,Grade 9,80.6 +History,Grade 7,81.7 +Biology,Grade 7,64.1 +Biology,Grade 7,60.0 +Chemistry,Grade 7,67.2 +Biology,Grade 9,70.9 +Biology,Grade 8,75.4 +Mathematics,Grade 9,58.2 +Mathematics,Grade 7,82.7 +History,Grade 7,76.7 +Mathematics,Grade 9,62.6 +Physics,Grade 7,72.9 +History,Grade 7,89.0 +Physics,Grade 8,79.8 +Mathematics,Grade 9,80.5 +Chemistry,Grade 9,80.8 +Physics,Grade 9,80.9 +Physics,Grade 8,73.1 +Chemistry,Grade 8,61.2 +Biology,Grade 8,88.2 +Chemistry,Grade 7,60.8 +Mathematics,Grade 7,59.8 +Mathematics,Grade 7,75.1 +Chemistry,Grade 9,70.8 +Biology,Grade 8,61.5 +Chemistry,Grade 8,62.5 +Chemistry,Grade 8,75.1 +History,Grade 8,67.9 +Physics,Grade 9,85.2 +History,Grade 7,70.1 +Mathematics,Grade 7,53.6 +History,Grade 9,84.4 +Biology,Grade 8,82.5 +Chemistry,Grade 7,71.7 +Physics,Grade 9,57.2 +Chemistry,Grade 9,73.5 +Chemistry,Grade 9,68.4 +Mathematics,Grade 9,69.9 +Chemistry,Grade 8,73.8 +History,Grade 8,92.5 +Physics,Grade 9,51.8 +Biology,Grade 9,83.1 +History,Grade 9,70.0 +Biology,Grade 8,56.9 +Chemistry,Grade 7,63.1 +Chemistry,Grade 8,89.0 +Chemistry,Grade 7,74.4 +History,Grade 7,74.2 +History,Grade 7,75.2 +Biology,Grade 8,81.0 +Biology,Grade 7,64.0 +Chemistry,Grade 8,66.3 +Biology,Grade 9,81.4 +Mathematics,Grade 8,93.1 +History,Grade 9,87.1 +Biology,Grade 7,71.9 +History,Grade 9,93.4 +Biology,Grade 9,87.0 +Mathematics,Grade 9,81.5 +Mathematics,Grade 8,74.4 +History,Grade 7,85.6 +Mathematics,Grade 7,61.4 +Physics,Grade 8,74.1 +Physics,Grade 8,66.6 +Chemistry,Grade 8,52.0 +Biology,Grade 9,90.6 +Biology,Grade 7,72.0 +History,Grade 7,87.0 +History,Grade 9,71.7 +Mathematics,Grade 7,58.9 +Biology,Grade 9,67.2 +Mathematics,Grade 8,73.5 +Mathematics,Grade 7,74.5 +Chemistry,Grade 9,79.6 +History,Grade 7,84.2 +Chemistry,Grade 9,91.6 +Chemistry,Grade 7,53.3 +Chemistry,Grade 8,87.8 +Biology,Grade 8,72.7 +Physics,Grade 7,64.2 +History,Grade 7,62.8 +Biology,Grade 9,87.7 +Mathematics,Grade 7,74.5 +Mathematics,Grade 8,54.8 +Physics,Grade 8,72.3 +Physics,Grade 7,73.7 +Mathematics,Grade 8,68.4 +Chemistry,Grade 7,76.9 +Biology,Grade 9,84.2 +History,Grade 7,53.9 +Biology,Grade 9,73.7 +Mathematics,Grade 9,77.4 +Chemistry,Grade 8,57.3 +Mathematics,Grade 7,62.1 +Chemistry,Grade 9,81.3 +Biology,Grade 8,65.8 +Biology,Grade 7,75.5 +Mathematics,Grade 9,74.6 +History,Grade 7,45.4 +Mathematics,Grade 8,84.6 +Biology,Grade 9,81.3 +History,Grade 8,90.1 +Mathematics,Grade 7,68.3 +Physics,Grade 7,63.6 +Biology,Grade 8,75.4 +Mathematics,Grade 8,63.8 +History,Grade 7,92.1 +Physics,Grade 9,56.8 +Chemistry,Grade 8,76.6 +Mathematics,Grade 9,86.3 +Mathematics,Grade 8,68.3 +History,Grade 9,43.8 +Mathematics,Grade 7,68.7 +History,Grade 7,71.3 +Biology,Grade 8,79.0 +Chemistry,Grade 9,71.2 +History,Grade 7,82.8 +Physics,Grade 9,54.9 +Mathematics,Grade 8,72.2 +Mathematics,Grade 7,52.1 +Chemistry,Grade 8,68.3 +Chemistry,Grade 8,84.1 +Biology,Grade 9,74.1 +Physics,Grade 8,71.1 +Biology,Grade 9,80.2 +Biology,Grade 8,68.2 +History,Grade 8,78.2 +Physics,Grade 9,63.2 +History,Grade 7,70.5 +Biology,Grade 7,72.8 +Physics,Grade 7,58.4 +Biology,Grade 8,55.5 +Biology,Grade 9,69.2 +Mathematics,Grade 8,73.1 +Chemistry,Grade 8,63.0 +Physics,Grade 7,64.8 +Physics,Grade 8,57.0 +Chemistry,Grade 8,71.6 +Biology,Grade 9,80.9 +Physics,Grade 9,63.5 +History,Grade 8,81.0 +Chemistry,Grade 8,78.7 +Physics,Grade 8,73.4 +Physics,Grade 9,85.4 +Chemistry,Grade 8,73.0 +Mathematics,Grade 8,73.1 +Physics,Grade 7,65.7 +Physics,Grade 7,47.6 +Biology,Grade 9,98.2 +Physics,Grade 8,56.6 +Biology,Grade 9,83.2 +History,Grade 9,94.2 +Physics,Grade 8,46.7 +Biology,Grade 7,78.0 +Chemistry,Grade 9,46.3 +History,Grade 7,89.6 +Chemistry,Grade 7,44.3 +Physics,Grade 9,57.7 +Biology,Grade 7,76.1 +Biology,Grade 8,50.9 +Chemistry,Grade 9,69.3 +Mathematics,Grade 9,85.2 +History,Grade 9,75.1 +Chemistry,Grade 7,46.9 +Biology,Grade 7,60.0 +Physics,Grade 8,57.3 +History,Grade 9,94.9 +History,Grade 7,67.1 +Biology,Grade 9,70.2 +Mathematics,Grade 7,71.8 +Physics,Grade 9,62.7 +Physics,Grade 7,46.2 +Mathematics,Grade 8,87.9 +Physics,Grade 9,79.6 +History,Grade 9,67.1 +History,Grade 7,82.7 +History,Grade 7,62.8 +Mathematics,Grade 9,99.3 +Biology,Grade 8,79.1 +Physics,Grade 8,61.0 +Mathematics,Grade 8,62.2 +Physics,Grade 7,62.1 +Mathematics,Grade 9,80.6 +History,Grade 7,66.5 +Chemistry,Grade 9,74.6 +Mathematics,Grade 8,48.9 +Mathematics,Grade 8,51.5 +Chemistry,Grade 8,87.6 +History,Grade 7,43.6 +Chemistry,Grade 9,93.3 +Chemistry,Grade 7,71.7 +Mathematics,Grade 9,85.2 +History,Grade 8,62.4 +Physics,Grade 9,72.5 +Mathematics,Grade 8,62.5 +History,Grade 7,73.3 +Physics,Grade 7,59.6 +Physics,Grade 9,51.8 +Chemistry,Grade 7,64.8 +Mathematics,Grade 7,60.0 +Mathematics,Grade 9,89.3 +Physics,Grade 7,84.2 +Mathematics,Grade 7,67.6 +Biology,Grade 8,77.1 +Physics,Grade 9,86.1 +Chemistry,Grade 7,70.1 +Mathematics,Grade 8,68.3 +Physics,Grade 7,69.2 +Mathematics,Grade 9,75.0 +Biology,Grade 7,62.6 +History,Grade 8,65.3 +History,Grade 9,92.7 +Mathematics,Grade 7,65.8 +Physics,Grade 7,54.1 +Biology,Grade 9,80.0 +Physics,Grade 9,68.5 +History,Grade 8,88.0 +Chemistry,Grade 9,68.7 +History,Grade 7,73.3 +Biology,Grade 9,87.9 +Mathematics,Grade 7,72.1 +History,Grade 9,96.7 +Physics,Grade 9,66.1 +Biology,Grade 7,69.6 +Physics,Grade 9,77.8 +Biology,Grade 7,65.8 +History,Grade 7,78.0 +Mathematics,Grade 9,82.0 +History,Grade 9,68.0 +Physics,Grade 7,53.3 +Physics,Grade 9,69.5 +Biology,Grade 9,71.0 +History,Grade 8,75.7 +History,Grade 9,67.4 +Chemistry,Grade 7,55.2 +Mathematics,Grade 8,68.5 +History,Grade 9,95.8 +History,Grade 7,55.4 +Physics,Grade 9,77.3 +Physics,Grade 8,77.1 +Mathematics,Grade 7,67.6 +History,Grade 8,79.5 +Physics,Grade 9,64.1 +Physics,Grade 9,54.4 +History,Grade 9,70.3 +Chemistry,Grade 8,73.5 +Mathematics,Grade 9,88.4 +Physics,Grade 8,71.3 +Biology,Grade 7,84.8 +History,Grade 7,65.4 +Mathematics,Grade 7,57.0 +Mathematics,Grade 7,76.0 +Chemistry,Grade 9,62.3 +Biology,Grade 9,84.9 +Physics,Grade 7,71.3 +Biology,Grade 8,73.2 +Physics,Grade 7,79.8 +Physics,Grade 7,70.8 +History,Grade 8,74.7 +Chemistry,Grade 7,65.2 +Mathematics,Grade 7,66.7 +Biology,Grade 7,64.4 +Biology,Grade 9,95.6 +History,Grade 7,67.9 +Physics,Grade 9,68.8 +History,Grade 9,83.7 +Biology,Grade 8,60.0 +Physics,Grade 8,76.0 +Chemistry,Grade 7,64.5 +Physics,Grade 9,76.3 +Mathematics,Grade 8,90.4 +Mathematics,Grade 8,56.3 +Chemistry,Grade 7,72.2 +Biology,Grade 8,79.0 +History,Grade 7,69.1 +Chemistry,Grade 7,55.6 +Mathematics,Grade 7,68.2 +Chemistry,Grade 8,57.4 +Physics,Grade 8,70.1 +Chemistry,Grade 9,67.7 +Chemistry,Grade 7,74.5 +Mathematics,Grade 9,61.7 +History,Grade 9,73.2 +History,Grade 8,82.7 +Biology,Grade 9,81.3 +Biology,Grade 7,74.8 +Mathematics,Grade 8,71.7 +History,Grade 8,79.5 +Mathematics,Grade 8,72.4 +Physics,Grade 9,57.2 +Biology,Grade 7,66.1 +Chemistry,Grade 8,79.6 +History,Grade 7,56.8 +Chemistry,Grade 8,56.4 +History,Grade 9,75.0 +Physics,Grade 7,78.7 +Physics,Grade 8,70.0 +Mathematics,Grade 9,70.4 +History,Grade 9,68.7 +History,Grade 8,96.3 +History,Grade 7,80.0 +Physics,Grade 7,80.9 +Chemistry,Grade 7,59.7 +History,Grade 8,82.0 +History,Grade 8,77.3 +Mathematics,Grade 9,88.6 +History,Grade 7,81.6 +Biology,Grade 8,85.0 +Mathematics,Grade 7,64.8 +Physics,Grade 8,80.6 +History,Grade 9,73.8 +Mathematics,Grade 9,68.0 +Physics,Grade 9,73.5 +Biology,Grade 8,74.0 +Biology,Grade 9,65.7 +Chemistry,Grade 8,74.1 +Mathematics,Grade 7,57.4 +History,Grade 9,94.4 +History,Grade 7,64.8 +Mathematics,Grade 7,76.2 +History,Grade 7,94.5 +Mathematics,Grade 7,71.2 +History,Grade 9,80.1 +Physics,Grade 7,88.8 +Mathematics,Grade 7,73.3 +Physics,Grade 8,89.2 +History,Grade 8,79.1 +Mathematics,Grade 9,92.9 +Chemistry,Grade 9,57.6 +Biology,Grade 8,75.3 +Mathematics,Grade 8,67.9 +Mathematics,Grade 7,65.1 +Chemistry,Grade 8,81.3 +Mathematics,Grade 7,78.7 +Mathematics,Grade 9,78.9 +Mathematics,Grade 7,57.6 +History,Grade 8,83.6 +Biology,Grade 8,67.0 +Chemistry,Grade 9,87.2 +Mathematics,Grade 8,64.2 +Mathematics,Grade 8,78.4 +Mathematics,Grade 8,72.8 +Biology,Grade 7,71.6 +Biology,Grade 7,65.3 +Mathematics,Grade 8,71.7 +Biology,Grade 7,51.2 +History,Grade 7,69.6 +Physics,Grade 9,44.3 +History,Grade 7,83.8 +Physics,Grade 8,92.8 +Physics,Grade 7,73.2 +Chemistry,Grade 9,78.0 +Mathematics,Grade 9,66.0 +History,Grade 9,83.6 +Mathematics,Grade 7,79.8 +History,Grade 8,79.3 +Physics,Grade 8,62.5 +Biology,Grade 8,69.0 +Biology,Grade 8,75.6 +Chemistry,Grade 7,82.8 +Mathematics,Grade 9,88.4 +History,Grade 9,88.8 +Chemistry,Grade 7,63.4 +Biology,Grade 9,72.3 +History,Grade 8,55.1 +Mathematics,Grade 8,71.7 +Mathematics,Grade 9,60.7 +Biology,Grade 9,86.6 +Chemistry,Grade 7,65.6 +Mathematics,Grade 7,64.7 +History,Grade 7,90.8 +Chemistry,Grade 7,68.2 +Physics,Grade 7,59.4 +Physics,Grade 7,43.8 +History,Grade 7,83.3 +History,Grade 7,66.7 +Physics,Grade 9,71.6 +Biology,Grade 9,95.1 +Chemistry,Grade 9,68.5 +Physics,Grade 7,66.4 +History,Grade 7,83.3 +Physics,Grade 9,93.1 +Chemistry,Grade 7,79.0 +Mathematics,Grade 8,77.0 +History,Grade 8,68.6 +Physics,Grade 8,87.2 +History,Grade 7,58.6 +History,Grade 7,85.9 +Biology,Grade 7,88.8 +Chemistry,Grade 7,48.9 +History,Grade 9,82.5 +Mathematics,Grade 9,90.3 +Chemistry,Grade 7,72.5 +Chemistry,Grade 9,62.2 +Mathematics,Grade 9,62.2 +History,Grade 8,82.8 +Biology,Grade 9,74.3 +Biology,Grade 7,74.2 +Chemistry,Grade 8,72.9 +Biology,Grade 7,71.7 +Physics,Grade 7,53.4 +Physics,Grade 7,53.6 +Physics,Grade 9,59.3 +History,Grade 8,77.9 +History,Grade 9,72.5 +Physics,Grade 8,64.4 +History,Grade 9,90.1 +Mathematics,Grade 7,65.2 +Chemistry,Grade 8,48.1 +History,Grade 8,69.2 +Biology,Grade 9,69.9 +Physics,Grade 7,83.9 +Chemistry,Grade 8,63.2 +History,Grade 8,82.0 +Mathematics,Grade 7,70.6 +Mathematics,Grade 9,78.3 +Physics,Grade 9,64.3 +History,Grade 7,66.4 +Mathematics,Grade 8,66.0 +History,Grade 7,68.2 +Chemistry,Grade 7,68.1 +Chemistry,Grade 8,83.4 +History,Grade 9,67.4 +Mathematics,Grade 8,56.0 +Biology,Grade 8,78.6 +Physics,Grade 7,73.5 +Chemistry,Grade 9,39.5 +Physics,Grade 9,84.1 +Physics,Grade 9,76.0 +Biology,Grade 9,66.2 +Mathematics,Grade 9,76.1 +History,Grade 8,61.0 +Physics,Grade 9,62.0 +Physics,Grade 7,61.2 +Physics,Grade 7,62.8 +Biology,Grade 8,88.5 +Physics,Grade 9,77.7 +History,Grade 9,77.6 +Biology,Grade 9,67.7 +History,Grade 9,85.1 +Mathematics,Grade 8,74.5 +Physics,Grade 9,63.7 +Physics,Grade 7,62.3 +History,Grade 8,82.3 +History,Grade 7,78.9 +Physics,Grade 9,75.5 +History,Grade 9,77.6 +Biology,Grade 7,79.6 +Physics,Grade 7,54.6 +Chemistry,Grade 9,70.3 +Mathematics,Grade 8,75.2 +Physics,Grade 7,56.2 +Biology,Grade 7,72.9 +Biology,Grade 7,59.1 +Physics,Grade 7,73.5 +Biology,Grade 7,54.1 +History,Grade 9,76.5 +Physics,Grade 8,63.7 +Biology,Grade 7,58.9 +Chemistry,Grade 8,83.1 +Physics,Grade 9,73.7 +Physics,Grade 7,52.2 +Chemistry,Grade 9,82.0 +Biology,Grade 7,62.0 +Biology,Grade 9,81.4 +Biology,Grade 7,69.0 +Mathematics,Grade 8,77.8 +Biology,Grade 8,71.4 +Physics,Grade 7,73.6 +Physics,Grade 7,60.9 +Physics,Grade 9,70.8 +Biology,Grade 9,80.6 +Physics,Grade 8,53.8 +Biology,Grade 9,100.0 +Biology,Grade 8,69.1 +History,Grade 7,54.4 +Biology,Grade 9,67.7 +Chemistry,Grade 9,72.7 +Chemistry,Grade 8,57.1 +Physics,Grade 9,73.1 +Mathematics,Grade 9,72.8 +Chemistry,Grade 9,63.3 +Physics,Grade 8,58.3 +Physics,Grade 8,71.4 +Chemistry,Grade 7,65.9 +History,Grade 7,98.7 +Chemistry,Grade 8,54.1 +Biology,Grade 7,73.7 +Chemistry,Grade 7,52.6 +History,Grade 7,78.3 +Biology,Grade 7,90.3 +History,Grade 9,88.9 +Chemistry,Grade 7,58.3 +Chemistry,Grade 9,73.6 +Physics,Grade 7,84.6 +Mathematics,Grade 9,84.8 +Biology,Grade 8,69.5 +Chemistry,Grade 9,52.1 +Chemistry,Grade 8,66.6 +Mathematics,Grade 8,96.1 +Mathematics,Grade 7,81.0 +Chemistry,Grade 9,71.1 +History,Grade 8,90.5 +Physics,Grade 8,78.2 +Physics,Grade 9,84.3 +Biology,Grade 9,63.0 +Chemistry,Grade 9,84.0 +Mathematics,Grade 8,82.5 +History,Grade 7,73.0 +Physics,Grade 7,49.4 +Chemistry,Grade 9,77.4 +Physics,Grade 8,66.4 +Mathematics,Grade 8,47.4 +Biology,Grade 7,84.8 +Chemistry,Grade 9,79.3 +Physics,Grade 9,78.4 +Biology,Grade 9,77.6 +Physics,Grade 9,94.8 +Chemistry,Grade 7,65.5 +Chemistry,Grade 8,93.1 +Biology,Grade 8,79.7 +Physics,Grade 7,74.0 +Chemistry,Grade 7,72.3 +Chemistry,Grade 7,57.3 +Chemistry,Grade 7,70.8 +History,Grade 9,64.0 +Mathematics,Grade 8,69.0 +Biology,Grade 7,66.9 +Mathematics,Grade 8,73.6 +Biology,Grade 9,76.7 +Physics,Grade 8,61.4 +Biology,Grade 7,92.4 +Chemistry,Grade 7,74.9 +History,Grade 8,75.5 +Chemistry,Grade 7,60.6 +Mathematics,Grade 9,75.3 +Mathematics,Grade 9,86.1 +History,Grade 8,91.9 +Mathematics,Grade 9,73.2 +Biology,Grade 9,77.7 +History,Grade 9,77.0 +Mathematics,Grade 8,85.6 +Mathematics,Grade 7,54.4 +Mathematics,Grade 8,67.9 +Biology,Grade 7,79.7 +Chemistry,Grade 9,71.2 +Physics,Grade 9,96.4 +Biology,Grade 9,86.5 +Mathematics,Grade 7,59.4 +Physics,Grade 9,73.0 +History,Grade 7,82.5 +Biology,Grade 7,61.9 +Biology,Grade 7,86.2 +Chemistry,Grade 8,63.6 +History,Grade 8,85.6 +History,Grade 7,82.9 +Physics,Grade 9,85.3 +Chemistry,Grade 9,58.2 +Physics,Grade 7,69.5 +Chemistry,Grade 9,79.5 +Physics,Grade 7,56.2 +Physics,Grade 7,52.5 +Mathematics,Grade 8,78.1 +Mathematics,Grade 9,69.2 +Chemistry,Grade 9,91.9 +Physics,Grade 7,53.7 +History,Grade 8,100.0 +Mathematics,Grade 7,66.6 +Physics,Grade 8,68.7 +Biology,Grade 8,80.3 +History,Grade 9,92.5 +Chemistry,Grade 8,75.2 +Physics,Grade 7,65.2 +History,Grade 8,70.5 +History,Grade 8,64.0 +History,Grade 7,96.3 +Physics,Grade 7,68.6 +History,Grade 8,96.6 +History,Grade 9,84.8 +Mathematics,Grade 7,56.2 +Physics,Grade 9,95.7 +Biology,Grade 7,55.1 +History,Grade 8,83.2 +Chemistry,Grade 8,42.2 +History,Grade 8,76.9 +Biology,Grade 8,78.3 +Chemistry,Grade 8,90.6 +Physics,Grade 9,80.4 +Physics,Grade 8,69.4 +History,Grade 9,80.9 +Chemistry,Grade 8,64.1 +History,Grade 9,81.1 +Mathematics,Grade 7,73.1 +Chemistry,Grade 9,88.5 +Biology,Grade 9,60.7 +Biology,Grade 9,84.9 +History,Grade 8,83.4 +History,Grade 8,70.9 +History,Grade 7,67.3 +Chemistry,Grade 8,59.9 +Biology,Grade 9,69.2 +History,Grade 7,58.4 +Physics,Grade 8,70.1 +History,Grade 8,80.7 +Chemistry,Grade 7,79.9 +History,Grade 7,60.4 +Biology,Grade 9,73.6 +Biology,Grade 9,91.5 +Chemistry,Grade 9,68.3 +Mathematics,Grade 7,43.8 +History,Grade 8,85.0 +Mathematics,Grade 8,56.9 +Biology,Grade 8,87.4 +Physics,Grade 8,54.9 +Physics,Grade 7,62.7 +Physics,Grade 7,73.5 +Mathematics,Grade 9,82.8 +Mathematics,Grade 8,76.7 +Physics,Grade 7,68.3 +Biology,Grade 8,62.9 +Biology,Grade 8,68.3 +History,Grade 8,70.4 +Physics,Grade 8,83.0 +Biology,Grade 7,79.3 +Chemistry,Grade 8,75.0 +Physics,Grade 9,70.4 +Mathematics,Grade 8,76.0 +Chemistry,Grade 7,67.2 +History,Grade 9,81.5 +Biology,Grade 7,73.7 +History,Grade 7,95.3 +Chemistry,Grade 7,33.6 +Physics,Grade 9,78.9 +Biology,Grade 8,56.0 +Biology,Grade 7,52.8 +Biology,Grade 7,70.3 +Mathematics,Grade 7,72.0 +Mathematics,Grade 8,76.5 +Chemistry,Grade 9,64.6 +History,Grade 9,91.3 +Chemistry,Grade 7,55.7 +Physics,Grade 9,73.3 +Biology,Grade 8,87.4 +Physics,Grade 8,78.8 +Biology,Grade 8,75.9 +Mathematics,Grade 8,58.6 +History,Grade 7,80.3 +Biology,Grade 7,93.2 +Chemistry,Grade 8,69.5 +History,Grade 8,87.6 +Mathematics,Grade 9,88.3 +Mathematics,Grade 9,52.3 +Mathematics,Grade 9,71.9 +Biology,Grade 7,68.2 +Physics,Grade 9,76.5 +Physics,Grade 9,65.4 +Mathematics,Grade 9,79.8 +History,Grade 8,88.3 +History,Grade 8,70.6 +History,Grade 8,80.0 +Biology,Grade 7,94.0 +Mathematics,Grade 9,59.6 +Biology,Grade 7,76.9 +Chemistry,Grade 9,68.1 +Physics,Grade 8,53.3 +Physics,Grade 8,80.4 +Chemistry,Grade 8,69.7 +Mathematics,Grade 9,74.7 +Chemistry,Grade 9,63.9 +Mathematics,Grade 7,67.3 +Mathematics,Grade 9,68.8 +Biology,Grade 7,59.9 +Chemistry,Grade 8,62.9 +Physics,Grade 7,65.0 +Mathematics,Grade 9,94.2 +Physics,Grade 8,60.8 +Chemistry,Grade 8,71.6 +Biology,Grade 7,65.5 +Biology,Grade 9,93.0 +History,Grade 7,78.1 +Physics,Grade 7,47.8 +Biology,Grade 9,77.4 +Chemistry,Grade 9,66.6 +History,Grade 8,63.7 +Chemistry,Grade 9,62.8 +Chemistry,Grade 8,79.7 +Chemistry,Grade 9,39.5 +Physics,Grade 9,74.3 +Chemistry,Grade 7,68.2 +Chemistry,Grade 7,79.3 +History,Grade 7,63.3 +Mathematics,Grade 7,57.6 +Chemistry,Grade 9,76.6 +Chemistry,Grade 9,76.3 +Mathematics,Grade 7,79.5 +Physics,Grade 7,58.7 +History,Grade 8,73.1 +History,Grade 7,77.7 +Mathematics,Grade 8,71.5 +Mathematics,Grade 9,74.4 +Chemistry,Grade 9,95.0 +Chemistry,Grade 9,73.7 +Mathematics,Grade 8,92.8 +Chemistry,Grade 7,56.5 +Mathematics,Grade 7,58.4 +History,Grade 9,72.3 +Chemistry,Grade 8,56.9 +Chemistry,Grade 7,67.7 +Mathematics,Grade 8,79.6 +Biology,Grade 7,84.5 +History,Grade 8,78.2 +Chemistry,Grade 8,69.3 +Physics,Grade 7,49.0 +Chemistry,Grade 9,71.1 +Mathematics,Grade 9,81.6 +Chemistry,Grade 8,62.7 +Mathematics,Grade 8,69.7 +Biology,Grade 7,68.0 +Biology,Grade 7,55.3 +Chemistry,Grade 7,61.6 +Chemistry,Grade 9,71.9 +Physics,Grade 8,65.1 +History,Grade 8,60.4 +Chemistry,Grade 7,64.9 +History,Grade 9,84.0 +Physics,Grade 7,38.9 +Biology,Grade 7,58.6 +Physics,Grade 8,67.1 +Chemistry,Grade 8,93.8 +Physics,Grade 9,57.4 +Chemistry,Grade 7,60.1 +Mathematics,Grade 9,75.9 +Biology,Grade 7,63.8 +Physics,Grade 7,76.2 +History,Grade 8,77.8 +Physics,Grade 8,51.1 +History,Grade 9,79.9 +Mathematics,Grade 9,79.6 +Biology,Grade 7,74.7 +Chemistry,Grade 8,73.9 +History,Grade 7,85.1 +Chemistry,Grade 8,64.1 +Mathematics,Grade 7,46.9 +History,Grade 8,76.9 +Mathematics,Grade 7,55.3 +Physics,Grade 8,69.4 +Biology,Grade 7,61.9 +Physics,Grade 8,75.4 +History,Grade 7,82.6 +Physics,Grade 8,72.3 +History,Grade 7,80.6 +Chemistry,Grade 7,77.4 +Biology,Grade 9,89.1 +Biology,Grade 8,82.1 +Mathematics,Grade 8,72.3 +Chemistry,Grade 7,68.2 +Physics,Grade 9,64.6 +Chemistry,Grade 7,50.7 +History,Grade 7,77.5 +History,Grade 8,72.1 +Chemistry,Grade 7,64.7 +Chemistry,Grade 7,77.5 +Biology,Grade 7,75.9 +History,Grade 7,81.1 +Chemistry,Grade 9,65.6 +Mathematics,Grade 9,80.4 +Biology,Grade 7,69.9 +History,Grade 8,66.2 +Chemistry,Grade 7,76.0 +Biology,Grade 7,82.0 +Chemistry,Grade 9,77.3 +Mathematics,Grade 8,91.2 +Chemistry,Grade 7,55.6 +History,Grade 8,78.6 +Biology,Grade 7,64.0 +Physics,Grade 9,75.6 +Mathematics,Grade 8,80.7 +Biology,Grade 8,74.8 +Mathematics,Grade 8,64.2 +History,Grade 7,69.2 +Mathematics,Grade 9,90.0 +Chemistry,Grade 9,80.7 +Biology,Grade 9,93.5 +Mathematics,Grade 7,55.0 +Physics,Grade 9,63.5 +Physics,Grade 8,57.5 +Biology,Grade 7,64.3 +Biology,Grade 7,56.2 +Chemistry,Grade 7,51.1 +Mathematics,Grade 9,69.4 +Chemistry,Grade 8,64.5 +Biology,Grade 9,71.4 +Chemistry,Grade 8,67.3 +Mathematics,Grade 7,54.9 +History,Grade 8,87.3 +Physics,Grade 7,53.6 +Biology,Grade 9,84.4 +Mathematics,Grade 9,69.9 +Chemistry,Grade 9,63.0 +Chemistry,Grade 8,75.3 +Physics,Grade 9,73.7 +Chemistry,Grade 9,69.8 +Physics,Grade 7,37.4 +Biology,Grade 9,100.0 +History,Grade 7,68.4 +Physics,Grade 7,63.8 +Mathematics,Grade 7,62.5 +Chemistry,Grade 9,69.4 +Mathematics,Grade 7,73.4 +Mathematics,Grade 8,81.1 +History,Grade 7,65.2 +Physics,Grade 9,74.4 +History,Grade 7,62.8 +Physics,Grade 9,91.6 +Biology,Grade 7,82.8 +Physics,Grade 7,62.2 +Physics,Grade 7,72.9 +History,Grade 9,70.9 +Chemistry,Grade 8,59.7 +History,Grade 7,76.3 +History,Grade 9,100.0 +History,Grade 7,57.7 +Chemistry,Grade 8,72.4 +Physics,Grade 9,75.3 +Mathematics,Grade 8,77.5 +Mathematics,Grade 7,58.3 +Mathematics,Grade 7,77.6 +History,Grade 8,89.5 +History,Grade 7,74.9 +Chemistry,Grade 9,77.5 +Biology,Grade 8,70.5 +Mathematics,Grade 7,72.5 +Biology,Grade 9,61.1 +Biology,Grade 7,71.8 +History,Grade 8,60.0 +History,Grade 9,88.3 +Mathematics,Grade 7,85.2 +Chemistry,Grade 8,74.4 +Biology,Grade 8,86.1 +Physics,Grade 9,65.6 +Mathematics,Grade 8,55.9 +Chemistry,Grade 7,69.1 +Physics,Grade 7,51.6 +History,Grade 8,73.0 +History,Grade 8,77.7 +Chemistry,Grade 7,71.3 +History,Grade 9,76.2 +Physics,Grade 7,62.0 +Biology,Grade 7,64.1 +Physics,Grade 7,71.5 +Biology,Grade 8,62.5 +Biology,Grade 7,67.5 +Chemistry,Grade 8,53.6 +Chemistry,Grade 8,49.6 +Physics,Grade 7,82.8 +History,Grade 8,99.3 +Biology,Grade 7,64.9 +Mathematics,Grade 7,85.6 +Biology,Grade 7,83.8 +Chemistry,Grade 9,59.4 +Chemistry,Grade 8,54.8 +Biology,Grade 7,59.1 +Physics,Grade 9,62.7 +Biology,Grade 8,80.0 +History,Grade 7,56.9 +Mathematics,Grade 9,93.6 +Biology,Grade 8,74.6 +Physics,Grade 9,61.9 +History,Grade 8,93.9 +Mathematics,Grade 9,64.5 +Physics,Grade 8,61.8 +Chemistry,Grade 7,61.4 +Chemistry,Grade 9,65.4 +Physics,Grade 9,78.8 +Biology,Grade 8,81.8 +Physics,Grade 8,60.8 +Biology,Grade 8,82.3 +Physics,Grade 8,58.1 +Biology,Grade 8,90.0 +Chemistry,Grade 7,80.3 +History,Grade 9,97.5 +Biology,Grade 8,70.7 +Physics,Grade 8,62.0 +History,Grade 9,78.1 +Chemistry,Grade 8,60.7 +Biology,Grade 9,88.7 +Chemistry,Grade 9,83.6 +History,Grade 9,86.1 +Chemistry,Grade 8,63.1 +History,Grade 9,59.5 +Physics,Grade 9,89.5 +Biology,Grade 9,75.9 +Chemistry,Grade 7,59.7 +Physics,Grade 7,75.5 +Biology,Grade 8,85.6 +Physics,Grade 7,69.0 +Mathematics,Grade 7,73.3 +Mathematics,Grade 7,79.3 +History,Grade 7,68.2 +Physics,Grade 8,67.9 +Physics,Grade 7,50.6 +Chemistry,Grade 9,83.2 +Physics,Grade 8,66.2 +Chemistry,Grade 9,61.2 +Chemistry,Grade 9,63.0 +Biology,Grade 7,79.8 +Mathematics,Grade 7,72.2 +History,Grade 7,88.0 +History,Grade 8,73.2 +History,Grade 7,61.3 +History,Grade 9,91.6 +Mathematics,Grade 8,85.5 +Mathematics,Grade 7,75.0 +Mathematics,Grade 8,63.4 +Chemistry,Grade 9,63.2 +History,Grade 8,63.7 +History,Grade 9,70.4 +Physics,Grade 7,54.5 +History,Grade 8,84.6 +Biology,Grade 9,75.0 +Physics,Grade 9,72.4 +History,Grade 9,80.1 +History,Grade 9,73.1 +Chemistry,Grade 9,67.2 +Biology,Grade 7,71.7 +History,Grade 8,73.9 +Biology,Grade 8,59.7 +Biology,Grade 7,66.4 +Biology,Grade 9,89.4 +Mathematics,Grade 8,51.9 +History,Grade 8,86.4 +History,Grade 9,77.9 +Biology,Grade 7,72.4 +Mathematics,Grade 8,88.9 +Chemistry,Grade 7,78.3 +History,Grade 8,79.8 +Biology,Grade 8,80.0 +Biology,Grade 7,75.5 +Chemistry,Grade 8,55.2 +Chemistry,Grade 8,77.9 +Mathematics,Grade 8,59.2 +Physics,Grade 7,56.4 +Mathematics,Grade 7,57.5 +Biology,Grade 7,63.7 +Biology,Grade 8,81.9 +Mathematics,Grade 8,84.0 +Biology,Grade 9,73.8 +Biology,Grade 7,85.4 +Physics,Grade 9,59.0 +History,Grade 8,97.2 +History,Grade 9,73.3 +Chemistry,Grade 9,61.9 +Physics,Grade 9,67.8 +History,Grade 8,82.9 +Biology,Grade 7,96.7 +Mathematics,Grade 7,43.9 +Chemistry,Grade 9,69.5 +Mathematics,Grade 8,61.6 +Physics,Grade 9,79.6 +Physics,Grade 8,61.1 +Chemistry,Grade 7,75.3 +Physics,Grade 8,58.1 +Biology,Grade 8,71.2 +Mathematics,Grade 9,55.7 +Biology,Grade 9,69.4 +Physics,Grade 8,45.6 +History,Grade 7,72.9 +Mathematics,Grade 7,55.3 +Mathematics,Grade 9,64.1 +Chemistry,Grade 9,73.1 +Biology,Grade 8,86.5 +History,Grade 7,86.6 +Chemistry,Grade 7,72.7 +Chemistry,Grade 8,57.1 +Physics,Grade 7,57.1 +Physics,Grade 7,67.1 +Biology,Grade 9,100.0 +Biology,Grade 8,66.2 +History,Grade 9,77.6 +Chemistry,Grade 8,76.6 +Biology,Grade 9,68.8 +Chemistry,Grade 8,60.6 +Chemistry,Grade 9,81.9 +Biology,Grade 7,67.3 +Biology,Grade 7,64.7 +Chemistry,Grade 8,66.3 +History,Grade 9,69.5 +History,Grade 8,73.0 +Physics,Grade 7,71.8 +History,Grade 7,86.3 +Biology,Grade 8,79.8 +Mathematics,Grade 7,60.8 +Biology,Grade 8,91.5 +Biology,Grade 8,82.7 +Chemistry,Grade 7,76.4 +Biology,Grade 7,68.7 +Biology,Grade 7,60.5 +History,Grade 8,85.7 +History,Grade 8,77.8 +Biology,Grade 9,78.4 +Mathematics,Grade 9,69.5 +Mathematics,Grade 9,74.4 +Chemistry,Grade 8,42.9 +Mathematics,Grade 8,74.1 +Biology,Grade 8,75.0 +Mathematics,Grade 8,63.4 +History,Grade 9,76.3 +Chemistry,Grade 7,65.5 +Physics,Grade 7,80.4 +History,Grade 7,72.8 +Chemistry,Grade 8,56.9 +Mathematics,Grade 7,62.1 +History,Grade 7,69.0 +Mathematics,Grade 8,74.7 +Physics,Grade 9,79.9 +Physics,Grade 8,65.8 +Mathematics,Grade 7,71.7 +Biology,Grade 8,60.5 +History,Grade 7,86.3 +Physics,Grade 8,77.0 +Biology,Grade 8,71.0 +Chemistry,Grade 7,60.5 +Biology,Grade 9,58.3 +Mathematics,Grade 7,60.0 +Mathematics,Grade 9,64.8 +Mathematics,Grade 7,73.3 +Biology,Grade 7,85.6 +History,Grade 8,67.5 +Chemistry,Grade 8,69.5 +Biology,Grade 7,74.8 +Mathematics,Grade 8,65.6 +Biology,Grade 9,83.0 +Mathematics,Grade 7,54.1 +Chemistry,Grade 7,68.0 +Mathematics,Grade 9,74.4 +Biology,Grade 7,78.7 +Biology,Grade 8,71.5 +Mathematics,Grade 7,61.5 +History,Grade 9,86.8 +History,Grade 9,100.0 +History,Grade 9,83.8 +Mathematics,Grade 9,60.9 +History,Grade 9,93.8 +Chemistry,Grade 8,68.1 +Chemistry,Grade 9,66.0 +Biology,Grade 8,85.4 +Biology,Grade 9,70.4 +History,Grade 9,69.6 +Mathematics,Grade 9,72.9 +Mathematics,Grade 7,93.1 +Biology,Grade 8,78.6 +History,Grade 9,59.2 +Mathematics,Grade 9,81.0 +Physics,Grade 9,58.4 +Biology,Grade 7,78.3 +Chemistry,Grade 8,69.1 +Biology,Grade 9,66.8 +Mathematics,Grade 8,56.0 +Mathematics,Grade 9,63.2 +Chemistry,Grade 9,71.6 +Physics,Grade 8,59.7 +Biology,Grade 7,77.4 +Physics,Grade 9,61.2 +History,Grade 9,75.5 +Mathematics,Grade 8,41.9 +Physics,Grade 7,65.4 +History,Grade 9,84.2 +Mathematics,Grade 9,66.2 +Physics,Grade 7,78.0 +Mathematics,Grade 9,84.3 +History,Grade 7,95.0 +Mathematics,Grade 8,62.6 +Biology,Grade 8,79.0 +Mathematics,Grade 8,75.4 +Mathematics,Grade 9,69.7 +History,Grade 9,79.6 +Mathematics,Grade 9,76.3 +Physics,Grade 7,68.8 +History,Grade 7,76.1 +Mathematics,Grade 9,49.5 +Physics,Grade 7,63.2 +Mathematics,Grade 9,75.5 +Biology,Grade 7,81.8 +Mathematics,Grade 8,69.0 +History,Grade 7,91.3 +Biology,Grade 7,83.1 +Biology,Grade 8,83.6 +Chemistry,Grade 8,80.9 +Mathematics,Grade 8,63.4 +Mathematics,Grade 8,67.0 +Physics,Grade 8,86.4 +Mathematics,Grade 8,77.8 +Mathematics,Grade 7,84.7 +Mathematics,Grade 9,66.3 +History,Grade 9,98.9 +History,Grade 7,83.1 +Mathematics,Grade 8,58.1 +Biology,Grade 9,69.7 +Chemistry,Grade 8,53.5 +History,Grade 8,72.2 +Biology,Grade 8,53.8 +Biology,Grade 9,65.2 +Mathematics,Grade 9,80.5 +Chemistry,Grade 8,76.2 +Mathematics,Grade 8,81.9 +History,Grade 8,79.2 +History,Grade 8,84.2 +Chemistry,Grade 7,64.1 +Physics,Grade 9,83.1 +Biology,Grade 8,59.4 +Mathematics,Grade 8,56.7 +Mathematics,Grade 9,62.0 +Biology,Grade 8,63.4 +Physics,Grade 9,70.9 +Biology,Grade 8,62.2 +Biology,Grade 7,71.1 +History,Grade 7,74.9 +History,Grade 7,65.1 +Chemistry,Grade 8,73.0 +Physics,Grade 7,61.0 +History,Grade 9,86.2 +History,Grade 7,68.2 +Physics,Grade 7,46.9 +Physics,Grade 9,61.2 +Mathematics,Grade 8,95.5 +Chemistry,Grade 7,89.7 +History,Grade 7,69.6 +Chemistry,Grade 8,69.1 +Biology,Grade 7,69.1 +Biology,Grade 7,86.7 +Chemistry,Grade 8,69.7 +History,Grade 7,66.2 +Chemistry,Grade 9,71.2 +Chemistry,Grade 9,73.1 +Chemistry,Grade 7,42.9 +Chemistry,Grade 7,53.9 +History,Grade 9,100.0 +Chemistry,Grade 7,60.8 +Chemistry,Grade 9,68.7 +Physics,Grade 8,74.4 +Mathematics,Grade 7,44.2 +History,Grade 7,94.1 +Chemistry,Grade 7,63.8 +Chemistry,Grade 9,96.0 +Mathematics,Grade 9,75.9 +Chemistry,Grade 9,82.1 +Mathematics,Grade 8,74.8 +History,Grade 7,84.6 +Physics,Grade 9,71.1 +Physics,Grade 8,88.5 diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-renamed/case.json b/agents/evals/fixtures/cases/bar-grouped-letsplot-renamed/case.json new file mode 100644 index 00000000000..6833866c053 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-renamed/case.json @@ -0,0 +1,29 @@ +{ + "spec_id": "bar-grouped", + "library": "letsplot", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "category", + "column": "Fach" + }, + { + "role": "group", + "column": "Jahrgangsstufe" + }, + { + "role": "value", + "column": "Punkte (Ø)" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "renamed", + "synthetic", + "renamed-headers", + "non-ascii-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, renamed)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-renamed/data.csv b/agents/evals/fixtures/cases/bar-grouped-letsplot-renamed/data.csv new file mode 100644 index 00000000000..8bbc890c19c --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-renamed/data.csv @@ -0,0 +1,16 @@ +Fach,Jahrgangsstufe,Punkte (Ø) +Mathematics,Grade 7,66.1 +Mathematics,Grade 8,69.9 +Mathematics,Grade 9,71.8 +Physics,Grade 7,64.6 +Physics,Grade 8,65.3 +Physics,Grade 9,74.1 +Chemistry,Grade 7,63.4 +Chemistry,Grade 8,66.5 +Chemistry,Grade 9,68.7 +Biology,Grade 7,73.0 +Biology,Grade 8,72.1 +Biology,Grade 9,80.7 +History,Grade 7,73.0 +History,Grade 8,79.9 +History,Grade 9,85.8 diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-x10/case.json b/agents/evals/fixtures/cases/bar-grouped-letsplot-x10/case.json new file mode 100644 index 00000000000..341d86c0da8 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-x10/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "bar-grouped", + "library": "letsplot", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "category", + "column": "Subject" + }, + { + "role": "group", + "column": "Grade Level" + }, + { + "role": "value", + "column": "Test Score" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, x10)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-letsplot-x10/data.csv b/agents/evals/fixtures/cases/bar-grouped-letsplot-x10/data.csv new file mode 100644 index 00000000000..8bb5979214c --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-letsplot-x10/data.csv @@ -0,0 +1,16 @@ +Subject,Grade Level,Test Score +Mathematics,Grade 7,660.8 +Mathematics,Grade 8,698.8 +Mathematics,Grade 9,718.1 +Physics,Grade 7,645.9 +Physics,Grade 8,653.1 +Physics,Grade 9,740.6 +Chemistry,Grade 7,633.8 +Chemistry,Grade 8,664.8 +Chemistry,Grade 9,687.1 +Biology,Grade 7,730.0 +Biology,Grade 8,720.9 +Biology,Grade 9,806.7 +History,Grade 7,730.3 +History,Grade 8,798.6 +History,Grade 9,858.1 diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-date/case.json b/agents/evals/fixtures/cases/bar-grouped-pygal-date/case.json new file mode 100644 index 00000000000..e0bb911ed36 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-date/case.json @@ -0,0 +1,30 @@ +{ + "spec_id": "bar-grouped", + "library": "pygal", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "category", + "column": "Subject" + }, + { + "role": "group", + "column": "Grade Level" + }, + { + "role": "value", + "column": "Test Score" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, date)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-date/data.csv b/agents/evals/fixtures/cases/bar-grouped-pygal-date/data.csv new file mode 100644 index 00000000000..c6a44301168 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-date/data.csv @@ -0,0 +1,16 @@ +Subject,Grade Level,Test Score,Exam Date,Graded On +Mathematics,Grade 7,66.1,21.01.2026,2026-01-23 +Mathematics,Grade 8,69.9,13.06.2026,2026-06-15 +Mathematics,Grade 9,71.8,22.05.2026,2026-05-22 +Physics,Grade 7,64.6,23.01.2026,2026-01-24 +Physics,Grade 8,65.3,21.02.2026,2026-02-21 +Physics,Grade 9,74.1,23.04.2026,2026-04-25 +Chemistry,Grade 7,63.4,22.04.2026,2026-04-23 +Chemistry,Grade 8,66.5,17.03.2026,2026-03-20 +Chemistry,Grade 9,68.7,01.02.2026,2026-02-04 +Biology,Grade 7,73.0,10.03.2026,2026-03-10 +Biology,Grade 8,72.1,03.03.2026,2026-03-04 +Biology,Grade 9,80.7,20.06.2026,2026-06-23 +History,Grade 7,73.0,10.02.2026,2026-02-13 +History,Grade 8,79.9,30.05.2026,2026-05-31 +History,Grade 9,85.8,03.06.2026,2026-06-05 diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-decimal-comma/case.json b/agents/evals/fixtures/cases/bar-grouped-pygal-decimal-comma/case.json new file mode 100644 index 00000000000..36d555044a6 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-decimal-comma/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "bar-grouped", + "library": "pygal", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "category", + "column": "Subject" + }, + { + "role": "group", + "column": "Grade Level" + }, + { + "role": "value", + "column": "Test Score" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-decimal-comma/data.csv b/agents/evals/fixtures/cases/bar-grouped-pygal-decimal-comma/data.csv new file mode 100644 index 00000000000..5a4fdf74c57 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-decimal-comma/data.csv @@ -0,0 +1,16 @@ +Subject;Grade Level;Test Score +Mathematics;Grade 7;66,1 +Mathematics;Grade 8;69,9 +Mathematics;Grade 9;71,8 +Physics;Grade 7;64,6 +Physics;Grade 8;65,3 +Physics;Grade 9;74,1 +Chemistry;Grade 7;63,4 +Chemistry;Grade 8;66,5 +Chemistry;Grade 9;68,7 +Biology;Grade 7;73,0 +Biology;Grade 8;72,1 +Biology;Grade 9;80,7 +History;Grade 7;73,0 +History;Grade 8;79,9 +History;Grade 9;85,8 diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-n12/case.json b/agents/evals/fixtures/cases/bar-grouped-pygal-n12/case.json new file mode 100644 index 00000000000..7672f75cc3b --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-n12/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "bar-grouped", + "library": "pygal", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "category", + "column": "Subject" + }, + { + "role": "group", + "column": "Grade Level" + }, + { + "role": "value", + "column": "Test Score" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, n12)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-n12/data.csv b/agents/evals/fixtures/cases/bar-grouped-pygal-n12/data.csv new file mode 100644 index 00000000000..056babdf94d --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-n12/data.csv @@ -0,0 +1,13 @@ +Subject,Grade Level,Test Score +Mathematics,Grade 7,66.1 +Mathematics,Grade 8,70.9 +Mathematics,Grade 9,75.3 +Physics,Grade 7,66.7 +Physics,Grade 8,63.5 +Physics,Grade 9,73.7 +Chemistry,Grade 7,69.1 +Chemistry,Grade 8,69.7 +Chemistry,Grade 9,75.1 +Biology,Grade 7,71.7 +Biology,Grade 8,76.4 +Biology,Grade 9,77.3 diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-n5000/case.json b/agents/evals/fixtures/cases/bar-grouped-pygal-n5000/case.json new file mode 100644 index 00000000000..ec764d16b5c --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-n5000/case.json @@ -0,0 +1,29 @@ +{ + "spec_id": "bar-grouped", + "library": "pygal", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "category", + "column": "Subject" + }, + { + "role": "group", + "column": "Grade Level" + }, + { + "role": "value", + "column": "Test Score" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "n5000", + "synthetic", + "large", + "aggregation" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, n5000)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-n5000/data.csv b/agents/evals/fixtures/cases/bar-grouped-pygal-n5000/data.csv new file mode 100644 index 00000000000..aaee49deb42 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-n5000/data.csv @@ -0,0 +1,5001 @@ +Subject,Grade Level,Test Score +History,Grade 9,91.7 +Physics,Grade 9,48.8 +Mathematics,Grade 8,61.5 +Mathematics,Grade 9,66.2 +Mathematics,Grade 9,63.3 +Physics,Grade 9,69.9 +History,Grade 8,84.7 +Biology,Grade 8,67.7 +Chemistry,Grade 9,71.1 +Mathematics,Grade 9,60.9 +Physics,Grade 9,62.6 +History,Grade 8,92.3 +Physics,Grade 7,48.6 +Biology,Grade 7,68.0 +Mathematics,Grade 9,71.5 +Physics,Grade 9,60.5 +History,Grade 9,68.7 +Biology,Grade 8,73.5 +Biology,Grade 9,77.4 +Biology,Grade 8,95.1 +History,Grade 8,78.0 +Mathematics,Grade 9,72.4 +History,Grade 7,75.8 +Chemistry,Grade 9,81.9 +History,Grade 7,76.0 +Physics,Grade 8,69.9 +Chemistry,Grade 9,70.7 +Chemistry,Grade 8,88.3 +Mathematics,Grade 9,58.3 +History,Grade 9,85.1 +Biology,Grade 8,69.9 +Physics,Grade 8,63.3 +Mathematics,Grade 9,84.1 +Chemistry,Grade 9,66.6 +Physics,Grade 9,63.1 +Mathematics,Grade 7,85.8 +Mathematics,Grade 8,78.7 +Biology,Grade 8,73.1 +History,Grade 8,66.1 +Biology,Grade 7,81.5 +History,Grade 7,88.2 +Chemistry,Grade 7,52.9 +Physics,Grade 8,67.4 +History,Grade 9,79.3 +Biology,Grade 9,67.5 +Mathematics,Grade 7,62.9 +Mathematics,Grade 7,51.0 +Biology,Grade 8,54.8 +History,Grade 8,59.6 +Chemistry,Grade 9,67.6 +Chemistry,Grade 8,64.8 +Chemistry,Grade 9,70.0 +Mathematics,Grade 7,56.8 +Biology,Grade 9,77.2 +Chemistry,Grade 9,71.6 +Biology,Grade 9,94.1 +Chemistry,Grade 7,77.2 +History,Grade 9,73.5 +Mathematics,Grade 7,70.7 +Chemistry,Grade 9,82.5 +Biology,Grade 9,72.3 +Biology,Grade 7,60.8 +Chemistry,Grade 7,53.3 +History,Grade 8,84.6 +History,Grade 8,62.9 +Physics,Grade 7,63.9 +Biology,Grade 7,78.5 +Physics,Grade 7,66.2 +Physics,Grade 9,70.0 +History,Grade 9,84.4 +Mathematics,Grade 7,76.4 +Chemistry,Grade 8,68.6 +History,Grade 9,89.7 +Chemistry,Grade 8,84.3 +History,Grade 9,78.1 +Biology,Grade 8,69.9 +Physics,Grade 8,49.0 +Mathematics,Grade 7,72.8 +History,Grade 8,86.4 +Biology,Grade 7,69.5 +History,Grade 8,98.4 +Physics,Grade 7,68.3 +Chemistry,Grade 9,75.0 +Biology,Grade 8,73.0 +Chemistry,Grade 8,65.2 +Mathematics,Grade 7,51.3 +Mathematics,Grade 9,83.3 +Mathematics,Grade 8,67.1 +History,Grade 8,56.2 +Mathematics,Grade 8,73.6 +Biology,Grade 7,71.5 +History,Grade 9,74.1 +Biology,Grade 7,63.5 +Mathematics,Grade 9,61.6 +Physics,Grade 9,76.8 +Biology,Grade 8,53.8 +Chemistry,Grade 7,40.9 +Physics,Grade 7,62.0 +Biology,Grade 7,50.8 +Physics,Grade 9,76.4 +Mathematics,Grade 8,73.7 +Chemistry,Grade 7,78.4 +Mathematics,Grade 7,75.8 +Chemistry,Grade 8,82.7 +History,Grade 7,69.4 +Biology,Grade 8,75.3 +Chemistry,Grade 8,69.0 +Biology,Grade 9,79.7 +Physics,Grade 7,74.9 +Biology,Grade 8,81.0 +Physics,Grade 7,60.5 +History,Grade 8,87.0 +Physics,Grade 9,67.6 +Physics,Grade 8,70.6 +Mathematics,Grade 9,65.6 +Physics,Grade 7,64.4 +History,Grade 9,70.0 +Biology,Grade 8,63.2 +Mathematics,Grade 8,67.5 +Physics,Grade 7,65.1 +Biology,Grade 7,64.2 +Physics,Grade 7,53.9 +History,Grade 9,68.4 +Mathematics,Grade 8,82.0 +History,Grade 8,71.2 +Physics,Grade 8,67.2 +Mathematics,Grade 7,77.1 +History,Grade 9,88.4 +Physics,Grade 9,65.3 +History,Grade 7,84.8 +Chemistry,Grade 9,49.8 +Biology,Grade 8,76.5 +History,Grade 8,57.1 +Mathematics,Grade 9,78.0 +Biology,Grade 8,74.5 +Chemistry,Grade 9,63.0 +History,Grade 8,78.8 +Mathematics,Grade 7,68.3 +History,Grade 7,72.9 +Biology,Grade 8,87.5 +Biology,Grade 8,52.9 +History,Grade 9,91.8 +Biology,Grade 8,90.5 +Chemistry,Grade 7,64.1 +History,Grade 8,93.8 +Chemistry,Grade 7,87.8 +Biology,Grade 8,73.8 +Biology,Grade 7,57.7 +History,Grade 7,97.9 +Biology,Grade 9,67.9 +Chemistry,Grade 9,88.7 +Chemistry,Grade 9,82.9 +Mathematics,Grade 9,89.3 +Chemistry,Grade 9,76.8 +Mathematics,Grade 7,70.6 +Chemistry,Grade 7,54.0 +History,Grade 9,64.5 +Physics,Grade 8,69.2 +History,Grade 8,85.5 +Physics,Grade 7,61.3 +Chemistry,Grade 7,68.1 +Physics,Grade 9,65.0 +Chemistry,Grade 9,77.2 +Physics,Grade 7,70.0 +Physics,Grade 8,41.4 +Physics,Grade 7,56.8 +Physics,Grade 7,60.7 +History,Grade 7,68.3 +History,Grade 9,87.0 +Biology,Grade 9,89.1 +Chemistry,Grade 8,85.2 +History,Grade 7,92.6 +Mathematics,Grade 9,74.2 +Biology,Grade 7,72.5 +Chemistry,Grade 9,59.7 +Chemistry,Grade 7,54.6 +History,Grade 8,71.8 +Chemistry,Grade 9,57.0 +Mathematics,Grade 9,67.4 +Biology,Grade 9,74.6 +History,Grade 9,78.5 +Biology,Grade 8,76.9 +Mathematics,Grade 8,72.5 +Chemistry,Grade 7,67.8 +History,Grade 7,51.3 +Biology,Grade 7,76.8 +Chemistry,Grade 7,46.4 +Biology,Grade 9,75.4 +History,Grade 8,67.2 +Chemistry,Grade 9,69.1 +Physics,Grade 7,56.2 +Biology,Grade 7,69.6 +Physics,Grade 8,76.7 +Chemistry,Grade 7,67.4 +Chemistry,Grade 8,95.3 +Chemistry,Grade 8,65.5 +Chemistry,Grade 7,71.9 +History,Grade 7,60.6 +Mathematics,Grade 7,76.0 +Physics,Grade 7,60.0 +Chemistry,Grade 8,50.1 +Chemistry,Grade 7,64.6 +Chemistry,Grade 9,70.4 +Chemistry,Grade 9,90.6 +History,Grade 7,64.8 +Chemistry,Grade 7,76.7 +History,Grade 8,83.1 +Physics,Grade 8,76.1 +History,Grade 8,80.0 +Physics,Grade 9,73.7 +Chemistry,Grade 9,90.4 +History,Grade 8,89.7 +Mathematics,Grade 9,83.9 +Biology,Grade 9,65.4 +Physics,Grade 7,57.8 +Physics,Grade 9,62.8 +Physics,Grade 9,71.3 +Chemistry,Grade 8,88.8 +Biology,Grade 9,88.0 +Mathematics,Grade 9,70.8 +History,Grade 7,90.7 +Biology,Grade 7,64.3 +Mathematics,Grade 7,60.2 +Physics,Grade 8,52.6 +Mathematics,Grade 8,80.6 +Chemistry,Grade 7,53.2 +Physics,Grade 9,47.7 +History,Grade 9,71.9 +Chemistry,Grade 9,64.3 +Mathematics,Grade 9,70.7 +Physics,Grade 9,64.0 +Physics,Grade 9,66.3 +Biology,Grade 9,67.5 +Mathematics,Grade 9,58.3 +Chemistry,Grade 9,78.2 +Mathematics,Grade 7,57.9 +History,Grade 7,70.8 +Physics,Grade 7,57.4 +Biology,Grade 7,68.5 +Mathematics,Grade 7,63.9 +Biology,Grade 9,80.3 +Physics,Grade 7,52.6 +History,Grade 7,66.7 +Chemistry,Grade 7,43.2 +Mathematics,Grade 9,78.4 +Chemistry,Grade 9,68.3 +History,Grade 7,81.7 +Physics,Grade 8,43.2 +Chemistry,Grade 9,57.0 +Chemistry,Grade 8,51.2 +Chemistry,Grade 7,84.6 +Mathematics,Grade 8,78.4 +History,Grade 8,84.8 +Mathematics,Grade 9,64.4 +Physics,Grade 8,64.4 +History,Grade 7,74.8 +Physics,Grade 8,72.5 +Biology,Grade 8,62.1 +Physics,Grade 7,89.3 +Mathematics,Grade 8,62.2 +Physics,Grade 9,69.9 +Chemistry,Grade 7,68.5 +Physics,Grade 9,39.4 +Biology,Grade 7,95.7 +History,Grade 7,56.9 +History,Grade 8,80.9 +History,Grade 8,81.5 +Biology,Grade 8,79.5 +Chemistry,Grade 8,69.5 +Chemistry,Grade 9,72.4 +Mathematics,Grade 8,62.2 +Chemistry,Grade 8,61.4 +Biology,Grade 9,83.6 +History,Grade 8,86.5 +Physics,Grade 7,76.7 +Physics,Grade 7,47.1 +History,Grade 7,77.8 +Physics,Grade 9,75.8 +Biology,Grade 9,72.8 +History,Grade 9,83.4 +Chemistry,Grade 9,90.8 +Biology,Grade 8,75.0 +Physics,Grade 8,80.1 +Biology,Grade 7,54.8 +Biology,Grade 8,89.6 +History,Grade 7,68.4 +Physics,Grade 8,53.4 +Biology,Grade 9,95.6 +History,Grade 7,79.5 +Chemistry,Grade 7,91.9 +Biology,Grade 8,83.1 +Physics,Grade 9,74.3 +Chemistry,Grade 8,71.7 +Biology,Grade 9,96.6 +History,Grade 9,77.6 +Mathematics,Grade 7,73.7 +Biology,Grade 9,84.2 +Biology,Grade 8,57.8 +Mathematics,Grade 9,80.1 +Physics,Grade 9,78.0 +Physics,Grade 9,83.0 +Physics,Grade 7,73.2 +Biology,Grade 7,50.9 +History,Grade 8,81.7 +Biology,Grade 8,100.0 +Chemistry,Grade 7,69.6 +History,Grade 7,72.0 +Physics,Grade 8,85.9 +Chemistry,Grade 9,74.6 +History,Grade 9,69.3 +Physics,Grade 7,62.5 +Biology,Grade 9,77.8 +Physics,Grade 9,75.3 +Mathematics,Grade 9,65.1 +Chemistry,Grade 7,69.2 +Biology,Grade 8,52.2 +Mathematics,Grade 8,72.6 +Mathematics,Grade 8,78.0 +Mathematics,Grade 7,63.9 +Mathematics,Grade 8,54.6 +Chemistry,Grade 7,65.8 +Chemistry,Grade 9,86.2 +Biology,Grade 8,56.2 +Physics,Grade 8,63.0 +Mathematics,Grade 8,91.1 +Biology,Grade 8,59.2 +History,Grade 7,88.5 +Biology,Grade 7,69.1 +History,Grade 7,80.1 +Mathematics,Grade 8,51.8 +Physics,Grade 8,71.0 +Biology,Grade 9,86.5 +Physics,Grade 9,61.8 +Biology,Grade 9,83.2 +Chemistry,Grade 8,68.3 +History,Grade 8,76.6 +Biology,Grade 7,78.3 +Biology,Grade 9,62.1 +Physics,Grade 7,65.9 +Biology,Grade 9,89.7 +Physics,Grade 9,65.0 +Biology,Grade 7,72.6 +Mathematics,Grade 7,88.8 +Chemistry,Grade 9,56.5 +Chemistry,Grade 7,58.6 +Biology,Grade 7,74.5 +Biology,Grade 8,75.2 +Chemistry,Grade 8,52.4 +Mathematics,Grade 9,76.3 +Biology,Grade 9,72.3 +History,Grade 8,84.3 +Mathematics,Grade 9,56.0 +Chemistry,Grade 9,57.4 +Mathematics,Grade 8,45.3 +Mathematics,Grade 7,87.1 +Biology,Grade 8,72.5 +History,Grade 8,79.5 +History,Grade 9,86.8 +Physics,Grade 9,47.5 +Physics,Grade 8,64.9 +History,Grade 9,70.5 +History,Grade 8,88.6 +Mathematics,Grade 8,84.4 +Biology,Grade 8,61.8 +History,Grade 9,88.8 +History,Grade 9,61.0 +History,Grade 8,75.5 +Mathematics,Grade 8,73.8 +History,Grade 7,77.4 +Mathematics,Grade 9,73.6 +Biology,Grade 7,65.3 +Biology,Grade 8,77.6 +History,Grade 9,77.1 +Mathematics,Grade 8,58.2 +Physics,Grade 8,68.1 +Physics,Grade 7,69.6 +History,Grade 9,77.6 +History,Grade 8,94.0 +Mathematics,Grade 7,68.8 +Mathematics,Grade 7,96.2 +Mathematics,Grade 7,66.6 +Biology,Grade 7,67.0 +History,Grade 9,74.9 +Chemistry,Grade 8,74.8 +History,Grade 8,95.3 +History,Grade 8,89.0 +History,Grade 9,79.8 +Chemistry,Grade 7,65.1 +Mathematics,Grade 7,74.4 +History,Grade 8,85.0 +Mathematics,Grade 7,86.1 +History,Grade 9,75.4 +Mathematics,Grade 8,58.3 +Chemistry,Grade 7,54.1 +History,Grade 7,83.2 +Physics,Grade 8,61.6 +Mathematics,Grade 7,88.0 +Physics,Grade 8,75.3 +Chemistry,Grade 8,72.9 +Biology,Grade 9,56.5 +Physics,Grade 7,78.6 +History,Grade 9,81.5 +Mathematics,Grade 9,73.0 +History,Grade 7,66.6 +Physics,Grade 7,46.2 +Biology,Grade 8,82.9 +Physics,Grade 9,78.2 +History,Grade 8,88.0 +History,Grade 7,72.3 +Chemistry,Grade 7,64.8 +History,Grade 7,83.3 +Biology,Grade 7,81.2 +Chemistry,Grade 7,76.6 +Physics,Grade 9,60.1 +History,Grade 8,66.2 +Biology,Grade 8,91.5 +Mathematics,Grade 8,74.7 +History,Grade 9,85.0 +Chemistry,Grade 8,60.8 +History,Grade 7,88.8 +Biology,Grade 9,68.3 +Chemistry,Grade 9,79.0 +Mathematics,Grade 8,76.3 +Physics,Grade 7,65.4 +Chemistry,Grade 9,75.8 +Chemistry,Grade 8,50.2 +Physics,Grade 8,63.9 +Biology,Grade 8,73.3 +Mathematics,Grade 8,63.2 +Chemistry,Grade 8,50.5 +Mathematics,Grade 8,74.5 +Physics,Grade 9,67.3 +History,Grade 8,89.0 +History,Grade 7,61.5 +History,Grade 7,68.7 +Mathematics,Grade 9,71.4 +Chemistry,Grade 7,54.2 +Physics,Grade 7,68.1 +Biology,Grade 9,87.4 +Physics,Grade 9,70.9 +Chemistry,Grade 9,56.3 +History,Grade 7,89.3 +History,Grade 8,97.4 +Mathematics,Grade 8,86.8 +Mathematics,Grade 8,66.5 +Chemistry,Grade 8,70.1 +Chemistry,Grade 8,84.1 +Biology,Grade 7,71.8 +History,Grade 8,62.4 +History,Grade 8,75.2 +History,Grade 8,71.9 +Mathematics,Grade 9,78.4 +Mathematics,Grade 9,85.3 +History,Grade 7,89.1 +History,Grade 8,62.2 +Biology,Grade 7,81.2 +Chemistry,Grade 9,76.6 +Mathematics,Grade 9,62.9 +Physics,Grade 9,61.3 +Chemistry,Grade 7,58.7 +Chemistry,Grade 7,66.1 +Biology,Grade 9,66.3 +Biology,Grade 9,79.1 +History,Grade 8,75.0 +History,Grade 9,65.1 +Biology,Grade 9,70.4 +Biology,Grade 9,84.9 +Chemistry,Grade 7,57.1 +Biology,Grade 9,77.4 +History,Grade 8,75.9 +Biology,Grade 7,86.9 +Chemistry,Grade 9,70.7 +History,Grade 8,70.6 +Chemistry,Grade 7,50.8 +Chemistry,Grade 8,60.9 +Biology,Grade 9,60.1 +Chemistry,Grade 8,77.2 +Mathematics,Grade 7,44.4 +Biology,Grade 7,76.1 +Biology,Grade 7,55.3 +Biology,Grade 7,73.7 +Biology,Grade 7,71.2 +History,Grade 8,65.3 +Mathematics,Grade 8,62.1 +History,Grade 9,77.5 +Chemistry,Grade 7,63.8 +Physics,Grade 7,69.8 +Physics,Grade 8,61.8 +Biology,Grade 8,66.4 +Biology,Grade 7,89.4 +Biology,Grade 7,93.9 +Biology,Grade 7,78.9 +History,Grade 8,83.0 +Chemistry,Grade 8,73.9 +Mathematics,Grade 8,54.3 +History,Grade 9,66.6 +Physics,Grade 8,63.7 +History,Grade 7,74.3 +Mathematics,Grade 7,70.7 +Chemistry,Grade 7,82.6 +Mathematics,Grade 7,73.7 +Mathematics,Grade 7,66.6 +Physics,Grade 7,63.5 +Biology,Grade 9,71.0 +History,Grade 8,81.2 +History,Grade 9,90.6 +Mathematics,Grade 7,56.5 +Biology,Grade 7,74.1 +Chemistry,Grade 8,86.7 +Mathematics,Grade 8,70.9 +Biology,Grade 7,80.7 +Physics,Grade 7,70.9 +Mathematics,Grade 9,87.5 +Chemistry,Grade 9,62.5 +Physics,Grade 9,58.9 +Biology,Grade 7,62.6 +Mathematics,Grade 8,80.5 +History,Grade 7,74.1 +Biology,Grade 9,80.0 +History,Grade 7,71.9 +Chemistry,Grade 8,85.5 +Chemistry,Grade 9,67.1 +History,Grade 9,79.3 +Biology,Grade 8,67.3 +Physics,Grade 8,65.5 +Biology,Grade 9,72.8 +History,Grade 7,71.3 +History,Grade 9,77.6 +Mathematics,Grade 7,68.3 +Mathematics,Grade 8,82.9 +Mathematics,Grade 7,70.3 +Chemistry,Grade 7,47.8 +Mathematics,Grade 8,61.3 +Biology,Grade 9,84.4 +Chemistry,Grade 8,74.2 +History,Grade 8,65.5 +Chemistry,Grade 8,55.4 +Physics,Grade 9,76.6 +Physics,Grade 7,47.1 +Mathematics,Grade 9,59.7 +History,Grade 9,87.5 +Physics,Grade 8,54.2 +Chemistry,Grade 9,65.3 +Chemistry,Grade 8,62.4 +History,Grade 9,62.8 +History,Grade 7,73.4 +History,Grade 7,72.8 +Biology,Grade 8,71.4 +Biology,Grade 9,78.4 +Chemistry,Grade 7,66.7 +Physics,Grade 7,65.3 +Mathematics,Grade 9,64.3 +History,Grade 7,65.1 +History,Grade 8,83.7 +Chemistry,Grade 8,53.4 +Physics,Grade 9,91.5 +Chemistry,Grade 8,63.4 +Chemistry,Grade 7,66.5 +Physics,Grade 9,70.0 +History,Grade 7,68.8 +Physics,Grade 9,71.1 +History,Grade 8,69.7 +Chemistry,Grade 9,87.4 +History,Grade 8,72.0 +Chemistry,Grade 9,56.8 +Chemistry,Grade 7,67.6 +History,Grade 9,79.9 +Mathematics,Grade 8,59.3 +Physics,Grade 9,61.6 +Biology,Grade 8,96.1 +Biology,Grade 9,59.6 +Mathematics,Grade 7,64.3 +Biology,Grade 9,78.6 +Chemistry,Grade 8,57.4 +History,Grade 9,95.1 +Chemistry,Grade 8,82.3 +Biology,Grade 9,69.2 +Chemistry,Grade 8,61.5 +History,Grade 9,89.5 +History,Grade 7,70.4 +Biology,Grade 7,72.1 +Chemistry,Grade 9,67.3 +Physics,Grade 9,65.0 +Biology,Grade 7,72.0 +History,Grade 8,89.2 +Biology,Grade 8,71.6 +History,Grade 9,73.1 +Physics,Grade 9,56.3 +Biology,Grade 9,65.2 +Mathematics,Grade 7,54.0 +History,Grade 7,85.3 +Chemistry,Grade 7,72.6 +History,Grade 8,72.2 +Physics,Grade 8,72.5 +Physics,Grade 8,64.1 +Chemistry,Grade 7,52.8 +Mathematics,Grade 9,84.7 +Chemistry,Grade 7,80.5 +Biology,Grade 8,70.3 +Chemistry,Grade 7,74.6 +History,Grade 7,82.5 +Mathematics,Grade 8,72.2 +History,Grade 9,77.9 +Chemistry,Grade 8,77.4 +Mathematics,Grade 7,59.5 +Physics,Grade 9,80.7 +History,Grade 7,67.1 +Mathematics,Grade 8,85.2 +Chemistry,Grade 9,78.4 +Physics,Grade 9,78.3 +History,Grade 8,77.5 +History,Grade 7,69.4 +Chemistry,Grade 9,74.9 +Mathematics,Grade 7,56.9 +History,Grade 8,72.7 +Mathematics,Grade 8,75.9 +Physics,Grade 9,59.3 +Physics,Grade 7,63.4 +Biology,Grade 7,83.5 +History,Grade 7,58.0 +Mathematics,Grade 7,81.6 +Physics,Grade 8,74.4 +Mathematics,Grade 9,74.7 +History,Grade 9,82.6 +Chemistry,Grade 8,73.2 +History,Grade 7,67.5 +Biology,Grade 8,83.2 +History,Grade 8,73.8 +Biology,Grade 8,71.0 +Mathematics,Grade 9,76.6 +Biology,Grade 7,51.5 +Mathematics,Grade 8,67.5 +Biology,Grade 9,73.6 +History,Grade 7,85.6 +Biology,Grade 9,67.9 +History,Grade 9,99.1 +Biology,Grade 8,56.6 +Physics,Grade 8,58.9 +History,Grade 9,63.7 +Biology,Grade 7,61.8 +History,Grade 9,92.0 +Chemistry,Grade 9,66.8 +Chemistry,Grade 8,74.2 +History,Grade 9,94.8 +Chemistry,Grade 7,65.6 +History,Grade 8,94.5 +Chemistry,Grade 9,58.9 +Physics,Grade 8,44.0 +Physics,Grade 8,59.8 +Biology,Grade 9,71.2 +Chemistry,Grade 9,74.5 +Chemistry,Grade 8,67.8 +Chemistry,Grade 8,59.3 +Mathematics,Grade 7,69.9 +Physics,Grade 8,67.0 +Chemistry,Grade 7,54.8 +History,Grade 8,71.2 +Mathematics,Grade 7,74.8 +History,Grade 8,43.6 +Mathematics,Grade 9,57.4 +Chemistry,Grade 9,68.5 +Physics,Grade 8,66.5 +Biology,Grade 8,70.8 +Mathematics,Grade 8,62.3 +Biology,Grade 8,89.6 +Biology,Grade 9,70.3 +Physics,Grade 7,68.9 +Biology,Grade 9,95.5 +Physics,Grade 8,59.5 +Biology,Grade 7,85.5 +Physics,Grade 9,72.1 +Biology,Grade 7,72.9 +History,Grade 7,86.0 +Chemistry,Grade 7,63.4 +History,Grade 9,69.7 +Physics,Grade 9,71.7 +Biology,Grade 9,68.3 +Chemistry,Grade 8,80.2 +Chemistry,Grade 8,67.4 +Biology,Grade 9,75.2 +History,Grade 7,79.5 +Physics,Grade 9,81.1 +Biology,Grade 7,76.7 +History,Grade 7,71.1 +History,Grade 7,77.6 +Physics,Grade 9,75.0 +Chemistry,Grade 9,98.4 +History,Grade 8,83.7 +History,Grade 7,78.4 +Physics,Grade 8,73.7 +Biology,Grade 7,76.1 +Mathematics,Grade 8,62.0 +Biology,Grade 9,64.2 +History,Grade 9,78.2 +Mathematics,Grade 7,83.9 +Biology,Grade 8,83.4 +Physics,Grade 8,65.4 +Biology,Grade 8,69.6 +Physics,Grade 7,67.2 +History,Grade 7,84.8 +Biology,Grade 9,76.2 +Chemistry,Grade 7,51.6 +Biology,Grade 9,73.6 +Chemistry,Grade 7,68.9 +Biology,Grade 8,79.8 +Physics,Grade 8,60.0 +Chemistry,Grade 8,42.4 +Mathematics,Grade 9,87.8 +Physics,Grade 9,58.1 +Mathematics,Grade 7,66.8 +Mathematics,Grade 8,79.3 +Physics,Grade 9,69.7 +Physics,Grade 8,55.0 +Mathematics,Grade 8,77.2 +Chemistry,Grade 7,51.0 +Chemistry,Grade 9,81.0 +Biology,Grade 9,68.9 +Mathematics,Grade 8,76.5 +Physics,Grade 9,64.5 +Mathematics,Grade 8,74.4 +History,Grade 7,54.9 +Mathematics,Grade 7,75.5 +Mathematics,Grade 9,66.2 +Mathematics,Grade 7,72.6 +Chemistry,Grade 8,52.1 +Biology,Grade 8,67.2 +Biology,Grade 9,70.8 +History,Grade 8,92.6 +Mathematics,Grade 9,83.0 +History,Grade 7,80.5 +Biology,Grade 8,58.6 +Biology,Grade 9,67.0 +Physics,Grade 8,58.7 +Chemistry,Grade 7,37.2 +Physics,Grade 9,66.0 +Mathematics,Grade 9,66.4 +Mathematics,Grade 9,46.6 +History,Grade 9,81.4 +History,Grade 7,76.8 +Chemistry,Grade 7,71.1 +Biology,Grade 8,79.4 +Biology,Grade 8,63.0 +Mathematics,Grade 9,95.2 +Physics,Grade 7,57.3 +Chemistry,Grade 9,83.4 +History,Grade 9,90.8 +Mathematics,Grade 7,93.3 +Mathematics,Grade 8,71.5 +Mathematics,Grade 9,62.0 +Physics,Grade 9,74.3 +History,Grade 8,85.5 +Physics,Grade 9,56.1 +Physics,Grade 7,67.6 +History,Grade 9,81.4 +Physics,Grade 9,69.8 +History,Grade 8,88.3 +Physics,Grade 9,70.5 +Physics,Grade 8,72.7 +Biology,Grade 7,62.6 +Biology,Grade 8,78.1 +Physics,Grade 8,79.8 +History,Grade 7,60.7 +History,Grade 7,64.9 +Physics,Grade 9,75.0 +Chemistry,Grade 9,70.1 +Biology,Grade 8,65.5 +History,Grade 9,100.0 +Biology,Grade 8,73.8 +Biology,Grade 8,60.9 +Mathematics,Grade 7,77.5 +Biology,Grade 8,49.8 +History,Grade 8,84.2 +History,Grade 8,69.5 +History,Grade 8,61.7 +Biology,Grade 8,84.6 +Physics,Grade 7,50.4 +Biology,Grade 8,79.3 +Chemistry,Grade 8,69.8 +Mathematics,Grade 7,79.7 +History,Grade 7,90.8 +Biology,Grade 7,84.2 +Biology,Grade 9,73.6 +Biology,Grade 9,63.8 +Biology,Grade 9,61.2 +Biology,Grade 9,85.4 +Biology,Grade 8,76.7 +Chemistry,Grade 9,67.4 +History,Grade 8,58.3 +History,Grade 9,90.8 +Biology,Grade 7,59.2 +Mathematics,Grade 7,73.0 +Chemistry,Grade 7,63.5 +Mathematics,Grade 9,64.6 +History,Grade 7,71.3 +Mathematics,Grade 7,72.3 +History,Grade 7,49.6 +Physics,Grade 8,73.2 +Physics,Grade 7,60.2 +Biology,Grade 8,87.8 +History,Grade 9,99.5 +History,Grade 9,81.2 +Chemistry,Grade 7,67.0 +History,Grade 9,87.3 +Chemistry,Grade 9,55.5 +Chemistry,Grade 8,78.5 +History,Grade 7,70.1 +Chemistry,Grade 9,79.0 +Biology,Grade 7,59.5 +Physics,Grade 7,75.2 +History,Grade 8,84.2 +Physics,Grade 7,79.1 +Chemistry,Grade 9,61.8 +Physics,Grade 9,77.4 +Chemistry,Grade 8,54.0 +Physics,Grade 7,73.4 +Physics,Grade 9,56.6 +History,Grade 8,58.6 +Mathematics,Grade 8,65.9 +History,Grade 8,83.0 +Biology,Grade 8,67.0 +Biology,Grade 9,92.8 +Biology,Grade 7,64.3 +Mathematics,Grade 9,65.3 +History,Grade 8,73.5 +Mathematics,Grade 9,69.6 +Chemistry,Grade 9,65.6 +Biology,Grade 8,93.3 +Biology,Grade 7,71.2 +Biology,Grade 9,80.9 +Mathematics,Grade 8,66.2 +Physics,Grade 7,69.9 +Mathematics,Grade 9,69.0 +Biology,Grade 9,84.2 +Mathematics,Grade 8,100.0 +Mathematics,Grade 8,73.9 +Physics,Grade 8,78.5 +Physics,Grade 8,62.0 +History,Grade 7,85.8 +History,Grade 7,65.4 +Mathematics,Grade 8,71.8 +Physics,Grade 9,54.2 +Biology,Grade 9,100.0 +Chemistry,Grade 9,54.9 +Biology,Grade 8,100.0 +Chemistry,Grade 9,72.0 +Biology,Grade 9,68.5 +Physics,Grade 9,87.8 +Mathematics,Grade 7,50.2 +Mathematics,Grade 8,80.2 +Physics,Grade 7,56.9 +Chemistry,Grade 7,65.6 +Mathematics,Grade 8,51.6 +Chemistry,Grade 8,89.2 +Chemistry,Grade 8,76.3 +History,Grade 7,79.9 +History,Grade 9,98.5 +Physics,Grade 8,43.8 +Biology,Grade 9,87.5 +History,Grade 8,81.8 +Mathematics,Grade 8,60.4 +Physics,Grade 8,78.2 +Mathematics,Grade 7,67.1 +History,Grade 7,72.8 +Chemistry,Grade 9,83.3 +Physics,Grade 7,74.7 +History,Grade 7,71.6 +History,Grade 7,75.5 +Chemistry,Grade 9,95.4 +Chemistry,Grade 8,76.1 +Biology,Grade 9,77.9 +History,Grade 8,82.5 +Mathematics,Grade 7,57.7 +History,Grade 9,74.2 +Physics,Grade 8,63.8 +History,Grade 9,81.4 +Biology,Grade 8,93.2 +Physics,Grade 8,57.3 +Physics,Grade 9,84.1 +History,Grade 9,92.7 +Biology,Grade 7,79.1 +Physics,Grade 8,62.8 +History,Grade 7,83.2 +Physics,Grade 8,54.3 +Biology,Grade 8,82.5 +History,Grade 8,61.8 +Mathematics,Grade 8,75.7 +Chemistry,Grade 8,70.0 +History,Grade 8,63.1 +Mathematics,Grade 9,86.2 +History,Grade 9,96.3 +Physics,Grade 9,68.0 +Physics,Grade 9,67.3 +Chemistry,Grade 7,80.2 +Mathematics,Grade 9,71.9 +Physics,Grade 9,42.4 +Mathematics,Grade 9,76.4 +Biology,Grade 8,74.2 +Mathematics,Grade 8,94.2 +Chemistry,Grade 7,63.0 +Biology,Grade 8,87.0 +History,Grade 8,83.2 +Biology,Grade 9,68.5 +Mathematics,Grade 8,78.8 +Mathematics,Grade 8,62.4 +History,Grade 9,67.3 +Physics,Grade 7,63.7 +History,Grade 9,74.0 +Physics,Grade 7,59.9 +Physics,Grade 7,77.3 +Chemistry,Grade 8,74.0 +History,Grade 8,76.8 +Mathematics,Grade 8,85.4 +Biology,Grade 7,71.8 +History,Grade 7,78.2 +Mathematics,Grade 8,85.8 +Physics,Grade 7,83.6 +Physics,Grade 8,62.4 +Physics,Grade 8,63.0 +Biology,Grade 8,73.5 +History,Grade 7,64.8 +Mathematics,Grade 7,67.7 +Mathematics,Grade 7,79.3 +Mathematics,Grade 7,63.7 +Mathematics,Grade 8,79.8 +Biology,Grade 9,77.2 +History,Grade 7,81.8 +History,Grade 7,75.3 +Physics,Grade 9,82.5 +Chemistry,Grade 9,76.9 +Physics,Grade 9,83.4 +History,Grade 7,82.5 +Mathematics,Grade 8,67.4 +Physics,Grade 9,62.2 +Chemistry,Grade 9,75.9 +Physics,Grade 9,70.4 +Physics,Grade 7,65.9 +Physics,Grade 8,59.4 +Chemistry,Grade 7,59.3 +Chemistry,Grade 7,65.7 +History,Grade 9,76.2 +Chemistry,Grade 9,68.8 +Physics,Grade 8,71.1 +Mathematics,Grade 8,71.5 +History,Grade 7,69.2 +Biology,Grade 8,71.5 +Biology,Grade 7,78.5 +Chemistry,Grade 9,65.0 +Biology,Grade 9,76.2 +Chemistry,Grade 7,75.1 +Chemistry,Grade 9,57.8 +Chemistry,Grade 8,66.8 +Chemistry,Grade 8,80.0 +History,Grade 9,87.7 +Mathematics,Grade 8,63.7 +Mathematics,Grade 7,86.9 +History,Grade 7,88.5 +Physics,Grade 7,68.3 +Mathematics,Grade 8,67.8 +Biology,Grade 9,72.2 +Chemistry,Grade 9,62.5 +Mathematics,Grade 9,71.3 +Physics,Grade 8,79.6 +History,Grade 8,62.2 +Chemistry,Grade 7,60.5 +Mathematics,Grade 8,80.6 +Chemistry,Grade 8,94.3 +Mathematics,Grade 7,74.3 +Mathematics,Grade 7,67.8 +History,Grade 9,100.0 +Physics,Grade 8,58.0 +Biology,Grade 7,88.5 +Chemistry,Grade 7,67.0 +Mathematics,Grade 7,44.8 +Mathematics,Grade 7,65.7 +History,Grade 8,75.8 +History,Grade 9,91.2 +Biology,Grade 7,71.0 +History,Grade 8,91.6 +Chemistry,Grade 7,49.0 +Chemistry,Grade 8,54.6 +History,Grade 7,74.4 +History,Grade 8,83.3 +History,Grade 9,66.8 +Biology,Grade 7,48.3 +Chemistry,Grade 9,69.2 +Mathematics,Grade 9,98.0 +Biology,Grade 9,82.4 +Chemistry,Grade 9,73.9 +Mathematics,Grade 7,61.0 +Mathematics,Grade 9,87.2 +Biology,Grade 9,70.7 +Biology,Grade 7,88.8 +History,Grade 9,100.0 +History,Grade 9,89.6 +Mathematics,Grade 8,61.6 +History,Grade 7,72.5 +Mathematics,Grade 7,92.1 +Physics,Grade 7,64.3 +History,Grade 9,74.4 +History,Grade 8,100.0 +Physics,Grade 9,68.6 +Chemistry,Grade 9,68.3 +Chemistry,Grade 7,67.3 +Physics,Grade 9,64.2 +History,Grade 9,92.0 +Physics,Grade 9,70.8 +History,Grade 9,81.7 +Mathematics,Grade 9,78.8 +Physics,Grade 7,84.5 +Biology,Grade 9,66.0 +Chemistry,Grade 7,82.8 +History,Grade 8,63.8 +History,Grade 9,75.2 +Mathematics,Grade 9,73.4 +Biology,Grade 9,97.3 +Mathematics,Grade 7,52.8 +Mathematics,Grade 8,66.7 +Biology,Grade 7,62.3 +History,Grade 7,83.9 +Biology,Grade 9,72.3 +Chemistry,Grade 9,72.7 +History,Grade 7,71.7 +Physics,Grade 8,59.2 +History,Grade 7,64.3 +History,Grade 7,57.4 +Physics,Grade 8,75.9 +Physics,Grade 7,79.6 +Biology,Grade 9,85.3 +Mathematics,Grade 8,62.8 +Biology,Grade 9,76.3 +History,Grade 8,81.3 +Chemistry,Grade 9,64.0 +Mathematics,Grade 7,72.2 +Physics,Grade 9,77.7 +Biology,Grade 7,77.4 +Mathematics,Grade 8,70.1 +Biology,Grade 7,65.6 +Mathematics,Grade 8,89.6 +History,Grade 9,87.7 +Physics,Grade 8,78.1 +Physics,Grade 7,47.8 +Biology,Grade 9,70.2 +Mathematics,Grade 9,65.8 +Physics,Grade 8,74.7 +Physics,Grade 7,65.7 +Chemistry,Grade 9,73.4 +Physics,Grade 8,68.6 +Chemistry,Grade 8,66.5 +Physics,Grade 7,58.5 +History,Grade 8,77.2 +Physics,Grade 7,59.1 +History,Grade 9,73.4 +Mathematics,Grade 7,72.4 +Chemistry,Grade 8,59.3 +History,Grade 8,74.5 +Chemistry,Grade 9,80.9 +Biology,Grade 9,79.1 +Biology,Grade 9,86.6 +Mathematics,Grade 9,76.6 +Mathematics,Grade 9,83.3 +Physics,Grade 8,74.1 +Chemistry,Grade 9,66.1 +History,Grade 7,60.3 +Mathematics,Grade 9,91.2 +Physics,Grade 7,74.6 +Biology,Grade 8,81.5 +Biology,Grade 7,79.1 +Mathematics,Grade 8,68.9 +Chemistry,Grade 7,69.0 +Physics,Grade 8,81.2 +Physics,Grade 8,58.9 +Physics,Grade 7,65.7 +Physics,Grade 9,85.2 +Mathematics,Grade 7,50.3 +History,Grade 7,95.4 +Biology,Grade 7,73.0 +Mathematics,Grade 8,58.5 +History,Grade 7,78.2 +Chemistry,Grade 7,51.1 +History,Grade 7,59.9 +History,Grade 9,80.2 +Biology,Grade 8,73.6 +Biology,Grade 8,74.5 +Physics,Grade 9,70.3 +Chemistry,Grade 9,79.0 +Chemistry,Grade 9,92.8 +Chemistry,Grade 8,78.2 +Biology,Grade 9,98.4 +Chemistry,Grade 8,65.7 +Mathematics,Grade 8,50.1 +Physics,Grade 9,70.9 +Mathematics,Grade 7,73.0 +Mathematics,Grade 8,83.6 +Biology,Grade 9,59.6 +History,Grade 7,57.9 +Biology,Grade 7,66.0 +Mathematics,Grade 7,84.3 +History,Grade 8,54.5 +Biology,Grade 7,77.7 +History,Grade 8,77.9 +Mathematics,Grade 9,64.0 +Mathematics,Grade 7,77.1 +Biology,Grade 9,86.1 +Biology,Grade 7,76.2 +Chemistry,Grade 9,90.4 +Chemistry,Grade 8,81.8 +History,Grade 9,79.8 +Physics,Grade 9,70.0 +Physics,Grade 8,63.6 +Physics,Grade 8,73.0 +Chemistry,Grade 9,59.4 +Biology,Grade 8,91.9 +Physics,Grade 8,55.9 +Physics,Grade 9,72.5 +Chemistry,Grade 8,71.6 +Biology,Grade 8,84.3 +Chemistry,Grade 9,75.7 +Chemistry,Grade 7,71.9 +Physics,Grade 9,69.5 +Physics,Grade 8,58.2 +Chemistry,Grade 7,72.1 +Biology,Grade 8,75.4 +History,Grade 8,63.7 +Chemistry,Grade 7,67.3 +Chemistry,Grade 7,64.5 +History,Grade 9,100.0 +Mathematics,Grade 8,69.6 +History,Grade 9,72.8 +Mathematics,Grade 7,61.1 +Physics,Grade 9,79.0 +Biology,Grade 7,76.3 +Biology,Grade 8,96.4 +History,Grade 9,97.7 +Physics,Grade 8,78.2 +Biology,Grade 9,75.0 +Mathematics,Grade 9,63.1 +Chemistry,Grade 9,82.3 +Physics,Grade 9,71.0 +Physics,Grade 7,63.5 +Chemistry,Grade 8,70.9 +Chemistry,Grade 7,67.8 +Physics,Grade 7,53.3 +Mathematics,Grade 7,84.1 +History,Grade 9,86.5 +Biology,Grade 8,72.8 +History,Grade 9,79.3 +History,Grade 8,64.6 +Chemistry,Grade 9,89.9 +Biology,Grade 9,100.0 +Chemistry,Grade 7,61.7 +Mathematics,Grade 7,61.9 +Physics,Grade 9,75.5 +Biology,Grade 7,58.1 +Physics,Grade 8,77.3 +Physics,Grade 7,46.7 +Chemistry,Grade 9,76.5 +History,Grade 8,78.5 +Biology,Grade 7,68.4 +Mathematics,Grade 8,69.7 +History,Grade 7,60.4 +Mathematics,Grade 7,74.6 +Physics,Grade 8,62.4 +Physics,Grade 9,66.0 +History,Grade 9,77.7 +Mathematics,Grade 9,80.2 +Mathematics,Grade 9,63.6 +History,Grade 8,80.2 +History,Grade 8,73.2 +Chemistry,Grade 8,71.3 +Biology,Grade 9,61.9 +Physics,Grade 8,72.5 +Physics,Grade 7,41.3 +Mathematics,Grade 8,60.8 +History,Grade 9,82.1 +Biology,Grade 9,100.0 +Chemistry,Grade 7,82.6 +Mathematics,Grade 7,81.8 +Biology,Grade 7,72.9 +Biology,Grade 7,62.6 +Chemistry,Grade 7,79.4 +Mathematics,Grade 9,69.8 +Biology,Grade 9,64.1 +History,Grade 8,66.3 +Chemistry,Grade 8,56.1 +Biology,Grade 7,77.6 +Physics,Grade 7,72.3 +Physics,Grade 8,58.8 +Physics,Grade 8,68.2 +History,Grade 9,76.7 +Chemistry,Grade 9,70.8 +Chemistry,Grade 7,58.5 +Mathematics,Grade 8,82.1 +Physics,Grade 8,53.9 +Chemistry,Grade 9,73.7 +Physics,Grade 7,64.9 +History,Grade 9,85.5 +Chemistry,Grade 9,75.7 +Physics,Grade 9,76.9 +Biology,Grade 9,68.5 +Biology,Grade 9,84.1 +History,Grade 7,84.4 +Mathematics,Grade 7,68.0 +Physics,Grade 8,81.0 +History,Grade 7,84.2 +Physics,Grade 9,54.9 +Chemistry,Grade 8,85.8 +Biology,Grade 7,68.0 +Physics,Grade 8,51.0 +Mathematics,Grade 9,43.9 +Chemistry,Grade 7,57.8 +Biology,Grade 7,75.9 +Chemistry,Grade 9,68.6 +Physics,Grade 7,79.7 +History,Grade 9,80.0 +Chemistry,Grade 9,71.5 +Biology,Grade 8,61.5 +Biology,Grade 9,100.0 +Chemistry,Grade 8,79.5 +Mathematics,Grade 9,64.3 +History,Grade 9,64.8 +History,Grade 7,75.3 +Biology,Grade 8,74.4 +Biology,Grade 8,70.3 +Mathematics,Grade 8,65.5 +Mathematics,Grade 8,82.9 +Physics,Grade 8,63.8 +Biology,Grade 7,65.6 +Physics,Grade 9,59.1 +Physics,Grade 8,64.2 +Physics,Grade 7,51.1 +History,Grade 9,100.0 +Biology,Grade 7,55.7 +Mathematics,Grade 8,68.1 +Biology,Grade 8,71.4 +History,Grade 8,76.3 +History,Grade 9,65.1 +Biology,Grade 7,75.4 +Biology,Grade 8,80.2 +Mathematics,Grade 8,70.1 +Physics,Grade 7,84.3 +Mathematics,Grade 7,56.8 +History,Grade 8,78.5 +History,Grade 8,80.3 +Chemistry,Grade 7,42.4 +Chemistry,Grade 9,69.7 +Mathematics,Grade 9,89.2 +Physics,Grade 8,87.5 +Mathematics,Grade 9,60.8 +History,Grade 8,61.5 +Mathematics,Grade 9,87.0 +Chemistry,Grade 8,61.9 +Chemistry,Grade 8,77.4 +Mathematics,Grade 8,66.5 +Biology,Grade 8,88.6 +Mathematics,Grade 7,65.6 +Mathematics,Grade 8,62.4 +Mathematics,Grade 8,85.8 +Physics,Grade 7,66.5 +Biology,Grade 8,77.9 +Biology,Grade 7,87.5 +Biology,Grade 7,73.9 +Biology,Grade 8,69.0 +Physics,Grade 8,89.5 +Physics,Grade 9,84.2 +Biology,Grade 9,68.7 +Biology,Grade 8,64.8 +Mathematics,Grade 9,75.7 +Mathematics,Grade 8,65.9 +History,Grade 7,82.3 +Chemistry,Grade 8,51.2 +Chemistry,Grade 7,56.3 +History,Grade 8,73.3 +Mathematics,Grade 9,85.1 +Biology,Grade 8,92.5 +Mathematics,Grade 7,58.9 +Biology,Grade 9,83.9 +Physics,Grade 8,67.6 +Chemistry,Grade 8,57.1 +History,Grade 8,61.4 +Physics,Grade 9,74.1 +Mathematics,Grade 7,67.1 +Chemistry,Grade 8,68.5 +Mathematics,Grade 7,75.1 +Mathematics,Grade 9,59.6 +History,Grade 9,75.5 +History,Grade 8,70.1 +Chemistry,Grade 8,66.0 +Biology,Grade 9,66.3 +Mathematics,Grade 7,71.5 +History,Grade 7,65.5 +Physics,Grade 8,58.6 +Biology,Grade 9,76.2 +History,Grade 8,90.7 +Biology,Grade 7,56.1 +Chemistry,Grade 9,50.7 +Mathematics,Grade 9,80.2 +Chemistry,Grade 8,59.6 +Chemistry,Grade 9,75.5 +History,Grade 9,100.0 +History,Grade 7,71.4 +Physics,Grade 9,76.4 +Biology,Grade 7,66.0 +Physics,Grade 9,79.7 +Chemistry,Grade 8,58.0 +Physics,Grade 9,78.7 +Chemistry,Grade 7,85.3 +Biology,Grade 8,66.1 +Mathematics,Grade 9,77.4 +Biology,Grade 7,79.8 +Biology,Grade 7,63.1 +History,Grade 9,89.9 +Mathematics,Grade 8,61.7 +History,Grade 8,97.8 +Chemistry,Grade 7,66.1 +History,Grade 9,87.3 +Chemistry,Grade 7,55.3 +Biology,Grade 8,73.2 +Physics,Grade 7,68.3 +Physics,Grade 8,60.4 +Biology,Grade 9,100.0 +Physics,Grade 9,66.7 +Physics,Grade 8,68.2 +Chemistry,Grade 8,68.6 +Chemistry,Grade 7,73.6 +History,Grade 8,78.5 +Mathematics,Grade 9,60.2 +Mathematics,Grade 9,70.0 +Physics,Grade 7,46.6 +Chemistry,Grade 9,67.3 +Biology,Grade 9,60.0 +Chemistry,Grade 8,53.8 +Chemistry,Grade 9,74.4 +History,Grade 7,94.8 +History,Grade 8,80.6 +Chemistry,Grade 9,65.8 +History,Grade 7,47.9 +Chemistry,Grade 8,58.0 +Physics,Grade 9,61.3 +History,Grade 7,75.7 +Mathematics,Grade 8,72.1 +History,Grade 7,77.8 +Mathematics,Grade 9,67.7 +Physics,Grade 7,40.1 +History,Grade 7,78.0 +Mathematics,Grade 7,72.7 +Mathematics,Grade 7,56.9 +History,Grade 8,73.2 +Chemistry,Grade 7,71.1 +History,Grade 7,79.9 +Chemistry,Grade 7,75.7 +Mathematics,Grade 7,70.5 +History,Grade 7,78.2 +Chemistry,Grade 9,59.4 +History,Grade 8,75.5 +Physics,Grade 8,65.5 +History,Grade 8,85.7 +Biology,Grade 7,80.1 +Biology,Grade 7,72.1 +Chemistry,Grade 8,79.1 +Physics,Grade 7,44.8 +Chemistry,Grade 9,76.7 +Chemistry,Grade 8,65.6 +History,Grade 7,68.0 +History,Grade 9,86.7 +Biology,Grade 8,83.9 +Physics,Grade 9,71.5 +Biology,Grade 9,74.2 +Mathematics,Grade 7,51.6 +Biology,Grade 7,72.0 +Physics,Grade 7,58.9 +History,Grade 8,81.3 +Physics,Grade 9,67.3 +Mathematics,Grade 7,69.4 +Biology,Grade 8,58.1 +Mathematics,Grade 8,69.6 +Physics,Grade 7,63.1 +History,Grade 7,71.5 +Chemistry,Grade 7,63.9 +Mathematics,Grade 9,92.8 +History,Grade 7,86.1 +Chemistry,Grade 9,71.6 +Mathematics,Grade 8,65.6 +Biology,Grade 9,76.7 +Chemistry,Grade 8,68.8 +Chemistry,Grade 8,55.8 +Physics,Grade 8,60.5 +History,Grade 7,85.0 +Biology,Grade 8,85.0 +History,Grade 9,84.3 +Mathematics,Grade 8,76.0 +History,Grade 9,70.3 +Biology,Grade 7,76.1 +Mathematics,Grade 9,64.7 +Chemistry,Grade 9,77.1 +Mathematics,Grade 8,72.7 +Physics,Grade 7,54.6 +Biology,Grade 9,93.4 +History,Grade 9,98.4 +Chemistry,Grade 8,80.8 +Mathematics,Grade 9,61.5 +Mathematics,Grade 9,69.9 +Physics,Grade 7,76.9 +Mathematics,Grade 7,56.0 +Biology,Grade 7,74.8 +Mathematics,Grade 8,56.1 +Chemistry,Grade 7,56.7 +History,Grade 9,86.0 +Biology,Grade 8,76.3 +Chemistry,Grade 8,50.7 +History,Grade 7,73.9 +Biology,Grade 8,86.7 +Biology,Grade 7,80.3 +Chemistry,Grade 9,71.0 +Physics,Grade 9,70.3 +History,Grade 9,77.1 +History,Grade 7,76.4 +History,Grade 8,73.6 +Mathematics,Grade 7,55.3 +Mathematics,Grade 8,72.4 +Physics,Grade 9,50.1 +Mathematics,Grade 8,73.5 +Mathematics,Grade 9,71.9 +Biology,Grade 7,81.4 +Chemistry,Grade 7,71.9 +Physics,Grade 8,62.9 +Biology,Grade 9,87.7 +Physics,Grade 7,68.0 +History,Grade 8,85.1 +Biology,Grade 8,92.7 +History,Grade 9,77.3 +Physics,Grade 9,64.8 +Mathematics,Grade 9,65.8 +Mathematics,Grade 9,90.1 +Mathematics,Grade 8,62.0 +Physics,Grade 7,69.6 +Biology,Grade 8,81.4 +Chemistry,Grade 9,85.7 +Biology,Grade 8,78.7 +History,Grade 7,80.9 +Biology,Grade 9,93.2 +Mathematics,Grade 7,57.3 +Physics,Grade 8,49.4 +Mathematics,Grade 8,92.1 +Chemistry,Grade 8,66.6 +Biology,Grade 8,70.7 +Mathematics,Grade 9,83.5 +Mathematics,Grade 7,69.4 +Physics,Grade 8,63.8 +Biology,Grade 7,81.1 +Chemistry,Grade 9,70.0 +Chemistry,Grade 8,71.4 +Chemistry,Grade 7,72.9 +Physics,Grade 8,58.6 +Physics,Grade 8,68.6 +Chemistry,Grade 8,76.7 +Physics,Grade 8,69.8 +Biology,Grade 9,78.3 +History,Grade 9,78.2 +Mathematics,Grade 7,60.1 +Chemistry,Grade 8,59.6 +Mathematics,Grade 8,79.6 +Biology,Grade 9,79.8 +Physics,Grade 9,78.0 +Mathematics,Grade 9,80.2 +Chemistry,Grade 8,72.5 +Biology,Grade 9,79.4 +Biology,Grade 7,80.5 +Biology,Grade 9,70.1 +Biology,Grade 8,68.2 +Mathematics,Grade 8,67.5 +Chemistry,Grade 7,64.6 +Physics,Grade 8,92.0 +Mathematics,Grade 9,80.8 +Mathematics,Grade 8,71.1 +Mathematics,Grade 9,80.0 +History,Grade 9,71.8 +Mathematics,Grade 7,72.1 +Biology,Grade 7,60.6 +Mathematics,Grade 7,73.3 +History,Grade 7,96.4 +Mathematics,Grade 8,64.8 +History,Grade 8,68.6 +History,Grade 9,78.2 +Biology,Grade 8,77.2 +Mathematics,Grade 8,56.3 +Chemistry,Grade 8,79.3 +Mathematics,Grade 7,77.7 +Physics,Grade 7,69.5 +Biology,Grade 9,70.5 +Chemistry,Grade 9,73.3 +Mathematics,Grade 7,64.1 +Chemistry,Grade 7,77.1 +History,Grade 8,85.5 +Physics,Grade 7,50.0 +Physics,Grade 8,73.3 +Mathematics,Grade 9,72.1 +Physics,Grade 7,61.2 +Biology,Grade 8,68.8 +History,Grade 9,71.5 +Mathematics,Grade 8,95.2 +Biology,Grade 9,86.3 +Mathematics,Grade 7,52.3 +Mathematics,Grade 8,74.6 +History,Grade 9,49.3 +History,Grade 8,88.0 +Physics,Grade 8,81.2 +Biology,Grade 7,67.2 +Physics,Grade 9,69.6 +Physics,Grade 7,59.2 +Chemistry,Grade 9,43.9 +Chemistry,Grade 8,65.1 +History,Grade 7,84.0 +History,Grade 7,87.8 +Physics,Grade 7,71.9 +Mathematics,Grade 9,69.3 +Physics,Grade 7,63.4 +Physics,Grade 8,65.2 +Biology,Grade 8,99.6 +Biology,Grade 7,77.0 +Mathematics,Grade 9,82.8 +History,Grade 9,85.3 +Biology,Grade 8,69.4 +Chemistry,Grade 7,72.3 +Chemistry,Grade 7,68.4 +Mathematics,Grade 8,76.3 +Mathematics,Grade 8,64.3 +Mathematics,Grade 9,85.6 +Biology,Grade 9,84.0 +History,Grade 9,63.5 +Chemistry,Grade 7,65.0 +Physics,Grade 9,49.1 +Mathematics,Grade 9,84.7 +Physics,Grade 8,58.4 +Physics,Grade 7,67.6 +Physics,Grade 8,68.3 +History,Grade 9,82.4 +Mathematics,Grade 7,81.1 +History,Grade 7,72.6 +History,Grade 8,70.8 +History,Grade 9,79.7 +Physics,Grade 9,85.7 +Chemistry,Grade 8,83.2 +Biology,Grade 9,53.2 +Chemistry,Grade 9,90.5 +Physics,Grade 9,73.2 +Mathematics,Grade 8,78.6 +Biology,Grade 8,100.0 +Biology,Grade 9,74.0 +History,Grade 9,91.7 +Physics,Grade 7,57.0 +Chemistry,Grade 8,67.3 +History,Grade 7,79.4 +Chemistry,Grade 7,53.3 +Biology,Grade 8,61.6 +Biology,Grade 8,81.3 +History,Grade 9,83.8 +Biology,Grade 9,81.4 +Biology,Grade 9,80.8 +Biology,Grade 9,98.3 +History,Grade 7,65.0 +Chemistry,Grade 7,63.7 +Physics,Grade 9,66.4 +Chemistry,Grade 9,84.1 +Chemistry,Grade 8,84.8 +Chemistry,Grade 7,67.4 +History,Grade 8,61.1 +Biology,Grade 7,70.0 +History,Grade 9,78.8 +Physics,Grade 7,70.2 +Chemistry,Grade 7,68.5 +History,Grade 8,82.2 +Biology,Grade 9,83.9 +Biology,Grade 9,74.9 +Mathematics,Grade 9,70.8 +History,Grade 8,79.7 +Physics,Grade 7,70.2 +Physics,Grade 8,69.3 +Biology,Grade 7,70.4 +Physics,Grade 9,62.6 +History,Grade 8,76.6 +Chemistry,Grade 8,65.5 +Chemistry,Grade 9,80.7 +Mathematics,Grade 8,65.0 +Biology,Grade 9,75.7 +Mathematics,Grade 7,57.2 +Chemistry,Grade 7,59.4 +Biology,Grade 8,95.2 +Chemistry,Grade 9,79.5 +Physics,Grade 9,72.0 +Mathematics,Grade 8,80.9 +Biology,Grade 8,75.5 +History,Grade 9,97.4 +History,Grade 9,71.7 +Mathematics,Grade 8,62.2 +Chemistry,Grade 9,88.1 +Physics,Grade 9,77.1 +Mathematics,Grade 9,62.7 +Mathematics,Grade 7,80.0 +History,Grade 7,79.3 +Physics,Grade 9,68.5 +History,Grade 7,87.4 +Biology,Grade 8,100.0 +Mathematics,Grade 7,68.9 +Chemistry,Grade 9,64.6 +History,Grade 8,62.6 +History,Grade 7,71.5 +Physics,Grade 8,70.4 +Biology,Grade 7,66.6 +Mathematics,Grade 9,78.6 +History,Grade 9,84.1 +Chemistry,Grade 8,64.7 +Physics,Grade 8,77.3 +Mathematics,Grade 9,60.7 +Chemistry,Grade 8,75.3 +Physics,Grade 9,57.7 +History,Grade 9,61.7 +Mathematics,Grade 8,86.5 +Mathematics,Grade 7,55.2 +Biology,Grade 9,77.2 +Mathematics,Grade 8,100.0 +History,Grade 8,89.5 +History,Grade 9,87.1 +Biology,Grade 9,68.1 +History,Grade 7,81.3 +Chemistry,Grade 7,78.0 +Chemistry,Grade 7,76.8 +Physics,Grade 9,90.3 +Biology,Grade 8,74.9 +Mathematics,Grade 8,62.6 +History,Grade 9,65.5 +Mathematics,Grade 8,68.9 +Mathematics,Grade 7,47.7 +Biology,Grade 9,72.6 +Mathematics,Grade 8,84.9 +Biology,Grade 7,80.7 +Biology,Grade 7,97.4 +Physics,Grade 9,42.6 +Mathematics,Grade 9,72.7 +Physics,Grade 8,69.0 +Mathematics,Grade 7,48.0 +Biology,Grade 7,58.1 +Chemistry,Grade 9,76.6 +History,Grade 9,88.8 +Physics,Grade 7,51.5 +Mathematics,Grade 9,77.6 +Biology,Grade 7,65.5 +Mathematics,Grade 7,57.8 +Biology,Grade 9,67.4 +Mathematics,Grade 8,71.7 +History,Grade 8,56.9 +Chemistry,Grade 7,61.9 +Mathematics,Grade 8,82.9 +Mathematics,Grade 8,75.5 +Physics,Grade 7,60.9 +Chemistry,Grade 9,63.9 +History,Grade 7,81.0 +Chemistry,Grade 8,69.7 +Mathematics,Grade 7,60.4 +Mathematics,Grade 9,70.2 +Biology,Grade 7,77.4 +Physics,Grade 7,80.5 +Mathematics,Grade 9,73.2 +Mathematics,Grade 9,60.6 +Chemistry,Grade 9,91.5 +Physics,Grade 7,68.9 +Biology,Grade 7,89.6 +Mathematics,Grade 9,68.9 +History,Grade 7,69.1 +Biology,Grade 8,77.8 +Biology,Grade 8,96.9 +Chemistry,Grade 9,61.7 +History,Grade 8,86.4 +Physics,Grade 8,56.8 +Mathematics,Grade 7,78.8 +History,Grade 7,59.6 +Biology,Grade 8,60.1 +Physics,Grade 7,34.3 +History,Grade 8,78.8 +Chemistry,Grade 8,73.0 +Physics,Grade 9,54.0 +Physics,Grade 8,56.8 +Biology,Grade 7,58.9 +Physics,Grade 8,68.9 +Biology,Grade 7,75.5 +Mathematics,Grade 8,82.1 +Physics,Grade 9,54.6 +Mathematics,Grade 9,82.8 +Mathematics,Grade 7,79.1 +History,Grade 9,76.7 +Biology,Grade 8,73.2 +Physics,Grade 9,57.9 +Chemistry,Grade 7,65.6 +Mathematics,Grade 9,80.4 +Biology,Grade 9,89.5 +History,Grade 8,73.6 +History,Grade 8,76.1 +Physics,Grade 9,72.9 +History,Grade 8,90.6 +Biology,Grade 8,75.2 +Chemistry,Grade 7,61.9 +Physics,Grade 9,74.3 +Biology,Grade 8,67.8 +Physics,Grade 8,71.7 +Chemistry,Grade 9,73.2 +Mathematics,Grade 8,77.8 +Chemistry,Grade 9,60.4 +History,Grade 9,49.6 +History,Grade 7,72.4 +Mathematics,Grade 8,86.2 +Biology,Grade 8,77.9 +Biology,Grade 7,77.5 +Physics,Grade 8,72.8 +Mathematics,Grade 7,69.4 +History,Grade 8,86.8 +History,Grade 8,77.7 +Chemistry,Grade 8,70.5 +Mathematics,Grade 9,99.7 +Chemistry,Grade 9,58.9 +Biology,Grade 7,77.1 +History,Grade 9,67.7 +Chemistry,Grade 7,72.9 +Chemistry,Grade 8,60.8 +Biology,Grade 9,74.1 +History,Grade 9,65.9 +Biology,Grade 8,73.3 +Physics,Grade 8,52.3 +Mathematics,Grade 7,48.6 +Chemistry,Grade 9,73.6 +Chemistry,Grade 7,55.5 +Mathematics,Grade 7,52.1 +History,Grade 7,86.6 +History,Grade 7,75.3 +Physics,Grade 8,72.5 +Mathematics,Grade 9,78.2 +Chemistry,Grade 8,76.2 +Chemistry,Grade 8,79.8 +Chemistry,Grade 8,78.2 +History,Grade 7,78.8 +Chemistry,Grade 8,56.8 +Physics,Grade 8,66.0 +Biology,Grade 9,85.1 +Physics,Grade 7,44.0 +Mathematics,Grade 9,74.1 +Chemistry,Grade 9,75.5 +Physics,Grade 9,85.5 +Chemistry,Grade 8,79.5 +Physics,Grade 7,69.5 +Mathematics,Grade 8,57.4 +Mathematics,Grade 8,83.8 +Biology,Grade 7,59.8 +Physics,Grade 9,57.6 +Chemistry,Grade 9,57.9 +Biology,Grade 9,83.3 +Biology,Grade 9,74.9 +Physics,Grade 9,69.6 +History,Grade 9,89.6 +Physics,Grade 9,57.7 +Biology,Grade 8,54.3 +Chemistry,Grade 7,48.8 +Physics,Grade 9,52.2 +Chemistry,Grade 7,62.5 +Physics,Grade 9,83.9 +Biology,Grade 7,91.0 +Mathematics,Grade 8,70.5 +Mathematics,Grade 9,77.3 +Mathematics,Grade 8,74.9 +Physics,Grade 9,74.5 +Chemistry,Grade 7,60.8 +History,Grade 8,76.6 +Chemistry,Grade 8,46.8 +Mathematics,Grade 9,79.5 +Physics,Grade 8,59.6 +Biology,Grade 8,81.8 +Biology,Grade 8,75.7 +Biology,Grade 8,77.4 +Mathematics,Grade 8,85.2 +History,Grade 9,92.3 +Chemistry,Grade 8,72.2 +Mathematics,Grade 8,55.4 +Mathematics,Grade 8,75.9 +Mathematics,Grade 9,48.8 +Physics,Grade 7,61.0 +History,Grade 9,87.4 +Physics,Grade 7,53.2 +Chemistry,Grade 8,76.3 +History,Grade 9,99.5 +History,Grade 8,80.8 +Mathematics,Grade 8,75.3 +History,Grade 7,83.3 +Mathematics,Grade 8,53.7 +Physics,Grade 8,52.3 +Mathematics,Grade 9,89.2 +Mathematics,Grade 9,80.1 +Mathematics,Grade 9,77.1 +Biology,Grade 8,65.9 +History,Grade 8,100.0 +Physics,Grade 9,64.9 +Physics,Grade 7,87.5 +Mathematics,Grade 7,80.6 +Physics,Grade 8,72.5 +Mathematics,Grade 8,75.2 +History,Grade 8,67.2 +Biology,Grade 8,72.6 +Chemistry,Grade 8,70.4 +Mathematics,Grade 9,77.4 +Chemistry,Grade 9,67.2 +Chemistry,Grade 7,79.0 +Biology,Grade 7,93.1 +Chemistry,Grade 9,73.6 +History,Grade 7,89.4 +History,Grade 7,70.4 +Mathematics,Grade 9,59.0 +Mathematics,Grade 9,65.3 +Mathematics,Grade 9,69.8 +Chemistry,Grade 8,86.4 +Biology,Grade 9,100.0 +Biology,Grade 8,79.8 +Physics,Grade 9,76.9 +Biology,Grade 9,77.5 +Physics,Grade 7,55.8 +Physics,Grade 7,43.9 +Physics,Grade 8,64.7 +History,Grade 9,91.3 +Mathematics,Grade 7,71.8 +Biology,Grade 8,65.7 +Chemistry,Grade 9,85.9 +Chemistry,Grade 8,72.7 +Chemistry,Grade 8,76.5 +Biology,Grade 8,85.2 +History,Grade 8,88.1 +Biology,Grade 9,70.6 +Chemistry,Grade 9,80.4 +Physics,Grade 8,72.0 +Chemistry,Grade 7,70.0 +Mathematics,Grade 9,53.3 +Chemistry,Grade 8,75.7 +Physics,Grade 9,62.1 +Mathematics,Grade 9,71.9 +History,Grade 7,89.4 +Physics,Grade 8,71.4 +History,Grade 9,88.3 +Physics,Grade 8,91.5 +Physics,Grade 9,70.0 +Chemistry,Grade 7,43.3 +History,Grade 8,80.6 +Chemistry,Grade 7,72.1 +Physics,Grade 8,55.2 +Physics,Grade 8,69.1 +Physics,Grade 8,83.1 +Biology,Grade 8,89.8 +Mathematics,Grade 8,53.4 +History,Grade 7,80.9 +History,Grade 9,69.5 +Physics,Grade 7,66.4 +Biology,Grade 7,55.2 +History,Grade 8,78.4 +Mathematics,Grade 9,58.2 +Chemistry,Grade 8,70.0 +Biology,Grade 7,58.4 +Biology,Grade 7,49.1 +Mathematics,Grade 7,63.6 +Mathematics,Grade 7,82.1 +Physics,Grade 7,54.2 +Mathematics,Grade 8,73.1 +History,Grade 8,73.4 +History,Grade 8,79.3 +Mathematics,Grade 9,73.0 +Biology,Grade 8,81.3 +Mathematics,Grade 8,64.3 +History,Grade 7,75.8 +Chemistry,Grade 8,77.3 +Biology,Grade 8,77.4 +Chemistry,Grade 8,65.9 +Physics,Grade 8,63.0 +Chemistry,Grade 8,80.6 +Chemistry,Grade 8,71.3 +History,Grade 9,77.5 +Biology,Grade 7,65.7 +Physics,Grade 8,51.8 +Physics,Grade 8,62.0 +Biology,Grade 8,66.7 +Physics,Grade 9,52.5 +Biology,Grade 9,86.5 +Biology,Grade 7,77.7 +Physics,Grade 8,55.2 +History,Grade 7,58.4 +Biology,Grade 7,65.4 +Physics,Grade 8,57.3 +History,Grade 7,73.3 +Biology,Grade 7,77.1 +Biology,Grade 9,67.8 +History,Grade 8,92.5 +History,Grade 8,72.5 +Mathematics,Grade 7,76.4 +Mathematics,Grade 9,73.9 +History,Grade 7,80.6 +Mathematics,Grade 8,59.9 +Chemistry,Grade 8,56.5 +Chemistry,Grade 7,49.3 +Physics,Grade 8,97.9 +Chemistry,Grade 7,72.6 +Mathematics,Grade 8,65.6 +Mathematics,Grade 8,87.5 +Mathematics,Grade 7,77.2 +Mathematics,Grade 8,80.5 +Mathematics,Grade 8,74.6 +History,Grade 7,79.6 +Mathematics,Grade 7,54.4 +Mathematics,Grade 8,75.0 +Physics,Grade 7,57.5 +Chemistry,Grade 9,86.4 +Chemistry,Grade 8,63.4 +Physics,Grade 8,72.8 +Mathematics,Grade 8,48.0 +Biology,Grade 8,57.9 +Physics,Grade 9,69.0 +History,Grade 9,75.8 +Physics,Grade 7,70.6 +Physics,Grade 7,70.2 +Chemistry,Grade 7,67.7 +History,Grade 7,90.1 +Mathematics,Grade 9,68.6 +Mathematics,Grade 8,80.2 +Physics,Grade 8,49.6 +History,Grade 9,70.7 +Chemistry,Grade 9,69.0 +Physics,Grade 9,77.2 +Mathematics,Grade 7,67.8 +History,Grade 7,74.2 +Physics,Grade 8,65.4 +Biology,Grade 8,81.5 +History,Grade 9,84.2 +Chemistry,Grade 9,53.7 +Biology,Grade 9,76.6 +Physics,Grade 7,75.2 +History,Grade 9,98.9 +Physics,Grade 8,72.1 +Physics,Grade 7,78.0 +Chemistry,Grade 7,53.6 +Chemistry,Grade 7,64.9 +Mathematics,Grade 7,61.5 +Chemistry,Grade 7,70.9 +Mathematics,Grade 8,67.7 +Physics,Grade 8,56.2 +History,Grade 9,79.0 +History,Grade 8,75.1 +Physics,Grade 7,74.7 +Mathematics,Grade 8,62.9 +Chemistry,Grade 7,69.2 +Biology,Grade 7,69.6 +Physics,Grade 7,35.6 +Biology,Grade 8,68.7 +Physics,Grade 7,76.2 +Biology,Grade 8,68.7 +History,Grade 9,84.3 +Biology,Grade 8,81.2 +Biology,Grade 9,85.7 +Biology,Grade 9,98.6 +Chemistry,Grade 9,57.3 +Physics,Grade 8,78.1 +Mathematics,Grade 7,61.1 +Biology,Grade 7,83.9 +Mathematics,Grade 9,82.9 +Biology,Grade 8,74.5 +Physics,Grade 7,71.6 +Physics,Grade 9,64.6 +Chemistry,Grade 7,40.5 +Mathematics,Grade 9,100.0 +Biology,Grade 7,62.4 +Biology,Grade 9,97.2 +History,Grade 8,93.8 +Biology,Grade 7,77.8 +History,Grade 9,85.9 +Physics,Grade 7,84.7 +Chemistry,Grade 9,66.9 +Mathematics,Grade 8,76.3 +Mathematics,Grade 7,79.0 +Mathematics,Grade 7,68.4 +Mathematics,Grade 7,66.0 +Mathematics,Grade 7,73.5 +Physics,Grade 7,63.7 +Biology,Grade 8,70.6 +Biology,Grade 7,69.2 +Physics,Grade 7,61.5 +Physics,Grade 8,64.2 +Chemistry,Grade 8,58.8 +Mathematics,Grade 9,94.9 +Chemistry,Grade 9,77.5 +Physics,Grade 7,62.3 +Biology,Grade 9,69.2 +History,Grade 7,71.2 +Physics,Grade 8,63.6 +Chemistry,Grade 9,78.4 +Chemistry,Grade 9,68.9 +Mathematics,Grade 7,57.9 +History,Grade 9,81.1 +Biology,Grade 7,75.1 +Mathematics,Grade 7,46.5 +History,Grade 7,74.0 +Mathematics,Grade 8,82.2 +History,Grade 7,70.1 +Chemistry,Grade 7,73.4 +Physics,Grade 7,71.0 +Physics,Grade 8,57.3 +Biology,Grade 8,82.0 +Biology,Grade 9,61.4 +Physics,Grade 9,65.5 +History,Grade 8,62.1 +History,Grade 9,85.4 +Biology,Grade 8,92.7 +History,Grade 9,88.5 +Chemistry,Grade 7,74.6 +Biology,Grade 7,58.6 +Chemistry,Grade 8,70.0 +Mathematics,Grade 7,93.4 +Physics,Grade 9,86.0 +History,Grade 7,76.1 +History,Grade 8,78.0 +Biology,Grade 7,84.3 +History,Grade 8,81.6 +Chemistry,Grade 9,66.4 +History,Grade 8,100.0 +Biology,Grade 7,84.5 +History,Grade 7,73.9 +Mathematics,Grade 7,45.7 +Physics,Grade 9,66.9 +Biology,Grade 9,70.6 +History,Grade 7,69.7 +Biology,Grade 9,68.0 +Physics,Grade 8,62.3 +Chemistry,Grade 8,81.5 +Chemistry,Grade 7,69.7 +Biology,Grade 9,64.8 +Biology,Grade 9,67.9 +Mathematics,Grade 7,69.7 +Chemistry,Grade 7,42.2 +Physics,Grade 9,85.2 +Biology,Grade 8,80.6 +Physics,Grade 8,89.2 +Biology,Grade 7,68.5 +Chemistry,Grade 9,87.5 +Biology,Grade 9,72.1 +History,Grade 7,64.0 +Mathematics,Grade 7,79.3 +Biology,Grade 8,62.6 +Mathematics,Grade 9,64.3 +Chemistry,Grade 7,60.6 +Mathematics,Grade 7,62.4 +Physics,Grade 9,96.4 +Biology,Grade 7,67.9 +History,Grade 7,68.3 +Biology,Grade 8,95.7 +Biology,Grade 7,62.7 +Chemistry,Grade 7,52.0 +History,Grade 8,98.4 +Biology,Grade 7,76.1 +Physics,Grade 9,77.7 +Biology,Grade 7,60.0 +Biology,Grade 9,87.1 +Chemistry,Grade 8,90.5 +Physics,Grade 9,75.8 +History,Grade 9,70.9 +Chemistry,Grade 8,57.9 +Mathematics,Grade 8,73.0 +Biology,Grade 9,80.6 +Mathematics,Grade 7,67.0 +Physics,Grade 9,72.7 +Chemistry,Grade 8,71.6 +Physics,Grade 7,81.1 +History,Grade 8,69.9 +History,Grade 9,97.4 +History,Grade 9,75.4 +History,Grade 9,95.0 +Mathematics,Grade 7,70.4 +History,Grade 9,73.0 +Physics,Grade 8,73.2 +Chemistry,Grade 8,71.1 +Biology,Grade 8,93.0 +History,Grade 8,55.8 +Biology,Grade 9,78.9 +Biology,Grade 8,76.5 +Physics,Grade 7,62.8 +Mathematics,Grade 7,86.5 +Physics,Grade 8,51.8 +Physics,Grade 9,61.0 +Biology,Grade 8,72.9 +Mathematics,Grade 8,83.9 +Physics,Grade 8,83.6 +Physics,Grade 9,72.8 +Chemistry,Grade 9,60.0 +Chemistry,Grade 7,68.4 +Physics,Grade 8,54.2 +Chemistry,Grade 9,56.7 +History,Grade 7,63.3 +Physics,Grade 8,80.3 +Physics,Grade 9,74.8 +Physics,Grade 7,68.8 +Physics,Grade 7,70.5 +History,Grade 9,78.2 +Chemistry,Grade 7,72.9 +Chemistry,Grade 9,81.3 +Chemistry,Grade 7,84.1 +Mathematics,Grade 9,91.7 +Biology,Grade 8,70.3 +Chemistry,Grade 7,64.1 +Mathematics,Grade 9,52.4 +Chemistry,Grade 9,68.2 +Mathematics,Grade 9,72.0 +Biology,Grade 9,78.6 +Chemistry,Grade 8,96.6 +Chemistry,Grade 8,79.8 +Chemistry,Grade 8,61.6 +Physics,Grade 7,66.9 +Physics,Grade 9,74.6 +Chemistry,Grade 8,78.7 +Biology,Grade 7,78.4 +History,Grade 9,67.4 +History,Grade 8,64.8 +Biology,Grade 9,76.0 +Biology,Grade 8,61.9 +Chemistry,Grade 7,58.8 +History,Grade 8,82.9 +History,Grade 9,87.6 +Physics,Grade 7,37.6 +Chemistry,Grade 8,77.4 +Physics,Grade 7,62.3 +Mathematics,Grade 7,80.6 +Mathematics,Grade 9,71.2 +Physics,Grade 8,84.7 +Mathematics,Grade 7,64.0 +History,Grade 7,63.6 +History,Grade 7,92.9 +Biology,Grade 7,94.8 +Mathematics,Grade 9,76.9 +Chemistry,Grade 7,59.0 +Biology,Grade 9,71.4 +History,Grade 8,85.0 +Biology,Grade 8,73.3 +Chemistry,Grade 8,68.0 +Mathematics,Grade 9,62.5 +Chemistry,Grade 7,73.9 +Physics,Grade 7,66.6 +Chemistry,Grade 9,86.7 +Physics,Grade 8,71.6 +History,Grade 7,65.2 +Chemistry,Grade 8,65.9 +Chemistry,Grade 8,75.3 +Mathematics,Grade 8,76.3 +Biology,Grade 8,59.6 +Physics,Grade 7,64.5 +Physics,Grade 8,47.8 +History,Grade 9,87.2 +Physics,Grade 9,53.4 +Biology,Grade 8,71.7 +History,Grade 9,83.7 +Biology,Grade 8,67.1 +History,Grade 9,84.4 +Mathematics,Grade 7,62.9 +Physics,Grade 9,68.8 +Mathematics,Grade 9,66.9 +Physics,Grade 8,74.1 +Biology,Grade 7,75.9 +Chemistry,Grade 8,73.9 +History,Grade 8,80.1 +Mathematics,Grade 8,66.3 +Physics,Grade 8,58.3 +Mathematics,Grade 7,75.6 +Physics,Grade 9,79.2 +Biology,Grade 9,81.3 +Mathematics,Grade 9,75.6 +Biology,Grade 9,83.1 +Biology,Grade 9,74.3 +Physics,Grade 9,71.2 +Mathematics,Grade 7,63.0 +History,Grade 7,77.4 +History,Grade 8,91.3 +Physics,Grade 8,73.3 +History,Grade 9,85.7 +Mathematics,Grade 9,64.7 +Mathematics,Grade 7,76.5 +Physics,Grade 8,62.9 +Chemistry,Grade 7,56.0 +Physics,Grade 8,72.6 +History,Grade 9,80.3 +Physics,Grade 7,65.1 +Physics,Grade 7,61.6 +Biology,Grade 7,52.0 +Chemistry,Grade 7,71.3 +Chemistry,Grade 8,73.6 +History,Grade 7,78.8 +Biology,Grade 8,84.6 +History,Grade 8,74.4 +History,Grade 8,100.0 +Biology,Grade 7,70.2 +Mathematics,Grade 7,57.1 +Biology,Grade 7,68.1 +Biology,Grade 9,84.7 +Physics,Grade 9,93.2 +Biology,Grade 8,75.4 +Chemistry,Grade 7,68.1 +Mathematics,Grade 9,51.3 +Biology,Grade 9,93.6 +Biology,Grade 9,58.3 +Chemistry,Grade 7,55.7 +Chemistry,Grade 9,63.7 +Mathematics,Grade 8,98.0 +Mathematics,Grade 9,76.9 +Chemistry,Grade 8,79.7 +Chemistry,Grade 7,70.6 +Mathematics,Grade 8,66.3 +Chemistry,Grade 7,81.1 +Chemistry,Grade 8,57.1 +Chemistry,Grade 7,100.0 +Mathematics,Grade 9,74.9 +Biology,Grade 8,73.5 +Mathematics,Grade 8,54.1 +Physics,Grade 8,54.9 +Mathematics,Grade 7,58.8 +History,Grade 9,73.3 +History,Grade 8,67.3 +Chemistry,Grade 9,69.2 +Physics,Grade 7,68.3 +History,Grade 7,76.4 +Biology,Grade 9,62.9 +Physics,Grade 8,70.7 +Chemistry,Grade 9,73.8 +Chemistry,Grade 9,86.6 +Chemistry,Grade 9,44.1 +Biology,Grade 7,83.7 +Biology,Grade 9,91.3 +Mathematics,Grade 9,68.6 +History,Grade 7,54.0 +Chemistry,Grade 9,50.7 +Biology,Grade 8,65.8 +Physics,Grade 7,68.5 +Chemistry,Grade 7,65.1 +Chemistry,Grade 8,76.8 +Biology,Grade 7,85.4 +Mathematics,Grade 8,51.9 +Mathematics,Grade 7,80.5 +Chemistry,Grade 9,64.2 +History,Grade 9,67.0 +Physics,Grade 9,58.4 +History,Grade 9,72.7 +Physics,Grade 9,76.0 +Mathematics,Grade 9,60.0 +History,Grade 7,77.6 +Mathematics,Grade 9,74.3 +Physics,Grade 7,70.9 +Physics,Grade 7,70.7 +History,Grade 8,67.0 +Biology,Grade 8,72.2 +Mathematics,Grade 9,74.8 +Mathematics,Grade 8,74.8 +History,Grade 9,85.1 +Biology,Grade 7,66.3 +Biology,Grade 7,56.8 +Physics,Grade 9,76.2 +History,Grade 8,77.7 +History,Grade 8,75.6 +History,Grade 7,76.6 +Physics,Grade 7,59.5 +Biology,Grade 9,85.7 +Biology,Grade 8,70.1 +History,Grade 7,82.1 +History,Grade 7,79.1 +Chemistry,Grade 7,45.0 +Biology,Grade 9,81.8 +Chemistry,Grade 8,70.5 +Mathematics,Grade 9,93.2 +Chemistry,Grade 7,80.7 +Biology,Grade 9,68.2 +Biology,Grade 7,70.8 +History,Grade 9,51.9 +History,Grade 8,73.7 +Physics,Grade 8,77.0 +Mathematics,Grade 9,74.5 +Physics,Grade 9,54.4 +Biology,Grade 8,100.0 +Physics,Grade 8,70.4 +Physics,Grade 7,65.0 +Biology,Grade 9,61.9 +Physics,Grade 7,49.7 +Chemistry,Grade 8,86.8 +Physics,Grade 9,61.2 +Biology,Grade 9,80.6 +History,Grade 9,83.7 +Biology,Grade 8,77.9 +Physics,Grade 9,76.5 +Mathematics,Grade 8,71.2 +Mathematics,Grade 7,69.9 +Chemistry,Grade 8,69.5 +Chemistry,Grade 9,97.2 +Physics,Grade 8,45.5 +Chemistry,Grade 7,69.4 +History,Grade 8,97.3 +Biology,Grade 9,71.2 +Mathematics,Grade 8,71.6 +Chemistry,Grade 8,74.6 +Mathematics,Grade 7,56.2 +Physics,Grade 8,75.5 +History,Grade 9,100.0 +History,Grade 7,82.4 +Physics,Grade 8,85.2 +Mathematics,Grade 8,70.2 +Physics,Grade 8,70.4 +Physics,Grade 8,77.9 +Mathematics,Grade 7,86.7 +History,Grade 7,77.5 +History,Grade 7,81.1 +Mathematics,Grade 8,72.5 +Chemistry,Grade 7,59.2 +Biology,Grade 8,78.0 +History,Grade 9,100.0 +Mathematics,Grade 7,76.5 +Biology,Grade 7,68.2 +Mathematics,Grade 9,76.8 +Biology,Grade 8,62.4 +History,Grade 8,98.7 +History,Grade 8,67.5 +History,Grade 9,81.0 +Physics,Grade 7,53.3 +Chemistry,Grade 8,65.9 +Mathematics,Grade 9,61.5 +Chemistry,Grade 7,53.0 +Chemistry,Grade 7,47.7 +Physics,Grade 9,93.7 +Mathematics,Grade 7,70.3 +Physics,Grade 7,76.4 +Physics,Grade 7,52.5 +History,Grade 8,67.6 +Mathematics,Grade 8,54.3 +History,Grade 8,79.2 +Chemistry,Grade 8,62.2 +Biology,Grade 8,66.1 +Physics,Grade 7,77.0 +Biology,Grade 7,63.8 +Physics,Grade 8,80.3 +Chemistry,Grade 8,69.4 +Physics,Grade 8,58.7 +History,Grade 9,76.1 +Mathematics,Grade 8,64.9 +Chemistry,Grade 8,59.9 +Chemistry,Grade 7,63.3 +Biology,Grade 7,66.2 +History,Grade 7,75.6 +Biology,Grade 7,56.5 +Biology,Grade 9,84.3 +Chemistry,Grade 8,60.1 +Physics,Grade 9,73.5 +Biology,Grade 9,78.6 +Mathematics,Grade 8,57.8 +History,Grade 7,60.7 +Physics,Grade 9,65.9 +Mathematics,Grade 7,69.5 +Biology,Grade 8,80.7 +Mathematics,Grade 7,76.1 +History,Grade 8,72.8 +Chemistry,Grade 9,58.2 +Mathematics,Grade 7,56.0 +History,Grade 9,81.1 +History,Grade 8,77.3 +Chemistry,Grade 7,57.9 +Mathematics,Grade 7,78.5 +History,Grade 9,80.3 +Chemistry,Grade 7,57.4 +Physics,Grade 8,62.5 +Physics,Grade 8,56.1 +Chemistry,Grade 7,79.7 +Chemistry,Grade 7,59.8 +Biology,Grade 9,82.3 +Physics,Grade 8,80.8 +History,Grade 7,77.5 +Biology,Grade 7,60.3 +Mathematics,Grade 7,54.4 +Mathematics,Grade 7,54.3 +Chemistry,Grade 9,67.4 +Mathematics,Grade 9,79.5 +Physics,Grade 8,49.6 +Physics,Grade 7,83.9 +History,Grade 8,75.0 +Chemistry,Grade 8,59.9 +Mathematics,Grade 8,55.1 +History,Grade 8,73.9 +Biology,Grade 8,75.9 +Biology,Grade 9,81.6 +Chemistry,Grade 9,69.8 +History,Grade 9,77.9 +History,Grade 8,80.8 +Biology,Grade 7,95.7 +Mathematics,Grade 9,66.7 +Physics,Grade 8,47.2 +Chemistry,Grade 9,81.8 +Chemistry,Grade 7,76.1 +Biology,Grade 9,61.8 +Physics,Grade 7,79.9 +Chemistry,Grade 8,72.9 +Physics,Grade 9,60.4 +History,Grade 7,73.9 +Biology,Grade 8,73.2 +Chemistry,Grade 7,69.5 +Mathematics,Grade 7,62.5 +Biology,Grade 7,69.6 +Chemistry,Grade 7,59.6 +History,Grade 7,69.7 +History,Grade 8,53.4 +Mathematics,Grade 7,59.3 +Mathematics,Grade 9,80.8 +Mathematics,Grade 7,69.5 +Biology,Grade 9,90.9 +Biology,Grade 7,60.6 +Biology,Grade 7,80.9 +Mathematics,Grade 9,80.4 +Chemistry,Grade 8,63.6 +Physics,Grade 8,38.7 +Biology,Grade 9,62.1 +History,Grade 7,77.6 +History,Grade 8,86.1 +Biology,Grade 7,76.6 +Mathematics,Grade 7,63.2 +Chemistry,Grade 9,54.0 +Mathematics,Grade 8,57.6 +Mathematics,Grade 9,81.2 +Physics,Grade 7,56.6 +Chemistry,Grade 8,67.6 +History,Grade 8,82.7 +Mathematics,Grade 8,61.2 +Mathematics,Grade 7,52.6 +Biology,Grade 7,70.0 +Physics,Grade 7,65.3 +Mathematics,Grade 9,71.0 +History,Grade 7,57.5 +Mathematics,Grade 7,65.3 +Biology,Grade 7,51.1 +Chemistry,Grade 9,74.2 +History,Grade 9,76.1 +Mathematics,Grade 7,62.5 +History,Grade 7,75.0 +Chemistry,Grade 7,71.2 +History,Grade 8,83.0 +Physics,Grade 8,69.9 +Chemistry,Grade 7,46.7 +History,Grade 9,83.3 +Biology,Grade 9,100.0 +Biology,Grade 7,67.3 +Physics,Grade 7,55.9 +Mathematics,Grade 7,66.5 +Physics,Grade 8,71.2 +Biology,Grade 7,73.4 +Mathematics,Grade 8,64.4 +Chemistry,Grade 7,72.7 +History,Grade 9,76.1 +Chemistry,Grade 9,63.8 +Chemistry,Grade 9,77.2 +Chemistry,Grade 7,68.9 +Chemistry,Grade 9,84.0 +History,Grade 8,61.3 +History,Grade 9,94.1 +History,Grade 7,73.7 +Chemistry,Grade 7,51.5 +Chemistry,Grade 9,80.5 +Biology,Grade 8,93.5 +History,Grade 7,73.7 +Chemistry,Grade 9,52.5 +Mathematics,Grade 8,84.0 +Mathematics,Grade 8,75.2 +Physics,Grade 8,71.7 +History,Grade 9,59.1 +History,Grade 7,73.6 +Biology,Grade 7,75.1 +Biology,Grade 7,85.1 +Physics,Grade 8,59.8 +Biology,Grade 9,50.5 +Biology,Grade 7,79.1 +Physics,Grade 7,60.8 +Chemistry,Grade 7,73.8 +Chemistry,Grade 8,68.5 +Biology,Grade 9,61.4 +Biology,Grade 7,65.1 +History,Grade 8,70.0 +Chemistry,Grade 7,69.9 +Chemistry,Grade 7,58.0 +Biology,Grade 9,97.5 +Mathematics,Grade 9,80.0 +Chemistry,Grade 7,65.8 +History,Grade 9,66.4 +Biology,Grade 7,83.9 +Chemistry,Grade 9,78.5 +Mathematics,Grade 7,66.4 +Biology,Grade 8,95.1 +Biology,Grade 9,100.0 +Biology,Grade 8,50.5 +History,Grade 7,97.3 +Biology,Grade 9,80.3 +Biology,Grade 8,69.6 +History,Grade 9,75.7 +Mathematics,Grade 7,73.7 +Physics,Grade 8,60.9 +Chemistry,Grade 7,79.0 +Physics,Grade 9,56.2 +Chemistry,Grade 7,52.0 +History,Grade 7,72.4 +Mathematics,Grade 7,65.8 +Chemistry,Grade 7,67.0 +Chemistry,Grade 7,46.7 +History,Grade 8,89.4 +Mathematics,Grade 8,64.9 +Mathematics,Grade 7,68.0 +Mathematics,Grade 8,60.9 +Mathematics,Grade 9,70.9 +Biology,Grade 8,56.7 +History,Grade 7,72.0 +Biology,Grade 9,66.8 +History,Grade 7,83.9 +Physics,Grade 8,50.0 +Physics,Grade 7,51.6 +History,Grade 8,85.1 +History,Grade 9,69.4 +Biology,Grade 9,84.5 +History,Grade 9,78.2 +Chemistry,Grade 9,77.7 +Biology,Grade 7,74.4 +Chemistry,Grade 8,69.5 +Mathematics,Grade 9,88.0 +Physics,Grade 7,63.4 +History,Grade 9,66.5 +Physics,Grade 7,60.4 +History,Grade 9,87.4 +History,Grade 8,76.6 +Physics,Grade 7,75.2 +Mathematics,Grade 8,66.5 +Chemistry,Grade 7,74.6 +Physics,Grade 9,65.2 +History,Grade 8,68.5 +Biology,Grade 7,77.6 +History,Grade 8,76.2 +History,Grade 8,75.7 +History,Grade 8,63.6 +Mathematics,Grade 8,77.5 +Biology,Grade 8,83.5 +History,Grade 7,77.2 +Biology,Grade 8,85.5 +Mathematics,Grade 8,63.3 +History,Grade 9,89.7 +Mathematics,Grade 9,66.4 +Biology,Grade 8,71.2 +Physics,Grade 7,59.1 +Biology,Grade 8,71.3 +Chemistry,Grade 7,80.6 +Chemistry,Grade 7,62.6 +History,Grade 9,72.8 +History,Grade 7,82.5 +Chemistry,Grade 7,69.5 +History,Grade 9,79.2 +Chemistry,Grade 7,62.4 +History,Grade 9,96.1 +Chemistry,Grade 9,68.0 +Mathematics,Grade 9,73.5 +Mathematics,Grade 9,76.9 +Biology,Grade 8,80.0 +Mathematics,Grade 9,71.7 +Chemistry,Grade 8,73.7 +Chemistry,Grade 9,68.3 +Physics,Grade 9,44.2 +Physics,Grade 9,55.1 +Biology,Grade 8,78.0 +Biology,Grade 8,45.9 +Mathematics,Grade 7,73.7 +Biology,Grade 9,68.3 +Biology,Grade 8,89.8 +Chemistry,Grade 7,66.5 +Physics,Grade 7,71.0 +Biology,Grade 8,94.2 +Physics,Grade 9,71.3 +History,Grade 7,76.4 +Chemistry,Grade 7,55.7 +Biology,Grade 8,81.3 +Physics,Grade 7,61.5 +History,Grade 7,65.4 +Mathematics,Grade 8,79.1 +Physics,Grade 9,71.7 +Mathematics,Grade 9,86.3 +Chemistry,Grade 7,55.8 +Biology,Grade 7,70.5 +Biology,Grade 8,57.9 +Biology,Grade 7,80.1 +Biology,Grade 7,72.7 +Biology,Grade 7,83.1 +Chemistry,Grade 9,59.2 +History,Grade 8,88.5 +Chemistry,Grade 9,57.5 +Physics,Grade 9,75.1 +Physics,Grade 7,70.1 +Chemistry,Grade 9,96.3 +Biology,Grade 8,76.0 +History,Grade 8,78.1 +Biology,Grade 9,75.1 +Mathematics,Grade 7,64.8 +Biology,Grade 8,78.1 +Chemistry,Grade 8,83.9 +Physics,Grade 9,70.8 +Biology,Grade 9,72.5 +Physics,Grade 8,65.9 +History,Grade 8,83.2 +Physics,Grade 7,70.8 +Chemistry,Grade 8,58.8 +Biology,Grade 8,90.3 +Physics,Grade 7,71.7 +Chemistry,Grade 8,100.0 +History,Grade 8,70.1 +Chemistry,Grade 7,52.4 +Mathematics,Grade 7,93.0 +Chemistry,Grade 7,78.2 +Physics,Grade 9,65.0 +Chemistry,Grade 9,63.2 +Mathematics,Grade 7,73.4 +Chemistry,Grade 8,93.7 +Biology,Grade 9,76.8 +History,Grade 8,100.0 +History,Grade 9,93.5 +Chemistry,Grade 8,54.8 +Chemistry,Grade 7,74.7 +Chemistry,Grade 9,73.7 +Biology,Grade 9,74.3 +Chemistry,Grade 7,98.6 +Mathematics,Grade 9,78.7 +Biology,Grade 7,63.0 +Mathematics,Grade 7,81.9 +Chemistry,Grade 9,79.0 +Chemistry,Grade 7,63.1 +History,Grade 9,73.2 +Mathematics,Grade 7,50.5 +Biology,Grade 8,74.0 +Biology,Grade 7,90.9 +Mathematics,Grade 8,61.9 +History,Grade 8,79.4 +Biology,Grade 9,74.5 +Biology,Grade 8,74.4 +Mathematics,Grade 7,62.0 +History,Grade 9,82.8 +Mathematics,Grade 9,89.7 +History,Grade 9,50.7 +Physics,Grade 8,76.0 +Chemistry,Grade 9,68.8 +Chemistry,Grade 7,48.7 +Biology,Grade 7,57.2 +Physics,Grade 7,70.7 +History,Grade 8,88.0 +History,Grade 7,67.4 +Chemistry,Grade 9,85.2 +History,Grade 8,64.2 +Mathematics,Grade 7,76.9 +Physics,Grade 7,51.2 +Chemistry,Grade 9,74.9 +Physics,Grade 9,64.6 +Mathematics,Grade 7,71.7 +Mathematics,Grade 8,71.3 +Chemistry,Grade 8,75.0 +Mathematics,Grade 7,71.2 +Biology,Grade 7,84.5 +Mathematics,Grade 8,64.6 +Physics,Grade 9,62.4 +History,Grade 8,88.8 +Physics,Grade 9,73.7 +Chemistry,Grade 7,65.0 +Physics,Grade 9,68.0 +History,Grade 8,81.5 +Mathematics,Grade 9,86.5 +Physics,Grade 7,71.2 +Chemistry,Grade 9,74.7 +History,Grade 9,100.0 +Biology,Grade 7,57.1 +History,Grade 9,75.7 +Chemistry,Grade 8,86.2 +Mathematics,Grade 8,91.5 +Chemistry,Grade 9,80.2 +Mathematics,Grade 7,58.2 +Physics,Grade 9,81.9 +Physics,Grade 9,66.9 +Biology,Grade 9,86.6 +Mathematics,Grade 8,58.2 +Biology,Grade 7,72.5 +History,Grade 7,82.7 +History,Grade 9,74.1 +Biology,Grade 7,81.6 +Chemistry,Grade 8,74.1 +Biology,Grade 8,69.3 +History,Grade 7,73.3 +History,Grade 7,77.8 +Biology,Grade 7,66.4 +Physics,Grade 8,76.3 +Physics,Grade 8,69.4 +History,Grade 7,87.1 +Biology,Grade 8,67.7 +Chemistry,Grade 7,70.5 +Biology,Grade 7,58.4 +Physics,Grade 9,72.6 +Biology,Grade 8,82.8 +Mathematics,Grade 9,76.7 +History,Grade 7,88.4 +Chemistry,Grade 7,55.5 +Physics,Grade 7,79.8 +Biology,Grade 8,75.8 +Physics,Grade 9,63.7 +Biology,Grade 7,71.7 +Chemistry,Grade 7,76.4 +Mathematics,Grade 9,83.3 +Physics,Grade 9,67.9 +Biology,Grade 9,83.2 +Mathematics,Grade 7,44.4 +Physics,Grade 7,77.3 +History,Grade 7,62.9 +Chemistry,Grade 7,66.4 +Mathematics,Grade 7,59.7 +Chemistry,Grade 8,69.7 +Physics,Grade 9,71.1 +Chemistry,Grade 7,76.1 +Chemistry,Grade 9,72.1 +Physics,Grade 8,65.0 +Physics,Grade 7,51.7 +Mathematics,Grade 8,85.5 +Physics,Grade 8,78.6 +Physics,Grade 7,63.8 +Chemistry,Grade 8,52.7 +History,Grade 8,83.5 +Biology,Grade 8,88.7 +Biology,Grade 7,74.9 +Mathematics,Grade 7,68.0 +Mathematics,Grade 8,69.3 +History,Grade 7,58.8 +Chemistry,Grade 7,55.5 +Biology,Grade 7,94.7 +Physics,Grade 7,63.6 +History,Grade 7,84.2 +History,Grade 9,100.0 +Mathematics,Grade 9,76.6 +Physics,Grade 9,69.8 +Physics,Grade 9,60.0 +Physics,Grade 9,55.3 +Mathematics,Grade 8,67.6 +Biology,Grade 7,84.0 +Mathematics,Grade 9,71.1 +Physics,Grade 9,56.3 +Biology,Grade 9,97.0 +Mathematics,Grade 8,83.0 +Physics,Grade 8,74.4 +Chemistry,Grade 7,65.1 +History,Grade 8,57.4 +History,Grade 8,81.8 +Physics,Grade 8,81.1 +Mathematics,Grade 9,83.7 +History,Grade 8,56.2 +History,Grade 8,69.6 +Biology,Grade 7,67.2 +Chemistry,Grade 9,62.8 +Mathematics,Grade 8,78.3 +Physics,Grade 7,65.7 +Chemistry,Grade 7,58.3 +Chemistry,Grade 9,65.7 +History,Grade 8,69.6 +Physics,Grade 8,60.7 +Biology,Grade 7,69.3 +Chemistry,Grade 7,79.4 +Mathematics,Grade 9,94.1 +Physics,Grade 8,75.6 +History,Grade 9,54.2 +Mathematics,Grade 8,68.8 +Biology,Grade 7,64.8 +History,Grade 7,60.2 +Physics,Grade 7,58.9 +Mathematics,Grade 7,57.6 +Biology,Grade 7,63.4 +Chemistry,Grade 9,59.6 +Mathematics,Grade 9,77.4 +Chemistry,Grade 8,62.4 +Mathematics,Grade 9,71.5 +Physics,Grade 8,74.0 +Physics,Grade 9,93.9 +History,Grade 7,68.3 +Biology,Grade 9,62.5 +Physics,Grade 9,76.9 +Biology,Grade 8,89.2 +Mathematics,Grade 9,77.8 +History,Grade 7,95.4 +Mathematics,Grade 9,86.2 +History,Grade 8,59.1 +Physics,Grade 9,56.9 +Physics,Grade 8,66.6 +Physics,Grade 7,53.9 +Physics,Grade 8,78.1 +Biology,Grade 9,72.7 +History,Grade 9,88.9 +Biology,Grade 9,81.0 +Chemistry,Grade 8,69.9 +Physics,Grade 9,55.8 +Mathematics,Grade 9,79.4 +Chemistry,Grade 8,69.3 +Chemistry,Grade 7,77.8 +Mathematics,Grade 9,58.5 +History,Grade 9,85.3 +Physics,Grade 8,57.6 +History,Grade 7,66.9 +Physics,Grade 8,70.5 +Physics,Grade 8,49.3 +History,Grade 8,69.9 +Chemistry,Grade 7,55.6 +Physics,Grade 8,60.4 +Physics,Grade 9,67.3 +Biology,Grade 9,88.7 +History,Grade 8,77.1 +Physics,Grade 9,76.8 +History,Grade 8,76.8 +History,Grade 7,87.3 +Chemistry,Grade 8,71.2 +Biology,Grade 9,72.9 +History,Grade 7,80.2 +Physics,Grade 8,71.2 +Chemistry,Grade 8,67.9 +Chemistry,Grade 7,72.0 +Chemistry,Grade 8,57.3 +Chemistry,Grade 8,80.3 +History,Grade 7,77.4 +History,Grade 8,92.3 +Chemistry,Grade 7,60.2 +History,Grade 8,68.7 +Mathematics,Grade 8,80.1 +Chemistry,Grade 7,61.7 +Physics,Grade 9,58.4 +Mathematics,Grade 9,56.7 +Biology,Grade 9,68.4 +History,Grade 9,86.1 +Chemistry,Grade 8,65.3 +Biology,Grade 9,72.3 +Mathematics,Grade 7,81.6 +Biology,Grade 8,59.2 +Chemistry,Grade 9,71.8 +Mathematics,Grade 8,71.1 +History,Grade 7,94.0 +Chemistry,Grade 8,62.6 +History,Grade 7,83.4 +Biology,Grade 9,82.9 +Biology,Grade 9,91.1 +History,Grade 7,78.0 +Mathematics,Grade 9,67.6 +Mathematics,Grade 8,67.0 +Mathematics,Grade 9,78.6 +Mathematics,Grade 7,63.4 +Physics,Grade 9,89.4 +Mathematics,Grade 9,69.1 +Biology,Grade 8,83.8 +Biology,Grade 8,72.0 +Mathematics,Grade 9,90.8 +Biology,Grade 7,54.4 +History,Grade 9,73.7 +Biology,Grade 8,66.7 +Mathematics,Grade 9,96.3 +Biology,Grade 8,77.8 +Biology,Grade 7,78.8 +History,Grade 7,78.8 +Mathematics,Grade 8,76.7 +Physics,Grade 8,79.1 +Physics,Grade 8,58.8 +Mathematics,Grade 7,69.0 +Chemistry,Grade 7,44.1 +Mathematics,Grade 9,78.5 +History,Grade 7,73.9 +Chemistry,Grade 7,67.0 +History,Grade 8,78.4 +Mathematics,Grade 9,65.0 +Physics,Grade 8,46.1 +History,Grade 8,70.2 +Mathematics,Grade 8,75.8 +Biology,Grade 7,59.5 +Chemistry,Grade 9,91.2 +Biology,Grade 8,92.9 +History,Grade 7,93.1 +Physics,Grade 9,81.1 +Mathematics,Grade 8,66.4 +Physics,Grade 8,46.4 +Mathematics,Grade 9,72.4 +Chemistry,Grade 9,81.8 +History,Grade 8,68.8 +Biology,Grade 8,79.2 +Physics,Grade 8,66.5 +Physics,Grade 9,64.7 +Biology,Grade 7,79.7 +History,Grade 7,89.2 +Biology,Grade 8,79.0 +Biology,Grade 8,58.7 +Physics,Grade 9,69.5 +Mathematics,Grade 7,85.6 +Mathematics,Grade 7,38.1 +Mathematics,Grade 7,72.1 +Biology,Grade 7,68.1 +Biology,Grade 7,80.8 +Physics,Grade 8,66.4 +Physics,Grade 9,57.2 +History,Grade 8,70.8 +Physics,Grade 8,73.2 +Biology,Grade 8,87.4 +Biology,Grade 9,82.8 +Biology,Grade 9,74.0 +Mathematics,Grade 9,59.9 +Physics,Grade 7,71.4 +Mathematics,Grade 9,72.1 +Physics,Grade 7,74.1 +Mathematics,Grade 8,58.5 +Mathematics,Grade 8,75.7 +History,Grade 9,74.7 +Biology,Grade 7,78.1 +History,Grade 7,58.3 +History,Grade 7,65.9 +Chemistry,Grade 7,49.5 +Mathematics,Grade 9,97.7 +Mathematics,Grade 9,89.4 +Chemistry,Grade 8,70.7 +History,Grade 8,56.4 +Biology,Grade 9,72.8 +Mathematics,Grade 9,79.7 +Physics,Grade 9,55.3 +Mathematics,Grade 8,57.8 +History,Grade 9,87.8 +Chemistry,Grade 8,70.8 +Chemistry,Grade 8,78.1 +Mathematics,Grade 7,58.9 +Mathematics,Grade 8,77.3 +History,Grade 8,78.1 +Physics,Grade 8,69.7 +Mathematics,Grade 8,64.9 +History,Grade 7,60.4 +Chemistry,Grade 7,74.3 +Physics,Grade 9,57.4 +History,Grade 8,65.7 +Mathematics,Grade 8,60.9 +Mathematics,Grade 8,81.9 +Chemistry,Grade 7,66.9 +Mathematics,Grade 9,86.8 +Mathematics,Grade 7,51.9 +Chemistry,Grade 8,60.7 +Physics,Grade 8,68.0 +Mathematics,Grade 7,54.5 +Chemistry,Grade 7,73.3 +Biology,Grade 7,72.9 +Physics,Grade 8,74.5 +History,Grade 7,54.3 +History,Grade 9,85.1 +Physics,Grade 9,62.1 +History,Grade 9,72.9 +Mathematics,Grade 7,76.8 +Physics,Grade 7,59.9 +Chemistry,Grade 8,69.5 +Chemistry,Grade 7,57.6 +Mathematics,Grade 7,65.5 +Mathematics,Grade 9,84.8 +Physics,Grade 9,65.0 +History,Grade 7,61.8 +Mathematics,Grade 9,61.2 +Chemistry,Grade 7,79.1 +Mathematics,Grade 7,100.0 +History,Grade 8,74.6 +Mathematics,Grade 9,65.9 +Mathematics,Grade 9,90.6 +Biology,Grade 9,82.7 +Mathematics,Grade 7,60.6 +Biology,Grade 8,88.0 +History,Grade 9,79.3 +Biology,Grade 9,74.4 +Chemistry,Grade 9,78.8 +Physics,Grade 9,71.2 +Biology,Grade 9,79.9 +Chemistry,Grade 7,90.1 +Mathematics,Grade 8,64.5 +Mathematics,Grade 9,54.9 +Physics,Grade 9,44.8 +Biology,Grade 8,70.9 +History,Grade 7,75.8 +Biology,Grade 8,74.1 +Physics,Grade 7,58.8 +History,Grade 9,93.0 +Chemistry,Grade 8,73.1 +Physics,Grade 8,58.7 +Biology,Grade 9,74.0 +Chemistry,Grade 9,69.2 +Mathematics,Grade 9,92.4 +History,Grade 9,79.7 +Mathematics,Grade 7,90.1 +History,Grade 9,69.8 +Biology,Grade 8,91.0 +Chemistry,Grade 9,56.8 +Chemistry,Grade 7,64.6 +Mathematics,Grade 7,78.6 +History,Grade 9,62.6 +Biology,Grade 8,72.5 +Biology,Grade 7,75.7 +Mathematics,Grade 8,67.7 +History,Grade 8,69.5 +Chemistry,Grade 9,82.1 +Physics,Grade 7,67.6 +History,Grade 9,100.0 +History,Grade 7,69.0 +Chemistry,Grade 9,79.0 +Physics,Grade 8,72.8 +Physics,Grade 8,73.3 +Biology,Grade 9,65.6 +History,Grade 8,77.5 +Biology,Grade 7,71.4 +Biology,Grade 9,83.6 +Physics,Grade 9,86.6 +Chemistry,Grade 9,68.9 +Mathematics,Grade 9,79.5 +History,Grade 7,63.1 +Physics,Grade 9,68.5 +History,Grade 8,84.2 +Chemistry,Grade 7,79.2 +Physics,Grade 7,55.6 +Biology,Grade 7,61.2 +History,Grade 9,81.0 +History,Grade 7,75.2 +Mathematics,Grade 8,78.1 +History,Grade 8,63.2 +Chemistry,Grade 9,80.4 +Biology,Grade 8,80.8 +Physics,Grade 9,56.9 +History,Grade 7,70.3 +History,Grade 8,76.3 +Chemistry,Grade 7,52.8 +History,Grade 9,67.6 +Mathematics,Grade 9,71.2 +Mathematics,Grade 9,82.9 +Biology,Grade 9,70.1 +Chemistry,Grade 7,76.4 +Physics,Grade 7,44.9 +Biology,Grade 9,73.7 +Biology,Grade 7,73.7 +Mathematics,Grade 7,79.1 +Physics,Grade 9,73.0 +History,Grade 7,84.9 +History,Grade 8,78.5 +History,Grade 7,87.9 +Physics,Grade 8,81.8 +History,Grade 8,71.7 +Mathematics,Grade 7,61.9 +Biology,Grade 9,70.0 +Biology,Grade 9,86.7 +Chemistry,Grade 8,56.3 +Mathematics,Grade 8,85.7 +Physics,Grade 7,54.6 +History,Grade 8,62.9 +History,Grade 7,71.2 +Physics,Grade 8,76.5 +Chemistry,Grade 8,74.5 +History,Grade 9,80.4 +Chemistry,Grade 9,81.3 +History,Grade 8,75.1 +Physics,Grade 9,79.4 +Biology,Grade 8,78.8 +History,Grade 8,70.9 +History,Grade 8,72.5 +Mathematics,Grade 9,91.1 +Biology,Grade 7,66.2 +Physics,Grade 7,56.8 +Chemistry,Grade 7,77.3 +History,Grade 7,62.1 +Biology,Grade 8,67.0 +Chemistry,Grade 9,81.4 +Chemistry,Grade 9,56.2 +Biology,Grade 9,100.0 +Mathematics,Grade 7,47.6 +History,Grade 8,69.2 +Biology,Grade 7,65.8 +Physics,Grade 8,53.9 +History,Grade 8,76.7 +Chemistry,Grade 9,70.6 +Mathematics,Grade 9,67.6 +Physics,Grade 9,60.3 +History,Grade 8,78.9 +Chemistry,Grade 9,67.4 +Physics,Grade 8,77.8 +Mathematics,Grade 8,70.1 +History,Grade 9,74.1 +Mathematics,Grade 7,88.9 +Physics,Grade 7,67.8 +Chemistry,Grade 8,67.3 +Mathematics,Grade 7,50.7 +Chemistry,Grade 8,66.4 +Biology,Grade 8,87.9 +Physics,Grade 7,59.8 +History,Grade 7,78.3 +Chemistry,Grade 8,65.3 +History,Grade 7,73.4 +History,Grade 8,89.9 +History,Grade 9,74.0 +Mathematics,Grade 9,72.3 +Mathematics,Grade 7,82.9 +Physics,Grade 7,72.5 +History,Grade 7,62.9 +History,Grade 8,72.8 +History,Grade 8,66.2 +Physics,Grade 7,72.3 +Mathematics,Grade 7,67.3 +Biology,Grade 9,83.0 +History,Grade 9,90.7 +Physics,Grade 8,57.8 +History,Grade 8,75.0 +Physics,Grade 7,53.6 +History,Grade 7,77.5 +Mathematics,Grade 9,65.4 +Physics,Grade 8,56.2 +Mathematics,Grade 9,82.0 +Biology,Grade 8,76.9 +Chemistry,Grade 9,62.3 +Chemistry,Grade 7,62.7 +History,Grade 7,83.7 +Biology,Grade 7,78.9 +Chemistry,Grade 8,93.0 +History,Grade 7,82.7 +History,Grade 9,93.4 +Mathematics,Grade 7,63.2 +Physics,Grade 9,70.6 +Chemistry,Grade 9,56.7 +Biology,Grade 7,74.2 +History,Grade 7,72.5 +Mathematics,Grade 8,65.9 +Biology,Grade 9,79.6 +Chemistry,Grade 7,69.2 +Physics,Grade 8,57.0 +Chemistry,Grade 9,60.9 +Biology,Grade 7,82.7 +Biology,Grade 9,76.0 +Biology,Grade 9,78.3 +History,Grade 7,78.0 +Physics,Grade 8,59.7 +Mathematics,Grade 8,76.0 +Physics,Grade 9,55.6 +History,Grade 8,89.1 +Biology,Grade 9,65.8 +History,Grade 9,74.8 +Chemistry,Grade 8,51.1 +Mathematics,Grade 7,69.6 +Mathematics,Grade 7,61.9 +Physics,Grade 7,51.6 +Chemistry,Grade 7,77.9 +Physics,Grade 9,65.4 +Physics,Grade 8,75.0 +Chemistry,Grade 7,76.1 +Physics,Grade 7,59.6 +Mathematics,Grade 8,74.7 +Physics,Grade 7,63.8 +Chemistry,Grade 7,58.8 +Physics,Grade 9,85.8 +Biology,Grade 7,68.6 +Mathematics,Grade 8,56.1 +Chemistry,Grade 7,60.3 +Biology,Grade 7,87.2 +Physics,Grade 7,52.4 +Physics,Grade 9,78.7 +Mathematics,Grade 9,80.2 +Chemistry,Grade 9,66.6 +History,Grade 8,88.9 +History,Grade 8,99.1 +Biology,Grade 8,87.7 +Biology,Grade 7,71.1 +Biology,Grade 9,84.6 +History,Grade 9,90.2 +Mathematics,Grade 9,69.5 +History,Grade 7,69.8 +Chemistry,Grade 8,45.5 +Physics,Grade 8,57.4 +Physics,Grade 8,51.3 +Chemistry,Grade 7,65.4 +Biology,Grade 9,72.9 +Mathematics,Grade 7,61.3 +Mathematics,Grade 9,69.9 +Physics,Grade 8,50.2 +Physics,Grade 9,66.5 +Chemistry,Grade 8,66.4 +Chemistry,Grade 9,85.0 +Chemistry,Grade 7,85.1 +Mathematics,Grade 8,70.3 +Mathematics,Grade 9,83.3 +Mathematics,Grade 9,75.7 +Mathematics,Grade 9,88.8 +Mathematics,Grade 7,73.6 +History,Grade 7,78.4 +Biology,Grade 8,82.8 +Physics,Grade 9,84.4 +Mathematics,Grade 7,61.1 +Mathematics,Grade 8,64.0 +Biology,Grade 8,79.4 +Chemistry,Grade 9,77.8 +Chemistry,Grade 8,60.7 +Biology,Grade 9,87.2 +History,Grade 8,96.5 +Mathematics,Grade 8,66.4 +Mathematics,Grade 7,68.2 +History,Grade 8,86.3 +Biology,Grade 7,94.3 +Chemistry,Grade 9,78.9 +Biology,Grade 9,81.4 +History,Grade 7,92.7 +History,Grade 7,78.8 +Chemistry,Grade 9,68.9 +Physics,Grade 7,68.9 +History,Grade 7,74.6 +History,Grade 7,66.0 +Physics,Grade 9,57.9 +Chemistry,Grade 8,82.2 +Chemistry,Grade 7,51.3 +Physics,Grade 7,56.5 +History,Grade 7,60.7 +Biology,Grade 7,85.1 +Physics,Grade 8,64.9 +Physics,Grade 8,69.8 +History,Grade 9,78.0 +Physics,Grade 8,70.9 +Biology,Grade 7,66.5 +Biology,Grade 8,61.8 +Chemistry,Grade 9,58.0 +Physics,Grade 8,64.8 +Physics,Grade 8,40.5 +Mathematics,Grade 7,74.5 +Chemistry,Grade 9,60.2 +Chemistry,Grade 8,67.9 +History,Grade 7,99.0 +Chemistry,Grade 9,70.3 +History,Grade 8,70.2 +Chemistry,Grade 9,64.0 +History,Grade 7,87.6 +Physics,Grade 7,76.3 +Biology,Grade 9,83.5 +History,Grade 7,68.1 +Chemistry,Grade 8,85.1 +History,Grade 9,80.0 +Physics,Grade 9,80.7 +History,Grade 7,87.2 +Physics,Grade 9,74.6 +Chemistry,Grade 9,67.0 +Mathematics,Grade 9,61.8 +History,Grade 8,66.7 +Chemistry,Grade 7,54.3 +Chemistry,Grade 9,100.0 +Physics,Grade 8,42.7 +Mathematics,Grade 7,84.4 +Mathematics,Grade 9,47.5 +Physics,Grade 8,82.5 +Biology,Grade 9,81.0 +Mathematics,Grade 7,52.1 +Chemistry,Grade 9,51.1 +Mathematics,Grade 7,62.8 +History,Grade 9,79.3 +History,Grade 7,66.4 +Mathematics,Grade 9,74.1 +Chemistry,Grade 9,73.6 +Biology,Grade 8,75.2 +Chemistry,Grade 8,64.8 +Physics,Grade 8,54.1 +Chemistry,Grade 7,88.3 +Chemistry,Grade 7,62.8 +Mathematics,Grade 8,71.3 +Mathematics,Grade 7,89.7 +History,Grade 8,100.0 +Biology,Grade 9,68.2 +Chemistry,Grade 7,82.5 +Mathematics,Grade 7,66.7 +Chemistry,Grade 7,42.2 +Mathematics,Grade 8,64.3 +Chemistry,Grade 9,63.7 +Chemistry,Grade 9,88.1 +Biology,Grade 8,87.4 +Mathematics,Grade 9,71.7 +Biology,Grade 9,65.6 +History,Grade 8,81.3 +Chemistry,Grade 7,60.5 +Chemistry,Grade 8,79.8 +Physics,Grade 7,55.1 +History,Grade 9,72.0 +Chemistry,Grade 9,77.7 +Biology,Grade 7,93.0 +History,Grade 8,84.6 +Physics,Grade 9,66.7 +Mathematics,Grade 7,80.4 +History,Grade 7,82.0 +History,Grade 9,69.4 +Physics,Grade 7,68.5 +Physics,Grade 9,65.9 +Chemistry,Grade 8,76.8 +Mathematics,Grade 8,61.4 +Biology,Grade 7,73.8 +Mathematics,Grade 7,65.3 +Biology,Grade 7,53.3 +Biology,Grade 9,86.3 +History,Grade 9,83.8 +History,Grade 9,69.6 +Biology,Grade 9,72.9 +History,Grade 9,79.6 +Chemistry,Grade 8,64.8 +Mathematics,Grade 8,77.1 +Physics,Grade 7,65.8 +Mathematics,Grade 9,55.0 +Mathematics,Grade 7,79.4 +Biology,Grade 7,72.2 +Physics,Grade 9,59.8 +Chemistry,Grade 8,67.8 +History,Grade 8,62.3 +Biology,Grade 8,73.9 +Chemistry,Grade 9,76.7 +Biology,Grade 8,72.0 +Chemistry,Grade 8,76.5 +History,Grade 8,54.9 +Mathematics,Grade 8,69.1 +Physics,Grade 7,69.5 +Biology,Grade 9,100.0 +Biology,Grade 9,78.9 +Mathematics,Grade 7,76.4 +Chemistry,Grade 9,68.3 +Mathematics,Grade 7,62.2 +History,Grade 8,71.6 +History,Grade 7,71.1 +Physics,Grade 8,69.2 +Physics,Grade 7,51.9 +Chemistry,Grade 8,58.2 +Biology,Grade 8,79.6 +Biology,Grade 8,100.0 +History,Grade 8,79.1 +Physics,Grade 7,68.8 +History,Grade 7,68.7 +Biology,Grade 8,65.6 +Mathematics,Grade 7,68.7 +History,Grade 7,69.8 +Biology,Grade 9,91.1 +Mathematics,Grade 7,73.8 +Mathematics,Grade 8,48.5 +Physics,Grade 8,57.5 +Biology,Grade 7,67.3 +Mathematics,Grade 7,73.7 +Mathematics,Grade 7,74.0 +Biology,Grade 8,73.5 +Chemistry,Grade 8,79.2 +Chemistry,Grade 8,70.1 +Mathematics,Grade 7,49.1 +Physics,Grade 9,55.8 +Chemistry,Grade 7,64.7 +Biology,Grade 8,91.6 +Physics,Grade 8,80.9 +Mathematics,Grade 9,84.8 +Biology,Grade 9,83.9 +History,Grade 7,69.7 +Chemistry,Grade 7,66.4 +History,Grade 7,79.4 +Biology,Grade 7,59.8 +Biology,Grade 8,79.4 +Chemistry,Grade 7,84.2 +Biology,Grade 7,61.9 +Mathematics,Grade 9,65.4 +Physics,Grade 9,58.9 +Biology,Grade 7,57.2 +Mathematics,Grade 7,61.4 +Mathematics,Grade 9,61.1 +Chemistry,Grade 9,67.0 +Biology,Grade 7,62.9 +Chemistry,Grade 8,71.1 +History,Grade 8,65.8 +Chemistry,Grade 8,48.8 +Biology,Grade 9,82.2 +Chemistry,Grade 7,62.1 +Chemistry,Grade 7,62.1 +Chemistry,Grade 9,83.4 +History,Grade 9,79.1 +Biology,Grade 9,94.7 +Mathematics,Grade 8,57.8 +Chemistry,Grade 8,68.4 +Mathematics,Grade 9,86.4 +Chemistry,Grade 9,71.4 +Biology,Grade 8,84.9 +History,Grade 7,76.7 +Mathematics,Grade 9,88.1 +History,Grade 9,73.4 +Physics,Grade 7,56.6 +History,Grade 7,60.4 +Biology,Grade 8,68.3 +Chemistry,Grade 7,62.7 +Biology,Grade 9,65.1 +Biology,Grade 7,80.2 +Chemistry,Grade 7,72.6 +Mathematics,Grade 9,85.1 +Mathematics,Grade 8,80.0 +Physics,Grade 7,62.3 +History,Grade 9,87.2 +History,Grade 8,71.8 +Physics,Grade 7,76.6 +Biology,Grade 8,64.6 +Mathematics,Grade 7,85.3 +Biology,Grade 8,58.9 +Mathematics,Grade 7,54.5 +History,Grade 8,86.4 +Physics,Grade 9,80.9 +Chemistry,Grade 7,66.0 +Biology,Grade 7,73.9 +Physics,Grade 8,59.4 +Chemistry,Grade 8,70.1 +Mathematics,Grade 7,60.4 +History,Grade 9,76.0 +Mathematics,Grade 8,81.7 +Chemistry,Grade 7,69.3 +Biology,Grade 9,70.6 +Mathematics,Grade 7,75.2 +Biology,Grade 7,67.7 +Biology,Grade 9,87.4 +Chemistry,Grade 7,64.1 +Mathematics,Grade 7,67.3 +History,Grade 8,100.0 +Physics,Grade 7,54.5 +Mathematics,Grade 7,41.9 +Biology,Grade 7,75.8 +Chemistry,Grade 9,58.7 +Physics,Grade 7,53.4 +History,Grade 7,83.0 +Biology,Grade 8,71.5 +Biology,Grade 7,96.8 +Biology,Grade 7,58.2 +Biology,Grade 8,89.3 +History,Grade 9,83.0 +Physics,Grade 9,47.7 +Chemistry,Grade 7,68.6 +Physics,Grade 9,80.4 +History,Grade 8,78.7 +Mathematics,Grade 8,70.6 +History,Grade 9,86.5 +Physics,Grade 9,76.8 +Physics,Grade 9,66.1 +Chemistry,Grade 9,64.0 +Mathematics,Grade 9,66.9 +Chemistry,Grade 7,80.4 +Chemistry,Grade 7,63.2 +Biology,Grade 8,76.5 +Biology,Grade 9,71.5 +Physics,Grade 8,47.2 +History,Grade 9,44.3 +History,Grade 8,67.4 +Biology,Grade 7,54.8 +Chemistry,Grade 8,67.6 +Mathematics,Grade 9,63.0 +Biology,Grade 9,76.1 +Chemistry,Grade 8,85.8 +Biology,Grade 8,67.4 +Biology,Grade 8,84.9 +Biology,Grade 9,60.5 +Mathematics,Grade 7,63.5 +Biology,Grade 9,87.3 +Chemistry,Grade 7,45.3 +Chemistry,Grade 7,52.2 +History,Grade 9,100.0 +Biology,Grade 7,72.1 +Biology,Grade 9,74.9 +History,Grade 7,73.6 +Chemistry,Grade 7,47.2 +Physics,Grade 7,78.7 +Biology,Grade 9,89.9 +Chemistry,Grade 9,77.1 +Physics,Grade 7,81.4 +Mathematics,Grade 7,43.2 +History,Grade 9,91.2 +Mathematics,Grade 7,89.8 +Biology,Grade 8,83.0 +Physics,Grade 7,64.1 +Chemistry,Grade 9,94.4 +History,Grade 7,72.2 +Physics,Grade 7,55.3 +History,Grade 9,76.0 +Physics,Grade 7,66.1 +Physics,Grade 7,62.7 +Biology,Grade 9,66.8 +History,Grade 8,82.0 +Biology,Grade 8,55.7 +Mathematics,Grade 7,73.2 +History,Grade 9,85.0 +Biology,Grade 8,80.8 +Biology,Grade 8,77.2 +Chemistry,Grade 8,85.8 +History,Grade 7,79.0 +History,Grade 7,67.1 +History,Grade 9,84.5 +Chemistry,Grade 7,57.0 +Mathematics,Grade 9,68.6 +Physics,Grade 7,61.4 +History,Grade 7,63.9 +Chemistry,Grade 7,46.6 +History,Grade 8,64.2 +History,Grade 7,73.0 +Chemistry,Grade 8,61.0 +Biology,Grade 7,91.7 +Mathematics,Grade 8,68.7 +Mathematics,Grade 7,64.9 +Physics,Grade 9,83.6 +Biology,Grade 8,70.0 +History,Grade 7,54.9 +History,Grade 7,68.2 +Chemistry,Grade 8,64.8 +History,Grade 9,73.8 +Mathematics,Grade 8,82.6 +History,Grade 8,78.1 +History,Grade 7,65.7 +Biology,Grade 9,59.8 +Chemistry,Grade 8,81.9 +Chemistry,Grade 7,72.7 +Biology,Grade 9,87.5 +History,Grade 8,79.1 +Mathematics,Grade 9,74.5 +Chemistry,Grade 8,48.4 +Chemistry,Grade 9,72.0 +Biology,Grade 8,77.2 +Biology,Grade 9,86.8 +History,Grade 7,80.9 +History,Grade 7,82.8 +Physics,Grade 9,54.4 +Physics,Grade 8,63.5 +Chemistry,Grade 8,73.1 +Biology,Grade 7,87.1 +Mathematics,Grade 9,79.3 +Physics,Grade 9,70.1 +History,Grade 9,77.4 +Physics,Grade 7,78.0 +Chemistry,Grade 7,45.9 +Biology,Grade 9,83.8 +History,Grade 7,82.2 +History,Grade 7,56.9 +Biology,Grade 7,72.8 +Mathematics,Grade 9,85.5 +Chemistry,Grade 8,69.8 +Chemistry,Grade 8,77.7 +Physics,Grade 9,70.1 +Mathematics,Grade 8,92.1 +Chemistry,Grade 8,81.9 +Mathematics,Grade 8,69.4 +History,Grade 9,64.5 +Biology,Grade 9,78.7 +Biology,Grade 7,51.3 +Physics,Grade 8,62.5 +Physics,Grade 8,67.0 +Chemistry,Grade 8,77.2 +History,Grade 9,72.2 +Mathematics,Grade 9,54.3 +Biology,Grade 7,77.0 +History,Grade 7,82.2 +Mathematics,Grade 9,55.0 +Physics,Grade 8,67.3 +Mathematics,Grade 8,69.2 +Mathematics,Grade 7,58.6 +Physics,Grade 7,72.5 +Mathematics,Grade 7,58.9 +Biology,Grade 7,71.6 +Chemistry,Grade 8,89.1 +Mathematics,Grade 9,53.5 +Chemistry,Grade 7,54.2 +Mathematics,Grade 8,66.4 +Biology,Grade 9,72.8 +Biology,Grade 9,61.4 +Physics,Grade 7,60.1 +Physics,Grade 7,79.2 +Mathematics,Grade 9,73.2 +Chemistry,Grade 7,78.6 +Biology,Grade 7,75.8 +Chemistry,Grade 8,69.7 +History,Grade 9,83.3 +Chemistry,Grade 9,62.4 +Mathematics,Grade 8,66.4 +Physics,Grade 8,75.1 +History,Grade 7,52.3 +Physics,Grade 7,54.0 +Mathematics,Grade 8,56.6 +Biology,Grade 8,81.1 +Chemistry,Grade 9,99.5 +Chemistry,Grade 7,72.7 +History,Grade 7,70.1 +Physics,Grade 8,49.2 +Mathematics,Grade 8,62.0 +Biology,Grade 7,81.0 +History,Grade 9,75.6 +History,Grade 7,73.2 +Physics,Grade 7,62.0 +History,Grade 9,75.7 +Physics,Grade 9,69.4 +History,Grade 9,90.8 +Biology,Grade 7,76.2 +History,Grade 7,88.1 +History,Grade 8,86.7 +Physics,Grade 7,68.2 +History,Grade 9,75.7 +Physics,Grade 8,67.7 +Chemistry,Grade 7,56.1 +Mathematics,Grade 8,67.5 +History,Grade 8,91.3 +History,Grade 7,89.7 +Mathematics,Grade 7,84.7 +Mathematics,Grade 8,78.1 +Mathematics,Grade 9,87.9 +Chemistry,Grade 8,62.7 +Mathematics,Grade 7,73.0 +Mathematics,Grade 8,69.1 +Biology,Grade 9,76.1 +History,Grade 9,73.1 +Biology,Grade 7,86.6 +Chemistry,Grade 9,77.9 +Chemistry,Grade 9,59.7 +Chemistry,Grade 7,91.7 +Mathematics,Grade 8,76.5 +Physics,Grade 8,60.2 +Mathematics,Grade 7,74.2 +Chemistry,Grade 8,50.1 +Chemistry,Grade 8,65.7 +Chemistry,Grade 8,72.0 +Chemistry,Grade 9,70.1 +History,Grade 7,69.4 +History,Grade 9,77.6 +Chemistry,Grade 9,73.0 +Physics,Grade 7,81.7 +Mathematics,Grade 9,65.9 +Physics,Grade 7,52.9 +Mathematics,Grade 8,70.9 +Biology,Grade 8,86.6 +Chemistry,Grade 8,63.9 +History,Grade 9,91.9 +Physics,Grade 7,51.9 +Physics,Grade 8,64.0 +Physics,Grade 9,67.4 +Chemistry,Grade 7,69.2 +Biology,Grade 9,83.6 +Physics,Grade 7,76.8 +Mathematics,Grade 8,70.3 +Biology,Grade 9,86.5 +Mathematics,Grade 9,78.9 +History,Grade 8,72.9 +Mathematics,Grade 7,74.0 +Mathematics,Grade 9,70.6 +Chemistry,Grade 7,50.7 +Biology,Grade 9,100.0 +History,Grade 9,81.7 +Physics,Grade 9,76.4 +Mathematics,Grade 9,92.9 +Biology,Grade 7,76.0 +Physics,Grade 8,89.8 +Biology,Grade 8,82.6 +Mathematics,Grade 7,60.6 +Physics,Grade 9,52.6 +Mathematics,Grade 9,78.8 +Physics,Grade 7,59.7 +Biology,Grade 9,71.5 +Biology,Grade 8,54.6 +Mathematics,Grade 7,54.6 +Biology,Grade 7,48.8 +Biology,Grade 8,84.1 +History,Grade 8,80.8 +Mathematics,Grade 9,66.8 +Physics,Grade 7,68.0 +History,Grade 8,57.3 +Chemistry,Grade 9,61.8 +Physics,Grade 9,69.7 +Physics,Grade 8,85.2 +Chemistry,Grade 8,84.0 +History,Grade 9,71.8 +Physics,Grade 7,69.1 +Biology,Grade 9,74.0 +Physics,Grade 9,50.0 +Chemistry,Grade 9,63.5 +Mathematics,Grade 8,79.1 +Mathematics,Grade 8,76.9 +Biology,Grade 7,68.3 +Physics,Grade 9,60.7 +Chemistry,Grade 8,86.8 +Chemistry,Grade 9,75.1 +Chemistry,Grade 9,85.1 +Mathematics,Grade 7,47.2 +History,Grade 7,61.2 +Mathematics,Grade 8,67.7 +History,Grade 7,66.6 +Physics,Grade 9,83.5 +Physics,Grade 7,61.0 +Mathematics,Grade 8,64.0 +Biology,Grade 9,67.9 +Physics,Grade 8,57.0 +History,Grade 7,66.2 +Physics,Grade 7,65.5 +Chemistry,Grade 7,69.0 +Mathematics,Grade 8,96.8 +History,Grade 7,85.5 +Chemistry,Grade 7,76.0 +Physics,Grade 9,58.5 +History,Grade 9,86.2 +Physics,Grade 8,71.5 +Physics,Grade 7,51.7 +Biology,Grade 8,77.3 +History,Grade 7,75.5 +Biology,Grade 8,87.6 +Chemistry,Grade 8,53.1 +History,Grade 7,71.4 +History,Grade 8,89.2 +Mathematics,Grade 8,70.9 +Chemistry,Grade 9,66.1 +Biology,Grade 9,88.7 +Mathematics,Grade 7,72.4 +Physics,Grade 9,71.3 +Mathematics,Grade 8,60.0 +Chemistry,Grade 7,59.1 +Biology,Grade 8,80.7 +Physics,Grade 8,74.3 +Physics,Grade 7,63.9 +Biology,Grade 8,70.6 +Physics,Grade 8,91.2 +Chemistry,Grade 8,68.4 +Mathematics,Grade 7,71.3 +Chemistry,Grade 9,70.4 +Mathematics,Grade 7,62.5 +Mathematics,Grade 7,67.1 +Chemistry,Grade 7,54.5 +Chemistry,Grade 9,68.3 +History,Grade 8,66.4 +History,Grade 8,93.3 +History,Grade 7,58.9 +Chemistry,Grade 8,71.3 +Biology,Grade 9,77.6 +Physics,Grade 7,81.0 +Biology,Grade 9,65.4 +Mathematics,Grade 7,73.9 +Mathematics,Grade 8,71.1 +Biology,Grade 9,81.0 +Mathematics,Grade 7,57.0 +Chemistry,Grade 7,68.0 +History,Grade 9,95.2 +Chemistry,Grade 7,78.6 +History,Grade 9,94.3 +History,Grade 8,74.5 +Mathematics,Grade 9,65.7 +Mathematics,Grade 9,60.7 +Physics,Grade 8,75.1 +Biology,Grade 9,86.7 +Chemistry,Grade 9,78.0 +Chemistry,Grade 9,67.3 +Biology,Grade 7,79.5 +History,Grade 7,69.5 +Physics,Grade 8,88.9 +Biology,Grade 9,94.2 +Chemistry,Grade 8,68.9 +Chemistry,Grade 9,80.4 +Mathematics,Grade 7,74.2 +Mathematics,Grade 9,61.8 +Mathematics,Grade 8,71.7 +Mathematics,Grade 9,55.3 +Chemistry,Grade 9,72.1 +Physics,Grade 9,83.6 +Chemistry,Grade 8,71.5 +Biology,Grade 8,54.0 +Chemistry,Grade 7,62.6 +History,Grade 9,67.8 +Mathematics,Grade 8,70.0 +Mathematics,Grade 8,68.1 +Mathematics,Grade 8,72.2 +Biology,Grade 7,67.0 +Mathematics,Grade 7,79.8 +Physics,Grade 8,65.8 +Chemistry,Grade 7,75.2 +Mathematics,Grade 8,70.0 +Chemistry,Grade 9,66.7 +Biology,Grade 9,67.9 +History,Grade 8,78.7 +Biology,Grade 7,83.4 +Chemistry,Grade 9,65.4 +Mathematics,Grade 9,66.3 +Mathematics,Grade 9,56.3 +Biology,Grade 9,77.3 +Physics,Grade 8,61.5 +Physics,Grade 7,42.7 +Chemistry,Grade 8,62.8 +Mathematics,Grade 7,67.8 +Physics,Grade 9,88.2 +Biology,Grade 8,61.3 +Mathematics,Grade 9,63.4 +Mathematics,Grade 8,69.6 +History,Grade 7,74.9 +Chemistry,Grade 9,85.6 +History,Grade 9,93.0 +Biology,Grade 7,65.1 +Biology,Grade 9,90.5 +Mathematics,Grade 8,84.6 +Chemistry,Grade 9,75.4 +History,Grade 7,93.9 +Chemistry,Grade 7,74.8 +Mathematics,Grade 9,89.2 +Biology,Grade 7,57.3 +Mathematics,Grade 7,81.7 +Biology,Grade 7,90.9 +Biology,Grade 7,80.6 +History,Grade 7,61.2 +Mathematics,Grade 9,73.9 +History,Grade 7,84.9 +Mathematics,Grade 8,57.2 +Mathematics,Grade 9,77.8 +Biology,Grade 9,83.1 +Chemistry,Grade 8,64.1 +History,Grade 9,72.3 +Chemistry,Grade 7,56.9 +Biology,Grade 7,64.5 +Physics,Grade 7,77.1 +History,Grade 8,82.2 +History,Grade 8,74.2 +Chemistry,Grade 8,78.5 +History,Grade 9,91.7 +History,Grade 9,83.4 +Chemistry,Grade 8,67.6 +Biology,Grade 8,90.3 +Biology,Grade 9,86.2 +Mathematics,Grade 7,56.4 +History,Grade 8,76.8 +History,Grade 9,96.9 +History,Grade 9,75.1 +Physics,Grade 8,74.1 +Mathematics,Grade 8,93.3 +Physics,Grade 9,82.6 +History,Grade 8,84.8 +History,Grade 7,64.8 +Chemistry,Grade 9,84.0 +Mathematics,Grade 9,90.5 +Mathematics,Grade 7,58.7 +History,Grade 8,86.3 +Biology,Grade 8,79.4 +Mathematics,Grade 8,65.0 +Biology,Grade 7,66.1 +Mathematics,Grade 9,86.6 +Physics,Grade 9,87.5 +Biology,Grade 8,90.9 +History,Grade 9,89.3 +History,Grade 7,75.4 +Biology,Grade 7,68.5 +Biology,Grade 9,67.3 +Mathematics,Grade 8,90.0 +History,Grade 7,81.0 +Biology,Grade 8,45.7 +Mathematics,Grade 7,90.2 +Chemistry,Grade 8,71.3 +Mathematics,Grade 8,51.1 +Biology,Grade 8,63.2 +Mathematics,Grade 7,73.5 +Chemistry,Grade 9,84.6 +History,Grade 8,67.4 +Chemistry,Grade 9,53.0 +Mathematics,Grade 8,66.1 +History,Grade 8,87.4 +Mathematics,Grade 8,65.4 +History,Grade 8,66.1 +Chemistry,Grade 7,51.4 +Mathematics,Grade 9,86.3 +Biology,Grade 9,80.6 +History,Grade 7,81.7 +Biology,Grade 7,64.1 +Biology,Grade 7,60.0 +Chemistry,Grade 7,67.2 +Biology,Grade 9,70.9 +Biology,Grade 8,75.4 +Mathematics,Grade 9,58.2 +Mathematics,Grade 7,82.7 +History,Grade 7,76.7 +Mathematics,Grade 9,62.6 +Physics,Grade 7,72.9 +History,Grade 7,89.0 +Physics,Grade 8,79.8 +Mathematics,Grade 9,80.5 +Chemistry,Grade 9,80.8 +Physics,Grade 9,80.9 +Physics,Grade 8,73.1 +Chemistry,Grade 8,61.2 +Biology,Grade 8,88.2 +Chemistry,Grade 7,60.8 +Mathematics,Grade 7,59.8 +Mathematics,Grade 7,75.1 +Chemistry,Grade 9,70.8 +Biology,Grade 8,61.5 +Chemistry,Grade 8,62.5 +Chemistry,Grade 8,75.1 +History,Grade 8,67.9 +Physics,Grade 9,85.2 +History,Grade 7,70.1 +Mathematics,Grade 7,53.6 +History,Grade 9,84.4 +Biology,Grade 8,82.5 +Chemistry,Grade 7,71.7 +Physics,Grade 9,57.2 +Chemistry,Grade 9,73.5 +Chemistry,Grade 9,68.4 +Mathematics,Grade 9,69.9 +Chemistry,Grade 8,73.8 +History,Grade 8,92.5 +Physics,Grade 9,51.8 +Biology,Grade 9,83.1 +History,Grade 9,70.0 +Biology,Grade 8,56.9 +Chemistry,Grade 7,63.1 +Chemistry,Grade 8,89.0 +Chemistry,Grade 7,74.4 +History,Grade 7,74.2 +History,Grade 7,75.2 +Biology,Grade 8,81.0 +Biology,Grade 7,64.0 +Chemistry,Grade 8,66.3 +Biology,Grade 9,81.4 +Mathematics,Grade 8,93.1 +History,Grade 9,87.1 +Biology,Grade 7,71.9 +History,Grade 9,93.4 +Biology,Grade 9,87.0 +Mathematics,Grade 9,81.5 +Mathematics,Grade 8,74.4 +History,Grade 7,85.6 +Mathematics,Grade 7,61.4 +Physics,Grade 8,74.1 +Physics,Grade 8,66.6 +Chemistry,Grade 8,52.0 +Biology,Grade 9,90.6 +Biology,Grade 7,72.0 +History,Grade 7,87.0 +History,Grade 9,71.7 +Mathematics,Grade 7,58.9 +Biology,Grade 9,67.2 +Mathematics,Grade 8,73.5 +Mathematics,Grade 7,74.5 +Chemistry,Grade 9,79.6 +History,Grade 7,84.2 +Chemistry,Grade 9,91.6 +Chemistry,Grade 7,53.3 +Chemistry,Grade 8,87.8 +Biology,Grade 8,72.7 +Physics,Grade 7,64.2 +History,Grade 7,62.8 +Biology,Grade 9,87.7 +Mathematics,Grade 7,74.5 +Mathematics,Grade 8,54.8 +Physics,Grade 8,72.3 +Physics,Grade 7,73.7 +Mathematics,Grade 8,68.4 +Chemistry,Grade 7,76.9 +Biology,Grade 9,84.2 +History,Grade 7,53.9 +Biology,Grade 9,73.7 +Mathematics,Grade 9,77.4 +Chemistry,Grade 8,57.3 +Mathematics,Grade 7,62.1 +Chemistry,Grade 9,81.3 +Biology,Grade 8,65.8 +Biology,Grade 7,75.5 +Mathematics,Grade 9,74.6 +History,Grade 7,45.4 +Mathematics,Grade 8,84.6 +Biology,Grade 9,81.3 +History,Grade 8,90.1 +Mathematics,Grade 7,68.3 +Physics,Grade 7,63.6 +Biology,Grade 8,75.4 +Mathematics,Grade 8,63.8 +History,Grade 7,92.1 +Physics,Grade 9,56.8 +Chemistry,Grade 8,76.6 +Mathematics,Grade 9,86.3 +Mathematics,Grade 8,68.3 +History,Grade 9,43.8 +Mathematics,Grade 7,68.7 +History,Grade 7,71.3 +Biology,Grade 8,79.0 +Chemistry,Grade 9,71.2 +History,Grade 7,82.8 +Physics,Grade 9,54.9 +Mathematics,Grade 8,72.2 +Mathematics,Grade 7,52.1 +Chemistry,Grade 8,68.3 +Chemistry,Grade 8,84.1 +Biology,Grade 9,74.1 +Physics,Grade 8,71.1 +Biology,Grade 9,80.2 +Biology,Grade 8,68.2 +History,Grade 8,78.2 +Physics,Grade 9,63.2 +History,Grade 7,70.5 +Biology,Grade 7,72.8 +Physics,Grade 7,58.4 +Biology,Grade 8,55.5 +Biology,Grade 9,69.2 +Mathematics,Grade 8,73.1 +Chemistry,Grade 8,63.0 +Physics,Grade 7,64.8 +Physics,Grade 8,57.0 +Chemistry,Grade 8,71.6 +Biology,Grade 9,80.9 +Physics,Grade 9,63.5 +History,Grade 8,81.0 +Chemistry,Grade 8,78.7 +Physics,Grade 8,73.4 +Physics,Grade 9,85.4 +Chemistry,Grade 8,73.0 +Mathematics,Grade 8,73.1 +Physics,Grade 7,65.7 +Physics,Grade 7,47.6 +Biology,Grade 9,98.2 +Physics,Grade 8,56.6 +Biology,Grade 9,83.2 +History,Grade 9,94.2 +Physics,Grade 8,46.7 +Biology,Grade 7,78.0 +Chemistry,Grade 9,46.3 +History,Grade 7,89.6 +Chemistry,Grade 7,44.3 +Physics,Grade 9,57.7 +Biology,Grade 7,76.1 +Biology,Grade 8,50.9 +Chemistry,Grade 9,69.3 +Mathematics,Grade 9,85.2 +History,Grade 9,75.1 +Chemistry,Grade 7,46.9 +Biology,Grade 7,60.0 +Physics,Grade 8,57.3 +History,Grade 9,94.9 +History,Grade 7,67.1 +Biology,Grade 9,70.2 +Mathematics,Grade 7,71.8 +Physics,Grade 9,62.7 +Physics,Grade 7,46.2 +Mathematics,Grade 8,87.9 +Physics,Grade 9,79.6 +History,Grade 9,67.1 +History,Grade 7,82.7 +History,Grade 7,62.8 +Mathematics,Grade 9,99.3 +Biology,Grade 8,79.1 +Physics,Grade 8,61.0 +Mathematics,Grade 8,62.2 +Physics,Grade 7,62.1 +Mathematics,Grade 9,80.6 +History,Grade 7,66.5 +Chemistry,Grade 9,74.6 +Mathematics,Grade 8,48.9 +Mathematics,Grade 8,51.5 +Chemistry,Grade 8,87.6 +History,Grade 7,43.6 +Chemistry,Grade 9,93.3 +Chemistry,Grade 7,71.7 +Mathematics,Grade 9,85.2 +History,Grade 8,62.4 +Physics,Grade 9,72.5 +Mathematics,Grade 8,62.5 +History,Grade 7,73.3 +Physics,Grade 7,59.6 +Physics,Grade 9,51.8 +Chemistry,Grade 7,64.8 +Mathematics,Grade 7,60.0 +Mathematics,Grade 9,89.3 +Physics,Grade 7,84.2 +Mathematics,Grade 7,67.6 +Biology,Grade 8,77.1 +Physics,Grade 9,86.1 +Chemistry,Grade 7,70.1 +Mathematics,Grade 8,68.3 +Physics,Grade 7,69.2 +Mathematics,Grade 9,75.0 +Biology,Grade 7,62.6 +History,Grade 8,65.3 +History,Grade 9,92.7 +Mathematics,Grade 7,65.8 +Physics,Grade 7,54.1 +Biology,Grade 9,80.0 +Physics,Grade 9,68.5 +History,Grade 8,88.0 +Chemistry,Grade 9,68.7 +History,Grade 7,73.3 +Biology,Grade 9,87.9 +Mathematics,Grade 7,72.1 +History,Grade 9,96.7 +Physics,Grade 9,66.1 +Biology,Grade 7,69.6 +Physics,Grade 9,77.8 +Biology,Grade 7,65.8 +History,Grade 7,78.0 +Mathematics,Grade 9,82.0 +History,Grade 9,68.0 +Physics,Grade 7,53.3 +Physics,Grade 9,69.5 +Biology,Grade 9,71.0 +History,Grade 8,75.7 +History,Grade 9,67.4 +Chemistry,Grade 7,55.2 +Mathematics,Grade 8,68.5 +History,Grade 9,95.8 +History,Grade 7,55.4 +Physics,Grade 9,77.3 +Physics,Grade 8,77.1 +Mathematics,Grade 7,67.6 +History,Grade 8,79.5 +Physics,Grade 9,64.1 +Physics,Grade 9,54.4 +History,Grade 9,70.3 +Chemistry,Grade 8,73.5 +Mathematics,Grade 9,88.4 +Physics,Grade 8,71.3 +Biology,Grade 7,84.8 +History,Grade 7,65.4 +Mathematics,Grade 7,57.0 +Mathematics,Grade 7,76.0 +Chemistry,Grade 9,62.3 +Biology,Grade 9,84.9 +Physics,Grade 7,71.3 +Biology,Grade 8,73.2 +Physics,Grade 7,79.8 +Physics,Grade 7,70.8 +History,Grade 8,74.7 +Chemistry,Grade 7,65.2 +Mathematics,Grade 7,66.7 +Biology,Grade 7,64.4 +Biology,Grade 9,95.6 +History,Grade 7,67.9 +Physics,Grade 9,68.8 +History,Grade 9,83.7 +Biology,Grade 8,60.0 +Physics,Grade 8,76.0 +Chemistry,Grade 7,64.5 +Physics,Grade 9,76.3 +Mathematics,Grade 8,90.4 +Mathematics,Grade 8,56.3 +Chemistry,Grade 7,72.2 +Biology,Grade 8,79.0 +History,Grade 7,69.1 +Chemistry,Grade 7,55.6 +Mathematics,Grade 7,68.2 +Chemistry,Grade 8,57.4 +Physics,Grade 8,70.1 +Chemistry,Grade 9,67.7 +Chemistry,Grade 7,74.5 +Mathematics,Grade 9,61.7 +History,Grade 9,73.2 +History,Grade 8,82.7 +Biology,Grade 9,81.3 +Biology,Grade 7,74.8 +Mathematics,Grade 8,71.7 +History,Grade 8,79.5 +Mathematics,Grade 8,72.4 +Physics,Grade 9,57.2 +Biology,Grade 7,66.1 +Chemistry,Grade 8,79.6 +History,Grade 7,56.8 +Chemistry,Grade 8,56.4 +History,Grade 9,75.0 +Physics,Grade 7,78.7 +Physics,Grade 8,70.0 +Mathematics,Grade 9,70.4 +History,Grade 9,68.7 +History,Grade 8,96.3 +History,Grade 7,80.0 +Physics,Grade 7,80.9 +Chemistry,Grade 7,59.7 +History,Grade 8,82.0 +History,Grade 8,77.3 +Mathematics,Grade 9,88.6 +History,Grade 7,81.6 +Biology,Grade 8,85.0 +Mathematics,Grade 7,64.8 +Physics,Grade 8,80.6 +History,Grade 9,73.8 +Mathematics,Grade 9,68.0 +Physics,Grade 9,73.5 +Biology,Grade 8,74.0 +Biology,Grade 9,65.7 +Chemistry,Grade 8,74.1 +Mathematics,Grade 7,57.4 +History,Grade 9,94.4 +History,Grade 7,64.8 +Mathematics,Grade 7,76.2 +History,Grade 7,94.5 +Mathematics,Grade 7,71.2 +History,Grade 9,80.1 +Physics,Grade 7,88.8 +Mathematics,Grade 7,73.3 +Physics,Grade 8,89.2 +History,Grade 8,79.1 +Mathematics,Grade 9,92.9 +Chemistry,Grade 9,57.6 +Biology,Grade 8,75.3 +Mathematics,Grade 8,67.9 +Mathematics,Grade 7,65.1 +Chemistry,Grade 8,81.3 +Mathematics,Grade 7,78.7 +Mathematics,Grade 9,78.9 +Mathematics,Grade 7,57.6 +History,Grade 8,83.6 +Biology,Grade 8,67.0 +Chemistry,Grade 9,87.2 +Mathematics,Grade 8,64.2 +Mathematics,Grade 8,78.4 +Mathematics,Grade 8,72.8 +Biology,Grade 7,71.6 +Biology,Grade 7,65.3 +Mathematics,Grade 8,71.7 +Biology,Grade 7,51.2 +History,Grade 7,69.6 +Physics,Grade 9,44.3 +History,Grade 7,83.8 +Physics,Grade 8,92.8 +Physics,Grade 7,73.2 +Chemistry,Grade 9,78.0 +Mathematics,Grade 9,66.0 +History,Grade 9,83.6 +Mathematics,Grade 7,79.8 +History,Grade 8,79.3 +Physics,Grade 8,62.5 +Biology,Grade 8,69.0 +Biology,Grade 8,75.6 +Chemistry,Grade 7,82.8 +Mathematics,Grade 9,88.4 +History,Grade 9,88.8 +Chemistry,Grade 7,63.4 +Biology,Grade 9,72.3 +History,Grade 8,55.1 +Mathematics,Grade 8,71.7 +Mathematics,Grade 9,60.7 +Biology,Grade 9,86.6 +Chemistry,Grade 7,65.6 +Mathematics,Grade 7,64.7 +History,Grade 7,90.8 +Chemistry,Grade 7,68.2 +Physics,Grade 7,59.4 +Physics,Grade 7,43.8 +History,Grade 7,83.3 +History,Grade 7,66.7 +Physics,Grade 9,71.6 +Biology,Grade 9,95.1 +Chemistry,Grade 9,68.5 +Physics,Grade 7,66.4 +History,Grade 7,83.3 +Physics,Grade 9,93.1 +Chemistry,Grade 7,79.0 +Mathematics,Grade 8,77.0 +History,Grade 8,68.6 +Physics,Grade 8,87.2 +History,Grade 7,58.6 +History,Grade 7,85.9 +Biology,Grade 7,88.8 +Chemistry,Grade 7,48.9 +History,Grade 9,82.5 +Mathematics,Grade 9,90.3 +Chemistry,Grade 7,72.5 +Chemistry,Grade 9,62.2 +Mathematics,Grade 9,62.2 +History,Grade 8,82.8 +Biology,Grade 9,74.3 +Biology,Grade 7,74.2 +Chemistry,Grade 8,72.9 +Biology,Grade 7,71.7 +Physics,Grade 7,53.4 +Physics,Grade 7,53.6 +Physics,Grade 9,59.3 +History,Grade 8,77.9 +History,Grade 9,72.5 +Physics,Grade 8,64.4 +History,Grade 9,90.1 +Mathematics,Grade 7,65.2 +Chemistry,Grade 8,48.1 +History,Grade 8,69.2 +Biology,Grade 9,69.9 +Physics,Grade 7,83.9 +Chemistry,Grade 8,63.2 +History,Grade 8,82.0 +Mathematics,Grade 7,70.6 +Mathematics,Grade 9,78.3 +Physics,Grade 9,64.3 +History,Grade 7,66.4 +Mathematics,Grade 8,66.0 +History,Grade 7,68.2 +Chemistry,Grade 7,68.1 +Chemistry,Grade 8,83.4 +History,Grade 9,67.4 +Mathematics,Grade 8,56.0 +Biology,Grade 8,78.6 +Physics,Grade 7,73.5 +Chemistry,Grade 9,39.5 +Physics,Grade 9,84.1 +Physics,Grade 9,76.0 +Biology,Grade 9,66.2 +Mathematics,Grade 9,76.1 +History,Grade 8,61.0 +Physics,Grade 9,62.0 +Physics,Grade 7,61.2 +Physics,Grade 7,62.8 +Biology,Grade 8,88.5 +Physics,Grade 9,77.7 +History,Grade 9,77.6 +Biology,Grade 9,67.7 +History,Grade 9,85.1 +Mathematics,Grade 8,74.5 +Physics,Grade 9,63.7 +Physics,Grade 7,62.3 +History,Grade 8,82.3 +History,Grade 7,78.9 +Physics,Grade 9,75.5 +History,Grade 9,77.6 +Biology,Grade 7,79.6 +Physics,Grade 7,54.6 +Chemistry,Grade 9,70.3 +Mathematics,Grade 8,75.2 +Physics,Grade 7,56.2 +Biology,Grade 7,72.9 +Biology,Grade 7,59.1 +Physics,Grade 7,73.5 +Biology,Grade 7,54.1 +History,Grade 9,76.5 +Physics,Grade 8,63.7 +Biology,Grade 7,58.9 +Chemistry,Grade 8,83.1 +Physics,Grade 9,73.7 +Physics,Grade 7,52.2 +Chemistry,Grade 9,82.0 +Biology,Grade 7,62.0 +Biology,Grade 9,81.4 +Biology,Grade 7,69.0 +Mathematics,Grade 8,77.8 +Biology,Grade 8,71.4 +Physics,Grade 7,73.6 +Physics,Grade 7,60.9 +Physics,Grade 9,70.8 +Biology,Grade 9,80.6 +Physics,Grade 8,53.8 +Biology,Grade 9,100.0 +Biology,Grade 8,69.1 +History,Grade 7,54.4 +Biology,Grade 9,67.7 +Chemistry,Grade 9,72.7 +Chemistry,Grade 8,57.1 +Physics,Grade 9,73.1 +Mathematics,Grade 9,72.8 +Chemistry,Grade 9,63.3 +Physics,Grade 8,58.3 +Physics,Grade 8,71.4 +Chemistry,Grade 7,65.9 +History,Grade 7,98.7 +Chemistry,Grade 8,54.1 +Biology,Grade 7,73.7 +Chemistry,Grade 7,52.6 +History,Grade 7,78.3 +Biology,Grade 7,90.3 +History,Grade 9,88.9 +Chemistry,Grade 7,58.3 +Chemistry,Grade 9,73.6 +Physics,Grade 7,84.6 +Mathematics,Grade 9,84.8 +Biology,Grade 8,69.5 +Chemistry,Grade 9,52.1 +Chemistry,Grade 8,66.6 +Mathematics,Grade 8,96.1 +Mathematics,Grade 7,81.0 +Chemistry,Grade 9,71.1 +History,Grade 8,90.5 +Physics,Grade 8,78.2 +Physics,Grade 9,84.3 +Biology,Grade 9,63.0 +Chemistry,Grade 9,84.0 +Mathematics,Grade 8,82.5 +History,Grade 7,73.0 +Physics,Grade 7,49.4 +Chemistry,Grade 9,77.4 +Physics,Grade 8,66.4 +Mathematics,Grade 8,47.4 +Biology,Grade 7,84.8 +Chemistry,Grade 9,79.3 +Physics,Grade 9,78.4 +Biology,Grade 9,77.6 +Physics,Grade 9,94.8 +Chemistry,Grade 7,65.5 +Chemistry,Grade 8,93.1 +Biology,Grade 8,79.7 +Physics,Grade 7,74.0 +Chemistry,Grade 7,72.3 +Chemistry,Grade 7,57.3 +Chemistry,Grade 7,70.8 +History,Grade 9,64.0 +Mathematics,Grade 8,69.0 +Biology,Grade 7,66.9 +Mathematics,Grade 8,73.6 +Biology,Grade 9,76.7 +Physics,Grade 8,61.4 +Biology,Grade 7,92.4 +Chemistry,Grade 7,74.9 +History,Grade 8,75.5 +Chemistry,Grade 7,60.6 +Mathematics,Grade 9,75.3 +Mathematics,Grade 9,86.1 +History,Grade 8,91.9 +Mathematics,Grade 9,73.2 +Biology,Grade 9,77.7 +History,Grade 9,77.0 +Mathematics,Grade 8,85.6 +Mathematics,Grade 7,54.4 +Mathematics,Grade 8,67.9 +Biology,Grade 7,79.7 +Chemistry,Grade 9,71.2 +Physics,Grade 9,96.4 +Biology,Grade 9,86.5 +Mathematics,Grade 7,59.4 +Physics,Grade 9,73.0 +History,Grade 7,82.5 +Biology,Grade 7,61.9 +Biology,Grade 7,86.2 +Chemistry,Grade 8,63.6 +History,Grade 8,85.6 +History,Grade 7,82.9 +Physics,Grade 9,85.3 +Chemistry,Grade 9,58.2 +Physics,Grade 7,69.5 +Chemistry,Grade 9,79.5 +Physics,Grade 7,56.2 +Physics,Grade 7,52.5 +Mathematics,Grade 8,78.1 +Mathematics,Grade 9,69.2 +Chemistry,Grade 9,91.9 +Physics,Grade 7,53.7 +History,Grade 8,100.0 +Mathematics,Grade 7,66.6 +Physics,Grade 8,68.7 +Biology,Grade 8,80.3 +History,Grade 9,92.5 +Chemistry,Grade 8,75.2 +Physics,Grade 7,65.2 +History,Grade 8,70.5 +History,Grade 8,64.0 +History,Grade 7,96.3 +Physics,Grade 7,68.6 +History,Grade 8,96.6 +History,Grade 9,84.8 +Mathematics,Grade 7,56.2 +Physics,Grade 9,95.7 +Biology,Grade 7,55.1 +History,Grade 8,83.2 +Chemistry,Grade 8,42.2 +History,Grade 8,76.9 +Biology,Grade 8,78.3 +Chemistry,Grade 8,90.6 +Physics,Grade 9,80.4 +Physics,Grade 8,69.4 +History,Grade 9,80.9 +Chemistry,Grade 8,64.1 +History,Grade 9,81.1 +Mathematics,Grade 7,73.1 +Chemistry,Grade 9,88.5 +Biology,Grade 9,60.7 +Biology,Grade 9,84.9 +History,Grade 8,83.4 +History,Grade 8,70.9 +History,Grade 7,67.3 +Chemistry,Grade 8,59.9 +Biology,Grade 9,69.2 +History,Grade 7,58.4 +Physics,Grade 8,70.1 +History,Grade 8,80.7 +Chemistry,Grade 7,79.9 +History,Grade 7,60.4 +Biology,Grade 9,73.6 +Biology,Grade 9,91.5 +Chemistry,Grade 9,68.3 +Mathematics,Grade 7,43.8 +History,Grade 8,85.0 +Mathematics,Grade 8,56.9 +Biology,Grade 8,87.4 +Physics,Grade 8,54.9 +Physics,Grade 7,62.7 +Physics,Grade 7,73.5 +Mathematics,Grade 9,82.8 +Mathematics,Grade 8,76.7 +Physics,Grade 7,68.3 +Biology,Grade 8,62.9 +Biology,Grade 8,68.3 +History,Grade 8,70.4 +Physics,Grade 8,83.0 +Biology,Grade 7,79.3 +Chemistry,Grade 8,75.0 +Physics,Grade 9,70.4 +Mathematics,Grade 8,76.0 +Chemistry,Grade 7,67.2 +History,Grade 9,81.5 +Biology,Grade 7,73.7 +History,Grade 7,95.3 +Chemistry,Grade 7,33.6 +Physics,Grade 9,78.9 +Biology,Grade 8,56.0 +Biology,Grade 7,52.8 +Biology,Grade 7,70.3 +Mathematics,Grade 7,72.0 +Mathematics,Grade 8,76.5 +Chemistry,Grade 9,64.6 +History,Grade 9,91.3 +Chemistry,Grade 7,55.7 +Physics,Grade 9,73.3 +Biology,Grade 8,87.4 +Physics,Grade 8,78.8 +Biology,Grade 8,75.9 +Mathematics,Grade 8,58.6 +History,Grade 7,80.3 +Biology,Grade 7,93.2 +Chemistry,Grade 8,69.5 +History,Grade 8,87.6 +Mathematics,Grade 9,88.3 +Mathematics,Grade 9,52.3 +Mathematics,Grade 9,71.9 +Biology,Grade 7,68.2 +Physics,Grade 9,76.5 +Physics,Grade 9,65.4 +Mathematics,Grade 9,79.8 +History,Grade 8,88.3 +History,Grade 8,70.6 +History,Grade 8,80.0 +Biology,Grade 7,94.0 +Mathematics,Grade 9,59.6 +Biology,Grade 7,76.9 +Chemistry,Grade 9,68.1 +Physics,Grade 8,53.3 +Physics,Grade 8,80.4 +Chemistry,Grade 8,69.7 +Mathematics,Grade 9,74.7 +Chemistry,Grade 9,63.9 +Mathematics,Grade 7,67.3 +Mathematics,Grade 9,68.8 +Biology,Grade 7,59.9 +Chemistry,Grade 8,62.9 +Physics,Grade 7,65.0 +Mathematics,Grade 9,94.2 +Physics,Grade 8,60.8 +Chemistry,Grade 8,71.6 +Biology,Grade 7,65.5 +Biology,Grade 9,93.0 +History,Grade 7,78.1 +Physics,Grade 7,47.8 +Biology,Grade 9,77.4 +Chemistry,Grade 9,66.6 +History,Grade 8,63.7 +Chemistry,Grade 9,62.8 +Chemistry,Grade 8,79.7 +Chemistry,Grade 9,39.5 +Physics,Grade 9,74.3 +Chemistry,Grade 7,68.2 +Chemistry,Grade 7,79.3 +History,Grade 7,63.3 +Mathematics,Grade 7,57.6 +Chemistry,Grade 9,76.6 +Chemistry,Grade 9,76.3 +Mathematics,Grade 7,79.5 +Physics,Grade 7,58.7 +History,Grade 8,73.1 +History,Grade 7,77.7 +Mathematics,Grade 8,71.5 +Mathematics,Grade 9,74.4 +Chemistry,Grade 9,95.0 +Chemistry,Grade 9,73.7 +Mathematics,Grade 8,92.8 +Chemistry,Grade 7,56.5 +Mathematics,Grade 7,58.4 +History,Grade 9,72.3 +Chemistry,Grade 8,56.9 +Chemistry,Grade 7,67.7 +Mathematics,Grade 8,79.6 +Biology,Grade 7,84.5 +History,Grade 8,78.2 +Chemistry,Grade 8,69.3 +Physics,Grade 7,49.0 +Chemistry,Grade 9,71.1 +Mathematics,Grade 9,81.6 +Chemistry,Grade 8,62.7 +Mathematics,Grade 8,69.7 +Biology,Grade 7,68.0 +Biology,Grade 7,55.3 +Chemistry,Grade 7,61.6 +Chemistry,Grade 9,71.9 +Physics,Grade 8,65.1 +History,Grade 8,60.4 +Chemistry,Grade 7,64.9 +History,Grade 9,84.0 +Physics,Grade 7,38.9 +Biology,Grade 7,58.6 +Physics,Grade 8,67.1 +Chemistry,Grade 8,93.8 +Physics,Grade 9,57.4 +Chemistry,Grade 7,60.1 +Mathematics,Grade 9,75.9 +Biology,Grade 7,63.8 +Physics,Grade 7,76.2 +History,Grade 8,77.8 +Physics,Grade 8,51.1 +History,Grade 9,79.9 +Mathematics,Grade 9,79.6 +Biology,Grade 7,74.7 +Chemistry,Grade 8,73.9 +History,Grade 7,85.1 +Chemistry,Grade 8,64.1 +Mathematics,Grade 7,46.9 +History,Grade 8,76.9 +Mathematics,Grade 7,55.3 +Physics,Grade 8,69.4 +Biology,Grade 7,61.9 +Physics,Grade 8,75.4 +History,Grade 7,82.6 +Physics,Grade 8,72.3 +History,Grade 7,80.6 +Chemistry,Grade 7,77.4 +Biology,Grade 9,89.1 +Biology,Grade 8,82.1 +Mathematics,Grade 8,72.3 +Chemistry,Grade 7,68.2 +Physics,Grade 9,64.6 +Chemistry,Grade 7,50.7 +History,Grade 7,77.5 +History,Grade 8,72.1 +Chemistry,Grade 7,64.7 +Chemistry,Grade 7,77.5 +Biology,Grade 7,75.9 +History,Grade 7,81.1 +Chemistry,Grade 9,65.6 +Mathematics,Grade 9,80.4 +Biology,Grade 7,69.9 +History,Grade 8,66.2 +Chemistry,Grade 7,76.0 +Biology,Grade 7,82.0 +Chemistry,Grade 9,77.3 +Mathematics,Grade 8,91.2 +Chemistry,Grade 7,55.6 +History,Grade 8,78.6 +Biology,Grade 7,64.0 +Physics,Grade 9,75.6 +Mathematics,Grade 8,80.7 +Biology,Grade 8,74.8 +Mathematics,Grade 8,64.2 +History,Grade 7,69.2 +Mathematics,Grade 9,90.0 +Chemistry,Grade 9,80.7 +Biology,Grade 9,93.5 +Mathematics,Grade 7,55.0 +Physics,Grade 9,63.5 +Physics,Grade 8,57.5 +Biology,Grade 7,64.3 +Biology,Grade 7,56.2 +Chemistry,Grade 7,51.1 +Mathematics,Grade 9,69.4 +Chemistry,Grade 8,64.5 +Biology,Grade 9,71.4 +Chemistry,Grade 8,67.3 +Mathematics,Grade 7,54.9 +History,Grade 8,87.3 +Physics,Grade 7,53.6 +Biology,Grade 9,84.4 +Mathematics,Grade 9,69.9 +Chemistry,Grade 9,63.0 +Chemistry,Grade 8,75.3 +Physics,Grade 9,73.7 +Chemistry,Grade 9,69.8 +Physics,Grade 7,37.4 +Biology,Grade 9,100.0 +History,Grade 7,68.4 +Physics,Grade 7,63.8 +Mathematics,Grade 7,62.5 +Chemistry,Grade 9,69.4 +Mathematics,Grade 7,73.4 +Mathematics,Grade 8,81.1 +History,Grade 7,65.2 +Physics,Grade 9,74.4 +History,Grade 7,62.8 +Physics,Grade 9,91.6 +Biology,Grade 7,82.8 +Physics,Grade 7,62.2 +Physics,Grade 7,72.9 +History,Grade 9,70.9 +Chemistry,Grade 8,59.7 +History,Grade 7,76.3 +History,Grade 9,100.0 +History,Grade 7,57.7 +Chemistry,Grade 8,72.4 +Physics,Grade 9,75.3 +Mathematics,Grade 8,77.5 +Mathematics,Grade 7,58.3 +Mathematics,Grade 7,77.6 +History,Grade 8,89.5 +History,Grade 7,74.9 +Chemistry,Grade 9,77.5 +Biology,Grade 8,70.5 +Mathematics,Grade 7,72.5 +Biology,Grade 9,61.1 +Biology,Grade 7,71.8 +History,Grade 8,60.0 +History,Grade 9,88.3 +Mathematics,Grade 7,85.2 +Chemistry,Grade 8,74.4 +Biology,Grade 8,86.1 +Physics,Grade 9,65.6 +Mathematics,Grade 8,55.9 +Chemistry,Grade 7,69.1 +Physics,Grade 7,51.6 +History,Grade 8,73.0 +History,Grade 8,77.7 +Chemistry,Grade 7,71.3 +History,Grade 9,76.2 +Physics,Grade 7,62.0 +Biology,Grade 7,64.1 +Physics,Grade 7,71.5 +Biology,Grade 8,62.5 +Biology,Grade 7,67.5 +Chemistry,Grade 8,53.6 +Chemistry,Grade 8,49.6 +Physics,Grade 7,82.8 +History,Grade 8,99.3 +Biology,Grade 7,64.9 +Mathematics,Grade 7,85.6 +Biology,Grade 7,83.8 +Chemistry,Grade 9,59.4 +Chemistry,Grade 8,54.8 +Biology,Grade 7,59.1 +Physics,Grade 9,62.7 +Biology,Grade 8,80.0 +History,Grade 7,56.9 +Mathematics,Grade 9,93.6 +Biology,Grade 8,74.6 +Physics,Grade 9,61.9 +History,Grade 8,93.9 +Mathematics,Grade 9,64.5 +Physics,Grade 8,61.8 +Chemistry,Grade 7,61.4 +Chemistry,Grade 9,65.4 +Physics,Grade 9,78.8 +Biology,Grade 8,81.8 +Physics,Grade 8,60.8 +Biology,Grade 8,82.3 +Physics,Grade 8,58.1 +Biology,Grade 8,90.0 +Chemistry,Grade 7,80.3 +History,Grade 9,97.5 +Biology,Grade 8,70.7 +Physics,Grade 8,62.0 +History,Grade 9,78.1 +Chemistry,Grade 8,60.7 +Biology,Grade 9,88.7 +Chemistry,Grade 9,83.6 +History,Grade 9,86.1 +Chemistry,Grade 8,63.1 +History,Grade 9,59.5 +Physics,Grade 9,89.5 +Biology,Grade 9,75.9 +Chemistry,Grade 7,59.7 +Physics,Grade 7,75.5 +Biology,Grade 8,85.6 +Physics,Grade 7,69.0 +Mathematics,Grade 7,73.3 +Mathematics,Grade 7,79.3 +History,Grade 7,68.2 +Physics,Grade 8,67.9 +Physics,Grade 7,50.6 +Chemistry,Grade 9,83.2 +Physics,Grade 8,66.2 +Chemistry,Grade 9,61.2 +Chemistry,Grade 9,63.0 +Biology,Grade 7,79.8 +Mathematics,Grade 7,72.2 +History,Grade 7,88.0 +History,Grade 8,73.2 +History,Grade 7,61.3 +History,Grade 9,91.6 +Mathematics,Grade 8,85.5 +Mathematics,Grade 7,75.0 +Mathematics,Grade 8,63.4 +Chemistry,Grade 9,63.2 +History,Grade 8,63.7 +History,Grade 9,70.4 +Physics,Grade 7,54.5 +History,Grade 8,84.6 +Biology,Grade 9,75.0 +Physics,Grade 9,72.4 +History,Grade 9,80.1 +History,Grade 9,73.1 +Chemistry,Grade 9,67.2 +Biology,Grade 7,71.7 +History,Grade 8,73.9 +Biology,Grade 8,59.7 +Biology,Grade 7,66.4 +Biology,Grade 9,89.4 +Mathematics,Grade 8,51.9 +History,Grade 8,86.4 +History,Grade 9,77.9 +Biology,Grade 7,72.4 +Mathematics,Grade 8,88.9 +Chemistry,Grade 7,78.3 +History,Grade 8,79.8 +Biology,Grade 8,80.0 +Biology,Grade 7,75.5 +Chemistry,Grade 8,55.2 +Chemistry,Grade 8,77.9 +Mathematics,Grade 8,59.2 +Physics,Grade 7,56.4 +Mathematics,Grade 7,57.5 +Biology,Grade 7,63.7 +Biology,Grade 8,81.9 +Mathematics,Grade 8,84.0 +Biology,Grade 9,73.8 +Biology,Grade 7,85.4 +Physics,Grade 9,59.0 +History,Grade 8,97.2 +History,Grade 9,73.3 +Chemistry,Grade 9,61.9 +Physics,Grade 9,67.8 +History,Grade 8,82.9 +Biology,Grade 7,96.7 +Mathematics,Grade 7,43.9 +Chemistry,Grade 9,69.5 +Mathematics,Grade 8,61.6 +Physics,Grade 9,79.6 +Physics,Grade 8,61.1 +Chemistry,Grade 7,75.3 +Physics,Grade 8,58.1 +Biology,Grade 8,71.2 +Mathematics,Grade 9,55.7 +Biology,Grade 9,69.4 +Physics,Grade 8,45.6 +History,Grade 7,72.9 +Mathematics,Grade 7,55.3 +Mathematics,Grade 9,64.1 +Chemistry,Grade 9,73.1 +Biology,Grade 8,86.5 +History,Grade 7,86.6 +Chemistry,Grade 7,72.7 +Chemistry,Grade 8,57.1 +Physics,Grade 7,57.1 +Physics,Grade 7,67.1 +Biology,Grade 9,100.0 +Biology,Grade 8,66.2 +History,Grade 9,77.6 +Chemistry,Grade 8,76.6 +Biology,Grade 9,68.8 +Chemistry,Grade 8,60.6 +Chemistry,Grade 9,81.9 +Biology,Grade 7,67.3 +Biology,Grade 7,64.7 +Chemistry,Grade 8,66.3 +History,Grade 9,69.5 +History,Grade 8,73.0 +Physics,Grade 7,71.8 +History,Grade 7,86.3 +Biology,Grade 8,79.8 +Mathematics,Grade 7,60.8 +Biology,Grade 8,91.5 +Biology,Grade 8,82.7 +Chemistry,Grade 7,76.4 +Biology,Grade 7,68.7 +Biology,Grade 7,60.5 +History,Grade 8,85.7 +History,Grade 8,77.8 +Biology,Grade 9,78.4 +Mathematics,Grade 9,69.5 +Mathematics,Grade 9,74.4 +Chemistry,Grade 8,42.9 +Mathematics,Grade 8,74.1 +Biology,Grade 8,75.0 +Mathematics,Grade 8,63.4 +History,Grade 9,76.3 +Chemistry,Grade 7,65.5 +Physics,Grade 7,80.4 +History,Grade 7,72.8 +Chemistry,Grade 8,56.9 +Mathematics,Grade 7,62.1 +History,Grade 7,69.0 +Mathematics,Grade 8,74.7 +Physics,Grade 9,79.9 +Physics,Grade 8,65.8 +Mathematics,Grade 7,71.7 +Biology,Grade 8,60.5 +History,Grade 7,86.3 +Physics,Grade 8,77.0 +Biology,Grade 8,71.0 +Chemistry,Grade 7,60.5 +Biology,Grade 9,58.3 +Mathematics,Grade 7,60.0 +Mathematics,Grade 9,64.8 +Mathematics,Grade 7,73.3 +Biology,Grade 7,85.6 +History,Grade 8,67.5 +Chemistry,Grade 8,69.5 +Biology,Grade 7,74.8 +Mathematics,Grade 8,65.6 +Biology,Grade 9,83.0 +Mathematics,Grade 7,54.1 +Chemistry,Grade 7,68.0 +Mathematics,Grade 9,74.4 +Biology,Grade 7,78.7 +Biology,Grade 8,71.5 +Mathematics,Grade 7,61.5 +History,Grade 9,86.8 +History,Grade 9,100.0 +History,Grade 9,83.8 +Mathematics,Grade 9,60.9 +History,Grade 9,93.8 +Chemistry,Grade 8,68.1 +Chemistry,Grade 9,66.0 +Biology,Grade 8,85.4 +Biology,Grade 9,70.4 +History,Grade 9,69.6 +Mathematics,Grade 9,72.9 +Mathematics,Grade 7,93.1 +Biology,Grade 8,78.6 +History,Grade 9,59.2 +Mathematics,Grade 9,81.0 +Physics,Grade 9,58.4 +Biology,Grade 7,78.3 +Chemistry,Grade 8,69.1 +Biology,Grade 9,66.8 +Mathematics,Grade 8,56.0 +Mathematics,Grade 9,63.2 +Chemistry,Grade 9,71.6 +Physics,Grade 8,59.7 +Biology,Grade 7,77.4 +Physics,Grade 9,61.2 +History,Grade 9,75.5 +Mathematics,Grade 8,41.9 +Physics,Grade 7,65.4 +History,Grade 9,84.2 +Mathematics,Grade 9,66.2 +Physics,Grade 7,78.0 +Mathematics,Grade 9,84.3 +History,Grade 7,95.0 +Mathematics,Grade 8,62.6 +Biology,Grade 8,79.0 +Mathematics,Grade 8,75.4 +Mathematics,Grade 9,69.7 +History,Grade 9,79.6 +Mathematics,Grade 9,76.3 +Physics,Grade 7,68.8 +History,Grade 7,76.1 +Mathematics,Grade 9,49.5 +Physics,Grade 7,63.2 +Mathematics,Grade 9,75.5 +Biology,Grade 7,81.8 +Mathematics,Grade 8,69.0 +History,Grade 7,91.3 +Biology,Grade 7,83.1 +Biology,Grade 8,83.6 +Chemistry,Grade 8,80.9 +Mathematics,Grade 8,63.4 +Mathematics,Grade 8,67.0 +Physics,Grade 8,86.4 +Mathematics,Grade 8,77.8 +Mathematics,Grade 7,84.7 +Mathematics,Grade 9,66.3 +History,Grade 9,98.9 +History,Grade 7,83.1 +Mathematics,Grade 8,58.1 +Biology,Grade 9,69.7 +Chemistry,Grade 8,53.5 +History,Grade 8,72.2 +Biology,Grade 8,53.8 +Biology,Grade 9,65.2 +Mathematics,Grade 9,80.5 +Chemistry,Grade 8,76.2 +Mathematics,Grade 8,81.9 +History,Grade 8,79.2 +History,Grade 8,84.2 +Chemistry,Grade 7,64.1 +Physics,Grade 9,83.1 +Biology,Grade 8,59.4 +Mathematics,Grade 8,56.7 +Mathematics,Grade 9,62.0 +Biology,Grade 8,63.4 +Physics,Grade 9,70.9 +Biology,Grade 8,62.2 +Biology,Grade 7,71.1 +History,Grade 7,74.9 +History,Grade 7,65.1 +Chemistry,Grade 8,73.0 +Physics,Grade 7,61.0 +History,Grade 9,86.2 +History,Grade 7,68.2 +Physics,Grade 7,46.9 +Physics,Grade 9,61.2 +Mathematics,Grade 8,95.5 +Chemistry,Grade 7,89.7 +History,Grade 7,69.6 +Chemistry,Grade 8,69.1 +Biology,Grade 7,69.1 +Biology,Grade 7,86.7 +Chemistry,Grade 8,69.7 +History,Grade 7,66.2 +Chemistry,Grade 9,71.2 +Chemistry,Grade 9,73.1 +Chemistry,Grade 7,42.9 +Chemistry,Grade 7,53.9 +History,Grade 9,100.0 +Chemistry,Grade 7,60.8 +Chemistry,Grade 9,68.7 +Physics,Grade 8,74.4 +Mathematics,Grade 7,44.2 +History,Grade 7,94.1 +Chemistry,Grade 7,63.8 +Chemistry,Grade 9,96.0 +Mathematics,Grade 9,75.9 +Chemistry,Grade 9,82.1 +Mathematics,Grade 8,74.8 +History,Grade 7,84.6 +Physics,Grade 9,71.1 +Physics,Grade 8,88.5 diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-renamed/case.json b/agents/evals/fixtures/cases/bar-grouped-pygal-renamed/case.json new file mode 100644 index 00000000000..cc7f00ff41d --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-renamed/case.json @@ -0,0 +1,29 @@ +{ + "spec_id": "bar-grouped", + "library": "pygal", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "category", + "column": "Fach" + }, + { + "role": "group", + "column": "Jahrgangsstufe" + }, + { + "role": "value", + "column": "Punkte (Ø)" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "renamed", + "synthetic", + "renamed-headers", + "non-ascii-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, renamed)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-renamed/data.csv b/agents/evals/fixtures/cases/bar-grouped-pygal-renamed/data.csv new file mode 100644 index 00000000000..8bbc890c19c --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-renamed/data.csv @@ -0,0 +1,16 @@ +Fach,Jahrgangsstufe,Punkte (Ø) +Mathematics,Grade 7,66.1 +Mathematics,Grade 8,69.9 +Mathematics,Grade 9,71.8 +Physics,Grade 7,64.6 +Physics,Grade 8,65.3 +Physics,Grade 9,74.1 +Chemistry,Grade 7,63.4 +Chemistry,Grade 8,66.5 +Chemistry,Grade 9,68.7 +Biology,Grade 7,73.0 +Biology,Grade 8,72.1 +Biology,Grade 9,80.7 +History,Grade 7,73.0 +History,Grade 8,79.9 +History,Grade 9,85.8 diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-x10/case.json b/agents/evals/fixtures/cases/bar-grouped-pygal-x10/case.json new file mode 100644 index 00000000000..28cda430a25 --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-x10/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "bar-grouped", + "library": "pygal", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "category", + "column": "Subject" + }, + { + "role": "group", + "column": "Grade Level" + }, + { + "role": "value", + "column": "Test Score" + } + ], + "expected": "accepted", + "tags": [ + "bar", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 303, x10)" +} diff --git a/agents/evals/fixtures/cases/bar-grouped-pygal-x10/data.csv b/agents/evals/fixtures/cases/bar-grouped-pygal-x10/data.csv new file mode 100644 index 00000000000..8bb5979214c --- /dev/null +++ b/agents/evals/fixtures/cases/bar-grouped-pygal-x10/data.csv @@ -0,0 +1,16 @@ +Subject,Grade Level,Test Score +Mathematics,Grade 7,660.8 +Mathematics,Grade 8,698.8 +Mathematics,Grade 9,718.1 +Physics,Grade 7,645.9 +Physics,Grade 8,653.1 +Physics,Grade 9,740.6 +Chemistry,Grade 7,633.8 +Chemistry,Grade 8,664.8 +Chemistry,Grade 9,687.1 +Biology,Grade 7,730.0 +Biology,Grade 8,720.9 +Biology,Grade 9,806.7 +History,Grade 7,730.3 +History,Grade 8,798.6 +History,Grade 9,858.1 diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-date/case.json b/agents/evals/fixtures/cases/box-basic-letsplot-date/case.json new file mode 100644 index 00000000000..be3846de285 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "box-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "category", + "column": "Production Line" + }, + { + "role": "value", + "column": "Fill Weight (g)" + } + ], + "expected": "accepted", + "tags": [ + "box", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, date)" +} diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-date/data.csv b/agents/evals/fixtures/cases/box-basic-letsplot-date/data.csv new file mode 100644 index 00000000000..523541979ba --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-date/data.csv @@ -0,0 +1,241 @@ +Production Line,Fill Weight (g),Shift Date,Checked On +Line A,501.9,20.01.2026,2026-01-22 +Line B,498.7,26.05.2026,2026-05-27 +Line C,499.7,19.02.2026,2026-02-19 +Line D,500.5,09.05.2026,2026-05-09 +Line A,500.1,27.01.2026,2026-01-31 +Line B,500.8,10.02.2026,2026-02-13 +Line C,500.1,02.03.2026,2026-03-04 +Line D,501.4,13.06.2026,2026-06-13 +Line A,501.2,25.02.2026,2026-02-27 +Line B,499.3,29.06.2026,2026-07-03 +Line C,498.1,22.02.2026,2026-02-26 +Line D,501.0,02.02.2026,2026-02-06 +Line A,494.0,28.04.2026,2026-04-30 +Line B,496.2,12.05.2026,2026-05-12 +Line C,500.1,10.06.2026,2026-06-12 +Line D,500.4,25.01.2026,2026-01-26 +Line A,500.5,20.04.2026,2026-04-22 +Line B,501.6,19.04.2026,2026-04-22 +Line C,500.7,13.04.2026,2026-04-16 +Line D,502.7,16.02.2026,2026-02-16 +Line A,499.0,17.03.2026,2026-03-18 +Line B,502.0,26.03.2026,2026-03-26 +Line C,500.6,20.01.2026,2026-01-21 +Line D,503.4,13.06.2026,2026-06-16 +Line A,499.8,14.03.2026,2026-03-17 +Line B,500.2,24.04.2026,2026-04-28 +Line C,499.5,09.04.2026,2026-04-09 +Line D,500.9,15.02.2026,2026-02-16 +Line A,501.1,01.06.2026,2026-06-03 +Line B,503.8,18.01.2026,2026-01-20 +Line C,498.2,08.03.2026,2026-03-10 +Line D,502.6,23.05.2026,2026-05-25 +Line A,501.3,24.01.2026,2026-01-25 +Line B,503.9,26.03.2026,2026-03-29 +Line C,498.2,14.02.2026,2026-02-18 +Line D,500.8,07.01.2026,2026-01-10 +Line A,498.2,12.01.2026,2026-01-15 +Line B,502.1,25.05.2026,2026-05-29 +Line C,500.8,19.04.2026,2026-04-22 +Line D,502.4,24.06.2026,2026-06-27 +Line A,501.6,07.01.2026,2026-01-08 +Line B,499.6,18.05.2026,2026-05-21 +Line C,500.2,20.01.2026,2026-01-22 +Line D,500.6,23.06.2026,2026-06-27 +Line A,499.5,12.03.2026,2026-03-12 +Line B,496.6,19.01.2026,2026-01-22 +Line C,499.5,17.03.2026,2026-03-18 +Line D,501.8,29.06.2026,2026-07-02 +Line A,499.5,20.01.2026,2026-01-20 +Line B,501.2,10.04.2026,2026-04-12 +Line C,497.4,01.02.2026,2026-02-05 +Line D,503.8,11.05.2026,2026-05-11 +Line A,499.4,09.02.2026,2026-02-12 +Line B,505.5,26.01.2026,2026-01-26 +Line C,500.6,21.06.2026,2026-06-22 +Line D,502.4,10.06.2026,2026-06-13 +Line A,502.6,16.02.2026,2026-02-16 +Line B,501.9,08.02.2026,2026-02-12 +Line C,499.7,12.03.2026,2026-03-15 +Line D,503.4,28.01.2026,2026-01-31 +Line A,499.9,13.01.2026,2026-01-14 +Line B,502.5,23.04.2026,2026-04-27 +Line C,503.7,13.04.2026,2026-04-17 +Line D,502.3,24.06.2026,2026-06-24 +Line A,499.3,07.06.2026,2026-06-08 +Line B,499.3,17.04.2026,2026-04-17 +Line C,497.6,05.05.2026,2026-05-06 +Line D,502.2,27.03.2026,2026-03-27 +Line A,501.8,19.03.2026,2026-03-21 +Line B,503.1,13.05.2026,2026-05-16 +Line C,497.4,07.01.2026,2026-01-08 +Line D,502.7,06.01.2026,2026-01-06 +Line A,502.6,23.02.2026,2026-02-25 +Line B,500.1,20.02.2026,2026-02-23 +Line C,501.0,29.03.2026,2026-03-31 +Line D,503.3,22.04.2026,2026-04-26 +Line A,502.0,31.05.2026,2026-06-03 +Line B,496.4,30.06.2026,2026-07-02 +Line C,499.8,31.03.2026,2026-04-04 +Line D,501.9,30.01.2026,2026-01-31 +Line A,500.6,27.01.2026,2026-01-27 +Line B,498.9,02.06.2026,2026-06-06 +Line C,502.8,26.05.2026,2026-05-26 +Line D,501.7,04.04.2026,2026-04-07 +Line A,501.7,06.03.2026,2026-03-06 +Line B,503.0,24.06.2026,2026-06-25 +Line C,498.9,25.04.2026,2026-04-29 +Line D,502.2,15.01.2026,2026-01-15 +Line A,502.2,12.06.2026,2026-06-15 +Line B,498.6,23.02.2026,2026-02-25 +Line C,497.3,18.06.2026,2026-06-21 +Line D,501.8,15.06.2026,2026-06-18 +Line A,501.6,02.07.2026,2026-07-02 +Line B,500.0,25.03.2026,2026-03-25 +Line C,500.7,22.06.2026,2026-06-26 +Line D,501.7,09.02.2026,2026-02-09 +Line A,498.8,07.01.2026,2026-01-09 +Line B,500.9,12.06.2026,2026-06-13 +Line C,498.0,08.02.2026,2026-02-11 +Line D,502.1,19.01.2026,2026-01-23 +Line A,498.5,08.04.2026,2026-04-10 +Line B,502.2,01.06.2026,2026-06-03 +Line C,499.8,28.01.2026,2026-01-30 +Line D,501.6,05.02.2026,2026-02-07 +Line A,499.1,17.06.2026,2026-06-18 +Line B,499.8,20.05.2026,2026-05-23 +Line C,496.6,22.05.2026,2026-05-23 +Line D,502.4,02.04.2026,2026-04-02 +Line A,498.5,11.04.2026,2026-04-11 +Line B,499.5,26.06.2026,2026-06-27 +Line C,497.9,21.05.2026,2026-05-25 +Line D,503.3,02.02.2026,2026-02-05 +Line A,499.9,19.04.2026,2026-04-19 +Line B,501.0,15.01.2026,2026-01-19 +Line C,498.1,12.01.2026,2026-01-12 +Line D,503.6,06.02.2026,2026-02-08 +Line A,503.2,15.05.2026,2026-05-16 +Line B,502.3,20.04.2026,2026-04-21 +Line C,499.4,08.06.2026,2026-06-12 +Line D,494.3,02.04.2026,2026-04-03 +Line A,501.4,30.03.2026,2026-03-30 +Line B,501.9,08.04.2026,2026-04-11 +Line C,498.4,09.02.2026,2026-02-13 +Line D,500.3,13.01.2026,2026-01-14 +Line A,493.6,09.06.2026,2026-06-11 +Line B,501.1,05.06.2026,2026-06-06 +Line C,499.6,27.03.2026,2026-03-30 +Line D,502.3,17.02.2026,2026-02-19 +Line A,500.4,30.05.2026,2026-06-02 +Line B,501.0,10.05.2026,2026-05-11 +Line C,498.2,20.04.2026,2026-04-22 +Line D,502.3,13.05.2026,2026-05-17 +Line A,499.0,22.02.2026,2026-02-26 +Line B,500.4,14.06.2026,2026-06-16 +Line C,500.1,07.06.2026,2026-06-07 +Line D,502.6,08.06.2026,2026-06-12 +Line A,500.2,06.02.2026,2026-02-09 +Line B,500.0,18.01.2026,2026-01-18 +Line C,499.6,14.01.2026,2026-01-17 +Line D,502.4,27.03.2026,2026-03-29 +Line A,499.0,13.01.2026,2026-01-13 +Line B,500.9,22.04.2026,2026-04-22 +Line C,500.3,01.05.2026,2026-05-03 +Line D,501.3,15.04.2026,2026-04-16 +Line A,500.6,28.06.2026,2026-07-02 +Line B,500.1,09.01.2026,2026-01-10 +Line C,497.7,03.06.2026,2026-06-03 +Line D,502.4,10.02.2026,2026-02-14 +Line A,501.5,07.05.2026,2026-05-07 +Line B,501.8,29.01.2026,2026-02-01 +Line C,499.5,16.02.2026,2026-02-19 +Line D,502.0,16.03.2026,2026-03-18 +Line A,501.4,17.01.2026,2026-01-21 +Line B,503.6,14.02.2026,2026-02-16 +Line C,501.9,02.07.2026,2026-07-03 +Line D,503.7,18.02.2026,2026-02-22 +Line A,501.8,02.02.2026,2026-02-02 +Line B,500.7,22.05.2026,2026-05-26 +Line C,498.3,22.05.2026,2026-05-24 +Line D,501.3,01.03.2026,2026-03-03 +Line A,501.8,04.06.2026,2026-06-05 +Line B,501.2,09.06.2026,2026-06-10 +Line C,499.6,28.01.2026,2026-01-28 +Line D,502.6,09.03.2026,2026-03-12 +Line A,500.6,31.03.2026,2026-04-03 +Line B,499.6,29.06.2026,2026-07-03 +Line C,498.3,15.02.2026,2026-02-17 +Line D,502.7,23.04.2026,2026-04-25 +Line A,501.0,26.02.2026,2026-02-26 +Line B,498.9,08.02.2026,2026-02-12 +Line C,499.2,08.02.2026,2026-02-08 +Line D,502.1,04.02.2026,2026-02-04 +Line A,502.7,16.02.2026,2026-02-18 +Line B,502.9,20.06.2026,2026-06-20 +Line C,498.2,31.05.2026,2026-06-01 +Line D,502.2,18.06.2026,2026-06-21 +Line A,498.2,12.02.2026,2026-02-16 +Line B,498.5,23.02.2026,2026-02-27 +Line C,499.2,30.03.2026,2026-04-01 +Line D,502.0,15.05.2026,2026-05-19 +Line A,502.9,18.03.2026,2026-03-19 +Line B,505.2,19.04.2026,2026-04-23 +Line C,497.9,26.04.2026,2026-04-29 +Line D,502.5,01.03.2026,2026-03-02 +Line A,501.6,09.01.2026,2026-01-11 +Line B,501.7,17.05.2026,2026-05-20 +Line C,499.7,23.06.2026,2026-06-27 +Line D,502.9,16.01.2026,2026-01-20 +Line A,500.8,03.03.2026,2026-03-03 +Line B,502.3,16.01.2026,2026-01-18 +Line C,496.7,18.03.2026,2026-03-19 +Line D,502.1,12.06.2026,2026-06-14 +Line A,499.5,24.06.2026,2026-06-26 +Line B,502.1,24.04.2026,2026-04-26 +Line C,500.0,21.06.2026,2026-06-24 +Line D,501.1,23.04.2026,2026-04-27 +Line A,497.8,28.06.2026,2026-06-29 +Line B,499.9,30.06.2026,2026-07-01 +Line C,501.0,12.04.2026,2026-04-14 +Line D,503.2,24.05.2026,2026-05-26 +Line A,503.1,25.01.2026,2026-01-26 +Line B,499.1,12.06.2026,2026-06-12 +Line C,501.0,14.01.2026,2026-01-18 +Line D,500.2,06.03.2026,2026-03-08 +Line A,499.4,22.03.2026,2026-03-22 +Line B,497.9,23.06.2026,2026-06-26 +Line C,499.0,21.03.2026,2026-03-25 +Line D,500.5,29.04.2026,2026-05-01 +Line A,502.4,25.01.2026,2026-01-27 +Line B,500.3,11.01.2026,2026-01-12 +Line C,498.7,02.04.2026,2026-04-03 +Line D,502.0,25.05.2026,2026-05-28 +Line A,500.6,13.05.2026,2026-05-15 +Line B,498.7,21.01.2026,2026-01-25 +Line C,498.1,25.05.2026,2026-05-27 +Line D,500.6,18.06.2026,2026-06-22 +Line A,501.3,08.06.2026,2026-06-12 +Line B,505.4,25.05.2026,2026-05-26 +Line C,498.7,12.04.2026,2026-04-16 +Line D,503.2,07.01.2026,2026-01-09 +Line A,499.5,07.06.2026,2026-06-07 +Line B,502.0,17.06.2026,2026-06-19 +Line C,498.4,06.06.2026,2026-06-06 +Line D,501.3,18.06.2026,2026-06-22 +Line A,501.9,03.02.2026,2026-02-04 +Line B,489.3,23.06.2026,2026-06-24 +Line C,499.0,16.06.2026,2026-06-19 +Line D,502.6,24.04.2026,2026-04-26 +Line A,499.7,24.02.2026,2026-02-24 +Line B,500.0,26.05.2026,2026-05-30 +Line C,498.2,20.02.2026,2026-02-23 +Line D,501.4,06.02.2026,2026-02-10 +Line A,501.4,18.02.2026,2026-02-20 +Line B,506.5,05.05.2026,2026-05-08 +Line C,498.8,26.01.2026,2026-01-29 +Line D,501.7,20.02.2026,2026-02-21 +Line A,499.7,15.02.2026,2026-02-15 +Line B,502.0,14.02.2026,2026-02-18 +Line C,500.5,09.01.2026,2026-01-10 +Line D,501.4,08.04.2026,2026-04-10 diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-decimal-comma/case.json b/agents/evals/fixtures/cases/box-basic-letsplot-decimal-comma/case.json new file mode 100644 index 00000000000..9c4ec1dd086 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "box-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "category", + "column": "Production Line" + }, + { + "role": "value", + "column": "Fill Weight (g)" + } + ], + "expected": "accepted", + "tags": [ + "box", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-decimal-comma/data.csv b/agents/evals/fixtures/cases/box-basic-letsplot-decimal-comma/data.csv new file mode 100644 index 00000000000..87f3168c064 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-decimal-comma/data.csv @@ -0,0 +1,241 @@ +Production Line;Fill Weight (g) +Line A;501,9 +Line B;498,7 +Line C;499,7 +Line D;500,5 +Line A;500,1 +Line B;500,8 +Line C;500,1 +Line D;501,4 +Line A;501,2 +Line B;499,3 +Line C;498,1 +Line D;501,0 +Line A;494,0 +Line B;496,2 +Line C;500,1 +Line D;500,4 +Line A;500,5 +Line B;501,6 +Line C;500,7 +Line D;502,7 +Line A;499,0 +Line B;502,0 +Line C;500,6 +Line D;503,4 +Line A;499,8 +Line B;500,2 +Line C;499,5 +Line D;500,9 +Line A;501,1 +Line B;503,8 +Line C;498,2 +Line D;502,6 +Line A;501,3 +Line B;503,9 +Line C;498,2 +Line D;500,8 +Line A;498,2 +Line B;502,1 +Line C;500,8 +Line D;502,4 +Line A;501,6 +Line B;499,6 +Line C;500,2 +Line D;500,6 +Line A;499,5 +Line B;496,6 +Line C;499,5 +Line D;501,8 +Line A;499,5 +Line B;501,2 +Line C;497,4 +Line D;503,8 +Line A;499,4 +Line B;505,5 +Line C;500,6 +Line D;502,4 +Line A;502,6 +Line B;501,9 +Line C;499,7 +Line D;503,4 +Line A;499,9 +Line B;502,5 +Line C;503,7 +Line D;502,3 +Line A;499,3 +Line B;499,3 +Line C;497,6 +Line D;502,2 +Line A;501,8 +Line B;503,1 +Line C;497,4 +Line D;502,7 +Line A;502,6 +Line B;500,1 +Line C;501,0 +Line D;503,3 +Line A;502,0 +Line B;496,4 +Line C;499,8 +Line D;501,9 +Line A;500,6 +Line B;498,9 +Line C;502,8 +Line D;501,7 +Line A;501,7 +Line B;503,0 +Line C;498,9 +Line D;502,2 +Line A;502,2 +Line B;498,6 +Line C;497,3 +Line D;501,8 +Line A;501,6 +Line B;500,0 +Line C;500,7 +Line D;501,7 +Line A;498,8 +Line B;500,9 +Line C;498,0 +Line D;502,1 +Line A;498,5 +Line B;502,2 +Line C;499,8 +Line D;501,6 +Line A;499,1 +Line B;499,8 +Line C;496,6 +Line D;502,4 +Line A;498,5 +Line B;499,5 +Line C;497,9 +Line D;503,3 +Line A;499,9 +Line B;501,0 +Line C;498,1 +Line D;503,6 +Line A;503,2 +Line B;502,3 +Line C;499,4 +Line D;494,3 +Line A;501,4 +Line B;501,9 +Line C;498,4 +Line D;500,3 +Line A;493,6 +Line B;501,1 +Line C;499,6 +Line D;502,3 +Line A;500,4 +Line B;501,0 +Line C;498,2 +Line D;502,3 +Line A;499,0 +Line B;500,4 +Line C;500,1 +Line D;502,6 +Line A;500,2 +Line B;500,0 +Line C;499,6 +Line D;502,4 +Line A;499,0 +Line B;500,9 +Line C;500,3 +Line D;501,3 +Line A;500,6 +Line B;500,1 +Line C;497,7 +Line D;502,4 +Line A;501,5 +Line B;501,8 +Line C;499,5 +Line D;502,0 +Line A;501,4 +Line B;503,6 +Line C;501,9 +Line D;503,7 +Line A;501,8 +Line B;500,7 +Line C;498,3 +Line D;501,3 +Line A;501,8 +Line B;501,2 +Line C;499,6 +Line D;502,6 +Line A;500,6 +Line B;499,6 +Line C;498,3 +Line D;502,7 +Line A;501,0 +Line B;498,9 +Line C;499,2 +Line D;502,1 +Line A;502,7 +Line B;502,9 +Line C;498,2 +Line D;502,2 +Line A;498,2 +Line B;498,5 +Line C;499,2 +Line D;502,0 +Line A;502,9 +Line B;505,2 +Line C;497,9 +Line D;502,5 +Line A;501,6 +Line B;501,7 +Line C;499,7 +Line D;502,9 +Line A;500,8 +Line B;502,3 +Line C;496,7 +Line D;502,1 +Line A;499,5 +Line B;502,1 +Line C;500,0 +Line D;501,1 +Line A;497,8 +Line B;499,9 +Line C;501,0 +Line D;503,2 +Line A;503,1 +Line B;499,1 +Line C;501,0 +Line D;500,2 +Line A;499,4 +Line B;497,9 +Line C;499,0 +Line D;500,5 +Line A;502,4 +Line B;500,3 +Line C;498,7 +Line D;502,0 +Line A;500,6 +Line B;498,7 +Line C;498,1 +Line D;500,6 +Line A;501,3 +Line B;505,4 +Line C;498,7 +Line D;503,2 +Line A;499,5 +Line B;502,0 +Line C;498,4 +Line D;501,3 +Line A;501,9 +Line B;489,3 +Line C;499,0 +Line D;502,6 +Line A;499,7 +Line B;500,0 +Line C;498,2 +Line D;501,4 +Line A;501,4 +Line B;506,5 +Line C;498,8 +Line D;501,7 +Line A;499,7 +Line B;502,0 +Line C;500,5 +Line D;501,4 diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-n12/case.json b/agents/evals/fixtures/cases/box-basic-letsplot-n12/case.json new file mode 100644 index 00000000000..b804db2d616 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "box-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "category", + "column": "Production Line" + }, + { + "role": "value", + "column": "Fill Weight (g)" + } + ], + "expected": "accepted", + "tags": [ + "box", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, n12)" +} diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-n12/data.csv b/agents/evals/fixtures/cases/box-basic-letsplot-n12/data.csv new file mode 100644 index 00000000000..9f5cb18a70a --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-n12/data.csv @@ -0,0 +1,13 @@ +Production Line,Fill Weight (g) +Line A,497.9 +Line B,498.9 +Line C,501.0 +Line D,501.7 +Line A,499.9 +Line B,504.8 +Line C,504.4 +Line D,502.7 +Line A,500.5 +Line B,501.1 +Line C,500.0 +Line D,501.8 diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-n5000/case.json b/agents/evals/fixtures/cases/box-basic-letsplot-n5000/case.json new file mode 100644 index 00000000000..f0274f2ac98 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "box-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "category", + "column": "Production Line" + }, + { + "role": "value", + "column": "Fill Weight (g)" + } + ], + "expected": "accepted", + "tags": [ + "box", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, n5000)" +} diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-n5000/data.csv b/agents/evals/fixtures/cases/box-basic-letsplot-n5000/data.csv new file mode 100644 index 00000000000..e5b76eac639 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-n5000/data.csv @@ -0,0 +1,5001 @@ +Production Line,Fill Weight (g) +Line A,499.4 +Line B,501.6 +Line C,498.7 +Line D,500.9 +Line A,500.4 +Line B,501.9 +Line C,499.0 +Line D,501.3 +Line A,501.7 +Line B,499.6 +Line C,499.1 +Line D,502.2 +Line A,499.1 +Line B,501.5 +Line C,496.0 +Line D,502.7 +Line A,500.1 +Line B,504.6 +Line C,496.7 +Line D,501.1 +Line A,500.9 +Line B,505.8 +Line C,502.1 +Line D,502.8 +Line A,498.6 +Line B,499.2 +Line C,504.1 +Line D,501.1 +Line A,500.1 +Line B,500.7 +Line C,498.8 +Line D,494.8 +Line A,499.7 +Line B,502.2 +Line C,499.1 +Line D,502.0 +Line A,499.3 +Line B,500.1 +Line C,498.3 +Line D,501.2 +Line A,501.3 +Line B,499.7 +Line C,500.3 +Line D,501.4 +Line A,499.6 +Line B,502.2 +Line C,500.4 +Line D,502.3 +Line A,500.4 +Line B,502.5 +Line C,498.4 +Line D,502.0 +Line A,501.2 +Line B,502.7 +Line C,500.9 +Line D,499.9 +Line A,497.2 +Line B,499.6 +Line C,499.8 +Line D,502.8 +Line A,501.4 +Line B,503.1 +Line C,498.4 +Line D,502.2 +Line A,499.5 +Line B,502.2 +Line C,500.9 +Line D,501.7 +Line A,502.0 +Line B,501.8 +Line C,498.1 +Line D,502.0 +Line A,499.8 +Line B,502.8 +Line C,496.4 +Line D,501.0 +Line A,499.5 +Line B,501.0 +Line C,497.8 +Line D,503.8 +Line A,499.1 +Line B,501.7 +Line C,501.1 +Line D,502.2 +Line A,501.0 +Line B,501.6 +Line C,500.5 +Line D,501.4 +Line A,500.2 +Line B,500.0 +Line C,500.8 +Line D,502.8 +Line A,500.1 +Line B,500.4 +Line C,499.9 +Line D,502.0 +Line A,501.5 +Line B,499.9 +Line C,499.9 +Line D,502.6 +Line A,500.4 +Line B,502.0 +Line C,501.4 +Line D,501.6 +Line A,499.5 +Line B,499.7 +Line C,498.3 +Line D,501.2 +Line A,499.1 +Line B,502.1 +Line C,496.4 +Line D,503.6 +Line A,500.5 +Line B,500.4 +Line C,499.2 +Line D,503.4 +Line A,500.3 +Line B,502.6 +Line C,498.7 +Line D,502.2 +Line A,498.2 +Line B,502.4 +Line C,499.9 +Line D,501.7 +Line A,502.6 +Line B,501.3 +Line C,497.3 +Line D,501.8 +Line A,499.2 +Line B,500.2 +Line C,500.0 +Line D,503.0 +Line A,499.1 +Line B,502.4 +Line C,500.6 +Line D,502.5 +Line A,499.1 +Line B,504.0 +Line C,498.4 +Line D,501.3 +Line A,500.7 +Line B,498.9 +Line C,495.5 +Line D,501.4 +Line A,500.7 +Line B,499.5 +Line C,497.6 +Line D,502.3 +Line A,499.7 +Line B,501.9 +Line C,498.6 +Line D,502.3 +Line A,500.0 +Line B,509.2 +Line C,499.3 +Line D,501.8 +Line A,498.8 +Line B,499.7 +Line C,498.6 +Line D,509.8 +Line A,501.1 +Line B,503.5 +Line C,498.1 +Line D,502.0 +Line A,493.7 +Line B,498.9 +Line C,500.5 +Line D,501.0 +Line A,499.8 +Line B,501.3 +Line C,494.3 +Line D,500.5 +Line A,501.0 +Line B,508.9 +Line C,496.2 +Line D,501.6 +Line A,500.6 +Line B,500.7 +Line C,497.8 +Line D,501.0 +Line A,499.6 +Line B,503.7 +Line C,498.0 +Line D,502.9 +Line A,501.2 +Line B,503.3 +Line C,497.9 +Line D,502.6 +Line A,498.5 +Line B,501.1 +Line C,499.7 +Line D,502.0 +Line A,500.4 +Line B,501.0 +Line C,500.8 +Line D,503.5 +Line A,505.0 +Line B,505.8 +Line C,501.7 +Line D,503.2 +Line A,500.0 +Line B,495.8 +Line C,499.6 +Line D,502.1 +Line A,499.7 +Line B,500.2 +Line C,498.9 +Line D,502.6 +Line A,500.7 +Line B,502.7 +Line C,496.8 +Line D,501.1 +Line A,499.4 +Line B,498.8 +Line C,496.0 +Line D,501.6 +Line A,501.5 +Line B,500.9 +Line C,496.5 +Line D,501.6 +Line A,489.9 +Line B,499.4 +Line C,498.7 +Line D,501.7 +Line A,499.0 +Line B,500.9 +Line C,500.0 +Line D,502.9 +Line A,501.1 +Line B,509.3 +Line C,499.0 +Line D,502.8 +Line A,500.9 +Line B,502.3 +Line C,499.8 +Line D,501.5 +Line A,498.7 +Line B,501.2 +Line C,498.8 +Line D,502.1 +Line A,503.3 +Line B,506.0 +Line C,498.2 +Line D,501.5 +Line A,498.9 +Line B,500.1 +Line C,498.3 +Line D,502.7 +Line A,502.0 +Line B,499.4 +Line C,497.1 +Line D,501.0 +Line A,498.4 +Line B,501.2 +Line C,491.0 +Line D,501.9 +Line A,499.0 +Line B,503.4 +Line C,499.2 +Line D,502.2 +Line A,499.7 +Line B,502.1 +Line C,498.1 +Line D,502.9 +Line A,501.3 +Line B,500.2 +Line C,498.9 +Line D,503.0 +Line A,498.3 +Line B,500.3 +Line C,497.8 +Line D,501.7 +Line A,498.5 +Line B,502.3 +Line C,498.4 +Line D,502.8 +Line A,500.7 +Line B,502.9 +Line C,496.6 +Line D,503.2 +Line A,499.8 +Line B,500.3 +Line C,496.9 +Line D,502.3 +Line A,500.6 +Line B,502.5 +Line C,498.6 +Line D,502.4 +Line A,500.4 +Line B,498.5 +Line C,500.0 +Line D,502.0 +Line A,502.7 +Line B,498.8 +Line C,500.2 +Line D,501.7 +Line A,500.1 +Line B,501.9 +Line C,498.7 +Line D,501.3 +Line A,499.5 +Line B,500.2 +Line C,497.4 +Line D,501.4 +Line A,503.1 +Line B,501.7 +Line C,500.1 +Line D,502.6 +Line A,498.1 +Line B,501.0 +Line C,500.0 +Line D,501.7 +Line A,499.9 +Line B,503.3 +Line C,498.3 +Line D,502.7 +Line A,501.3 +Line B,500.5 +Line C,501.2 +Line D,503.0 +Line A,499.5 +Line B,500.7 +Line C,499.7 +Line D,501.7 +Line A,499.8 +Line B,500.4 +Line C,501.3 +Line D,502.8 +Line A,500.4 +Line B,502.8 +Line C,501.1 +Line D,501.7 +Line A,499.3 +Line B,499.0 +Line C,498.5 +Line D,502.7 +Line A,501.4 +Line B,500.2 +Line C,501.0 +Line D,501.1 +Line A,499.4 +Line B,502.8 +Line C,500.3 +Line D,503.6 +Line A,498.7 +Line B,500.7 +Line C,498.9 +Line D,501.1 +Line A,499.8 +Line B,503.6 +Line C,498.0 +Line D,501.6 +Line A,500.3 +Line B,504.1 +Line C,499.3 +Line D,502.1 +Line A,500.4 +Line B,503.1 +Line C,499.4 +Line D,501.6 +Line A,500.8 +Line B,504.5 +Line C,500.8 +Line D,500.5 +Line A,501.3 +Line B,501.1 +Line C,500.2 +Line D,501.3 +Line A,499.6 +Line B,499.4 +Line C,501.4 +Line D,501.8 +Line A,500.4 +Line B,498.8 +Line C,502.4 +Line D,501.8 +Line A,501.3 +Line B,501.7 +Line C,500.1 +Line D,501.3 +Line A,501.3 +Line B,499.2 +Line C,496.8 +Line D,503.5 +Line A,500.6 +Line B,500.9 +Line C,507.5 +Line D,502.4 +Line A,500.0 +Line B,504.8 +Line C,499.5 +Line D,502.7 +Line A,498.8 +Line B,503.8 +Line C,497.1 +Line D,504.2 +Line A,499.9 +Line B,501.5 +Line C,499.0 +Line D,500.8 +Line A,499.8 +Line B,501.0 +Line C,499.4 +Line D,502.1 +Line A,499.7 +Line B,501.1 +Line C,497.9 +Line D,501.8 +Line A,499.7 +Line B,500.9 +Line C,490.5 +Line D,502.2 +Line A,501.3 +Line B,508.5 +Line C,499.3 +Line D,502.7 +Line A,500.7 +Line B,505.1 +Line C,500.0 +Line D,501.5 +Line A,501.9 +Line B,501.4 +Line C,498.1 +Line D,500.8 +Line A,500.8 +Line B,499.1 +Line C,500.0 +Line D,501.1 +Line A,498.5 +Line B,505.5 +Line C,496.4 +Line D,499.1 +Line A,500.8 +Line B,502.8 +Line C,497.2 +Line D,502.7 +Line A,501.1 +Line B,498.0 +Line C,500.5 +Line D,502.6 +Line A,499.3 +Line B,500.5 +Line C,498.2 +Line D,500.4 +Line A,499.4 +Line B,498.3 +Line C,499.6 +Line D,502.7 +Line A,498.8 +Line B,502.8 +Line C,497.8 +Line D,501.7 +Line A,499.9 +Line B,500.6 +Line C,497.4 +Line D,502.5 +Line A,500.1 +Line B,501.9 +Line C,499.5 +Line D,502.0 +Line A,501.5 +Line B,501.7 +Line C,499.9 +Line D,501.9 +Line A,500.1 +Line B,508.4 +Line C,499.5 +Line D,502.1 +Line A,501.0 +Line B,500.2 +Line C,496.4 +Line D,502.9 +Line A,499.6 +Line B,500.2 +Line C,498.0 +Line D,502.7 +Line A,500.2 +Line B,495.7 +Line C,498.3 +Line D,503.2 +Line A,501.1 +Line B,502.5 +Line C,497.1 +Line D,501.3 +Line A,502.2 +Line B,501.6 +Line C,497.2 +Line D,502.7 +Line A,499.4 +Line B,499.0 +Line C,501.9 +Line D,502.8 +Line A,501.5 +Line B,498.5 +Line C,499.8 +Line D,500.4 +Line A,502.6 +Line B,498.6 +Line C,500.4 +Line D,502.2 +Line A,500.6 +Line B,504.7 +Line C,499.2 +Line D,502.0 +Line A,500.5 +Line B,503.0 +Line C,499.2 +Line D,501.0 +Line A,498.1 +Line B,501.4 +Line C,497.4 +Line D,503.3 +Line A,502.0 +Line B,505.4 +Line C,497.2 +Line D,502.7 +Line A,500.2 +Line B,501.5 +Line C,498.0 +Line D,501.8 +Line A,499.4 +Line B,499.7 +Line C,500.0 +Line D,501.8 +Line A,500.5 +Line B,503.1 +Line C,498.8 +Line D,500.9 +Line A,502.1 +Line B,499.3 +Line C,499.7 +Line D,503.7 +Line A,501.3 +Line B,501.6 +Line C,500.8 +Line D,501.2 +Line A,508.6 +Line B,498.9 +Line C,499.3 +Line D,501.6 +Line A,500.6 +Line B,501.2 +Line C,502.0 +Line D,501.2 +Line A,499.8 +Line B,507.4 +Line C,498.3 +Line D,502.4 +Line A,500.0 +Line B,506.2 +Line C,497.6 +Line D,502.0 +Line A,500.8 +Line B,503.5 +Line C,497.5 +Line D,502.1 +Line A,501.0 +Line B,496.8 +Line C,499.9 +Line D,501.7 +Line A,499.8 +Line B,502.2 +Line C,498.7 +Line D,501.4 +Line A,502.7 +Line B,500.9 +Line C,497.9 +Line D,501.5 +Line A,498.9 +Line B,502.7 +Line C,498.9 +Line D,501.4 +Line A,501.7 +Line B,498.5 +Line C,500.6 +Line D,502.8 +Line A,498.7 +Line B,501.5 +Line C,500.4 +Line D,502.9 +Line A,497.4 +Line B,498.5 +Line C,498.2 +Line D,501.2 +Line A,500.0 +Line B,500.6 +Line C,499.9 +Line D,502.8 +Line A,502.5 +Line B,504.4 +Line C,499.6 +Line D,502.7 +Line A,500.4 +Line B,500.2 +Line C,499.3 +Line D,502.1 +Line A,499.1 +Line B,497.8 +Line C,499.5 +Line D,503.4 +Line A,500.6 +Line B,507.8 +Line C,498.7 +Line D,502.4 +Line A,502.3 +Line B,502.3 +Line C,498.8 +Line D,503.1 +Line A,500.6 +Line B,506.3 +Line C,500.6 +Line D,501.8 +Line A,499.4 +Line B,502.4 +Line C,497.6 +Line D,503.4 +Line A,498.7 +Line B,497.9 +Line C,499.8 +Line D,500.6 +Line A,503.2 +Line B,500.6 +Line C,498.2 +Line D,502.3 +Line A,501.1 +Line B,504.4 +Line C,498.1 +Line D,491.5 +Line A,500.6 +Line B,500.5 +Line C,500.5 +Line D,502.1 +Line A,501.1 +Line B,503.6 +Line C,499.6 +Line D,502.2 +Line A,500.9 +Line B,501.5 +Line C,498.3 +Line D,501.5 +Line A,500.2 +Line B,502.4 +Line C,498.9 +Line D,502.2 +Line A,500.9 +Line B,501.6 +Line C,500.7 +Line D,501.5 +Line A,499.6 +Line B,501.0 +Line C,499.2 +Line D,503.1 +Line A,500.8 +Line B,499.4 +Line C,500.7 +Line D,501.7 +Line A,501.9 +Line B,498.6 +Line C,497.9 +Line D,501.4 +Line A,501.4 +Line B,498.3 +Line C,498.7 +Line D,502.4 +Line A,499.6 +Line B,500.9 +Line C,497.8 +Line D,501.2 +Line A,501.1 +Line B,499.9 +Line C,496.1 +Line D,501.7 +Line A,500.0 +Line B,498.6 +Line C,498.0 +Line D,502.7 +Line A,503.0 +Line B,502.2 +Line C,498.6 +Line D,501.5 +Line A,507.5 +Line B,500.8 +Line C,501.1 +Line D,502.4 +Line A,502.0 +Line B,500.2 +Line C,497.8 +Line D,501.1 +Line A,501.0 +Line B,500.4 +Line C,497.8 +Line D,502.0 +Line A,501.3 +Line B,500.5 +Line C,498.1 +Line D,502.1 +Line A,501.8 +Line B,501.7 +Line C,498.3 +Line D,502.6 +Line A,501.3 +Line B,502.8 +Line C,500.5 +Line D,500.6 +Line A,500.1 +Line B,503.6 +Line C,499.3 +Line D,502.5 +Line A,500.1 +Line B,501.9 +Line C,499.4 +Line D,501.7 +Line A,501.3 +Line B,496.8 +Line C,500.7 +Line D,501.8 +Line A,502.1 +Line B,500.4 +Line C,497.2 +Line D,501.0 +Line A,500.4 +Line B,503.8 +Line C,499.2 +Line D,502.6 +Line A,499.3 +Line B,498.6 +Line C,499.6 +Line D,503.1 +Line A,499.4 +Line B,501.0 +Line C,500.9 +Line D,501.1 +Line A,501.0 +Line B,499.5 +Line C,496.2 +Line D,502.3 +Line A,499.3 +Line B,497.7 +Line C,498.7 +Line D,503.5 +Line A,500.0 +Line B,500.1 +Line C,496.6 +Line D,500.6 +Line A,500.7 +Line B,502.5 +Line C,499.5 +Line D,500.5 +Line A,500.2 +Line B,499.8 +Line C,497.5 +Line D,501.5 +Line A,500.8 +Line B,502.1 +Line C,499.6 +Line D,503.8 +Line A,500.0 +Line B,498.7 +Line C,499.4 +Line D,501.6 +Line A,499.5 +Line B,500.9 +Line C,496.6 +Line D,502.6 +Line A,501.4 +Line B,501.3 +Line C,497.5 +Line D,502.0 +Line A,500.3 +Line B,500.3 +Line C,499.5 +Line D,502.1 +Line A,501.6 +Line B,507.0 +Line C,499.8 +Line D,502.8 +Line A,500.9 +Line B,501.0 +Line C,500.1 +Line D,502.1 +Line A,501.3 +Line B,502.6 +Line C,499.0 +Line D,501.6 +Line A,500.3 +Line B,504.4 +Line C,500.6 +Line D,502.4 +Line A,501.8 +Line B,500.7 +Line C,500.1 +Line D,493.0 +Line A,499.7 +Line B,498.2 +Line C,500.5 +Line D,501.3 +Line A,501.4 +Line B,501.5 +Line C,498.8 +Line D,502.1 +Line A,500.3 +Line B,499.5 +Line C,499.3 +Line D,502.2 +Line A,501.0 +Line B,503.7 +Line C,498.4 +Line D,503.0 +Line A,499.8 +Line B,501.6 +Line C,498.9 +Line D,501.5 +Line A,502.1 +Line B,502.3 +Line C,498.7 +Line D,504.0 +Line A,499.8 +Line B,497.9 +Line C,499.4 +Line D,501.7 +Line A,500.0 +Line B,503.0 +Line C,492.7 +Line D,502.5 +Line A,501.7 +Line B,501.6 +Line C,499.5 +Line D,501.7 +Line A,500.0 +Line B,501.6 +Line C,500.5 +Line D,502.1 +Line A,500.0 +Line B,500.7 +Line C,500.1 +Line D,501.5 +Line A,501.6 +Line B,501.5 +Line C,498.1 +Line D,502.4 +Line A,498.8 +Line B,502.8 +Line C,499.7 +Line D,501.9 +Line A,500.5 +Line B,503.1 +Line C,498.1 +Line D,502.9 +Line A,500.8 +Line B,498.1 +Line C,498.7 +Line D,508.1 +Line A,507.3 +Line B,499.9 +Line C,498.5 +Line D,502.4 +Line A,502.0 +Line B,499.6 +Line C,498.1 +Line D,501.5 +Line A,501.5 +Line B,502.7 +Line C,502.3 +Line D,502.1 +Line A,501.6 +Line B,503.0 +Line C,501.7 +Line D,501.8 +Line A,498.2 +Line B,499.2 +Line C,499.6 +Line D,501.5 +Line A,498.8 +Line B,503.0 +Line C,497.4 +Line D,500.9 +Line A,500.7 +Line B,500.5 +Line C,496.8 +Line D,501.7 +Line A,500.7 +Line B,500.6 +Line C,495.7 +Line D,501.2 +Line A,499.8 +Line B,499.5 +Line C,499.7 +Line D,502.4 +Line A,497.6 +Line B,498.5 +Line C,499.7 +Line D,501.0 +Line A,502.6 +Line B,498.6 +Line C,495.4 +Line D,501.5 +Line A,499.9 +Line B,497.1 +Line C,501.2 +Line D,500.6 +Line A,500.5 +Line B,495.9 +Line C,500.0 +Line D,501.4 +Line A,502.2 +Line B,499.3 +Line C,498.1 +Line D,502.4 +Line A,502.0 +Line B,501.3 +Line C,498.0 +Line D,501.4 +Line A,499.4 +Line B,499.8 +Line C,498.2 +Line D,501.2 +Line A,499.8 +Line B,502.5 +Line C,501.3 +Line D,500.5 +Line A,500.7 +Line B,504.3 +Line C,499.9 +Line D,501.8 +Line A,498.9 +Line B,499.9 +Line C,500.8 +Line D,508.8 +Line A,500.3 +Line B,502.0 +Line C,498.2 +Line D,501.2 +Line A,498.3 +Line B,503.3 +Line C,499.6 +Line D,501.3 +Line A,501.4 +Line B,502.1 +Line C,498.5 +Line D,503.6 +Line A,501.7 +Line B,498.1 +Line C,498.3 +Line D,502.2 +Line A,500.0 +Line B,502.0 +Line C,498.1 +Line D,501.7 +Line A,499.6 +Line B,499.6 +Line C,499.5 +Line D,500.9 +Line A,500.8 +Line B,501.3 +Line C,499.5 +Line D,501.7 +Line A,500.0 +Line B,502.1 +Line C,498.8 +Line D,502.9 +Line A,502.0 +Line B,504.1 +Line C,500.5 +Line D,501.9 +Line A,503.2 +Line B,503.1 +Line C,499.8 +Line D,502.6 +Line A,502.2 +Line B,499.6 +Line C,499.3 +Line D,502.6 +Line A,499.9 +Line B,501.3 +Line C,498.7 +Line D,502.3 +Line A,500.0 +Line B,503.0 +Line C,498.2 +Line D,502.1 +Line A,501.8 +Line B,501.1 +Line C,499.8 +Line D,501.7 +Line A,498.6 +Line B,503.3 +Line C,501.7 +Line D,502.2 +Line A,501.7 +Line B,502.0 +Line C,498.2 +Line D,501.3 +Line A,502.5 +Line B,503.4 +Line C,497.9 +Line D,503.1 +Line A,500.8 +Line B,500.8 +Line C,501.1 +Line D,502.0 +Line A,500.7 +Line B,500.1 +Line C,498.8 +Line D,503.1 +Line A,498.2 +Line B,499.0 +Line C,499.1 +Line D,499.7 +Line A,501.9 +Line B,499.4 +Line C,501.1 +Line D,502.3 +Line A,500.9 +Line B,499.0 +Line C,499.3 +Line D,504.8 +Line A,500.2 +Line B,500.4 +Line C,497.9 +Line D,503.5 +Line A,499.4 +Line B,500.5 +Line C,499.0 +Line D,502.6 +Line A,501.3 +Line B,503.5 +Line C,498.0 +Line D,502.4 +Line A,501.3 +Line B,500.9 +Line C,497.7 +Line D,502.7 +Line A,500.5 +Line B,500.1 +Line C,499.1 +Line D,500.8 +Line A,500.4 +Line B,501.9 +Line C,498.8 +Line D,502.0 +Line A,500.1 +Line B,502.6 +Line C,500.3 +Line D,502.6 +Line A,500.8 +Line B,499.9 +Line C,499.0 +Line D,502.9 +Line A,500.9 +Line B,501.5 +Line C,497.9 +Line D,503.5 +Line A,499.8 +Line B,503.8 +Line C,498.6 +Line D,501.8 +Line A,500.4 +Line B,503.9 +Line C,501.2 +Line D,502.2 +Line A,501.4 +Line B,498.6 +Line C,498.0 +Line D,501.5 +Line A,499.9 +Line B,501.4 +Line C,501.0 +Line D,507.3 +Line A,501.1 +Line B,503.1 +Line C,499.2 +Line D,501.7 +Line A,501.7 +Line B,500.9 +Line C,501.1 +Line D,502.5 +Line A,499.1 +Line B,503.7 +Line C,498.3 +Line D,502.0 +Line A,500.3 +Line B,501.9 +Line C,499.8 +Line D,503.1 +Line A,501.4 +Line B,502.7 +Line C,499.2 +Line D,501.3 +Line A,500.0 +Line B,499.5 +Line C,499.5 +Line D,502.0 +Line A,501.2 +Line B,502.7 +Line C,497.9 +Line D,500.4 +Line A,499.9 +Line B,502.4 +Line C,501.1 +Line D,500.5 +Line A,500.2 +Line B,501.4 +Line C,501.1 +Line D,501.9 +Line A,499.9 +Line B,499.2 +Line C,499.2 +Line D,503.0 +Line A,501.2 +Line B,504.5 +Line C,498.6 +Line D,501.4 +Line A,501.1 +Line B,500.4 +Line C,499.3 +Line D,500.3 +Line A,501.2 +Line B,499.1 +Line C,500.4 +Line D,501.3 +Line A,501.1 +Line B,500.4 +Line C,497.9 +Line D,501.2 +Line A,498.2 +Line B,505.1 +Line C,499.5 +Line D,503.3 +Line A,502.4 +Line B,500.4 +Line C,499.4 +Line D,501.2 +Line A,501.3 +Line B,496.7 +Line C,501.0 +Line D,501.7 +Line A,498.2 +Line B,500.8 +Line C,499.3 +Line D,501.4 +Line A,501.9 +Line B,499.3 +Line C,498.3 +Line D,501.4 +Line A,499.8 +Line B,502.4 +Line C,499.2 +Line D,500.8 +Line A,499.1 +Line B,502.8 +Line C,498.7 +Line D,502.6 +Line A,501.9 +Line B,501.7 +Line C,495.6 +Line D,500.8 +Line A,500.9 +Line B,504.5 +Line C,502.3 +Line D,502.3 +Line A,501.0 +Line B,504.4 +Line C,500.8 +Line D,502.9 +Line A,497.8 +Line B,500.5 +Line C,500.0 +Line D,501.3 +Line A,501.2 +Line B,500.2 +Line C,497.8 +Line D,504.0 +Line A,500.9 +Line B,500.2 +Line C,497.9 +Line D,502.2 +Line A,501.7 +Line B,498.3 +Line C,502.0 +Line D,502.4 +Line A,498.6 +Line B,501.3 +Line C,499.0 +Line D,500.9 +Line A,501.0 +Line B,497.2 +Line C,497.0 +Line D,500.7 +Line A,501.3 +Line B,504.1 +Line C,501.2 +Line D,501.3 +Line A,500.4 +Line B,504.4 +Line C,498.2 +Line D,501.7 +Line A,501.3 +Line B,503.0 +Line C,499.9 +Line D,501.7 +Line A,500.5 +Line B,502.0 +Line C,495.6 +Line D,500.5 +Line A,499.4 +Line B,500.5 +Line C,499.9 +Line D,500.2 +Line A,501.0 +Line B,500.7 +Line C,499.1 +Line D,502.6 +Line A,501.9 +Line B,501.9 +Line C,502.7 +Line D,501.5 +Line A,500.7 +Line B,505.1 +Line C,499.6 +Line D,502.6 +Line A,500.4 +Line B,499.0 +Line C,497.0 +Line D,500.9 +Line A,501.8 +Line B,502.6 +Line C,500.0 +Line D,500.0 +Line A,502.9 +Line B,501.6 +Line C,498.0 +Line D,502.2 +Line A,499.8 +Line B,502.1 +Line C,498.4 +Line D,503.0 +Line A,500.2 +Line B,500.5 +Line C,499.6 +Line D,501.6 +Line A,498.5 +Line B,500.2 +Line C,499.6 +Line D,500.9 +Line A,499.3 +Line B,502.9 +Line C,501.0 +Line D,502.0 +Line A,499.6 +Line B,503.2 +Line C,500.7 +Line D,503.8 +Line A,500.0 +Line B,500.5 +Line C,498.1 +Line D,503.7 +Line A,499.1 +Line B,504.3 +Line C,497.2 +Line D,501.0 +Line A,498.2 +Line B,501.1 +Line C,496.4 +Line D,502.0 +Line A,507.8 +Line B,497.3 +Line C,498.8 +Line D,501.2 +Line A,500.4 +Line B,500.6 +Line C,499.6 +Line D,503.0 +Line A,501.2 +Line B,501.0 +Line C,498.9 +Line D,501.8 +Line A,501.2 +Line B,500.6 +Line C,497.6 +Line D,501.2 +Line A,498.9 +Line B,503.1 +Line C,502.9 +Line D,502.5 +Line A,500.8 +Line B,501.4 +Line C,499.6 +Line D,502.8 +Line A,501.5 +Line B,499.9 +Line C,502.0 +Line D,502.4 +Line A,493.1 +Line B,501.7 +Line C,500.2 +Line D,500.7 +Line A,502.0 +Line B,497.6 +Line C,499.1 +Line D,502.6 +Line A,500.7 +Line B,499.9 +Line C,500.4 +Line D,504.1 +Line A,498.9 +Line B,501.7 +Line C,496.9 +Line D,501.5 +Line A,498.8 +Line B,501.5 +Line C,500.2 +Line D,503.0 +Line A,499.1 +Line B,503.0 +Line C,498.3 +Line D,503.6 +Line A,499.1 +Line B,502.8 +Line C,499.9 +Line D,496.5 +Line A,501.4 +Line B,502.1 +Line C,498.5 +Line D,502.4 +Line A,500.2 +Line B,501.9 +Line C,501.4 +Line D,502.2 +Line A,501.1 +Line B,501.1 +Line C,499.7 +Line D,500.8 +Line A,502.8 +Line B,503.0 +Line C,499.7 +Line D,501.3 +Line A,500.4 +Line B,499.6 +Line C,499.6 +Line D,503.9 +Line A,500.7 +Line B,500.6 +Line C,500.2 +Line D,503.9 +Line A,498.4 +Line B,500.6 +Line C,499.0 +Line D,502.6 +Line A,499.4 +Line B,500.9 +Line C,500.0 +Line D,502.8 +Line A,499.2 +Line B,499.6 +Line C,497.9 +Line D,501.5 +Line A,501.3 +Line B,500.8 +Line C,500.6 +Line D,501.3 +Line A,499.3 +Line B,501.5 +Line C,500.4 +Line D,501.9 +Line A,502.0 +Line B,499.7 +Line C,499.0 +Line D,502.1 +Line A,503.1 +Line B,502.4 +Line C,498.0 +Line D,499.9 +Line A,502.1 +Line B,503.8 +Line C,497.6 +Line D,503.6 +Line A,501.1 +Line B,501.4 +Line C,497.7 +Line D,501.7 +Line A,500.6 +Line B,502.1 +Line C,497.2 +Line D,502.7 +Line A,501.6 +Line B,501.6 +Line C,497.9 +Line D,502.6 +Line A,500.3 +Line B,498.6 +Line C,500.4 +Line D,502.2 +Line A,500.6 +Line B,502.5 +Line C,500.9 +Line D,501.8 +Line A,503.2 +Line B,504.0 +Line C,499.1 +Line D,502.0 +Line A,501.6 +Line B,501.5 +Line C,498.9 +Line D,502.2 +Line A,500.0 +Line B,502.5 +Line C,500.3 +Line D,501.7 +Line A,498.6 +Line B,501.0 +Line C,497.9 +Line D,503.4 +Line A,502.4 +Line B,502.2 +Line C,500.4 +Line D,501.4 +Line A,499.2 +Line B,502.4 +Line C,490.8 +Line D,501.5 +Line A,505.7 +Line B,499.8 +Line C,499.2 +Line D,502.8 +Line A,499.7 +Line B,499.7 +Line C,498.7 +Line D,501.1 +Line A,500.0 +Line B,498.7 +Line C,497.8 +Line D,503.0 +Line A,500.2 +Line B,500.8 +Line C,496.8 +Line D,502.1 +Line A,499.5 +Line B,501.5 +Line C,497.7 +Line D,502.6 +Line A,501.9 +Line B,497.1 +Line C,499.4 +Line D,501.4 +Line A,498.9 +Line B,501.2 +Line C,498.2 +Line D,504.2 +Line A,499.6 +Line B,499.8 +Line C,498.8 +Line D,503.1 +Line A,500.5 +Line B,502.1 +Line C,499.3 +Line D,501.5 +Line A,501.4 +Line B,501.1 +Line C,502.6 +Line D,502.1 +Line A,499.1 +Line B,504.3 +Line C,496.0 +Line D,501.4 +Line A,499.8 +Line B,503.5 +Line C,499.2 +Line D,502.9 +Line A,503.5 +Line B,498.1 +Line C,499.0 +Line D,502.9 +Line A,500.1 +Line B,501.5 +Line C,497.8 +Line D,503.4 +Line A,503.7 +Line B,500.3 +Line C,499.5 +Line D,501.2 +Line A,499.6 +Line B,498.7 +Line C,499.4 +Line D,502.8 +Line A,501.6 +Line B,502.3 +Line C,500.2 +Line D,502.1 +Line A,500.5 +Line B,498.3 +Line C,500.8 +Line D,501.8 +Line A,500.9 +Line B,502.0 +Line C,500.4 +Line D,503.2 +Line A,502.5 +Line B,498.4 +Line C,500.3 +Line D,501.4 +Line A,498.8 +Line B,500.2 +Line C,500.0 +Line D,503.0 +Line A,500.7 +Line B,501.6 +Line C,496.8 +Line D,502.6 +Line A,501.1 +Line B,502.6 +Line C,500.4 +Line D,503.4 +Line A,501.7 +Line B,498.9 +Line C,499.6 +Line D,500.7 +Line A,499.4 +Line B,502.4 +Line C,498.7 +Line D,500.5 +Line A,502.7 +Line B,499.6 +Line C,498.8 +Line D,500.6 +Line A,500.1 +Line B,498.4 +Line C,498.3 +Line D,503.9 +Line A,500.8 +Line B,503.0 +Line C,499.6 +Line D,501.8 +Line A,499.4 +Line B,504.1 +Line C,497.3 +Line D,502.4 +Line A,499.9 +Line B,501.2 +Line C,500.2 +Line D,503.5 +Line A,501.4 +Line B,502.5 +Line C,499.0 +Line D,502.1 +Line A,497.1 +Line B,501.6 +Line C,502.4 +Line D,502.6 +Line A,499.9 +Line B,499.5 +Line C,498.8 +Line D,502.7 +Line A,498.7 +Line B,501.7 +Line C,499.1 +Line D,500.9 +Line A,499.5 +Line B,503.1 +Line C,500.7 +Line D,503.9 +Line A,498.7 +Line B,504.1 +Line C,500.5 +Line D,502.9 +Line A,494.9 +Line B,500.6 +Line C,499.2 +Line D,501.7 +Line A,500.0 +Line B,500.3 +Line C,498.1 +Line D,501.8 +Line A,501.6 +Line B,499.9 +Line C,495.4 +Line D,502.4 +Line A,502.2 +Line B,499.3 +Line C,496.0 +Line D,503.0 +Line A,497.7 +Line B,502.1 +Line C,498.5 +Line D,501.3 +Line A,498.7 +Line B,505.8 +Line C,499.2 +Line D,501.6 +Line A,499.8 +Line B,503.7 +Line C,501.0 +Line D,502.3 +Line A,501.3 +Line B,502.1 +Line C,499.1 +Line D,502.5 +Line A,499.9 +Line B,500.1 +Line C,496.6 +Line D,502.2 +Line A,501.5 +Line B,499.8 +Line C,497.8 +Line D,503.1 +Line A,499.4 +Line B,501.2 +Line C,501.2 +Line D,499.6 +Line A,502.7 +Line B,504.1 +Line C,496.6 +Line D,500.8 +Line A,499.1 +Line B,501.0 +Line C,495.7 +Line D,502.2 +Line A,498.3 +Line B,499.8 +Line C,499.7 +Line D,502.5 +Line A,501.4 +Line B,498.5 +Line C,496.9 +Line D,502.1 +Line A,501.4 +Line B,501.4 +Line C,497.4 +Line D,501.2 +Line A,499.4 +Line B,501.7 +Line C,497.0 +Line D,502.1 +Line A,500.0 +Line B,500.9 +Line C,500.1 +Line D,501.9 +Line A,499.7 +Line B,500.6 +Line C,500.2 +Line D,501.7 +Line A,502.9 +Line B,500.7 +Line C,497.5 +Line D,501.4 +Line A,500.0 +Line B,502.9 +Line C,498.4 +Line D,501.1 +Line A,500.9 +Line B,500.5 +Line C,498.6 +Line D,501.4 +Line A,500.9 +Line B,501.2 +Line C,499.1 +Line D,502.5 +Line A,499.1 +Line B,499.0 +Line C,499.8 +Line D,503.6 +Line A,501.1 +Line B,497.4 +Line C,498.7 +Line D,501.6 +Line A,500.3 +Line B,502.7 +Line C,501.1 +Line D,501.5 +Line A,499.3 +Line B,500.9 +Line C,500.9 +Line D,501.5 +Line A,499.0 +Line B,501.8 +Line C,499.5 +Line D,503.0 +Line A,499.6 +Line B,501.6 +Line C,499.9 +Line D,502.6 +Line A,501.5 +Line B,504.7 +Line C,497.5 +Line D,503.9 +Line A,499.5 +Line B,503.1 +Line C,499.1 +Line D,501.9 +Line A,501.0 +Line B,504.5 +Line C,500.8 +Line D,500.3 +Line A,506.0 +Line B,502.3 +Line C,496.3 +Line D,502.5 +Line A,498.9 +Line B,499.6 +Line C,500.1 +Line D,504.9 +Line A,498.2 +Line B,504.1 +Line C,499.0 +Line D,502.5 +Line A,501.1 +Line B,501.4 +Line C,499.8 +Line D,502.3 +Line A,501.1 +Line B,503.8 +Line C,498.4 +Line D,502.6 +Line A,500.0 +Line B,501.4 +Line C,496.5 +Line D,502.4 +Line A,499.6 +Line B,501.8 +Line C,501.0 +Line D,502.5 +Line A,502.4 +Line B,505.0 +Line C,499.5 +Line D,503.7 +Line A,501.2 +Line B,499.3 +Line C,501.6 +Line D,502.4 +Line A,500.7 +Line B,499.8 +Line C,499.8 +Line D,501.2 +Line A,501.9 +Line B,503.0 +Line C,496.4 +Line D,501.8 +Line A,501.4 +Line B,500.7 +Line C,499.8 +Line D,501.4 +Line A,501.3 +Line B,503.5 +Line C,498.7 +Line D,501.6 +Line A,500.7 +Line B,499.8 +Line C,497.5 +Line D,502.0 +Line A,499.0 +Line B,500.9 +Line C,500.2 +Line D,501.9 +Line A,503.0 +Line B,499.9 +Line C,497.0 +Line D,502.6 +Line A,501.2 +Line B,503.9 +Line C,498.5 +Line D,503.1 +Line A,500.6 +Line B,501.9 +Line C,498.1 +Line D,503.7 +Line A,500.5 +Line B,502.0 +Line C,500.4 +Line D,502.5 +Line A,498.7 +Line B,500.0 +Line C,499.0 +Line D,500.7 +Line A,499.5 +Line B,499.3 +Line C,497.3 +Line D,501.3 +Line A,501.3 +Line B,500.3 +Line C,498.3 +Line D,502.5 +Line A,499.1 +Line B,501.2 +Line C,501.0 +Line D,500.8 +Line A,500.8 +Line B,502.8 +Line C,498.1 +Line D,501.4 +Line A,502.0 +Line B,501.7 +Line C,496.4 +Line D,502.5 +Line A,500.9 +Line B,503.0 +Line C,498.4 +Line D,502.0 +Line A,501.9 +Line B,502.0 +Line C,500.1 +Line D,501.7 +Line A,500.2 +Line B,500.6 +Line C,498.0 +Line D,502.4 +Line A,500.2 +Line B,499.9 +Line C,496.0 +Line D,502.1 +Line A,499.5 +Line B,498.9 +Line C,497.9 +Line D,501.3 +Line A,502.1 +Line B,498.9 +Line C,499.3 +Line D,502.2 +Line A,500.7 +Line B,500.9 +Line C,501.6 +Line D,500.9 +Line A,499.5 +Line B,497.2 +Line C,501.5 +Line D,503.1 +Line A,500.1 +Line B,498.9 +Line C,499.2 +Line D,501.4 +Line A,501.1 +Line B,500.4 +Line C,499.5 +Line D,501.5 +Line A,500.6 +Line B,501.1 +Line C,501.8 +Line D,502.2 +Line A,500.8 +Line B,503.8 +Line C,498.7 +Line D,500.9 +Line A,500.9 +Line B,502.4 +Line C,499.2 +Line D,503.5 +Line A,499.7 +Line B,499.0 +Line C,499.0 +Line D,503.5 +Line A,501.1 +Line B,503.4 +Line C,501.8 +Line D,501.8 +Line A,499.9 +Line B,499.2 +Line C,499.6 +Line D,503.0 +Line A,498.8 +Line B,501.8 +Line C,498.9 +Line D,502.8 +Line A,493.7 +Line B,501.0 +Line C,498.1 +Line D,502.3 +Line A,501.1 +Line B,499.5 +Line C,499.6 +Line D,501.8 +Line A,501.7 +Line B,500.2 +Line C,498.8 +Line D,501.0 +Line A,501.0 +Line B,500.2 +Line C,497.1 +Line D,503.5 +Line A,499.7 +Line B,502.2 +Line C,500.7 +Line D,501.1 +Line A,501.5 +Line B,504.8 +Line C,495.9 +Line D,495.1 +Line A,501.0 +Line B,497.5 +Line C,498.9 +Line D,502.0 +Line A,501.0 +Line B,499.9 +Line C,498.8 +Line D,502.7 +Line A,501.6 +Line B,502.5 +Line C,498.3 +Line D,502.8 +Line A,500.1 +Line B,498.9 +Line C,501.7 +Line D,501.5 +Line A,500.7 +Line B,502.8 +Line C,497.6 +Line D,502.6 +Line A,499.2 +Line B,501.6 +Line C,498.8 +Line D,502.7 +Line A,501.3 +Line B,501.6 +Line C,498.5 +Line D,503.3 +Line A,500.3 +Line B,502.0 +Line C,498.2 +Line D,501.3 +Line A,502.3 +Line B,499.6 +Line C,501.7 +Line D,502.3 +Line A,501.2 +Line B,500.0 +Line C,499.2 +Line D,503.2 +Line A,501.4 +Line B,499.4 +Line C,499.8 +Line D,501.8 +Line A,501.8 +Line B,501.3 +Line C,499.3 +Line D,501.4 +Line A,500.9 +Line B,503.4 +Line C,499.6 +Line D,502.0 +Line A,500.2 +Line B,499.9 +Line C,498.4 +Line D,502.9 +Line A,501.5 +Line B,500.2 +Line C,499.5 +Line D,502.7 +Line A,501.7 +Line B,500.6 +Line C,496.7 +Line D,501.1 +Line A,501.3 +Line B,502.9 +Line C,497.1 +Line D,501.6 +Line A,500.0 +Line B,504.0 +Line C,499.1 +Line D,501.4 +Line A,500.8 +Line B,499.8 +Line C,495.9 +Line D,500.1 +Line A,501.0 +Line B,504.0 +Line C,498.4 +Line D,501.9 +Line A,498.9 +Line B,498.9 +Line C,502.2 +Line D,501.7 +Line A,499.4 +Line B,501.0 +Line C,499.7 +Line D,494.9 +Line A,500.2 +Line B,503.7 +Line C,500.1 +Line D,500.3 +Line A,510.0 +Line B,503.3 +Line C,501.5 +Line D,501.5 +Line A,501.0 +Line B,501.7 +Line C,503.0 +Line D,501.1 +Line A,500.3 +Line B,498.9 +Line C,498.7 +Line D,501.6 +Line A,500.2 +Line B,501.1 +Line C,500.3 +Line D,504.5 +Line A,501.0 +Line B,500.1 +Line C,500.1 +Line D,502.9 +Line A,507.8 +Line B,503.3 +Line C,500.7 +Line D,502.6 +Line A,498.9 +Line B,501.1 +Line C,497.5 +Line D,502.3 +Line A,499.7 +Line B,502.9 +Line C,498.0 +Line D,500.9 +Line A,499.1 +Line B,502.3 +Line C,497.9 +Line D,502.3 +Line A,500.1 +Line B,495.5 +Line C,499.9 +Line D,500.8 +Line A,500.8 +Line B,502.1 +Line C,496.6 +Line D,502.0 +Line A,500.3 +Line B,502.5 +Line C,500.6 +Line D,501.9 +Line A,499.4 +Line B,500.4 +Line C,502.7 +Line D,501.8 +Line A,500.1 +Line B,503.9 +Line C,497.1 +Line D,501.8 +Line A,501.5 +Line B,504.0 +Line C,496.8 +Line D,501.9 +Line A,500.4 +Line B,499.2 +Line C,500.9 +Line D,503.0 +Line A,501.0 +Line B,502.4 +Line C,499.8 +Line D,501.1 +Line A,501.7 +Line B,504.2 +Line C,497.2 +Line D,500.4 +Line A,499.7 +Line B,501.9 +Line C,500.1 +Line D,502.3 +Line A,500.1 +Line B,501.3 +Line C,499.9 +Line D,502.7 +Line A,499.6 +Line B,501.0 +Line C,496.5 +Line D,501.5 +Line A,499.8 +Line B,500.5 +Line C,501.8 +Line D,503.1 +Line A,500.1 +Line B,499.6 +Line C,499.6 +Line D,503.2 +Line A,500.9 +Line B,500.6 +Line C,500.9 +Line D,502.3 +Line A,498.4 +Line B,499.2 +Line C,500.9 +Line D,502.1 +Line A,499.0 +Line B,499.8 +Line C,500.9 +Line D,502.4 +Line A,499.2 +Line B,505.1 +Line C,499.6 +Line D,503.1 +Line A,499.6 +Line B,501.7 +Line C,500.9 +Line D,500.6 +Line A,501.7 +Line B,488.8 +Line C,498.0 +Line D,503.2 +Line A,499.2 +Line B,502.1 +Line C,497.6 +Line D,501.5 +Line A,502.1 +Line B,503.3 +Line C,498.0 +Line D,502.5 +Line A,500.4 +Line B,502.3 +Line C,498.9 +Line D,503.4 +Line A,499.9 +Line B,502.8 +Line C,498.4 +Line D,503.6 +Line A,499.2 +Line B,500.0 +Line C,499.6 +Line D,501.0 +Line A,499.8 +Line B,502.6 +Line C,498.7 +Line D,501.5 +Line A,499.8 +Line B,501.3 +Line C,507.9 +Line D,501.8 +Line A,489.9 +Line B,501.8 +Line C,502.4 +Line D,501.0 +Line A,500.3 +Line B,500.1 +Line C,497.1 +Line D,502.2 +Line A,498.3 +Line B,504.2 +Line C,499.0 +Line D,502.1 +Line A,500.4 +Line B,500.8 +Line C,502.0 +Line D,501.6 +Line A,499.7 +Line B,502.8 +Line C,497.1 +Line D,502.8 +Line A,499.8 +Line B,497.4 +Line C,496.3 +Line D,503.0 +Line A,500.6 +Line B,504.2 +Line C,497.7 +Line D,501.7 +Line A,498.8 +Line B,511.0 +Line C,500.5 +Line D,502.8 +Line A,499.7 +Line B,500.9 +Line C,496.4 +Line D,502.9 +Line A,499.8 +Line B,502.0 +Line C,499.0 +Line D,502.6 +Line A,500.3 +Line B,503.4 +Line C,498.0 +Line D,502.7 +Line A,501.8 +Line B,501.5 +Line C,498.2 +Line D,501.1 +Line A,499.6 +Line B,502.2 +Line C,502.2 +Line D,502.4 +Line A,500.6 +Line B,496.8 +Line C,500.3 +Line D,501.2 +Line A,500.2 +Line B,503.0 +Line C,499.4 +Line D,502.8 +Line A,502.8 +Line B,498.2 +Line C,500.8 +Line D,501.2 +Line A,501.9 +Line B,504.5 +Line C,498.2 +Line D,501.3 +Line A,499.9 +Line B,499.6 +Line C,501.2 +Line D,501.9 +Line A,501.5 +Line B,501.5 +Line C,496.2 +Line D,502.4 +Line A,498.8 +Line B,501.4 +Line C,491.2 +Line D,502.0 +Line A,500.0 +Line B,503.3 +Line C,498.5 +Line D,502.7 +Line A,500.1 +Line B,499.2 +Line C,497.4 +Line D,501.8 +Line A,501.3 +Line B,503.6 +Line C,497.7 +Line D,503.1 +Line A,502.2 +Line B,500.7 +Line C,499.3 +Line D,502.6 +Line A,500.8 +Line B,502.0 +Line C,498.6 +Line D,500.7 +Line A,499.2 +Line B,498.6 +Line C,501.7 +Line D,502.4 +Line A,501.1 +Line B,501.5 +Line C,495.2 +Line D,503.2 +Line A,499.1 +Line B,503.6 +Line C,498.4 +Line D,500.8 +Line A,499.8 +Line B,500.7 +Line C,497.1 +Line D,502.5 +Line A,501.9 +Line B,499.1 +Line C,499.7 +Line D,500.7 +Line A,499.9 +Line B,500.3 +Line C,498.3 +Line D,502.9 +Line A,500.5 +Line B,505.9 +Line C,501.4 +Line D,502.0 +Line A,500.6 +Line B,498.9 +Line C,498.9 +Line D,500.8 +Line A,501.8 +Line B,501.1 +Line C,501.1 +Line D,500.3 +Line A,498.7 +Line B,502.3 +Line C,498.4 +Line D,502.4 +Line A,499.0 +Line B,498.5 +Line C,498.9 +Line D,501.7 +Line A,500.2 +Line B,498.0 +Line C,501.7 +Line D,500.8 +Line A,498.6 +Line B,504.3 +Line C,501.2 +Line D,501.5 +Line A,500.0 +Line B,498.7 +Line C,500.7 +Line D,502.3 +Line A,501.6 +Line B,501.5 +Line C,500.6 +Line D,502.0 +Line A,500.7 +Line B,504.0 +Line C,499.6 +Line D,501.5 +Line A,501.8 +Line B,503.4 +Line C,499.4 +Line D,502.4 +Line A,501.2 +Line B,500.2 +Line C,496.8 +Line D,501.7 +Line A,502.5 +Line B,501.9 +Line C,509.0 +Line D,501.8 +Line A,500.4 +Line B,501.1 +Line C,500.0 +Line D,501.4 +Line A,502.1 +Line B,501.2 +Line C,498.4 +Line D,503.2 +Line A,500.3 +Line B,491.8 +Line C,498.5 +Line D,502.1 +Line A,499.5 +Line B,502.1 +Line C,499.4 +Line D,501.9 +Line A,501.6 +Line B,503.0 +Line C,498.1 +Line D,501.6 +Line A,499.3 +Line B,498.0 +Line C,498.6 +Line D,502.2 +Line A,501.3 +Line B,500.5 +Line C,499.6 +Line D,502.5 +Line A,500.2 +Line B,501.0 +Line C,500.7 +Line D,502.8 +Line A,501.4 +Line B,498.9 +Line C,496.3 +Line D,502.8 +Line A,499.2 +Line B,503.3 +Line C,500.2 +Line D,501.7 +Line A,499.6 +Line B,502.8 +Line C,499.9 +Line D,502.7 +Line A,500.5 +Line B,497.8 +Line C,498.1 +Line D,500.4 +Line A,500.5 +Line B,500.9 +Line C,501.9 +Line D,502.9 +Line A,500.8 +Line B,502.8 +Line C,497.7 +Line D,501.6 +Line A,503.1 +Line B,499.2 +Line C,498.5 +Line D,503.4 +Line A,502.0 +Line B,505.5 +Line C,499.1 +Line D,502.0 +Line A,500.2 +Line B,503.6 +Line C,499.6 +Line D,502.6 +Line A,499.2 +Line B,499.8 +Line C,500.2 +Line D,501.8 +Line A,501.7 +Line B,504.6 +Line C,499.7 +Line D,501.5 +Line A,501.9 +Line B,497.3 +Line C,497.4 +Line D,501.6 +Line A,500.2 +Line B,500.8 +Line C,496.9 +Line D,502.2 +Line A,501.4 +Line B,502.2 +Line C,497.9 +Line D,501.0 +Line A,501.6 +Line B,502.4 +Line C,498.6 +Line D,501.3 +Line A,501.4 +Line B,499.6 +Line C,497.9 +Line D,502.8 +Line A,500.2 +Line B,502.6 +Line C,500.5 +Line D,500.9 +Line A,499.7 +Line B,500.1 +Line C,499.8 +Line D,501.8 +Line A,500.7 +Line B,499.5 +Line C,500.5 +Line D,500.3 +Line A,500.4 +Line B,501.6 +Line C,500.6 +Line D,501.3 +Line A,501.2 +Line B,500.9 +Line C,498.1 +Line D,502.4 +Line A,501.0 +Line B,497.6 +Line C,497.9 +Line D,500.1 +Line A,499.4 +Line B,504.6 +Line C,499.8 +Line D,501.9 +Line A,500.8 +Line B,504.0 +Line C,499.1 +Line D,501.3 +Line A,501.6 +Line B,501.8 +Line C,497.6 +Line D,500.8 +Line A,500.4 +Line B,500.7 +Line C,499.4 +Line D,503.8 +Line A,500.4 +Line B,500.1 +Line C,502.9 +Line D,502.1 +Line A,498.5 +Line B,502.3 +Line C,501.6 +Line D,500.9 +Line A,501.1 +Line B,498.0 +Line C,499.2 +Line D,502.5 +Line A,501.2 +Line B,499.7 +Line C,498.0 +Line D,501.7 +Line A,502.1 +Line B,504.0 +Line C,501.2 +Line D,500.5 +Line A,499.4 +Line B,499.2 +Line C,500.5 +Line D,503.4 +Line A,500.5 +Line B,498.7 +Line C,499.7 +Line D,501.3 +Line A,498.7 +Line B,497.5 +Line C,499.9 +Line D,501.5 +Line A,499.3 +Line B,499.5 +Line C,500.0 +Line D,503.4 +Line A,499.4 +Line B,500.7 +Line C,498.1 +Line D,501.0 +Line A,500.5 +Line B,501.1 +Line C,499.3 +Line D,503.6 +Line A,498.6 +Line B,501.7 +Line C,499.1 +Line D,500.8 +Line A,499.6 +Line B,501.1 +Line C,498.8 +Line D,502.1 +Line A,501.2 +Line B,502.1 +Line C,498.9 +Line D,503.5 +Line A,499.1 +Line B,499.8 +Line C,498.2 +Line D,501.0 +Line A,499.8 +Line B,506.0 +Line C,499.6 +Line D,500.9 +Line A,500.4 +Line B,501.1 +Line C,499.0 +Line D,502.3 +Line A,501.2 +Line B,496.8 +Line C,500.1 +Line D,493.7 +Line A,500.7 +Line B,501.5 +Line C,498.4 +Line D,502.3 +Line A,501.5 +Line B,502.1 +Line C,502.2 +Line D,502.3 +Line A,501.6 +Line B,502.0 +Line C,500.7 +Line D,502.6 +Line A,501.8 +Line B,502.1 +Line C,505.5 +Line D,501.0 +Line A,499.5 +Line B,499.6 +Line C,498.3 +Line D,501.9 +Line A,500.7 +Line B,501.6 +Line C,508.3 +Line D,501.9 +Line A,499.4 +Line B,499.8 +Line C,497.8 +Line D,502.3 +Line A,501.2 +Line B,498.8 +Line C,500.2 +Line D,501.2 +Line A,499.2 +Line B,503.2 +Line C,498.5 +Line D,508.4 +Line A,499.5 +Line B,501.5 +Line C,500.7 +Line D,502.8 +Line A,500.2 +Line B,501.2 +Line C,499.5 +Line D,502.6 +Line A,499.3 +Line B,499.3 +Line C,496.2 +Line D,501.4 +Line A,501.3 +Line B,499.3 +Line C,498.4 +Line D,500.7 +Line A,498.6 +Line B,499.6 +Line C,500.7 +Line D,501.8 +Line A,499.8 +Line B,501.6 +Line C,499.2 +Line D,501.3 +Line A,499.6 +Line B,502.2 +Line C,497.7 +Line D,500.1 +Line A,507.0 +Line B,501.8 +Line C,500.4 +Line D,496.5 +Line A,501.4 +Line B,499.7 +Line C,497.8 +Line D,502.9 +Line A,499.8 +Line B,500.2 +Line C,498.3 +Line D,502.2 +Line A,500.5 +Line B,501.5 +Line C,498.9 +Line D,502.5 +Line A,500.0 +Line B,500.2 +Line C,501.1 +Line D,501.9 +Line A,498.8 +Line B,498.4 +Line C,498.9 +Line D,503.6 +Line A,500.1 +Line B,502.0 +Line C,500.4 +Line D,502.5 +Line A,502.9 +Line B,496.4 +Line C,498.1 +Line D,501.3 +Line A,499.4 +Line B,492.6 +Line C,495.2 +Line D,501.9 +Line A,502.5 +Line B,501.7 +Line C,502.4 +Line D,501.1 +Line A,500.0 +Line B,502.3 +Line C,501.8 +Line D,501.9 +Line A,500.2 +Line B,497.6 +Line C,498.2 +Line D,501.2 +Line A,498.2 +Line B,505.0 +Line C,497.0 +Line D,501.7 +Line A,500.6 +Line B,501.1 +Line C,501.1 +Line D,501.5 +Line A,500.5 +Line B,503.7 +Line C,500.5 +Line D,500.9 +Line A,500.3 +Line B,505.5 +Line C,498.0 +Line D,502.1 +Line A,499.7 +Line B,502.5 +Line C,500.2 +Line D,503.0 +Line A,498.9 +Line B,501.3 +Line C,497.6 +Line D,503.4 +Line A,501.4 +Line B,500.3 +Line C,497.4 +Line D,503.8 +Line A,499.3 +Line B,505.1 +Line C,498.7 +Line D,502.1 +Line A,501.9 +Line B,509.1 +Line C,501.3 +Line D,502.6 +Line A,499.8 +Line B,503.2 +Line C,500.0 +Line D,502.0 +Line A,501.2 +Line B,500.2 +Line C,500.5 +Line D,502.7 +Line A,500.1 +Line B,503.9 +Line C,499.6 +Line D,501.2 +Line A,499.2 +Line B,499.6 +Line C,497.9 +Line D,500.3 +Line A,501.2 +Line B,506.0 +Line C,501.5 +Line D,502.8 +Line A,500.9 +Line B,499.9 +Line C,497.4 +Line D,500.9 +Line A,502.1 +Line B,499.5 +Line C,496.4 +Line D,501.6 +Line A,499.8 +Line B,500.8 +Line C,498.8 +Line D,502.1 +Line A,500.5 +Line B,501.0 +Line C,497.1 +Line D,501.9 +Line A,498.8 +Line B,499.3 +Line C,498.6 +Line D,503.4 +Line A,501.5 +Line B,503.8 +Line C,498.2 +Line D,501.6 +Line A,502.5 +Line B,500.7 +Line C,500.3 +Line D,500.7 +Line A,501.6 +Line B,503.6 +Line C,499.4 +Line D,502.1 +Line A,501.9 +Line B,501.8 +Line C,500.2 +Line D,502.7 +Line A,500.8 +Line B,500.3 +Line C,497.7 +Line D,503.1 +Line A,499.6 +Line B,500.9 +Line C,499.9 +Line D,502.3 +Line A,501.1 +Line B,499.6 +Line C,500.9 +Line D,498.9 +Line A,502.4 +Line B,499.2 +Line C,500.0 +Line D,501.1 +Line A,499.9 +Line B,500.5 +Line C,500.3 +Line D,502.3 +Line A,499.5 +Line B,500.8 +Line C,497.6 +Line D,502.2 +Line A,509.1 +Line B,501.9 +Line C,499.7 +Line D,502.1 +Line A,500.4 +Line B,500.2 +Line C,499.1 +Line D,502.8 +Line A,502.0 +Line B,499.3 +Line C,498.8 +Line D,501.4 +Line A,500.1 +Line B,503.3 +Line C,498.8 +Line D,502.8 +Line A,502.2 +Line B,504.2 +Line C,497.0 +Line D,502.1 +Line A,501.5 +Line B,503.1 +Line C,498.9 +Line D,503.8 +Line A,499.7 +Line B,501.5 +Line C,498.6 +Line D,503.3 +Line A,499.7 +Line B,498.5 +Line C,500.3 +Line D,500.9 +Line A,499.5 +Line B,504.6 +Line C,497.9 +Line D,503.6 +Line A,497.7 +Line B,498.7 +Line C,499.7 +Line D,502.0 +Line A,501.3 +Line B,503.7 +Line C,500.6 +Line D,502.2 +Line A,500.9 +Line B,502.7 +Line C,498.2 +Line D,503.0 +Line A,500.1 +Line B,498.8 +Line C,500.5 +Line D,501.5 +Line A,499.0 +Line B,499.1 +Line C,501.0 +Line D,501.9 +Line A,500.5 +Line B,501.5 +Line C,500.4 +Line D,501.7 +Line A,499.7 +Line B,502.0 +Line C,499.6 +Line D,501.7 +Line A,499.0 +Line B,500.3 +Line C,500.6 +Line D,501.3 +Line A,501.1 +Line B,501.2 +Line C,499.1 +Line D,501.4 +Line A,500.2 +Line B,499.5 +Line C,499.1 +Line D,503.9 +Line A,500.8 +Line B,503.9 +Line C,499.5 +Line D,502.1 +Line A,500.9 +Line B,502.4 +Line C,502.0 +Line D,501.2 +Line A,500.6 +Line B,499.0 +Line C,498.5 +Line D,501.2 +Line A,499.2 +Line B,500.0 +Line C,501.6 +Line D,501.7 +Line A,499.2 +Line B,503.2 +Line C,495.5 +Line D,502.2 +Line A,501.8 +Line B,502.1 +Line C,499.8 +Line D,501.8 +Line A,499.7 +Line B,504.2 +Line C,489.3 +Line D,503.5 +Line A,500.6 +Line B,501.1 +Line C,497.9 +Line D,502.5 +Line A,500.6 +Line B,500.9 +Line C,498.5 +Line D,501.9 +Line A,501.1 +Line B,501.2 +Line C,498.9 +Line D,502.1 +Line A,501.0 +Line B,500.1 +Line C,507.3 +Line D,501.9 +Line A,500.6 +Line B,503.7 +Line C,500.9 +Line D,502.2 +Line A,499.4 +Line B,498.8 +Line C,499.9 +Line D,502.5 +Line A,501.1 +Line B,502.3 +Line C,499.0 +Line D,502.5 +Line A,500.3 +Line B,501.0 +Line C,500.3 +Line D,501.5 +Line A,499.6 +Line B,499.3 +Line C,497.0 +Line D,501.3 +Line A,498.3 +Line B,501.3 +Line C,497.4 +Line D,502.2 +Line A,500.1 +Line B,502.5 +Line C,498.9 +Line D,502.1 +Line A,500.9 +Line B,499.4 +Line C,498.6 +Line D,501.8 +Line A,498.7 +Line B,502.8 +Line C,500.2 +Line D,501.3 +Line A,500.6 +Line B,498.8 +Line C,499.6 +Line D,502.2 +Line A,499.7 +Line B,503.3 +Line C,499.7 +Line D,503.0 +Line A,500.8 +Line B,499.5 +Line C,499.2 +Line D,501.2 +Line A,502.8 +Line B,503.4 +Line C,501.7 +Line D,502.5 +Line A,500.9 +Line B,501.4 +Line C,497.9 +Line D,501.6 +Line A,499.0 +Line B,498.2 +Line C,502.7 +Line D,503.3 +Line A,500.4 +Line B,501.1 +Line C,498.3 +Line D,503.3 +Line A,501.4 +Line B,503.4 +Line C,498.8 +Line D,501.2 +Line A,501.2 +Line B,502.7 +Line C,496.9 +Line D,501.9 +Line A,499.3 +Line B,499.1 +Line C,503.3 +Line D,503.8 +Line A,499.9 +Line B,499.5 +Line C,500.5 +Line D,501.2 +Line A,501.1 +Line B,501.1 +Line C,499.4 +Line D,503.1 +Line A,498.9 +Line B,504.0 +Line C,502.2 +Line D,502.0 +Line A,499.6 +Line B,500.3 +Line C,497.0 +Line D,502.1 +Line A,499.7 +Line B,493.1 +Line C,499.1 +Line D,502.2 +Line A,501.8 +Line B,502.9 +Line C,497.3 +Line D,502.0 +Line A,499.3 +Line B,501.8 +Line C,497.6 +Line D,502.7 +Line A,502.7 +Line B,500.7 +Line C,501.5 +Line D,502.7 +Line A,498.9 +Line B,501.1 +Line C,498.2 +Line D,502.3 +Line A,500.5 +Line B,502.8 +Line C,499.2 +Line D,503.0 +Line A,500.6 +Line B,506.6 +Line C,497.8 +Line D,504.1 +Line A,502.3 +Line B,500.0 +Line C,496.0 +Line D,502.4 +Line A,500.5 +Line B,499.2 +Line C,500.1 +Line D,501.7 +Line A,500.6 +Line B,502.0 +Line C,501.1 +Line D,502.2 +Line A,500.8 +Line B,501.4 +Line C,497.3 +Line D,492.8 +Line A,499.5 +Line B,501.5 +Line C,503.0 +Line D,502.0 +Line A,501.0 +Line B,503.6 +Line C,501.0 +Line D,502.7 +Line A,501.9 +Line B,502.7 +Line C,501.0 +Line D,501.7 +Line A,500.8 +Line B,502.8 +Line C,499.2 +Line D,500.8 +Line A,500.6 +Line B,498.0 +Line C,500.3 +Line D,501.1 +Line A,503.6 +Line B,503.4 +Line C,497.4 +Line D,501.2 +Line A,503.5 +Line B,497.4 +Line C,497.0 +Line D,502.2 +Line A,499.1 +Line B,500.3 +Line C,499.5 +Line D,501.1 +Line A,499.2 +Line B,502.4 +Line C,498.7 +Line D,500.6 +Line A,500.1 +Line B,507.0 +Line C,496.6 +Line D,503.4 +Line A,501.1 +Line B,502.1 +Line C,499.7 +Line D,502.1 +Line A,499.2 +Line B,501.9 +Line C,499.6 +Line D,500.6 +Line A,499.5 +Line B,501.4 +Line C,496.9 +Line D,501.8 +Line A,500.7 +Line B,502.8 +Line C,500.5 +Line D,503.0 +Line A,499.6 +Line B,501.1 +Line C,500.1 +Line D,502.6 +Line A,500.9 +Line B,500.4 +Line C,497.4 +Line D,509.2 +Line A,501.9 +Line B,500.3 +Line C,500.4 +Line D,500.8 +Line A,499.7 +Line B,502.1 +Line C,500.1 +Line D,501.0 +Line A,499.3 +Line B,502.1 +Line C,498.1 +Line D,502.2 +Line A,500.2 +Line B,502.5 +Line C,498.6 +Line D,501.2 +Line A,500.7 +Line B,502.0 +Line C,498.0 +Line D,503.6 +Line A,499.6 +Line B,497.1 +Line C,498.4 +Line D,501.1 +Line A,499.3 +Line B,502.1 +Line C,499.0 +Line D,502.0 +Line A,501.7 +Line B,501.4 +Line C,497.4 +Line D,501.7 +Line A,500.1 +Line B,500.3 +Line C,498.5 +Line D,509.7 +Line A,498.2 +Line B,502.7 +Line C,498.8 +Line D,500.6 +Line A,500.9 +Line B,501.7 +Line C,500.2 +Line D,503.0 +Line A,500.6 +Line B,506.0 +Line C,500.7 +Line D,502.6 +Line A,502.0 +Line B,498.4 +Line C,501.4 +Line D,502.6 +Line A,499.0 +Line B,501.2 +Line C,498.6 +Line D,503.9 +Line A,499.8 +Line B,501.7 +Line C,498.5 +Line D,501.6 +Line A,500.4 +Line B,502.9 +Line C,499.1 +Line D,501.6 +Line A,499.0 +Line B,502.0 +Line C,500.3 +Line D,504.6 +Line A,501.8 +Line B,502.1 +Line C,498.7 +Line D,500.8 +Line A,498.9 +Line B,500.1 +Line C,497.2 +Line D,502.5 +Line A,500.8 +Line B,501.2 +Line C,500.1 +Line D,501.2 +Line A,500.1 +Line B,502.0 +Line C,498.0 +Line D,502.5 +Line A,498.4 +Line B,501.0 +Line C,501.0 +Line D,500.9 +Line A,501.3 +Line B,503.7 +Line C,497.7 +Line D,501.6 +Line A,501.0 +Line B,500.7 +Line C,499.5 +Line D,503.2 +Line A,501.0 +Line B,501.8 +Line C,496.2 +Line D,502.5 +Line A,501.7 +Line B,494.7 +Line C,498.9 +Line D,502.5 +Line A,501.3 +Line B,502.1 +Line C,497.0 +Line D,501.4 +Line A,501.8 +Line B,502.3 +Line C,498.6 +Line D,500.8 +Line A,502.9 +Line B,498.5 +Line C,498.0 +Line D,502.0 +Line A,503.2 +Line B,501.6 +Line C,499.5 +Line D,502.8 +Line A,500.4 +Line B,504.2 +Line C,502.1 +Line D,501.3 +Line A,499.4 +Line B,501.5 +Line C,499.1 +Line D,501.3 +Line A,499.9 +Line B,502.2 +Line C,498.6 +Line D,502.9 +Line A,501.5 +Line B,493.6 +Line C,499.8 +Line D,501.1 +Line A,500.1 +Line B,498.1 +Line C,499.8 +Line D,501.3 +Line A,501.1 +Line B,501.5 +Line C,497.5 +Line D,501.2 +Line A,501.1 +Line B,499.1 +Line C,499.2 +Line D,500.7 +Line A,499.7 +Line B,500.9 +Line C,498.8 +Line D,502.7 +Line A,500.1 +Line B,500.9 +Line C,499.6 +Line D,502.7 +Line A,499.5 +Line B,493.9 +Line C,499.4 +Line D,502.2 +Line A,499.5 +Line B,499.7 +Line C,500.6 +Line D,500.3 +Line A,500.5 +Line B,500.4 +Line C,499.4 +Line D,502.9 +Line A,499.5 +Line B,501.2 +Line C,498.0 +Line D,501.0 +Line A,499.7 +Line B,499.9 +Line C,498.7 +Line D,502.1 +Line A,501.2 +Line B,498.4 +Line C,499.9 +Line D,502.7 +Line A,497.8 +Line B,503.4 +Line C,497.7 +Line D,500.6 +Line A,500.3 +Line B,496.9 +Line C,499.2 +Line D,501.6 +Line A,500.0 +Line B,498.3 +Line C,497.9 +Line D,500.2 +Line A,500.4 +Line B,503.2 +Line C,498.2 +Line D,502.8 +Line A,501.0 +Line B,504.0 +Line C,500.6 +Line D,502.4 +Line A,502.6 +Line B,499.3 +Line C,502.6 +Line D,501.9 +Line A,500.2 +Line B,502.7 +Line C,501.6 +Line D,501.8 +Line A,498.9 +Line B,504.0 +Line C,498.9 +Line D,502.9 +Line A,501.1 +Line B,500.9 +Line C,501.0 +Line D,502.7 +Line A,500.0 +Line B,501.6 +Line C,500.2 +Line D,501.2 +Line A,501.4 +Line B,500.6 +Line C,496.8 +Line D,500.8 +Line A,500.7 +Line B,502.4 +Line C,499.3 +Line D,502.6 +Line A,501.4 +Line B,499.5 +Line C,499.6 +Line D,501.4 +Line A,500.9 +Line B,500.5 +Line C,499.8 +Line D,502.5 +Line A,500.4 +Line B,502.1 +Line C,499.1 +Line D,502.1 +Line A,500.7 +Line B,500.5 +Line C,499.4 +Line D,501.5 +Line A,501.8 +Line B,505.8 +Line C,498.8 +Line D,502.4 +Line A,500.4 +Line B,499.8 +Line C,501.3 +Line D,502.6 +Line A,500.7 +Line B,500.8 +Line C,500.1 +Line D,505.6 +Line A,500.1 +Line B,501.5 +Line C,497.6 +Line D,499.4 +Line A,501.0 +Line B,503.0 +Line C,501.7 +Line D,503.5 +Line A,500.5 +Line B,502.5 +Line C,498.5 +Line D,503.0 +Line A,500.2 +Line B,500.2 +Line C,498.5 +Line D,501.3 +Line A,497.1 +Line B,499.7 +Line C,500.8 +Line D,501.9 +Line A,501.7 +Line B,503.8 +Line C,497.2 +Line D,501.5 +Line A,499.3 +Line B,503.2 +Line C,495.8 +Line D,503.0 +Line A,500.2 +Line B,501.4 +Line C,497.4 +Line D,503.8 +Line A,499.7 +Line B,501.0 +Line C,499.6 +Line D,502.2 +Line A,497.2 +Line B,505.7 +Line C,502.4 +Line D,501.9 +Line A,499.1 +Line B,498.9 +Line C,497.8 +Line D,501.8 +Line A,500.3 +Line B,499.1 +Line C,502.3 +Line D,503.6 +Line A,500.2 +Line B,500.4 +Line C,501.7 +Line D,502.6 +Line A,501.0 +Line B,499.5 +Line C,497.5 +Line D,503.1 +Line A,500.1 +Line B,503.3 +Line C,498.2 +Line D,502.4 +Line A,497.7 +Line B,496.2 +Line C,500.1 +Line D,503.0 +Line A,501.2 +Line B,504.0 +Line C,497.6 +Line D,502.0 +Line A,498.4 +Line B,498.8 +Line C,498.1 +Line D,503.0 +Line A,501.5 +Line B,502.1 +Line C,496.9 +Line D,502.1 +Line A,501.9 +Line B,500.7 +Line C,498.7 +Line D,502.7 +Line A,499.7 +Line B,496.1 +Line C,499.1 +Line D,503.2 +Line A,500.9 +Line B,497.3 +Line C,499.0 +Line D,501.7 +Line A,499.6 +Line B,498.3 +Line C,497.2 +Line D,501.8 +Line A,500.0 +Line B,501.9 +Line C,499.9 +Line D,502.9 +Line A,498.6 +Line B,503.0 +Line C,497.2 +Line D,502.3 +Line A,500.6 +Line B,503.1 +Line C,498.4 +Line D,502.0 +Line A,499.7 +Line B,498.6 +Line C,502.6 +Line D,503.4 +Line A,500.3 +Line B,503.5 +Line C,500.1 +Line D,501.2 +Line A,501.1 +Line B,501.9 +Line C,500.0 +Line D,503.7 +Line A,499.8 +Line B,501.0 +Line C,500.6 +Line D,502.1 +Line A,498.8 +Line B,501.3 +Line C,499.0 +Line D,500.9 +Line A,499.8 +Line B,501.7 +Line C,500.3 +Line D,501.1 +Line A,498.0 +Line B,502.4 +Line C,500.8 +Line D,502.6 +Line A,500.6 +Line B,499.5 +Line C,498.4 +Line D,502.0 +Line A,501.6 +Line B,497.2 +Line C,500.2 +Line D,502.8 +Line A,502.5 +Line B,497.3 +Line C,498.8 +Line D,501.4 +Line A,500.8 +Line B,499.0 +Line C,500.3 +Line D,501.6 +Line A,498.0 +Line B,502.4 +Line C,498.5 +Line D,502.1 +Line A,500.9 +Line B,502.2 +Line C,498.4 +Line D,500.4 +Line A,499.3 +Line B,502.8 +Line C,498.3 +Line D,502.2 +Line A,499.1 +Line B,502.4 +Line C,498.9 +Line D,502.5 +Line A,497.9 +Line B,502.0 +Line C,499.4 +Line D,502.0 +Line A,500.0 +Line B,509.5 +Line C,499.8 +Line D,503.3 +Line A,498.9 +Line B,501.2 +Line C,500.5 +Line D,501.2 +Line A,501.4 +Line B,503.1 +Line C,498.1 +Line D,499.4 +Line A,500.0 +Line B,499.6 +Line C,491.5 +Line D,501.1 +Line A,502.0 +Line B,510.8 +Line C,498.9 +Line D,502.5 +Line A,499.7 +Line B,501.9 +Line C,500.1 +Line D,502.7 +Line A,499.6 +Line B,498.1 +Line C,499.8 +Line D,503.6 +Line A,499.4 +Line B,498.9 +Line C,499.6 +Line D,501.5 +Line A,499.2 +Line B,497.5 +Line C,500.2 +Line D,501.8 +Line A,502.4 +Line B,501.6 +Line C,497.6 +Line D,502.1 +Line A,497.7 +Line B,501.5 +Line C,498.7 +Line D,501.9 +Line A,498.7 +Line B,502.6 +Line C,500.4 +Line D,501.1 +Line A,500.6 +Line B,498.9 +Line C,500.4 +Line D,502.6 +Line A,499.8 +Line B,502.9 +Line C,499.0 +Line D,504.1 +Line A,498.7 +Line B,501.6 +Line C,499.1 +Line D,501.9 +Line A,500.3 +Line B,501.1 +Line C,496.7 +Line D,502.5 +Line A,501.7 +Line B,504.0 +Line C,500.2 +Line D,501.8 +Line A,500.0 +Line B,498.8 +Line C,496.7 +Line D,501.6 +Line A,501.5 +Line B,498.7 +Line C,501.1 +Line D,502.2 +Line A,499.0 +Line B,503.0 +Line C,496.4 +Line D,503.8 +Line A,500.7 +Line B,499.7 +Line C,500.2 +Line D,503.1 +Line A,500.7 +Line B,502.8 +Line C,498.5 +Line D,500.8 +Line A,499.8 +Line B,501.8 +Line C,500.6 +Line D,501.5 +Line A,499.9 +Line B,502.1 +Line C,500.2 +Line D,503.4 +Line A,502.0 +Line B,498.9 +Line C,502.1 +Line D,501.7 +Line A,494.7 +Line B,500.5 +Line C,499.7 +Line D,501.6 +Line A,498.7 +Line B,499.8 +Line C,498.4 +Line D,501.8 +Line A,499.5 +Line B,499.4 +Line C,495.1 +Line D,501.7 +Line A,493.9 +Line B,502.1 +Line C,500.3 +Line D,500.2 +Line A,498.6 +Line B,497.6 +Line C,500.1 +Line D,502.1 +Line A,501.5 +Line B,497.0 +Line C,498.6 +Line D,501.9 +Line A,501.3 +Line B,499.7 +Line C,495.4 +Line D,501.0 +Line A,499.7 +Line B,504.4 +Line C,500.3 +Line D,500.0 +Line A,501.1 +Line B,502.2 +Line C,498.2 +Line D,501.3 +Line A,500.2 +Line B,501.3 +Line C,499.2 +Line D,501.3 +Line A,501.3 +Line B,499.0 +Line C,500.9 +Line D,503.3 +Line A,498.6 +Line B,500.0 +Line C,496.2 +Line D,501.5 +Line A,499.2 +Line B,499.9 +Line C,499.1 +Line D,501.3 +Line A,500.8 +Line B,504.5 +Line C,499.3 +Line D,500.1 +Line A,498.6 +Line B,504.0 +Line C,498.2 +Line D,501.2 +Line A,509.0 +Line B,503.2 +Line C,496.1 +Line D,501.7 +Line A,499.4 +Line B,501.1 +Line C,497.4 +Line D,501.5 +Line A,501.0 +Line B,500.5 +Line C,498.6 +Line D,500.8 +Line A,498.9 +Line B,500.8 +Line C,496.2 +Line D,500.1 +Line A,501.0 +Line B,503.2 +Line C,499.5 +Line D,501.8 +Line A,499.3 +Line B,500.7 +Line C,499.1 +Line D,494.8 +Line A,500.4 +Line B,500.4 +Line C,498.9 +Line D,502.8 +Line A,499.2 +Line B,501.8 +Line C,498.3 +Line D,500.4 +Line A,500.6 +Line B,500.7 +Line C,497.8 +Line D,501.3 +Line A,499.7 +Line B,503.6 +Line C,499.5 +Line D,501.2 +Line A,498.9 +Line B,501.5 +Line C,497.3 +Line D,502.1 +Line A,500.7 +Line B,500.9 +Line C,498.3 +Line D,501.2 +Line A,499.5 +Line B,500.7 +Line C,498.8 +Line D,502.4 +Line A,501.6 +Line B,501.5 +Line C,500.2 +Line D,504.3 +Line A,499.2 +Line B,503.4 +Line C,498.2 +Line D,504.1 +Line A,500.6 +Line B,502.1 +Line C,499.8 +Line D,500.8 +Line A,500.2 +Line B,500.2 +Line C,497.1 +Line D,501.2 +Line A,501.2 +Line B,500.5 +Line C,500.1 +Line D,501.8 +Line A,500.8 +Line B,500.3 +Line C,498.3 +Line D,501.1 +Line A,500.0 +Line B,502.0 +Line C,499.4 +Line D,501.9 +Line A,502.0 +Line B,502.0 +Line C,500.1 +Line D,501.8 +Line A,499.0 +Line B,503.7 +Line C,497.8 +Line D,503.1 +Line A,500.3 +Line B,498.8 +Line C,499.8 +Line D,501.7 +Line A,501.1 +Line B,499.5 +Line C,497.5 +Line D,501.7 +Line A,501.3 +Line B,501.2 +Line C,496.5 +Line D,502.3 +Line A,501.5 +Line B,502.2 +Line C,498.7 +Line D,503.2 +Line A,500.6 +Line B,500.4 +Line C,497.3 +Line D,502.9 +Line A,499.3 +Line B,499.0 +Line C,500.7 +Line D,502.0 +Line A,498.5 +Line B,503.9 +Line C,499.6 +Line D,502.0 +Line A,499.3 +Line B,502.2 +Line C,492.1 +Line D,500.8 +Line A,499.7 +Line B,501.1 +Line C,502.7 +Line D,501.7 +Line A,501.0 +Line B,501.3 +Line C,498.6 +Line D,502.5 +Line A,500.5 +Line B,502.8 +Line C,497.0 +Line D,500.9 +Line A,500.1 +Line B,499.9 +Line C,499.2 +Line D,503.0 +Line A,501.3 +Line B,503.8 +Line C,500.0 +Line D,501.7 +Line A,499.4 +Line B,503.7 +Line C,499.0 +Line D,501.3 +Line A,501.2 +Line B,502.6 +Line C,495.9 +Line D,502.2 +Line A,498.5 +Line B,501.8 +Line C,501.9 +Line D,503.1 +Line A,499.9 +Line B,502.1 +Line C,497.0 +Line D,502.1 +Line A,500.5 +Line B,498.7 +Line C,498.1 +Line D,501.4 +Line A,499.5 +Line B,500.7 +Line C,500.2 +Line D,501.9 +Line A,501.0 +Line B,504.8 +Line C,499.0 +Line D,501.8 +Line A,500.2 +Line B,499.4 +Line C,499.2 +Line D,502.0 +Line A,500.8 +Line B,501.7 +Line C,500.9 +Line D,501.5 +Line A,502.7 +Line B,499.5 +Line C,499.9 +Line D,502.2 +Line A,502.1 +Line B,501.3 +Line C,500.9 +Line D,503.1 +Line A,502.6 +Line B,500.0 +Line C,500.5 +Line D,502.8 +Line A,501.0 +Line B,502.5 +Line C,497.0 +Line D,500.8 +Line A,501.4 +Line B,501.8 +Line C,499.2 +Line D,499.9 +Line A,500.0 +Line B,501.7 +Line C,501.5 +Line D,503.2 +Line A,500.9 +Line B,499.6 +Line C,498.7 +Line D,502.3 +Line A,502.6 +Line B,502.2 +Line C,499.3 +Line D,501.6 +Line A,501.8 +Line B,500.4 +Line C,497.7 +Line D,501.8 +Line A,500.8 +Line B,501.3 +Line C,500.5 +Line D,502.4 +Line A,499.9 +Line B,501.3 +Line C,501.5 +Line D,502.3 +Line A,499.1 +Line B,501.2 +Line C,498.9 +Line D,502.1 +Line A,501.9 +Line B,500.4 +Line C,501.6 +Line D,504.0 +Line A,498.1 +Line B,501.1 +Line C,499.1 +Line D,501.5 +Line A,500.1 +Line B,494.9 +Line C,497.4 +Line D,502.2 +Line A,500.9 +Line B,505.4 +Line C,497.1 +Line D,500.8 +Line A,499.3 +Line B,503.6 +Line C,497.9 +Line D,502.4 +Line A,500.7 +Line B,503.1 +Line C,496.0 +Line D,502.0 +Line A,500.6 +Line B,498.2 +Line C,499.6 +Line D,501.0 +Line A,501.3 +Line B,498.4 +Line C,497.8 +Line D,502.0 +Line A,498.7 +Line B,501.7 +Line C,497.3 +Line D,501.0 +Line A,500.9 +Line B,504.6 +Line C,497.4 +Line D,500.6 +Line A,500.8 +Line B,497.2 +Line C,499.7 +Line D,502.4 +Line A,502.0 +Line B,501.1 +Line C,505.6 +Line D,500.9 +Line A,504.7 +Line B,498.2 +Line C,501.7 +Line D,502.9 +Line A,501.2 +Line B,501.6 +Line C,501.8 +Line D,502.0 +Line A,500.6 +Line B,500.9 +Line C,499.9 +Line D,501.0 +Line A,501.7 +Line B,498.9 +Line C,498.0 +Line D,502.0 +Line A,500.5 +Line B,501.0 +Line C,498.2 +Line D,500.6 +Line A,499.4 +Line B,500.2 +Line C,497.0 +Line D,502.4 +Line A,500.1 +Line B,501.9 +Line C,499.0 +Line D,501.2 +Line A,499.4 +Line B,499.2 +Line C,498.5 +Line D,501.6 +Line A,500.2 +Line B,502.9 +Line C,502.2 +Line D,503.8 +Line A,499.9 +Line B,500.5 +Line C,500.4 +Line D,501.4 +Line A,499.9 +Line B,499.5 +Line C,500.5 +Line D,501.8 +Line A,500.9 +Line B,501.3 +Line C,496.8 +Line D,501.7 +Line A,500.6 +Line B,498.5 +Line C,499.6 +Line D,501.1 +Line A,499.0 +Line B,499.1 +Line C,497.1 +Line D,501.1 +Line A,499.5 +Line B,507.3 +Line C,501.6 +Line D,502.6 +Line A,500.5 +Line B,498.2 +Line C,498.6 +Line D,501.1 +Line A,499.6 +Line B,501.6 +Line C,499.4 +Line D,502.8 +Line A,500.7 +Line B,499.6 +Line C,499.6 +Line D,502.3 +Line A,499.8 +Line B,502.1 +Line C,498.5 +Line D,502.3 +Line A,499.0 +Line B,500.5 +Line C,499.6 +Line D,503.8 +Line A,498.3 +Line B,500.4 +Line C,500.9 +Line D,501.0 +Line A,500.0 +Line B,501.4 +Line C,500.8 +Line D,502.1 +Line A,502.2 +Line B,502.9 +Line C,498.2 +Line D,503.3 +Line A,500.7 +Line B,499.6 +Line C,497.0 +Line D,501.6 +Line A,501.4 +Line B,499.5 +Line C,497.8 +Line D,503.2 +Line A,501.4 +Line B,501.1 +Line C,499.9 +Line D,501.1 +Line A,492.5 +Line B,504.2 +Line C,499.1 +Line D,500.9 +Line A,500.0 +Line B,499.3 +Line C,496.1 +Line D,502.2 +Line A,499.9 +Line B,498.3 +Line C,500.4 +Line D,503.5 +Line A,501.5 +Line B,502.7 +Line C,500.4 +Line D,503.7 +Line A,500.7 +Line B,492.9 +Line C,498.6 +Line D,502.7 +Line A,500.6 +Line B,499.5 +Line C,499.2 +Line D,502.3 +Line A,499.2 +Line B,501.1 +Line C,499.0 +Line D,500.3 +Line A,499.3 +Line B,501.4 +Line C,500.5 +Line D,495.5 +Line A,499.1 +Line B,503.0 +Line C,498.9 +Line D,501.2 +Line A,499.1 +Line B,501.9 +Line C,499.5 +Line D,502.4 +Line A,503.0 +Line B,493.1 +Line C,500.3 +Line D,500.9 +Line A,499.3 +Line B,502.5 +Line C,499.2 +Line D,502.4 +Line A,501.0 +Line B,499.3 +Line C,498.6 +Line D,501.6 +Line A,498.3 +Line B,498.4 +Line C,499.3 +Line D,500.5 +Line A,500.1 +Line B,500.9 +Line C,499.3 +Line D,502.5 +Line A,490.7 +Line B,501.6 +Line C,498.8 +Line D,500.5 +Line A,500.2 +Line B,491.4 +Line C,498.9 +Line D,502.4 +Line A,500.4 +Line B,501.2 +Line C,509.2 +Line D,502.8 +Line A,499.7 +Line B,506.3 +Line C,497.9 +Line D,501.8 +Line A,502.5 +Line B,501.8 +Line C,497.5 +Line D,501.6 +Line A,500.8 +Line B,502.9 +Line C,498.3 +Line D,501.0 +Line A,499.6 +Line B,504.9 +Line C,497.2 +Line D,502.4 +Line A,500.1 +Line B,500.9 +Line C,499.0 +Line D,501.7 +Line A,501.3 +Line B,499.1 +Line C,498.4 +Line D,502.8 +Line A,500.5 +Line B,496.3 +Line C,498.3 +Line D,503.1 +Line A,500.3 +Line B,504.9 +Line C,497.5 +Line D,503.5 +Line A,499.2 +Line B,502.7 +Line C,497.8 +Line D,501.4 +Line A,499.5 +Line B,501.7 +Line C,499.6 +Line D,504.8 +Line A,502.7 +Line B,502.9 +Line C,501.0 +Line D,501.7 +Line A,501.6 +Line B,501.1 +Line C,496.1 +Line D,503.2 +Line A,501.0 +Line B,500.6 +Line C,497.7 +Line D,501.6 +Line A,499.3 +Line B,502.1 +Line C,497.9 +Line D,503.2 +Line A,500.0 +Line B,501.9 +Line C,497.7 +Line D,502.2 +Line A,502.7 +Line B,502.3 +Line C,496.1 +Line D,500.4 +Line A,500.4 +Line B,499.6 +Line C,499.6 +Line D,501.5 +Line A,502.2 +Line B,502.4 +Line C,499.8 +Line D,502.9 +Line A,501.7 +Line B,502.4 +Line C,498.9 +Line D,501.2 +Line A,500.5 +Line B,505.9 +Line C,499.3 +Line D,501.6 +Line A,500.6 +Line B,500.5 +Line C,497.3 +Line D,502.1 +Line A,500.3 +Line B,502.4 +Line C,499.8 +Line D,501.5 +Line A,499.4 +Line B,502.4 +Line C,498.6 +Line D,501.9 +Line A,503.4 +Line B,500.2 +Line C,501.6 +Line D,501.6 +Line A,500.1 +Line B,499.6 +Line C,500.6 +Line D,501.1 +Line A,499.1 +Line B,502.8 +Line C,503.9 +Line D,503.7 +Line A,500.9 +Line B,501.7 +Line C,498.2 +Line D,503.7 +Line A,498.3 +Line B,500.1 +Line C,499.3 +Line D,501.2 +Line A,500.7 +Line B,500.7 +Line C,498.8 +Line D,502.5 +Line A,500.4 +Line B,500.0 +Line C,499.4 +Line D,500.3 +Line A,502.2 +Line B,500.4 +Line C,499.5 +Line D,502.4 +Line A,502.3 +Line B,500.2 +Line C,498.7 +Line D,501.6 +Line A,507.5 +Line B,497.4 +Line C,499.4 +Line D,502.6 +Line A,501.8 +Line B,499.3 +Line C,498.9 +Line D,502.3 +Line A,500.4 +Line B,499.8 +Line C,496.8 +Line D,500.9 +Line A,500.5 +Line B,500.0 +Line C,500.7 +Line D,502.3 +Line A,498.2 +Line B,507.3 +Line C,500.7 +Line D,501.2 +Line A,501.1 +Line B,501.7 +Line C,501.5 +Line D,501.3 +Line A,500.7 +Line B,512.1 +Line C,499.3 +Line D,501.8 +Line A,501.8 +Line B,502.4 +Line C,495.2 +Line D,501.0 +Line A,501.0 +Line B,501.7 +Line C,496.4 +Line D,503.0 +Line A,500.8 +Line B,499.9 +Line C,499.6 +Line D,500.2 +Line A,500.2 +Line B,497.0 +Line C,498.5 +Line D,503.0 +Line A,502.7 +Line B,500.8 +Line C,498.3 +Line D,503.0 +Line A,500.5 +Line B,502.3 +Line C,499.6 +Line D,502.9 +Line A,499.2 +Line B,501.2 +Line C,499.6 +Line D,503.1 +Line A,499.3 +Line B,501.2 +Line C,495.5 +Line D,502.0 +Line A,497.9 +Line B,499.5 +Line C,500.3 +Line D,502.9 +Line A,500.4 +Line B,498.6 +Line C,499.9 +Line D,503.0 +Line A,500.9 +Line B,504.6 +Line C,489.8 +Line D,502.6 +Line A,498.9 +Line B,500.7 +Line C,497.7 +Line D,501.7 +Line A,499.3 +Line B,503.2 +Line C,497.0 +Line D,501.8 +Line A,501.1 +Line B,500.6 +Line C,499.2 +Line D,501.9 +Line A,500.9 +Line B,500.3 +Line C,499.9 +Line D,502.7 +Line A,500.9 +Line B,499.0 +Line C,498.7 +Line D,502.8 +Line A,498.7 +Line B,498.6 +Line C,496.7 +Line D,503.1 +Line A,499.4 +Line B,499.9 +Line C,499.0 +Line D,501.1 +Line A,499.5 +Line B,502.5 +Line C,500.4 +Line D,502.1 +Line A,500.3 +Line B,504.7 +Line C,497.0 +Line D,501.8 +Line A,499.8 +Line B,501.5 +Line C,499.0 +Line D,502.1 +Line A,500.0 +Line B,498.8 +Line C,498.3 +Line D,501.8 +Line A,501.1 +Line B,500.7 +Line C,498.5 +Line D,503.1 +Line A,499.8 +Line B,496.4 +Line C,499.8 +Line D,501.0 +Line A,500.5 +Line B,502.1 +Line C,497.0 +Line D,502.1 +Line A,502.4 +Line B,501.1 +Line C,498.8 +Line D,501.7 +Line A,501.0 +Line B,500.4 +Line C,500.9 +Line D,502.4 +Line A,500.4 +Line B,500.9 +Line C,508.0 +Line D,501.8 +Line A,501.3 +Line B,501.2 +Line C,499.8 +Line D,501.5 +Line A,501.9 +Line B,500.2 +Line C,499.2 +Line D,501.5 +Line A,498.5 +Line B,509.2 +Line C,498.0 +Line D,502.0 +Line A,500.8 +Line B,500.7 +Line C,500.1 +Line D,503.6 +Line A,501.3 +Line B,499.9 +Line C,499.1 +Line D,502.1 +Line A,501.1 +Line B,501.9 +Line C,498.3 +Line D,504.0 +Line A,500.7 +Line B,499.6 +Line C,509.3 +Line D,501.8 +Line A,502.2 +Line B,502.5 +Line C,499.3 +Line D,501.2 +Line A,499.9 +Line B,500.0 +Line C,499.6 +Line D,502.6 +Line A,500.7 +Line B,500.8 +Line C,497.5 +Line D,502.2 +Line A,500.8 +Line B,499.7 +Line C,499.0 +Line D,503.3 +Line A,500.2 +Line B,506.0 +Line C,499.4 +Line D,502.1 +Line A,499.5 +Line B,501.3 +Line C,499.7 +Line D,502.6 +Line A,499.2 +Line B,499.4 +Line C,500.2 +Line D,501.1 +Line A,502.6 +Line B,501.2 +Line C,497.0 +Line D,502.3 +Line A,501.0 +Line B,504.2 +Line C,499.8 +Line D,501.0 +Line A,499.5 +Line B,503.1 +Line C,499.3 +Line D,501.2 +Line A,499.3 +Line B,501.3 +Line C,501.3 +Line D,502.8 +Line A,499.3 +Line B,498.1 +Line C,497.1 +Line D,501.4 +Line A,501.0 +Line B,501.3 +Line C,497.4 +Line D,502.6 +Line A,499.5 +Line B,500.6 +Line C,499.0 +Line D,501.2 +Line A,498.4 +Line B,506.5 +Line C,499.2 +Line D,502.8 +Line A,500.4 +Line B,501.6 +Line C,498.1 +Line D,503.4 +Line A,499.9 +Line B,503.2 +Line C,501.8 +Line D,502.3 +Line A,500.4 +Line B,500.4 +Line C,499.0 +Line D,503.3 +Line A,501.0 +Line B,498.9 +Line C,497.1 +Line D,510.2 +Line A,500.1 +Line B,502.3 +Line C,497.0 +Line D,501.5 +Line A,501.1 +Line B,504.1 +Line C,500.6 +Line D,502.5 +Line A,501.6 +Line B,501.0 +Line C,500.5 +Line D,502.1 +Line A,498.6 +Line B,501.0 +Line C,495.8 +Line D,500.5 +Line A,500.9 +Line B,501.5 +Line C,499.3 +Line D,502.1 +Line A,499.6 +Line B,503.1 +Line C,498.5 +Line D,501.3 +Line A,499.3 +Line B,502.3 +Line C,497.7 +Line D,502.8 +Line A,501.3 +Line B,499.4 +Line C,498.7 +Line D,503.1 +Line A,501.1 +Line B,504.5 +Line C,502.5 +Line D,500.5 +Line A,502.2 +Line B,501.0 +Line C,497.7 +Line D,502.1 +Line A,502.5 +Line B,501.9 +Line C,490.6 +Line D,502.5 +Line A,499.6 +Line B,498.3 +Line C,500.7 +Line D,502.2 +Line A,501.0 +Line B,501.2 +Line C,498.5 +Line D,502.8 +Line A,499.7 +Line B,500.1 +Line C,499.3 +Line D,499.9 +Line A,500.5 +Line B,502.4 +Line C,501.3 +Line D,500.8 +Line A,499.6 +Line B,502.1 +Line C,500.1 +Line D,501.4 +Line A,498.2 +Line B,504.2 +Line C,498.1 +Line D,502.0 +Line A,500.4 +Line B,501.3 +Line C,498.0 +Line D,502.1 +Line A,500.1 +Line B,501.3 +Line C,499.2 +Line D,502.0 +Line A,500.9 +Line B,498.6 +Line C,499.8 +Line D,502.0 +Line A,501.4 +Line B,497.0 +Line C,499.5 +Line D,501.2 +Line A,500.3 +Line B,501.2 +Line C,497.9 +Line D,502.8 +Line A,502.1 +Line B,503.3 +Line C,495.5 +Line D,502.2 +Line A,500.1 +Line B,501.8 +Line C,499.3 +Line D,502.8 +Line A,501.0 +Line B,500.7 +Line C,501.2 +Line D,499.9 +Line A,500.2 +Line B,501.5 +Line C,501.0 +Line D,501.2 +Line A,503.3 +Line B,500.7 +Line C,502.1 +Line D,502.1 +Line A,501.6 +Line B,498.9 +Line C,499.3 +Line D,502.7 +Line A,501.8 +Line B,499.4 +Line C,500.5 +Line D,503.1 +Line A,499.7 +Line B,503.0 +Line C,498.1 +Line D,502.6 +Line A,501.2 +Line B,500.3 +Line C,498.2 +Line D,500.6 +Line A,499.8 +Line B,502.0 +Line C,498.5 +Line D,503.1 +Line A,502.2 +Line B,501.2 +Line C,499.0 +Line D,502.8 +Line A,499.7 +Line B,502.7 +Line C,498.0 +Line D,504.0 +Line A,499.7 +Line B,501.0 +Line C,496.9 +Line D,499.7 +Line A,497.7 +Line B,499.9 +Line C,500.3 +Line D,502.1 +Line A,499.7 +Line B,500.6 +Line C,499.3 +Line D,501.2 +Line A,500.5 +Line B,498.0 +Line C,501.0 +Line D,501.7 +Line A,500.9 +Line B,499.7 +Line C,501.4 +Line D,500.6 +Line A,501.5 +Line B,500.6 +Line C,501.5 +Line D,501.8 +Line A,503.4 +Line B,501.8 +Line C,498.9 +Line D,500.0 +Line A,500.6 +Line B,500.2 +Line C,499.6 +Line D,502.9 +Line A,499.9 +Line B,503.0 +Line C,498.4 +Line D,499.8 +Line A,498.7 +Line B,499.2 +Line C,497.9 +Line D,500.7 +Line A,500.6 +Line B,498.7 +Line C,498.7 +Line D,501.1 +Line A,500.3 +Line B,498.0 +Line C,499.4 +Line D,501.9 +Line A,497.3 +Line B,498.9 +Line C,500.2 +Line D,502.6 +Line A,501.3 +Line B,504.4 +Line C,499.4 +Line D,502.0 +Line A,500.7 +Line B,500.0 +Line C,498.9 +Line D,504.3 +Line A,499.3 +Line B,502.8 +Line C,498.4 +Line D,501.9 +Line A,500.3 +Line B,503.8 +Line C,500.4 +Line D,501.7 +Line A,499.4 +Line B,500.0 +Line C,498.4 +Line D,501.0 +Line A,500.6 +Line B,502.4 +Line C,498.8 +Line D,502.2 +Line A,501.3 +Line B,504.8 +Line C,497.9 +Line D,501.1 +Line A,501.1 +Line B,499.7 +Line C,500.0 +Line D,502.6 +Line A,499.8 +Line B,499.4 +Line C,500.3 +Line D,502.0 +Line A,501.6 +Line B,500.8 +Line C,495.7 +Line D,501.7 +Line A,499.4 +Line B,501.7 +Line C,499.1 +Line D,501.5 +Line A,497.8 +Line B,499.8 +Line C,499.8 +Line D,498.7 +Line A,499.8 +Line B,501.6 +Line C,497.4 +Line D,502.0 +Line A,500.2 +Line B,502.5 +Line C,499.7 +Line D,500.7 +Line A,499.8 +Line B,497.2 +Line C,498.1 +Line D,501.7 +Line A,501.0 +Line B,501.5 +Line C,497.6 +Line D,502.9 +Line A,501.7 +Line B,500.7 +Line C,499.1 +Line D,501.1 +Line A,500.3 +Line B,500.1 +Line C,499.2 +Line D,502.2 +Line A,498.9 +Line B,501.9 +Line C,497.9 +Line D,502.2 +Line A,499.9 +Line B,503.4 +Line C,499.5 +Line D,502.9 +Line A,500.5 +Line B,503.8 +Line C,499.7 +Line D,501.7 +Line A,500.8 +Line B,500.1 +Line C,500.4 +Line D,501.1 +Line A,500.3 +Line B,503.8 +Line C,496.7 +Line D,501.9 +Line A,501.0 +Line B,500.1 +Line C,500.5 +Line D,502.5 +Line A,501.2 +Line B,501.1 +Line C,499.1 +Line D,501.5 +Line A,501.5 +Line B,501.3 +Line C,502.9 +Line D,501.4 +Line A,502.0 +Line B,500.3 +Line C,498.3 +Line D,500.6 +Line A,500.7 +Line B,502.6 +Line C,501.0 +Line D,503.3 +Line A,497.4 +Line B,500.9 +Line C,499.4 +Line D,502.0 +Line A,501.0 +Line B,499.9 +Line C,498.8 +Line D,502.1 +Line A,498.6 +Line B,499.5 +Line C,496.0 +Line D,500.6 +Line A,498.3 +Line B,501.2 +Line C,497.7 +Line D,500.7 +Line A,499.0 +Line B,503.4 +Line C,502.0 +Line D,500.6 +Line A,500.8 +Line B,502.1 +Line C,500.0 +Line D,501.3 +Line A,490.3 +Line B,502.6 +Line C,499.6 +Line D,499.8 +Line A,498.4 +Line B,502.5 +Line C,497.9 +Line D,501.0 +Line A,501.0 +Line B,502.7 +Line C,499.2 +Line D,501.6 +Line A,500.8 +Line B,501.5 +Line C,499.4 +Line D,502.6 +Line A,501.4 +Line B,502.1 +Line C,498.9 +Line D,501.6 +Line A,500.8 +Line B,500.6 +Line C,499.8 +Line D,501.9 +Line A,501.3 +Line B,496.6 +Line C,497.2 +Line D,502.2 +Line A,499.2 +Line B,497.5 +Line C,497.7 +Line D,502.2 +Line A,500.6 +Line B,505.2 +Line C,499.3 +Line D,501.4 +Line A,501.0 +Line B,501.6 +Line C,500.3 +Line D,502.9 +Line A,498.9 +Line B,502.6 +Line C,500.7 +Line D,501.4 +Line A,500.6 +Line B,500.6 +Line C,498.2 +Line D,501.6 +Line A,501.1 +Line B,502.3 +Line C,499.5 +Line D,502.7 +Line A,502.7 +Line B,501.8 +Line C,498.2 +Line D,503.6 +Line A,498.7 +Line B,504.1 +Line C,499.1 +Line D,501.7 +Line A,499.7 +Line B,501.3 +Line C,497.6 +Line D,502.4 +Line A,499.8 +Line B,500.2 +Line C,497.8 +Line D,502.4 +Line A,500.0 +Line B,501.8 +Line C,499.4 +Line D,501.3 +Line A,501.3 +Line B,505.0 +Line C,497.5 +Line D,503.5 +Line A,501.1 +Line B,504.2 +Line C,498.4 +Line D,501.5 +Line A,497.9 +Line B,501.3 +Line C,499.6 +Line D,500.1 +Line A,500.0 +Line B,502.4 +Line C,499.4 +Line D,501.9 +Line A,501.3 +Line B,499.4 +Line C,499.6 +Line D,502.4 +Line A,500.4 +Line B,500.6 +Line C,494.7 +Line D,500.9 +Line A,498.9 +Line B,506.2 +Line C,496.7 +Line D,501.6 +Line A,502.1 +Line B,500.3 +Line C,501.9 +Line D,503.2 +Line A,499.2 +Line B,499.9 +Line C,499.7 +Line D,502.0 +Line A,501.2 +Line B,499.4 +Line C,499.9 +Line D,502.1 +Line A,500.1 +Line B,501.9 +Line C,498.4 +Line D,502.8 +Line A,500.3 +Line B,499.7 +Line C,498.7 +Line D,503.3 +Line A,499.9 +Line B,501.2 +Line C,498.4 +Line D,502.9 +Line A,499.5 +Line B,499.1 +Line C,499.4 +Line D,502.2 +Line A,500.4 +Line B,505.7 +Line C,498.4 +Line D,502.2 +Line A,499.8 +Line B,498.7 +Line C,496.8 +Line D,502.2 +Line A,500.7 +Line B,502.5 +Line C,498.0 +Line D,502.0 +Line A,500.5 +Line B,500.6 +Line C,498.0 +Line D,501.9 +Line A,499.0 +Line B,498.4 +Line C,498.1 +Line D,503.1 +Line A,502.1 +Line B,504.8 +Line C,499.7 +Line D,501.9 +Line A,500.5 +Line B,501.9 +Line C,499.0 +Line D,501.0 +Line A,501.2 +Line B,499.0 +Line C,501.1 +Line D,502.7 +Line A,497.8 +Line B,500.9 +Line C,498.2 +Line D,501.9 +Line A,499.6 +Line B,501.5 +Line C,497.8 +Line D,501.0 +Line A,501.0 +Line B,501.9 +Line C,501.3 +Line D,502.4 +Line A,499.7 +Line B,502.5 +Line C,497.8 +Line D,500.9 +Line A,499.7 +Line B,503.2 +Line C,499.2 +Line D,501.8 +Line A,500.6 +Line B,500.3 +Line C,498.4 +Line D,501.6 +Line A,497.7 +Line B,497.6 +Line C,500.4 +Line D,502.1 +Line A,500.2 +Line B,500.5 +Line C,499.2 +Line D,502.1 +Line A,501.5 +Line B,500.4 +Line C,500.8 +Line D,502.1 +Line A,497.9 +Line B,499.7 +Line C,498.4 +Line D,502.5 +Line A,500.7 +Line B,501.1 +Line C,498.0 +Line D,504.0 +Line A,498.5 +Line B,499.3 +Line C,499.8 +Line D,501.6 +Line A,500.8 +Line B,509.2 +Line C,499.2 +Line D,501.0 +Line A,500.2 +Line B,503.2 +Line C,501.3 +Line D,502.1 +Line A,498.3 +Line B,500.7 +Line C,496.1 +Line D,501.4 diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-renamed/case.json b/agents/evals/fixtures/cases/box-basic-letsplot-renamed/case.json new file mode 100644 index 00000000000..3fb73e18c0d --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-renamed/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "box-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "category", + "column": "Abfülllinie" + }, + { + "role": "value", + "column": "Füllgewicht [g]" + } + ], + "expected": "accepted", + "tags": [ + "box", + "renamed", + "synthetic", + "renamed-headers", + "non-ascii-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, renamed)" +} diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-renamed/data.csv b/agents/evals/fixtures/cases/box-basic-letsplot-renamed/data.csv new file mode 100644 index 00000000000..f3b21176c0d --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-renamed/data.csv @@ -0,0 +1,241 @@ +Abfülllinie,Füllgewicht [g] +Line A,501.9 +Line B,498.7 +Line C,499.7 +Line D,500.5 +Line A,500.1 +Line B,500.8 +Line C,500.1 +Line D,501.4 +Line A,501.2 +Line B,499.3 +Line C,498.1 +Line D,501.0 +Line A,494.0 +Line B,496.2 +Line C,500.1 +Line D,500.4 +Line A,500.5 +Line B,501.6 +Line C,500.7 +Line D,502.7 +Line A,499.0 +Line B,502.0 +Line C,500.6 +Line D,503.4 +Line A,499.8 +Line B,500.2 +Line C,499.5 +Line D,500.9 +Line A,501.1 +Line B,503.8 +Line C,498.2 +Line D,502.6 +Line A,501.3 +Line B,503.9 +Line C,498.2 +Line D,500.8 +Line A,498.2 +Line B,502.1 +Line C,500.8 +Line D,502.4 +Line A,501.6 +Line B,499.6 +Line C,500.2 +Line D,500.6 +Line A,499.5 +Line B,496.6 +Line C,499.5 +Line D,501.8 +Line A,499.5 +Line B,501.2 +Line C,497.4 +Line D,503.8 +Line A,499.4 +Line B,505.5 +Line C,500.6 +Line D,502.4 +Line A,502.6 +Line B,501.9 +Line C,499.7 +Line D,503.4 +Line A,499.9 +Line B,502.5 +Line C,503.7 +Line D,502.3 +Line A,499.3 +Line B,499.3 +Line C,497.6 +Line D,502.2 +Line A,501.8 +Line B,503.1 +Line C,497.4 +Line D,502.7 +Line A,502.6 +Line B,500.1 +Line C,501.0 +Line D,503.3 +Line A,502.0 +Line B,496.4 +Line C,499.8 +Line D,501.9 +Line A,500.6 +Line B,498.9 +Line C,502.8 +Line D,501.7 +Line A,501.7 +Line B,503.0 +Line C,498.9 +Line D,502.2 +Line A,502.2 +Line B,498.6 +Line C,497.3 +Line D,501.8 +Line A,501.6 +Line B,500.0 +Line C,500.7 +Line D,501.7 +Line A,498.8 +Line B,500.9 +Line C,498.0 +Line D,502.1 +Line A,498.5 +Line B,502.2 +Line C,499.8 +Line D,501.6 +Line A,499.1 +Line B,499.8 +Line C,496.6 +Line D,502.4 +Line A,498.5 +Line B,499.5 +Line C,497.9 +Line D,503.3 +Line A,499.9 +Line B,501.0 +Line C,498.1 +Line D,503.6 +Line A,503.2 +Line B,502.3 +Line C,499.4 +Line D,494.3 +Line A,501.4 +Line B,501.9 +Line C,498.4 +Line D,500.3 +Line A,493.6 +Line B,501.1 +Line C,499.6 +Line D,502.3 +Line A,500.4 +Line B,501.0 +Line C,498.2 +Line D,502.3 +Line A,499.0 +Line B,500.4 +Line C,500.1 +Line D,502.6 +Line A,500.2 +Line B,500.0 +Line C,499.6 +Line D,502.4 +Line A,499.0 +Line B,500.9 +Line C,500.3 +Line D,501.3 +Line A,500.6 +Line B,500.1 +Line C,497.7 +Line D,502.4 +Line A,501.5 +Line B,501.8 +Line C,499.5 +Line D,502.0 +Line A,501.4 +Line B,503.6 +Line C,501.9 +Line D,503.7 +Line A,501.8 +Line B,500.7 +Line C,498.3 +Line D,501.3 +Line A,501.8 +Line B,501.2 +Line C,499.6 +Line D,502.6 +Line A,500.6 +Line B,499.6 +Line C,498.3 +Line D,502.7 +Line A,501.0 +Line B,498.9 +Line C,499.2 +Line D,502.1 +Line A,502.7 +Line B,502.9 +Line C,498.2 +Line D,502.2 +Line A,498.2 +Line B,498.5 +Line C,499.2 +Line D,502.0 +Line A,502.9 +Line B,505.2 +Line C,497.9 +Line D,502.5 +Line A,501.6 +Line B,501.7 +Line C,499.7 +Line D,502.9 +Line A,500.8 +Line B,502.3 +Line C,496.7 +Line D,502.1 +Line A,499.5 +Line B,502.1 +Line C,500.0 +Line D,501.1 +Line A,497.8 +Line B,499.9 +Line C,501.0 +Line D,503.2 +Line A,503.1 +Line B,499.1 +Line C,501.0 +Line D,500.2 +Line A,499.4 +Line B,497.9 +Line C,499.0 +Line D,500.5 +Line A,502.4 +Line B,500.3 +Line C,498.7 +Line D,502.0 +Line A,500.6 +Line B,498.7 +Line C,498.1 +Line D,500.6 +Line A,501.3 +Line B,505.4 +Line C,498.7 +Line D,503.2 +Line A,499.5 +Line B,502.0 +Line C,498.4 +Line D,501.3 +Line A,501.9 +Line B,489.3 +Line C,499.0 +Line D,502.6 +Line A,499.7 +Line B,500.0 +Line C,498.2 +Line D,501.4 +Line A,501.4 +Line B,506.5 +Line C,498.8 +Line D,501.7 +Line A,499.7 +Line B,502.0 +Line C,500.5 +Line D,501.4 diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-x10/case.json b/agents/evals/fixtures/cases/box-basic-letsplot-x10/case.json new file mode 100644 index 00000000000..ae9c915006a --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "box-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "category", + "column": "Production Line" + }, + { + "role": "value", + "column": "Fill Weight (g)" + } + ], + "expected": "accepted", + "tags": [ + "box", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, x10)" +} diff --git a/agents/evals/fixtures/cases/box-basic-letsplot-x10/data.csv b/agents/evals/fixtures/cases/box-basic-letsplot-x10/data.csv new file mode 100644 index 00000000000..05f7d36b8e3 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-letsplot-x10/data.csv @@ -0,0 +1,241 @@ +Production Line,Fill Weight (g) +Line A,5019.3 +Line B,4987.0 +Line C,4997.3 +Line D,5005.3 +Line A,5001.1 +Line B,5008.0 +Line C,5000.8 +Line D,5014.1 +Line A,5012.1 +Line B,4993.1 +Line C,4981.1 +Line D,5010.1 +Line A,4940.3 +Line B,4961.5 +Line C,5001.0 +Line D,5004.5 +Line A,5004.5 +Line B,5015.9 +Line C,5007.5 +Line D,5026.6 +Line A,4990.5 +Line B,5019.9 +Line C,5006.2 +Line D,5034.4 +Line A,4997.9 +Line B,5001.6 +Line C,4995.3 +Line D,5009.2 +Line A,5011.0 +Line B,5037.7 +Line C,4982.4 +Line D,5026.2 +Line A,5013.1 +Line B,5039.0 +Line C,4981.6 +Line D,5008.1 +Line A,4981.6 +Line B,5021.1 +Line C,5008.0 +Line D,5024.1 +Line A,5015.9 +Line B,4995.8 +Line C,5001.5 +Line D,5006.5 +Line A,4995.0 +Line B,4966.0 +Line C,4994.8 +Line D,5017.9 +Line A,4994.8 +Line B,5011.7 +Line C,4974.4 +Line D,5037.6 +Line A,4993.5 +Line B,5054.9 +Line C,5006.1 +Line D,5023.9 +Line A,5025.9 +Line B,5018.9 +Line C,4996.8 +Line D,5033.5 +Line A,4999.3 +Line B,5025.0 +Line C,5036.7 +Line D,5023.0 +Line A,4993.3 +Line B,4993.3 +Line C,4976.2 +Line D,5021.8 +Line A,5018.0 +Line B,5030.6 +Line C,4974.2 +Line D,5027.4 +Line A,5026.2 +Line B,5000.8 +Line C,5009.9 +Line D,5032.7 +Line A,5020.5 +Line B,4964.3 +Line C,4998.3 +Line D,5019.3 +Line A,5005.6 +Line B,4989.3 +Line C,5028.5 +Line D,5017.5 +Line A,5016.7 +Line B,5029.9 +Line C,4989.0 +Line D,5021.8 +Line A,5022.1 +Line B,4986.4 +Line C,4972.7 +Line D,5018.2 +Line A,5015.8 +Line B,4999.5 +Line C,5006.8 +Line D,5017.5 +Line A,4987.6 +Line B,5009.3 +Line C,4979.7 +Line D,5021.0 +Line A,4985.4 +Line B,5021.6 +Line C,4998.1 +Line D,5015.7 +Line A,4991.1 +Line B,4997.8 +Line C,4966.4 +Line D,5023.5 +Line A,4985.4 +Line B,4995.1 +Line C,4979.4 +Line D,5033.1 +Line A,4998.9 +Line B,5010.2 +Line C,4981.0 +Line D,5036.0 +Line A,5032.0 +Line B,5022.6 +Line C,4993.8 +Line D,4943.3 +Line A,5013.8 +Line B,5019.0 +Line C,4984.1 +Line D,5003.3 +Line A,4936.3 +Line B,5011.3 +Line C,4995.7 +Line D,5022.7 +Line A,5004.2 +Line B,5009.9 +Line C,4981.5 +Line D,5023.4 +Line A,4990.1 +Line B,5004.2 +Line C,5000.9 +Line D,5026.3 +Line A,5001.8 +Line B,5000.0 +Line C,4995.9 +Line D,5024.4 +Line A,4989.9 +Line B,5009.1 +Line C,5002.9 +Line D,5013.4 +Line A,5006.0 +Line B,5000.9 +Line C,4976.7 +Line D,5024.1 +Line A,5014.7 +Line B,5017.9 +Line C,4995.4 +Line D,5019.5 +Line A,5014.4 +Line B,5036.1 +Line C,5019.0 +Line D,5036.7 +Line A,5018.0 +Line B,5007.2 +Line C,4983.1 +Line D,5013.1 +Line A,5018.0 +Line B,5012.5 +Line C,4996.0 +Line D,5026.4 +Line A,5006.5 +Line B,4995.6 +Line C,4982.8 +Line D,5027.3 +Line A,5009.7 +Line B,4988.8 +Line C,4992.4 +Line D,5021.1 +Line A,5027.1 +Line B,5029.3 +Line C,4981.8 +Line D,5022.3 +Line A,4981.5 +Line B,4985.4 +Line C,4992.1 +Line D,5020.5 +Line A,5028.6 +Line B,5051.6 +Line C,4978.5 +Line D,5024.9 +Line A,5016.4 +Line B,5016.6 +Line C,4996.8 +Line D,5029.1 +Line A,5008.2 +Line B,5022.8 +Line C,4967.4 +Line D,5021.0 +Line A,4995.2 +Line B,5021.1 +Line C,5000.4 +Line D,5011.3 +Line A,4977.7 +Line B,4998.6 +Line C,5009.6 +Line D,5031.8 +Line A,5031.2 +Line B,4991.4 +Line C,5009.6 +Line D,5002.3 +Line A,4994.3 +Line B,4978.5 +Line C,4989.9 +Line D,5004.9 +Line A,5023.7 +Line B,5003.5 +Line C,4987.0 +Line D,5020.4 +Line A,5006.5 +Line B,4986.7 +Line C,4981.4 +Line D,5006.2 +Line A,5013.4 +Line B,5053.7 +Line C,4986.8 +Line D,5031.8 +Line A,4995.4 +Line B,5020.4 +Line C,4983.7 +Line D,5012.8 +Line A,5019.2 +Line B,4892.8 +Line C,4989.8 +Line D,5025.9 +Line A,4996.7 +Line B,5000.1 +Line C,4981.6 +Line D,5014.4 +Line A,5013.7 +Line B,5065.0 +Line C,4988.4 +Line D,5017.0 +Line A,4997.4 +Line B,5019.9 +Line C,5004.9 +Line D,5014.4 diff --git a/agents/evals/fixtures/cases/box-basic-pygal-date/case.json b/agents/evals/fixtures/cases/box-basic-pygal-date/case.json new file mode 100644 index 00000000000..9cdc702644e --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "box-basic", + "library": "pygal", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "category", + "column": "Production Line" + }, + { + "role": "value", + "column": "Fill Weight (g)" + } + ], + "expected": "accepted", + "tags": [ + "box", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, date)" +} diff --git a/agents/evals/fixtures/cases/box-basic-pygal-date/data.csv b/agents/evals/fixtures/cases/box-basic-pygal-date/data.csv new file mode 100644 index 00000000000..523541979ba --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-date/data.csv @@ -0,0 +1,241 @@ +Production Line,Fill Weight (g),Shift Date,Checked On +Line A,501.9,20.01.2026,2026-01-22 +Line B,498.7,26.05.2026,2026-05-27 +Line C,499.7,19.02.2026,2026-02-19 +Line D,500.5,09.05.2026,2026-05-09 +Line A,500.1,27.01.2026,2026-01-31 +Line B,500.8,10.02.2026,2026-02-13 +Line C,500.1,02.03.2026,2026-03-04 +Line D,501.4,13.06.2026,2026-06-13 +Line A,501.2,25.02.2026,2026-02-27 +Line B,499.3,29.06.2026,2026-07-03 +Line C,498.1,22.02.2026,2026-02-26 +Line D,501.0,02.02.2026,2026-02-06 +Line A,494.0,28.04.2026,2026-04-30 +Line B,496.2,12.05.2026,2026-05-12 +Line C,500.1,10.06.2026,2026-06-12 +Line D,500.4,25.01.2026,2026-01-26 +Line A,500.5,20.04.2026,2026-04-22 +Line B,501.6,19.04.2026,2026-04-22 +Line C,500.7,13.04.2026,2026-04-16 +Line D,502.7,16.02.2026,2026-02-16 +Line A,499.0,17.03.2026,2026-03-18 +Line B,502.0,26.03.2026,2026-03-26 +Line C,500.6,20.01.2026,2026-01-21 +Line D,503.4,13.06.2026,2026-06-16 +Line A,499.8,14.03.2026,2026-03-17 +Line B,500.2,24.04.2026,2026-04-28 +Line C,499.5,09.04.2026,2026-04-09 +Line D,500.9,15.02.2026,2026-02-16 +Line A,501.1,01.06.2026,2026-06-03 +Line B,503.8,18.01.2026,2026-01-20 +Line C,498.2,08.03.2026,2026-03-10 +Line D,502.6,23.05.2026,2026-05-25 +Line A,501.3,24.01.2026,2026-01-25 +Line B,503.9,26.03.2026,2026-03-29 +Line C,498.2,14.02.2026,2026-02-18 +Line D,500.8,07.01.2026,2026-01-10 +Line A,498.2,12.01.2026,2026-01-15 +Line B,502.1,25.05.2026,2026-05-29 +Line C,500.8,19.04.2026,2026-04-22 +Line D,502.4,24.06.2026,2026-06-27 +Line A,501.6,07.01.2026,2026-01-08 +Line B,499.6,18.05.2026,2026-05-21 +Line C,500.2,20.01.2026,2026-01-22 +Line D,500.6,23.06.2026,2026-06-27 +Line A,499.5,12.03.2026,2026-03-12 +Line B,496.6,19.01.2026,2026-01-22 +Line C,499.5,17.03.2026,2026-03-18 +Line D,501.8,29.06.2026,2026-07-02 +Line A,499.5,20.01.2026,2026-01-20 +Line B,501.2,10.04.2026,2026-04-12 +Line C,497.4,01.02.2026,2026-02-05 +Line D,503.8,11.05.2026,2026-05-11 +Line A,499.4,09.02.2026,2026-02-12 +Line B,505.5,26.01.2026,2026-01-26 +Line C,500.6,21.06.2026,2026-06-22 +Line D,502.4,10.06.2026,2026-06-13 +Line A,502.6,16.02.2026,2026-02-16 +Line B,501.9,08.02.2026,2026-02-12 +Line C,499.7,12.03.2026,2026-03-15 +Line D,503.4,28.01.2026,2026-01-31 +Line A,499.9,13.01.2026,2026-01-14 +Line B,502.5,23.04.2026,2026-04-27 +Line C,503.7,13.04.2026,2026-04-17 +Line D,502.3,24.06.2026,2026-06-24 +Line A,499.3,07.06.2026,2026-06-08 +Line B,499.3,17.04.2026,2026-04-17 +Line C,497.6,05.05.2026,2026-05-06 +Line D,502.2,27.03.2026,2026-03-27 +Line A,501.8,19.03.2026,2026-03-21 +Line B,503.1,13.05.2026,2026-05-16 +Line C,497.4,07.01.2026,2026-01-08 +Line D,502.7,06.01.2026,2026-01-06 +Line A,502.6,23.02.2026,2026-02-25 +Line B,500.1,20.02.2026,2026-02-23 +Line C,501.0,29.03.2026,2026-03-31 +Line D,503.3,22.04.2026,2026-04-26 +Line A,502.0,31.05.2026,2026-06-03 +Line B,496.4,30.06.2026,2026-07-02 +Line C,499.8,31.03.2026,2026-04-04 +Line D,501.9,30.01.2026,2026-01-31 +Line A,500.6,27.01.2026,2026-01-27 +Line B,498.9,02.06.2026,2026-06-06 +Line C,502.8,26.05.2026,2026-05-26 +Line D,501.7,04.04.2026,2026-04-07 +Line A,501.7,06.03.2026,2026-03-06 +Line B,503.0,24.06.2026,2026-06-25 +Line C,498.9,25.04.2026,2026-04-29 +Line D,502.2,15.01.2026,2026-01-15 +Line A,502.2,12.06.2026,2026-06-15 +Line B,498.6,23.02.2026,2026-02-25 +Line C,497.3,18.06.2026,2026-06-21 +Line D,501.8,15.06.2026,2026-06-18 +Line A,501.6,02.07.2026,2026-07-02 +Line B,500.0,25.03.2026,2026-03-25 +Line C,500.7,22.06.2026,2026-06-26 +Line D,501.7,09.02.2026,2026-02-09 +Line A,498.8,07.01.2026,2026-01-09 +Line B,500.9,12.06.2026,2026-06-13 +Line C,498.0,08.02.2026,2026-02-11 +Line D,502.1,19.01.2026,2026-01-23 +Line A,498.5,08.04.2026,2026-04-10 +Line B,502.2,01.06.2026,2026-06-03 +Line C,499.8,28.01.2026,2026-01-30 +Line D,501.6,05.02.2026,2026-02-07 +Line A,499.1,17.06.2026,2026-06-18 +Line B,499.8,20.05.2026,2026-05-23 +Line C,496.6,22.05.2026,2026-05-23 +Line D,502.4,02.04.2026,2026-04-02 +Line A,498.5,11.04.2026,2026-04-11 +Line B,499.5,26.06.2026,2026-06-27 +Line C,497.9,21.05.2026,2026-05-25 +Line D,503.3,02.02.2026,2026-02-05 +Line A,499.9,19.04.2026,2026-04-19 +Line B,501.0,15.01.2026,2026-01-19 +Line C,498.1,12.01.2026,2026-01-12 +Line D,503.6,06.02.2026,2026-02-08 +Line A,503.2,15.05.2026,2026-05-16 +Line B,502.3,20.04.2026,2026-04-21 +Line C,499.4,08.06.2026,2026-06-12 +Line D,494.3,02.04.2026,2026-04-03 +Line A,501.4,30.03.2026,2026-03-30 +Line B,501.9,08.04.2026,2026-04-11 +Line C,498.4,09.02.2026,2026-02-13 +Line D,500.3,13.01.2026,2026-01-14 +Line A,493.6,09.06.2026,2026-06-11 +Line B,501.1,05.06.2026,2026-06-06 +Line C,499.6,27.03.2026,2026-03-30 +Line D,502.3,17.02.2026,2026-02-19 +Line A,500.4,30.05.2026,2026-06-02 +Line B,501.0,10.05.2026,2026-05-11 +Line C,498.2,20.04.2026,2026-04-22 +Line D,502.3,13.05.2026,2026-05-17 +Line A,499.0,22.02.2026,2026-02-26 +Line B,500.4,14.06.2026,2026-06-16 +Line C,500.1,07.06.2026,2026-06-07 +Line D,502.6,08.06.2026,2026-06-12 +Line A,500.2,06.02.2026,2026-02-09 +Line B,500.0,18.01.2026,2026-01-18 +Line C,499.6,14.01.2026,2026-01-17 +Line D,502.4,27.03.2026,2026-03-29 +Line A,499.0,13.01.2026,2026-01-13 +Line B,500.9,22.04.2026,2026-04-22 +Line C,500.3,01.05.2026,2026-05-03 +Line D,501.3,15.04.2026,2026-04-16 +Line A,500.6,28.06.2026,2026-07-02 +Line B,500.1,09.01.2026,2026-01-10 +Line C,497.7,03.06.2026,2026-06-03 +Line D,502.4,10.02.2026,2026-02-14 +Line A,501.5,07.05.2026,2026-05-07 +Line B,501.8,29.01.2026,2026-02-01 +Line C,499.5,16.02.2026,2026-02-19 +Line D,502.0,16.03.2026,2026-03-18 +Line A,501.4,17.01.2026,2026-01-21 +Line B,503.6,14.02.2026,2026-02-16 +Line C,501.9,02.07.2026,2026-07-03 +Line D,503.7,18.02.2026,2026-02-22 +Line A,501.8,02.02.2026,2026-02-02 +Line B,500.7,22.05.2026,2026-05-26 +Line C,498.3,22.05.2026,2026-05-24 +Line D,501.3,01.03.2026,2026-03-03 +Line A,501.8,04.06.2026,2026-06-05 +Line B,501.2,09.06.2026,2026-06-10 +Line C,499.6,28.01.2026,2026-01-28 +Line D,502.6,09.03.2026,2026-03-12 +Line A,500.6,31.03.2026,2026-04-03 +Line B,499.6,29.06.2026,2026-07-03 +Line C,498.3,15.02.2026,2026-02-17 +Line D,502.7,23.04.2026,2026-04-25 +Line A,501.0,26.02.2026,2026-02-26 +Line B,498.9,08.02.2026,2026-02-12 +Line C,499.2,08.02.2026,2026-02-08 +Line D,502.1,04.02.2026,2026-02-04 +Line A,502.7,16.02.2026,2026-02-18 +Line B,502.9,20.06.2026,2026-06-20 +Line C,498.2,31.05.2026,2026-06-01 +Line D,502.2,18.06.2026,2026-06-21 +Line A,498.2,12.02.2026,2026-02-16 +Line B,498.5,23.02.2026,2026-02-27 +Line C,499.2,30.03.2026,2026-04-01 +Line D,502.0,15.05.2026,2026-05-19 +Line A,502.9,18.03.2026,2026-03-19 +Line B,505.2,19.04.2026,2026-04-23 +Line C,497.9,26.04.2026,2026-04-29 +Line D,502.5,01.03.2026,2026-03-02 +Line A,501.6,09.01.2026,2026-01-11 +Line B,501.7,17.05.2026,2026-05-20 +Line C,499.7,23.06.2026,2026-06-27 +Line D,502.9,16.01.2026,2026-01-20 +Line A,500.8,03.03.2026,2026-03-03 +Line B,502.3,16.01.2026,2026-01-18 +Line C,496.7,18.03.2026,2026-03-19 +Line D,502.1,12.06.2026,2026-06-14 +Line A,499.5,24.06.2026,2026-06-26 +Line B,502.1,24.04.2026,2026-04-26 +Line C,500.0,21.06.2026,2026-06-24 +Line D,501.1,23.04.2026,2026-04-27 +Line A,497.8,28.06.2026,2026-06-29 +Line B,499.9,30.06.2026,2026-07-01 +Line C,501.0,12.04.2026,2026-04-14 +Line D,503.2,24.05.2026,2026-05-26 +Line A,503.1,25.01.2026,2026-01-26 +Line B,499.1,12.06.2026,2026-06-12 +Line C,501.0,14.01.2026,2026-01-18 +Line D,500.2,06.03.2026,2026-03-08 +Line A,499.4,22.03.2026,2026-03-22 +Line B,497.9,23.06.2026,2026-06-26 +Line C,499.0,21.03.2026,2026-03-25 +Line D,500.5,29.04.2026,2026-05-01 +Line A,502.4,25.01.2026,2026-01-27 +Line B,500.3,11.01.2026,2026-01-12 +Line C,498.7,02.04.2026,2026-04-03 +Line D,502.0,25.05.2026,2026-05-28 +Line A,500.6,13.05.2026,2026-05-15 +Line B,498.7,21.01.2026,2026-01-25 +Line C,498.1,25.05.2026,2026-05-27 +Line D,500.6,18.06.2026,2026-06-22 +Line A,501.3,08.06.2026,2026-06-12 +Line B,505.4,25.05.2026,2026-05-26 +Line C,498.7,12.04.2026,2026-04-16 +Line D,503.2,07.01.2026,2026-01-09 +Line A,499.5,07.06.2026,2026-06-07 +Line B,502.0,17.06.2026,2026-06-19 +Line C,498.4,06.06.2026,2026-06-06 +Line D,501.3,18.06.2026,2026-06-22 +Line A,501.9,03.02.2026,2026-02-04 +Line B,489.3,23.06.2026,2026-06-24 +Line C,499.0,16.06.2026,2026-06-19 +Line D,502.6,24.04.2026,2026-04-26 +Line A,499.7,24.02.2026,2026-02-24 +Line B,500.0,26.05.2026,2026-05-30 +Line C,498.2,20.02.2026,2026-02-23 +Line D,501.4,06.02.2026,2026-02-10 +Line A,501.4,18.02.2026,2026-02-20 +Line B,506.5,05.05.2026,2026-05-08 +Line C,498.8,26.01.2026,2026-01-29 +Line D,501.7,20.02.2026,2026-02-21 +Line A,499.7,15.02.2026,2026-02-15 +Line B,502.0,14.02.2026,2026-02-18 +Line C,500.5,09.01.2026,2026-01-10 +Line D,501.4,08.04.2026,2026-04-10 diff --git a/agents/evals/fixtures/cases/box-basic-pygal-decimal-comma/case.json b/agents/evals/fixtures/cases/box-basic-pygal-decimal-comma/case.json new file mode 100644 index 00000000000..a02cb33927a --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "box-basic", + "library": "pygal", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "category", + "column": "Production Line" + }, + { + "role": "value", + "column": "Fill Weight (g)" + } + ], + "expected": "accepted", + "tags": [ + "box", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/box-basic-pygal-decimal-comma/data.csv b/agents/evals/fixtures/cases/box-basic-pygal-decimal-comma/data.csv new file mode 100644 index 00000000000..87f3168c064 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-decimal-comma/data.csv @@ -0,0 +1,241 @@ +Production Line;Fill Weight (g) +Line A;501,9 +Line B;498,7 +Line C;499,7 +Line D;500,5 +Line A;500,1 +Line B;500,8 +Line C;500,1 +Line D;501,4 +Line A;501,2 +Line B;499,3 +Line C;498,1 +Line D;501,0 +Line A;494,0 +Line B;496,2 +Line C;500,1 +Line D;500,4 +Line A;500,5 +Line B;501,6 +Line C;500,7 +Line D;502,7 +Line A;499,0 +Line B;502,0 +Line C;500,6 +Line D;503,4 +Line A;499,8 +Line B;500,2 +Line C;499,5 +Line D;500,9 +Line A;501,1 +Line B;503,8 +Line C;498,2 +Line D;502,6 +Line A;501,3 +Line B;503,9 +Line C;498,2 +Line D;500,8 +Line A;498,2 +Line B;502,1 +Line C;500,8 +Line D;502,4 +Line A;501,6 +Line B;499,6 +Line C;500,2 +Line D;500,6 +Line A;499,5 +Line B;496,6 +Line C;499,5 +Line D;501,8 +Line A;499,5 +Line B;501,2 +Line C;497,4 +Line D;503,8 +Line A;499,4 +Line B;505,5 +Line C;500,6 +Line D;502,4 +Line A;502,6 +Line B;501,9 +Line C;499,7 +Line D;503,4 +Line A;499,9 +Line B;502,5 +Line C;503,7 +Line D;502,3 +Line A;499,3 +Line B;499,3 +Line C;497,6 +Line D;502,2 +Line A;501,8 +Line B;503,1 +Line C;497,4 +Line D;502,7 +Line A;502,6 +Line B;500,1 +Line C;501,0 +Line D;503,3 +Line A;502,0 +Line B;496,4 +Line C;499,8 +Line D;501,9 +Line A;500,6 +Line B;498,9 +Line C;502,8 +Line D;501,7 +Line A;501,7 +Line B;503,0 +Line C;498,9 +Line D;502,2 +Line A;502,2 +Line B;498,6 +Line C;497,3 +Line D;501,8 +Line A;501,6 +Line B;500,0 +Line C;500,7 +Line D;501,7 +Line A;498,8 +Line B;500,9 +Line C;498,0 +Line D;502,1 +Line A;498,5 +Line B;502,2 +Line C;499,8 +Line D;501,6 +Line A;499,1 +Line B;499,8 +Line C;496,6 +Line D;502,4 +Line A;498,5 +Line B;499,5 +Line C;497,9 +Line D;503,3 +Line A;499,9 +Line B;501,0 +Line C;498,1 +Line D;503,6 +Line A;503,2 +Line B;502,3 +Line C;499,4 +Line D;494,3 +Line A;501,4 +Line B;501,9 +Line C;498,4 +Line D;500,3 +Line A;493,6 +Line B;501,1 +Line C;499,6 +Line D;502,3 +Line A;500,4 +Line B;501,0 +Line C;498,2 +Line D;502,3 +Line A;499,0 +Line B;500,4 +Line C;500,1 +Line D;502,6 +Line A;500,2 +Line B;500,0 +Line C;499,6 +Line D;502,4 +Line A;499,0 +Line B;500,9 +Line C;500,3 +Line D;501,3 +Line A;500,6 +Line B;500,1 +Line C;497,7 +Line D;502,4 +Line A;501,5 +Line B;501,8 +Line C;499,5 +Line D;502,0 +Line A;501,4 +Line B;503,6 +Line C;501,9 +Line D;503,7 +Line A;501,8 +Line B;500,7 +Line C;498,3 +Line D;501,3 +Line A;501,8 +Line B;501,2 +Line C;499,6 +Line D;502,6 +Line A;500,6 +Line B;499,6 +Line C;498,3 +Line D;502,7 +Line A;501,0 +Line B;498,9 +Line C;499,2 +Line D;502,1 +Line A;502,7 +Line B;502,9 +Line C;498,2 +Line D;502,2 +Line A;498,2 +Line B;498,5 +Line C;499,2 +Line D;502,0 +Line A;502,9 +Line B;505,2 +Line C;497,9 +Line D;502,5 +Line A;501,6 +Line B;501,7 +Line C;499,7 +Line D;502,9 +Line A;500,8 +Line B;502,3 +Line C;496,7 +Line D;502,1 +Line A;499,5 +Line B;502,1 +Line C;500,0 +Line D;501,1 +Line A;497,8 +Line B;499,9 +Line C;501,0 +Line D;503,2 +Line A;503,1 +Line B;499,1 +Line C;501,0 +Line D;500,2 +Line A;499,4 +Line B;497,9 +Line C;499,0 +Line D;500,5 +Line A;502,4 +Line B;500,3 +Line C;498,7 +Line D;502,0 +Line A;500,6 +Line B;498,7 +Line C;498,1 +Line D;500,6 +Line A;501,3 +Line B;505,4 +Line C;498,7 +Line D;503,2 +Line A;499,5 +Line B;502,0 +Line C;498,4 +Line D;501,3 +Line A;501,9 +Line B;489,3 +Line C;499,0 +Line D;502,6 +Line A;499,7 +Line B;500,0 +Line C;498,2 +Line D;501,4 +Line A;501,4 +Line B;506,5 +Line C;498,8 +Line D;501,7 +Line A;499,7 +Line B;502,0 +Line C;500,5 +Line D;501,4 diff --git a/agents/evals/fixtures/cases/box-basic-pygal-n12/case.json b/agents/evals/fixtures/cases/box-basic-pygal-n12/case.json new file mode 100644 index 00000000000..45a66a455b8 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "box-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "category", + "column": "Production Line" + }, + { + "role": "value", + "column": "Fill Weight (g)" + } + ], + "expected": "accepted", + "tags": [ + "box", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, n12)" +} diff --git a/agents/evals/fixtures/cases/box-basic-pygal-n12/data.csv b/agents/evals/fixtures/cases/box-basic-pygal-n12/data.csv new file mode 100644 index 00000000000..9f5cb18a70a --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-n12/data.csv @@ -0,0 +1,13 @@ +Production Line,Fill Weight (g) +Line A,497.9 +Line B,498.9 +Line C,501.0 +Line D,501.7 +Line A,499.9 +Line B,504.8 +Line C,504.4 +Line D,502.7 +Line A,500.5 +Line B,501.1 +Line C,500.0 +Line D,501.8 diff --git a/agents/evals/fixtures/cases/box-basic-pygal-n5000/case.json b/agents/evals/fixtures/cases/box-basic-pygal-n5000/case.json new file mode 100644 index 00000000000..54dd6fb4f1e --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "box-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "category", + "column": "Production Line" + }, + { + "role": "value", + "column": "Fill Weight (g)" + } + ], + "expected": "accepted", + "tags": [ + "box", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, n5000)" +} diff --git a/agents/evals/fixtures/cases/box-basic-pygal-n5000/data.csv b/agents/evals/fixtures/cases/box-basic-pygal-n5000/data.csv new file mode 100644 index 00000000000..e5b76eac639 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-n5000/data.csv @@ -0,0 +1,5001 @@ +Production Line,Fill Weight (g) +Line A,499.4 +Line B,501.6 +Line C,498.7 +Line D,500.9 +Line A,500.4 +Line B,501.9 +Line C,499.0 +Line D,501.3 +Line A,501.7 +Line B,499.6 +Line C,499.1 +Line D,502.2 +Line A,499.1 +Line B,501.5 +Line C,496.0 +Line D,502.7 +Line A,500.1 +Line B,504.6 +Line C,496.7 +Line D,501.1 +Line A,500.9 +Line B,505.8 +Line C,502.1 +Line D,502.8 +Line A,498.6 +Line B,499.2 +Line C,504.1 +Line D,501.1 +Line A,500.1 +Line B,500.7 +Line C,498.8 +Line D,494.8 +Line A,499.7 +Line B,502.2 +Line C,499.1 +Line D,502.0 +Line A,499.3 +Line B,500.1 +Line C,498.3 +Line D,501.2 +Line A,501.3 +Line B,499.7 +Line C,500.3 +Line D,501.4 +Line A,499.6 +Line B,502.2 +Line C,500.4 +Line D,502.3 +Line A,500.4 +Line B,502.5 +Line C,498.4 +Line D,502.0 +Line A,501.2 +Line B,502.7 +Line C,500.9 +Line D,499.9 +Line A,497.2 +Line B,499.6 +Line C,499.8 +Line D,502.8 +Line A,501.4 +Line B,503.1 +Line C,498.4 +Line D,502.2 +Line A,499.5 +Line B,502.2 +Line C,500.9 +Line D,501.7 +Line A,502.0 +Line B,501.8 +Line C,498.1 +Line D,502.0 +Line A,499.8 +Line B,502.8 +Line C,496.4 +Line D,501.0 +Line A,499.5 +Line B,501.0 +Line C,497.8 +Line D,503.8 +Line A,499.1 +Line B,501.7 +Line C,501.1 +Line D,502.2 +Line A,501.0 +Line B,501.6 +Line C,500.5 +Line D,501.4 +Line A,500.2 +Line B,500.0 +Line C,500.8 +Line D,502.8 +Line A,500.1 +Line B,500.4 +Line C,499.9 +Line D,502.0 +Line A,501.5 +Line B,499.9 +Line C,499.9 +Line D,502.6 +Line A,500.4 +Line B,502.0 +Line C,501.4 +Line D,501.6 +Line A,499.5 +Line B,499.7 +Line C,498.3 +Line D,501.2 +Line A,499.1 +Line B,502.1 +Line C,496.4 +Line D,503.6 +Line A,500.5 +Line B,500.4 +Line C,499.2 +Line D,503.4 +Line A,500.3 +Line B,502.6 +Line C,498.7 +Line D,502.2 +Line A,498.2 +Line B,502.4 +Line C,499.9 +Line D,501.7 +Line A,502.6 +Line B,501.3 +Line C,497.3 +Line D,501.8 +Line A,499.2 +Line B,500.2 +Line C,500.0 +Line D,503.0 +Line A,499.1 +Line B,502.4 +Line C,500.6 +Line D,502.5 +Line A,499.1 +Line B,504.0 +Line C,498.4 +Line D,501.3 +Line A,500.7 +Line B,498.9 +Line C,495.5 +Line D,501.4 +Line A,500.7 +Line B,499.5 +Line C,497.6 +Line D,502.3 +Line A,499.7 +Line B,501.9 +Line C,498.6 +Line D,502.3 +Line A,500.0 +Line B,509.2 +Line C,499.3 +Line D,501.8 +Line A,498.8 +Line B,499.7 +Line C,498.6 +Line D,509.8 +Line A,501.1 +Line B,503.5 +Line C,498.1 +Line D,502.0 +Line A,493.7 +Line B,498.9 +Line C,500.5 +Line D,501.0 +Line A,499.8 +Line B,501.3 +Line C,494.3 +Line D,500.5 +Line A,501.0 +Line B,508.9 +Line C,496.2 +Line D,501.6 +Line A,500.6 +Line B,500.7 +Line C,497.8 +Line D,501.0 +Line A,499.6 +Line B,503.7 +Line C,498.0 +Line D,502.9 +Line A,501.2 +Line B,503.3 +Line C,497.9 +Line D,502.6 +Line A,498.5 +Line B,501.1 +Line C,499.7 +Line D,502.0 +Line A,500.4 +Line B,501.0 +Line C,500.8 +Line D,503.5 +Line A,505.0 +Line B,505.8 +Line C,501.7 +Line D,503.2 +Line A,500.0 +Line B,495.8 +Line C,499.6 +Line D,502.1 +Line A,499.7 +Line B,500.2 +Line C,498.9 +Line D,502.6 +Line A,500.7 +Line B,502.7 +Line C,496.8 +Line D,501.1 +Line A,499.4 +Line B,498.8 +Line C,496.0 +Line D,501.6 +Line A,501.5 +Line B,500.9 +Line C,496.5 +Line D,501.6 +Line A,489.9 +Line B,499.4 +Line C,498.7 +Line D,501.7 +Line A,499.0 +Line B,500.9 +Line C,500.0 +Line D,502.9 +Line A,501.1 +Line B,509.3 +Line C,499.0 +Line D,502.8 +Line A,500.9 +Line B,502.3 +Line C,499.8 +Line D,501.5 +Line A,498.7 +Line B,501.2 +Line C,498.8 +Line D,502.1 +Line A,503.3 +Line B,506.0 +Line C,498.2 +Line D,501.5 +Line A,498.9 +Line B,500.1 +Line C,498.3 +Line D,502.7 +Line A,502.0 +Line B,499.4 +Line C,497.1 +Line D,501.0 +Line A,498.4 +Line B,501.2 +Line C,491.0 +Line D,501.9 +Line A,499.0 +Line B,503.4 +Line C,499.2 +Line D,502.2 +Line A,499.7 +Line B,502.1 +Line C,498.1 +Line D,502.9 +Line A,501.3 +Line B,500.2 +Line C,498.9 +Line D,503.0 +Line A,498.3 +Line B,500.3 +Line C,497.8 +Line D,501.7 +Line A,498.5 +Line B,502.3 +Line C,498.4 +Line D,502.8 +Line A,500.7 +Line B,502.9 +Line C,496.6 +Line D,503.2 +Line A,499.8 +Line B,500.3 +Line C,496.9 +Line D,502.3 +Line A,500.6 +Line B,502.5 +Line C,498.6 +Line D,502.4 +Line A,500.4 +Line B,498.5 +Line C,500.0 +Line D,502.0 +Line A,502.7 +Line B,498.8 +Line C,500.2 +Line D,501.7 +Line A,500.1 +Line B,501.9 +Line C,498.7 +Line D,501.3 +Line A,499.5 +Line B,500.2 +Line C,497.4 +Line D,501.4 +Line A,503.1 +Line B,501.7 +Line C,500.1 +Line D,502.6 +Line A,498.1 +Line B,501.0 +Line C,500.0 +Line D,501.7 +Line A,499.9 +Line B,503.3 +Line C,498.3 +Line D,502.7 +Line A,501.3 +Line B,500.5 +Line C,501.2 +Line D,503.0 +Line A,499.5 +Line B,500.7 +Line C,499.7 +Line D,501.7 +Line A,499.8 +Line B,500.4 +Line C,501.3 +Line D,502.8 +Line A,500.4 +Line B,502.8 +Line C,501.1 +Line D,501.7 +Line A,499.3 +Line B,499.0 +Line C,498.5 +Line D,502.7 +Line A,501.4 +Line B,500.2 +Line C,501.0 +Line D,501.1 +Line A,499.4 +Line B,502.8 +Line C,500.3 +Line D,503.6 +Line A,498.7 +Line B,500.7 +Line C,498.9 +Line D,501.1 +Line A,499.8 +Line B,503.6 +Line C,498.0 +Line D,501.6 +Line A,500.3 +Line B,504.1 +Line C,499.3 +Line D,502.1 +Line A,500.4 +Line B,503.1 +Line C,499.4 +Line D,501.6 +Line A,500.8 +Line B,504.5 +Line C,500.8 +Line D,500.5 +Line A,501.3 +Line B,501.1 +Line C,500.2 +Line D,501.3 +Line A,499.6 +Line B,499.4 +Line C,501.4 +Line D,501.8 +Line A,500.4 +Line B,498.8 +Line C,502.4 +Line D,501.8 +Line A,501.3 +Line B,501.7 +Line C,500.1 +Line D,501.3 +Line A,501.3 +Line B,499.2 +Line C,496.8 +Line D,503.5 +Line A,500.6 +Line B,500.9 +Line C,507.5 +Line D,502.4 +Line A,500.0 +Line B,504.8 +Line C,499.5 +Line D,502.7 +Line A,498.8 +Line B,503.8 +Line C,497.1 +Line D,504.2 +Line A,499.9 +Line B,501.5 +Line C,499.0 +Line D,500.8 +Line A,499.8 +Line B,501.0 +Line C,499.4 +Line D,502.1 +Line A,499.7 +Line B,501.1 +Line C,497.9 +Line D,501.8 +Line A,499.7 +Line B,500.9 +Line C,490.5 +Line D,502.2 +Line A,501.3 +Line B,508.5 +Line C,499.3 +Line D,502.7 +Line A,500.7 +Line B,505.1 +Line C,500.0 +Line D,501.5 +Line A,501.9 +Line B,501.4 +Line C,498.1 +Line D,500.8 +Line A,500.8 +Line B,499.1 +Line C,500.0 +Line D,501.1 +Line A,498.5 +Line B,505.5 +Line C,496.4 +Line D,499.1 +Line A,500.8 +Line B,502.8 +Line C,497.2 +Line D,502.7 +Line A,501.1 +Line B,498.0 +Line C,500.5 +Line D,502.6 +Line A,499.3 +Line B,500.5 +Line C,498.2 +Line D,500.4 +Line A,499.4 +Line B,498.3 +Line C,499.6 +Line D,502.7 +Line A,498.8 +Line B,502.8 +Line C,497.8 +Line D,501.7 +Line A,499.9 +Line B,500.6 +Line C,497.4 +Line D,502.5 +Line A,500.1 +Line B,501.9 +Line C,499.5 +Line D,502.0 +Line A,501.5 +Line B,501.7 +Line C,499.9 +Line D,501.9 +Line A,500.1 +Line B,508.4 +Line C,499.5 +Line D,502.1 +Line A,501.0 +Line B,500.2 +Line C,496.4 +Line D,502.9 +Line A,499.6 +Line B,500.2 +Line C,498.0 +Line D,502.7 +Line A,500.2 +Line B,495.7 +Line C,498.3 +Line D,503.2 +Line A,501.1 +Line B,502.5 +Line C,497.1 +Line D,501.3 +Line A,502.2 +Line B,501.6 +Line C,497.2 +Line D,502.7 +Line A,499.4 +Line B,499.0 +Line C,501.9 +Line D,502.8 +Line A,501.5 +Line B,498.5 +Line C,499.8 +Line D,500.4 +Line A,502.6 +Line B,498.6 +Line C,500.4 +Line D,502.2 +Line A,500.6 +Line B,504.7 +Line C,499.2 +Line D,502.0 +Line A,500.5 +Line B,503.0 +Line C,499.2 +Line D,501.0 +Line A,498.1 +Line B,501.4 +Line C,497.4 +Line D,503.3 +Line A,502.0 +Line B,505.4 +Line C,497.2 +Line D,502.7 +Line A,500.2 +Line B,501.5 +Line C,498.0 +Line D,501.8 +Line A,499.4 +Line B,499.7 +Line C,500.0 +Line D,501.8 +Line A,500.5 +Line B,503.1 +Line C,498.8 +Line D,500.9 +Line A,502.1 +Line B,499.3 +Line C,499.7 +Line D,503.7 +Line A,501.3 +Line B,501.6 +Line C,500.8 +Line D,501.2 +Line A,508.6 +Line B,498.9 +Line C,499.3 +Line D,501.6 +Line A,500.6 +Line B,501.2 +Line C,502.0 +Line D,501.2 +Line A,499.8 +Line B,507.4 +Line C,498.3 +Line D,502.4 +Line A,500.0 +Line B,506.2 +Line C,497.6 +Line D,502.0 +Line A,500.8 +Line B,503.5 +Line C,497.5 +Line D,502.1 +Line A,501.0 +Line B,496.8 +Line C,499.9 +Line D,501.7 +Line A,499.8 +Line B,502.2 +Line C,498.7 +Line D,501.4 +Line A,502.7 +Line B,500.9 +Line C,497.9 +Line D,501.5 +Line A,498.9 +Line B,502.7 +Line C,498.9 +Line D,501.4 +Line A,501.7 +Line B,498.5 +Line C,500.6 +Line D,502.8 +Line A,498.7 +Line B,501.5 +Line C,500.4 +Line D,502.9 +Line A,497.4 +Line B,498.5 +Line C,498.2 +Line D,501.2 +Line A,500.0 +Line B,500.6 +Line C,499.9 +Line D,502.8 +Line A,502.5 +Line B,504.4 +Line C,499.6 +Line D,502.7 +Line A,500.4 +Line B,500.2 +Line C,499.3 +Line D,502.1 +Line A,499.1 +Line B,497.8 +Line C,499.5 +Line D,503.4 +Line A,500.6 +Line B,507.8 +Line C,498.7 +Line D,502.4 +Line A,502.3 +Line B,502.3 +Line C,498.8 +Line D,503.1 +Line A,500.6 +Line B,506.3 +Line C,500.6 +Line D,501.8 +Line A,499.4 +Line B,502.4 +Line C,497.6 +Line D,503.4 +Line A,498.7 +Line B,497.9 +Line C,499.8 +Line D,500.6 +Line A,503.2 +Line B,500.6 +Line C,498.2 +Line D,502.3 +Line A,501.1 +Line B,504.4 +Line C,498.1 +Line D,491.5 +Line A,500.6 +Line B,500.5 +Line C,500.5 +Line D,502.1 +Line A,501.1 +Line B,503.6 +Line C,499.6 +Line D,502.2 +Line A,500.9 +Line B,501.5 +Line C,498.3 +Line D,501.5 +Line A,500.2 +Line B,502.4 +Line C,498.9 +Line D,502.2 +Line A,500.9 +Line B,501.6 +Line C,500.7 +Line D,501.5 +Line A,499.6 +Line B,501.0 +Line C,499.2 +Line D,503.1 +Line A,500.8 +Line B,499.4 +Line C,500.7 +Line D,501.7 +Line A,501.9 +Line B,498.6 +Line C,497.9 +Line D,501.4 +Line A,501.4 +Line B,498.3 +Line C,498.7 +Line D,502.4 +Line A,499.6 +Line B,500.9 +Line C,497.8 +Line D,501.2 +Line A,501.1 +Line B,499.9 +Line C,496.1 +Line D,501.7 +Line A,500.0 +Line B,498.6 +Line C,498.0 +Line D,502.7 +Line A,503.0 +Line B,502.2 +Line C,498.6 +Line D,501.5 +Line A,507.5 +Line B,500.8 +Line C,501.1 +Line D,502.4 +Line A,502.0 +Line B,500.2 +Line C,497.8 +Line D,501.1 +Line A,501.0 +Line B,500.4 +Line C,497.8 +Line D,502.0 +Line A,501.3 +Line B,500.5 +Line C,498.1 +Line D,502.1 +Line A,501.8 +Line B,501.7 +Line C,498.3 +Line D,502.6 +Line A,501.3 +Line B,502.8 +Line C,500.5 +Line D,500.6 +Line A,500.1 +Line B,503.6 +Line C,499.3 +Line D,502.5 +Line A,500.1 +Line B,501.9 +Line C,499.4 +Line D,501.7 +Line A,501.3 +Line B,496.8 +Line C,500.7 +Line D,501.8 +Line A,502.1 +Line B,500.4 +Line C,497.2 +Line D,501.0 +Line A,500.4 +Line B,503.8 +Line C,499.2 +Line D,502.6 +Line A,499.3 +Line B,498.6 +Line C,499.6 +Line D,503.1 +Line A,499.4 +Line B,501.0 +Line C,500.9 +Line D,501.1 +Line A,501.0 +Line B,499.5 +Line C,496.2 +Line D,502.3 +Line A,499.3 +Line B,497.7 +Line C,498.7 +Line D,503.5 +Line A,500.0 +Line B,500.1 +Line C,496.6 +Line D,500.6 +Line A,500.7 +Line B,502.5 +Line C,499.5 +Line D,500.5 +Line A,500.2 +Line B,499.8 +Line C,497.5 +Line D,501.5 +Line A,500.8 +Line B,502.1 +Line C,499.6 +Line D,503.8 +Line A,500.0 +Line B,498.7 +Line C,499.4 +Line D,501.6 +Line A,499.5 +Line B,500.9 +Line C,496.6 +Line D,502.6 +Line A,501.4 +Line B,501.3 +Line C,497.5 +Line D,502.0 +Line A,500.3 +Line B,500.3 +Line C,499.5 +Line D,502.1 +Line A,501.6 +Line B,507.0 +Line C,499.8 +Line D,502.8 +Line A,500.9 +Line B,501.0 +Line C,500.1 +Line D,502.1 +Line A,501.3 +Line B,502.6 +Line C,499.0 +Line D,501.6 +Line A,500.3 +Line B,504.4 +Line C,500.6 +Line D,502.4 +Line A,501.8 +Line B,500.7 +Line C,500.1 +Line D,493.0 +Line A,499.7 +Line B,498.2 +Line C,500.5 +Line D,501.3 +Line A,501.4 +Line B,501.5 +Line C,498.8 +Line D,502.1 +Line A,500.3 +Line B,499.5 +Line C,499.3 +Line D,502.2 +Line A,501.0 +Line B,503.7 +Line C,498.4 +Line D,503.0 +Line A,499.8 +Line B,501.6 +Line C,498.9 +Line D,501.5 +Line A,502.1 +Line B,502.3 +Line C,498.7 +Line D,504.0 +Line A,499.8 +Line B,497.9 +Line C,499.4 +Line D,501.7 +Line A,500.0 +Line B,503.0 +Line C,492.7 +Line D,502.5 +Line A,501.7 +Line B,501.6 +Line C,499.5 +Line D,501.7 +Line A,500.0 +Line B,501.6 +Line C,500.5 +Line D,502.1 +Line A,500.0 +Line B,500.7 +Line C,500.1 +Line D,501.5 +Line A,501.6 +Line B,501.5 +Line C,498.1 +Line D,502.4 +Line A,498.8 +Line B,502.8 +Line C,499.7 +Line D,501.9 +Line A,500.5 +Line B,503.1 +Line C,498.1 +Line D,502.9 +Line A,500.8 +Line B,498.1 +Line C,498.7 +Line D,508.1 +Line A,507.3 +Line B,499.9 +Line C,498.5 +Line D,502.4 +Line A,502.0 +Line B,499.6 +Line C,498.1 +Line D,501.5 +Line A,501.5 +Line B,502.7 +Line C,502.3 +Line D,502.1 +Line A,501.6 +Line B,503.0 +Line C,501.7 +Line D,501.8 +Line A,498.2 +Line B,499.2 +Line C,499.6 +Line D,501.5 +Line A,498.8 +Line B,503.0 +Line C,497.4 +Line D,500.9 +Line A,500.7 +Line B,500.5 +Line C,496.8 +Line D,501.7 +Line A,500.7 +Line B,500.6 +Line C,495.7 +Line D,501.2 +Line A,499.8 +Line B,499.5 +Line C,499.7 +Line D,502.4 +Line A,497.6 +Line B,498.5 +Line C,499.7 +Line D,501.0 +Line A,502.6 +Line B,498.6 +Line C,495.4 +Line D,501.5 +Line A,499.9 +Line B,497.1 +Line C,501.2 +Line D,500.6 +Line A,500.5 +Line B,495.9 +Line C,500.0 +Line D,501.4 +Line A,502.2 +Line B,499.3 +Line C,498.1 +Line D,502.4 +Line A,502.0 +Line B,501.3 +Line C,498.0 +Line D,501.4 +Line A,499.4 +Line B,499.8 +Line C,498.2 +Line D,501.2 +Line A,499.8 +Line B,502.5 +Line C,501.3 +Line D,500.5 +Line A,500.7 +Line B,504.3 +Line C,499.9 +Line D,501.8 +Line A,498.9 +Line B,499.9 +Line C,500.8 +Line D,508.8 +Line A,500.3 +Line B,502.0 +Line C,498.2 +Line D,501.2 +Line A,498.3 +Line B,503.3 +Line C,499.6 +Line D,501.3 +Line A,501.4 +Line B,502.1 +Line C,498.5 +Line D,503.6 +Line A,501.7 +Line B,498.1 +Line C,498.3 +Line D,502.2 +Line A,500.0 +Line B,502.0 +Line C,498.1 +Line D,501.7 +Line A,499.6 +Line B,499.6 +Line C,499.5 +Line D,500.9 +Line A,500.8 +Line B,501.3 +Line C,499.5 +Line D,501.7 +Line A,500.0 +Line B,502.1 +Line C,498.8 +Line D,502.9 +Line A,502.0 +Line B,504.1 +Line C,500.5 +Line D,501.9 +Line A,503.2 +Line B,503.1 +Line C,499.8 +Line D,502.6 +Line A,502.2 +Line B,499.6 +Line C,499.3 +Line D,502.6 +Line A,499.9 +Line B,501.3 +Line C,498.7 +Line D,502.3 +Line A,500.0 +Line B,503.0 +Line C,498.2 +Line D,502.1 +Line A,501.8 +Line B,501.1 +Line C,499.8 +Line D,501.7 +Line A,498.6 +Line B,503.3 +Line C,501.7 +Line D,502.2 +Line A,501.7 +Line B,502.0 +Line C,498.2 +Line D,501.3 +Line A,502.5 +Line B,503.4 +Line C,497.9 +Line D,503.1 +Line A,500.8 +Line B,500.8 +Line C,501.1 +Line D,502.0 +Line A,500.7 +Line B,500.1 +Line C,498.8 +Line D,503.1 +Line A,498.2 +Line B,499.0 +Line C,499.1 +Line D,499.7 +Line A,501.9 +Line B,499.4 +Line C,501.1 +Line D,502.3 +Line A,500.9 +Line B,499.0 +Line C,499.3 +Line D,504.8 +Line A,500.2 +Line B,500.4 +Line C,497.9 +Line D,503.5 +Line A,499.4 +Line B,500.5 +Line C,499.0 +Line D,502.6 +Line A,501.3 +Line B,503.5 +Line C,498.0 +Line D,502.4 +Line A,501.3 +Line B,500.9 +Line C,497.7 +Line D,502.7 +Line A,500.5 +Line B,500.1 +Line C,499.1 +Line D,500.8 +Line A,500.4 +Line B,501.9 +Line C,498.8 +Line D,502.0 +Line A,500.1 +Line B,502.6 +Line C,500.3 +Line D,502.6 +Line A,500.8 +Line B,499.9 +Line C,499.0 +Line D,502.9 +Line A,500.9 +Line B,501.5 +Line C,497.9 +Line D,503.5 +Line A,499.8 +Line B,503.8 +Line C,498.6 +Line D,501.8 +Line A,500.4 +Line B,503.9 +Line C,501.2 +Line D,502.2 +Line A,501.4 +Line B,498.6 +Line C,498.0 +Line D,501.5 +Line A,499.9 +Line B,501.4 +Line C,501.0 +Line D,507.3 +Line A,501.1 +Line B,503.1 +Line C,499.2 +Line D,501.7 +Line A,501.7 +Line B,500.9 +Line C,501.1 +Line D,502.5 +Line A,499.1 +Line B,503.7 +Line C,498.3 +Line D,502.0 +Line A,500.3 +Line B,501.9 +Line C,499.8 +Line D,503.1 +Line A,501.4 +Line B,502.7 +Line C,499.2 +Line D,501.3 +Line A,500.0 +Line B,499.5 +Line C,499.5 +Line D,502.0 +Line A,501.2 +Line B,502.7 +Line C,497.9 +Line D,500.4 +Line A,499.9 +Line B,502.4 +Line C,501.1 +Line D,500.5 +Line A,500.2 +Line B,501.4 +Line C,501.1 +Line D,501.9 +Line A,499.9 +Line B,499.2 +Line C,499.2 +Line D,503.0 +Line A,501.2 +Line B,504.5 +Line C,498.6 +Line D,501.4 +Line A,501.1 +Line B,500.4 +Line C,499.3 +Line D,500.3 +Line A,501.2 +Line B,499.1 +Line C,500.4 +Line D,501.3 +Line A,501.1 +Line B,500.4 +Line C,497.9 +Line D,501.2 +Line A,498.2 +Line B,505.1 +Line C,499.5 +Line D,503.3 +Line A,502.4 +Line B,500.4 +Line C,499.4 +Line D,501.2 +Line A,501.3 +Line B,496.7 +Line C,501.0 +Line D,501.7 +Line A,498.2 +Line B,500.8 +Line C,499.3 +Line D,501.4 +Line A,501.9 +Line B,499.3 +Line C,498.3 +Line D,501.4 +Line A,499.8 +Line B,502.4 +Line C,499.2 +Line D,500.8 +Line A,499.1 +Line B,502.8 +Line C,498.7 +Line D,502.6 +Line A,501.9 +Line B,501.7 +Line C,495.6 +Line D,500.8 +Line A,500.9 +Line B,504.5 +Line C,502.3 +Line D,502.3 +Line A,501.0 +Line B,504.4 +Line C,500.8 +Line D,502.9 +Line A,497.8 +Line B,500.5 +Line C,500.0 +Line D,501.3 +Line A,501.2 +Line B,500.2 +Line C,497.8 +Line D,504.0 +Line A,500.9 +Line B,500.2 +Line C,497.9 +Line D,502.2 +Line A,501.7 +Line B,498.3 +Line C,502.0 +Line D,502.4 +Line A,498.6 +Line B,501.3 +Line C,499.0 +Line D,500.9 +Line A,501.0 +Line B,497.2 +Line C,497.0 +Line D,500.7 +Line A,501.3 +Line B,504.1 +Line C,501.2 +Line D,501.3 +Line A,500.4 +Line B,504.4 +Line C,498.2 +Line D,501.7 +Line A,501.3 +Line B,503.0 +Line C,499.9 +Line D,501.7 +Line A,500.5 +Line B,502.0 +Line C,495.6 +Line D,500.5 +Line A,499.4 +Line B,500.5 +Line C,499.9 +Line D,500.2 +Line A,501.0 +Line B,500.7 +Line C,499.1 +Line D,502.6 +Line A,501.9 +Line B,501.9 +Line C,502.7 +Line D,501.5 +Line A,500.7 +Line B,505.1 +Line C,499.6 +Line D,502.6 +Line A,500.4 +Line B,499.0 +Line C,497.0 +Line D,500.9 +Line A,501.8 +Line B,502.6 +Line C,500.0 +Line D,500.0 +Line A,502.9 +Line B,501.6 +Line C,498.0 +Line D,502.2 +Line A,499.8 +Line B,502.1 +Line C,498.4 +Line D,503.0 +Line A,500.2 +Line B,500.5 +Line C,499.6 +Line D,501.6 +Line A,498.5 +Line B,500.2 +Line C,499.6 +Line D,500.9 +Line A,499.3 +Line B,502.9 +Line C,501.0 +Line D,502.0 +Line A,499.6 +Line B,503.2 +Line C,500.7 +Line D,503.8 +Line A,500.0 +Line B,500.5 +Line C,498.1 +Line D,503.7 +Line A,499.1 +Line B,504.3 +Line C,497.2 +Line D,501.0 +Line A,498.2 +Line B,501.1 +Line C,496.4 +Line D,502.0 +Line A,507.8 +Line B,497.3 +Line C,498.8 +Line D,501.2 +Line A,500.4 +Line B,500.6 +Line C,499.6 +Line D,503.0 +Line A,501.2 +Line B,501.0 +Line C,498.9 +Line D,501.8 +Line A,501.2 +Line B,500.6 +Line C,497.6 +Line D,501.2 +Line A,498.9 +Line B,503.1 +Line C,502.9 +Line D,502.5 +Line A,500.8 +Line B,501.4 +Line C,499.6 +Line D,502.8 +Line A,501.5 +Line B,499.9 +Line C,502.0 +Line D,502.4 +Line A,493.1 +Line B,501.7 +Line C,500.2 +Line D,500.7 +Line A,502.0 +Line B,497.6 +Line C,499.1 +Line D,502.6 +Line A,500.7 +Line B,499.9 +Line C,500.4 +Line D,504.1 +Line A,498.9 +Line B,501.7 +Line C,496.9 +Line D,501.5 +Line A,498.8 +Line B,501.5 +Line C,500.2 +Line D,503.0 +Line A,499.1 +Line B,503.0 +Line C,498.3 +Line D,503.6 +Line A,499.1 +Line B,502.8 +Line C,499.9 +Line D,496.5 +Line A,501.4 +Line B,502.1 +Line C,498.5 +Line D,502.4 +Line A,500.2 +Line B,501.9 +Line C,501.4 +Line D,502.2 +Line A,501.1 +Line B,501.1 +Line C,499.7 +Line D,500.8 +Line A,502.8 +Line B,503.0 +Line C,499.7 +Line D,501.3 +Line A,500.4 +Line B,499.6 +Line C,499.6 +Line D,503.9 +Line A,500.7 +Line B,500.6 +Line C,500.2 +Line D,503.9 +Line A,498.4 +Line B,500.6 +Line C,499.0 +Line D,502.6 +Line A,499.4 +Line B,500.9 +Line C,500.0 +Line D,502.8 +Line A,499.2 +Line B,499.6 +Line C,497.9 +Line D,501.5 +Line A,501.3 +Line B,500.8 +Line C,500.6 +Line D,501.3 +Line A,499.3 +Line B,501.5 +Line C,500.4 +Line D,501.9 +Line A,502.0 +Line B,499.7 +Line C,499.0 +Line D,502.1 +Line A,503.1 +Line B,502.4 +Line C,498.0 +Line D,499.9 +Line A,502.1 +Line B,503.8 +Line C,497.6 +Line D,503.6 +Line A,501.1 +Line B,501.4 +Line C,497.7 +Line D,501.7 +Line A,500.6 +Line B,502.1 +Line C,497.2 +Line D,502.7 +Line A,501.6 +Line B,501.6 +Line C,497.9 +Line D,502.6 +Line A,500.3 +Line B,498.6 +Line C,500.4 +Line D,502.2 +Line A,500.6 +Line B,502.5 +Line C,500.9 +Line D,501.8 +Line A,503.2 +Line B,504.0 +Line C,499.1 +Line D,502.0 +Line A,501.6 +Line B,501.5 +Line C,498.9 +Line D,502.2 +Line A,500.0 +Line B,502.5 +Line C,500.3 +Line D,501.7 +Line A,498.6 +Line B,501.0 +Line C,497.9 +Line D,503.4 +Line A,502.4 +Line B,502.2 +Line C,500.4 +Line D,501.4 +Line A,499.2 +Line B,502.4 +Line C,490.8 +Line D,501.5 +Line A,505.7 +Line B,499.8 +Line C,499.2 +Line D,502.8 +Line A,499.7 +Line B,499.7 +Line C,498.7 +Line D,501.1 +Line A,500.0 +Line B,498.7 +Line C,497.8 +Line D,503.0 +Line A,500.2 +Line B,500.8 +Line C,496.8 +Line D,502.1 +Line A,499.5 +Line B,501.5 +Line C,497.7 +Line D,502.6 +Line A,501.9 +Line B,497.1 +Line C,499.4 +Line D,501.4 +Line A,498.9 +Line B,501.2 +Line C,498.2 +Line D,504.2 +Line A,499.6 +Line B,499.8 +Line C,498.8 +Line D,503.1 +Line A,500.5 +Line B,502.1 +Line C,499.3 +Line D,501.5 +Line A,501.4 +Line B,501.1 +Line C,502.6 +Line D,502.1 +Line A,499.1 +Line B,504.3 +Line C,496.0 +Line D,501.4 +Line A,499.8 +Line B,503.5 +Line C,499.2 +Line D,502.9 +Line A,503.5 +Line B,498.1 +Line C,499.0 +Line D,502.9 +Line A,500.1 +Line B,501.5 +Line C,497.8 +Line D,503.4 +Line A,503.7 +Line B,500.3 +Line C,499.5 +Line D,501.2 +Line A,499.6 +Line B,498.7 +Line C,499.4 +Line D,502.8 +Line A,501.6 +Line B,502.3 +Line C,500.2 +Line D,502.1 +Line A,500.5 +Line B,498.3 +Line C,500.8 +Line D,501.8 +Line A,500.9 +Line B,502.0 +Line C,500.4 +Line D,503.2 +Line A,502.5 +Line B,498.4 +Line C,500.3 +Line D,501.4 +Line A,498.8 +Line B,500.2 +Line C,500.0 +Line D,503.0 +Line A,500.7 +Line B,501.6 +Line C,496.8 +Line D,502.6 +Line A,501.1 +Line B,502.6 +Line C,500.4 +Line D,503.4 +Line A,501.7 +Line B,498.9 +Line C,499.6 +Line D,500.7 +Line A,499.4 +Line B,502.4 +Line C,498.7 +Line D,500.5 +Line A,502.7 +Line B,499.6 +Line C,498.8 +Line D,500.6 +Line A,500.1 +Line B,498.4 +Line C,498.3 +Line D,503.9 +Line A,500.8 +Line B,503.0 +Line C,499.6 +Line D,501.8 +Line A,499.4 +Line B,504.1 +Line C,497.3 +Line D,502.4 +Line A,499.9 +Line B,501.2 +Line C,500.2 +Line D,503.5 +Line A,501.4 +Line B,502.5 +Line C,499.0 +Line D,502.1 +Line A,497.1 +Line B,501.6 +Line C,502.4 +Line D,502.6 +Line A,499.9 +Line B,499.5 +Line C,498.8 +Line D,502.7 +Line A,498.7 +Line B,501.7 +Line C,499.1 +Line D,500.9 +Line A,499.5 +Line B,503.1 +Line C,500.7 +Line D,503.9 +Line A,498.7 +Line B,504.1 +Line C,500.5 +Line D,502.9 +Line A,494.9 +Line B,500.6 +Line C,499.2 +Line D,501.7 +Line A,500.0 +Line B,500.3 +Line C,498.1 +Line D,501.8 +Line A,501.6 +Line B,499.9 +Line C,495.4 +Line D,502.4 +Line A,502.2 +Line B,499.3 +Line C,496.0 +Line D,503.0 +Line A,497.7 +Line B,502.1 +Line C,498.5 +Line D,501.3 +Line A,498.7 +Line B,505.8 +Line C,499.2 +Line D,501.6 +Line A,499.8 +Line B,503.7 +Line C,501.0 +Line D,502.3 +Line A,501.3 +Line B,502.1 +Line C,499.1 +Line D,502.5 +Line A,499.9 +Line B,500.1 +Line C,496.6 +Line D,502.2 +Line A,501.5 +Line B,499.8 +Line C,497.8 +Line D,503.1 +Line A,499.4 +Line B,501.2 +Line C,501.2 +Line D,499.6 +Line A,502.7 +Line B,504.1 +Line C,496.6 +Line D,500.8 +Line A,499.1 +Line B,501.0 +Line C,495.7 +Line D,502.2 +Line A,498.3 +Line B,499.8 +Line C,499.7 +Line D,502.5 +Line A,501.4 +Line B,498.5 +Line C,496.9 +Line D,502.1 +Line A,501.4 +Line B,501.4 +Line C,497.4 +Line D,501.2 +Line A,499.4 +Line B,501.7 +Line C,497.0 +Line D,502.1 +Line A,500.0 +Line B,500.9 +Line C,500.1 +Line D,501.9 +Line A,499.7 +Line B,500.6 +Line C,500.2 +Line D,501.7 +Line A,502.9 +Line B,500.7 +Line C,497.5 +Line D,501.4 +Line A,500.0 +Line B,502.9 +Line C,498.4 +Line D,501.1 +Line A,500.9 +Line B,500.5 +Line C,498.6 +Line D,501.4 +Line A,500.9 +Line B,501.2 +Line C,499.1 +Line D,502.5 +Line A,499.1 +Line B,499.0 +Line C,499.8 +Line D,503.6 +Line A,501.1 +Line B,497.4 +Line C,498.7 +Line D,501.6 +Line A,500.3 +Line B,502.7 +Line C,501.1 +Line D,501.5 +Line A,499.3 +Line B,500.9 +Line C,500.9 +Line D,501.5 +Line A,499.0 +Line B,501.8 +Line C,499.5 +Line D,503.0 +Line A,499.6 +Line B,501.6 +Line C,499.9 +Line D,502.6 +Line A,501.5 +Line B,504.7 +Line C,497.5 +Line D,503.9 +Line A,499.5 +Line B,503.1 +Line C,499.1 +Line D,501.9 +Line A,501.0 +Line B,504.5 +Line C,500.8 +Line D,500.3 +Line A,506.0 +Line B,502.3 +Line C,496.3 +Line D,502.5 +Line A,498.9 +Line B,499.6 +Line C,500.1 +Line D,504.9 +Line A,498.2 +Line B,504.1 +Line C,499.0 +Line D,502.5 +Line A,501.1 +Line B,501.4 +Line C,499.8 +Line D,502.3 +Line A,501.1 +Line B,503.8 +Line C,498.4 +Line D,502.6 +Line A,500.0 +Line B,501.4 +Line C,496.5 +Line D,502.4 +Line A,499.6 +Line B,501.8 +Line C,501.0 +Line D,502.5 +Line A,502.4 +Line B,505.0 +Line C,499.5 +Line D,503.7 +Line A,501.2 +Line B,499.3 +Line C,501.6 +Line D,502.4 +Line A,500.7 +Line B,499.8 +Line C,499.8 +Line D,501.2 +Line A,501.9 +Line B,503.0 +Line C,496.4 +Line D,501.8 +Line A,501.4 +Line B,500.7 +Line C,499.8 +Line D,501.4 +Line A,501.3 +Line B,503.5 +Line C,498.7 +Line D,501.6 +Line A,500.7 +Line B,499.8 +Line C,497.5 +Line D,502.0 +Line A,499.0 +Line B,500.9 +Line C,500.2 +Line D,501.9 +Line A,503.0 +Line B,499.9 +Line C,497.0 +Line D,502.6 +Line A,501.2 +Line B,503.9 +Line C,498.5 +Line D,503.1 +Line A,500.6 +Line B,501.9 +Line C,498.1 +Line D,503.7 +Line A,500.5 +Line B,502.0 +Line C,500.4 +Line D,502.5 +Line A,498.7 +Line B,500.0 +Line C,499.0 +Line D,500.7 +Line A,499.5 +Line B,499.3 +Line C,497.3 +Line D,501.3 +Line A,501.3 +Line B,500.3 +Line C,498.3 +Line D,502.5 +Line A,499.1 +Line B,501.2 +Line C,501.0 +Line D,500.8 +Line A,500.8 +Line B,502.8 +Line C,498.1 +Line D,501.4 +Line A,502.0 +Line B,501.7 +Line C,496.4 +Line D,502.5 +Line A,500.9 +Line B,503.0 +Line C,498.4 +Line D,502.0 +Line A,501.9 +Line B,502.0 +Line C,500.1 +Line D,501.7 +Line A,500.2 +Line B,500.6 +Line C,498.0 +Line D,502.4 +Line A,500.2 +Line B,499.9 +Line C,496.0 +Line D,502.1 +Line A,499.5 +Line B,498.9 +Line C,497.9 +Line D,501.3 +Line A,502.1 +Line B,498.9 +Line C,499.3 +Line D,502.2 +Line A,500.7 +Line B,500.9 +Line C,501.6 +Line D,500.9 +Line A,499.5 +Line B,497.2 +Line C,501.5 +Line D,503.1 +Line A,500.1 +Line B,498.9 +Line C,499.2 +Line D,501.4 +Line A,501.1 +Line B,500.4 +Line C,499.5 +Line D,501.5 +Line A,500.6 +Line B,501.1 +Line C,501.8 +Line D,502.2 +Line A,500.8 +Line B,503.8 +Line C,498.7 +Line D,500.9 +Line A,500.9 +Line B,502.4 +Line C,499.2 +Line D,503.5 +Line A,499.7 +Line B,499.0 +Line C,499.0 +Line D,503.5 +Line A,501.1 +Line B,503.4 +Line C,501.8 +Line D,501.8 +Line A,499.9 +Line B,499.2 +Line C,499.6 +Line D,503.0 +Line A,498.8 +Line B,501.8 +Line C,498.9 +Line D,502.8 +Line A,493.7 +Line B,501.0 +Line C,498.1 +Line D,502.3 +Line A,501.1 +Line B,499.5 +Line C,499.6 +Line D,501.8 +Line A,501.7 +Line B,500.2 +Line C,498.8 +Line D,501.0 +Line A,501.0 +Line B,500.2 +Line C,497.1 +Line D,503.5 +Line A,499.7 +Line B,502.2 +Line C,500.7 +Line D,501.1 +Line A,501.5 +Line B,504.8 +Line C,495.9 +Line D,495.1 +Line A,501.0 +Line B,497.5 +Line C,498.9 +Line D,502.0 +Line A,501.0 +Line B,499.9 +Line C,498.8 +Line D,502.7 +Line A,501.6 +Line B,502.5 +Line C,498.3 +Line D,502.8 +Line A,500.1 +Line B,498.9 +Line C,501.7 +Line D,501.5 +Line A,500.7 +Line B,502.8 +Line C,497.6 +Line D,502.6 +Line A,499.2 +Line B,501.6 +Line C,498.8 +Line D,502.7 +Line A,501.3 +Line B,501.6 +Line C,498.5 +Line D,503.3 +Line A,500.3 +Line B,502.0 +Line C,498.2 +Line D,501.3 +Line A,502.3 +Line B,499.6 +Line C,501.7 +Line D,502.3 +Line A,501.2 +Line B,500.0 +Line C,499.2 +Line D,503.2 +Line A,501.4 +Line B,499.4 +Line C,499.8 +Line D,501.8 +Line A,501.8 +Line B,501.3 +Line C,499.3 +Line D,501.4 +Line A,500.9 +Line B,503.4 +Line C,499.6 +Line D,502.0 +Line A,500.2 +Line B,499.9 +Line C,498.4 +Line D,502.9 +Line A,501.5 +Line B,500.2 +Line C,499.5 +Line D,502.7 +Line A,501.7 +Line B,500.6 +Line C,496.7 +Line D,501.1 +Line A,501.3 +Line B,502.9 +Line C,497.1 +Line D,501.6 +Line A,500.0 +Line B,504.0 +Line C,499.1 +Line D,501.4 +Line A,500.8 +Line B,499.8 +Line C,495.9 +Line D,500.1 +Line A,501.0 +Line B,504.0 +Line C,498.4 +Line D,501.9 +Line A,498.9 +Line B,498.9 +Line C,502.2 +Line D,501.7 +Line A,499.4 +Line B,501.0 +Line C,499.7 +Line D,494.9 +Line A,500.2 +Line B,503.7 +Line C,500.1 +Line D,500.3 +Line A,510.0 +Line B,503.3 +Line C,501.5 +Line D,501.5 +Line A,501.0 +Line B,501.7 +Line C,503.0 +Line D,501.1 +Line A,500.3 +Line B,498.9 +Line C,498.7 +Line D,501.6 +Line A,500.2 +Line B,501.1 +Line C,500.3 +Line D,504.5 +Line A,501.0 +Line B,500.1 +Line C,500.1 +Line D,502.9 +Line A,507.8 +Line B,503.3 +Line C,500.7 +Line D,502.6 +Line A,498.9 +Line B,501.1 +Line C,497.5 +Line D,502.3 +Line A,499.7 +Line B,502.9 +Line C,498.0 +Line D,500.9 +Line A,499.1 +Line B,502.3 +Line C,497.9 +Line D,502.3 +Line A,500.1 +Line B,495.5 +Line C,499.9 +Line D,500.8 +Line A,500.8 +Line B,502.1 +Line C,496.6 +Line D,502.0 +Line A,500.3 +Line B,502.5 +Line C,500.6 +Line D,501.9 +Line A,499.4 +Line B,500.4 +Line C,502.7 +Line D,501.8 +Line A,500.1 +Line B,503.9 +Line C,497.1 +Line D,501.8 +Line A,501.5 +Line B,504.0 +Line C,496.8 +Line D,501.9 +Line A,500.4 +Line B,499.2 +Line C,500.9 +Line D,503.0 +Line A,501.0 +Line B,502.4 +Line C,499.8 +Line D,501.1 +Line A,501.7 +Line B,504.2 +Line C,497.2 +Line D,500.4 +Line A,499.7 +Line B,501.9 +Line C,500.1 +Line D,502.3 +Line A,500.1 +Line B,501.3 +Line C,499.9 +Line D,502.7 +Line A,499.6 +Line B,501.0 +Line C,496.5 +Line D,501.5 +Line A,499.8 +Line B,500.5 +Line C,501.8 +Line D,503.1 +Line A,500.1 +Line B,499.6 +Line C,499.6 +Line D,503.2 +Line A,500.9 +Line B,500.6 +Line C,500.9 +Line D,502.3 +Line A,498.4 +Line B,499.2 +Line C,500.9 +Line D,502.1 +Line A,499.0 +Line B,499.8 +Line C,500.9 +Line D,502.4 +Line A,499.2 +Line B,505.1 +Line C,499.6 +Line D,503.1 +Line A,499.6 +Line B,501.7 +Line C,500.9 +Line D,500.6 +Line A,501.7 +Line B,488.8 +Line C,498.0 +Line D,503.2 +Line A,499.2 +Line B,502.1 +Line C,497.6 +Line D,501.5 +Line A,502.1 +Line B,503.3 +Line C,498.0 +Line D,502.5 +Line A,500.4 +Line B,502.3 +Line C,498.9 +Line D,503.4 +Line A,499.9 +Line B,502.8 +Line C,498.4 +Line D,503.6 +Line A,499.2 +Line B,500.0 +Line C,499.6 +Line D,501.0 +Line A,499.8 +Line B,502.6 +Line C,498.7 +Line D,501.5 +Line A,499.8 +Line B,501.3 +Line C,507.9 +Line D,501.8 +Line A,489.9 +Line B,501.8 +Line C,502.4 +Line D,501.0 +Line A,500.3 +Line B,500.1 +Line C,497.1 +Line D,502.2 +Line A,498.3 +Line B,504.2 +Line C,499.0 +Line D,502.1 +Line A,500.4 +Line B,500.8 +Line C,502.0 +Line D,501.6 +Line A,499.7 +Line B,502.8 +Line C,497.1 +Line D,502.8 +Line A,499.8 +Line B,497.4 +Line C,496.3 +Line D,503.0 +Line A,500.6 +Line B,504.2 +Line C,497.7 +Line D,501.7 +Line A,498.8 +Line B,511.0 +Line C,500.5 +Line D,502.8 +Line A,499.7 +Line B,500.9 +Line C,496.4 +Line D,502.9 +Line A,499.8 +Line B,502.0 +Line C,499.0 +Line D,502.6 +Line A,500.3 +Line B,503.4 +Line C,498.0 +Line D,502.7 +Line A,501.8 +Line B,501.5 +Line C,498.2 +Line D,501.1 +Line A,499.6 +Line B,502.2 +Line C,502.2 +Line D,502.4 +Line A,500.6 +Line B,496.8 +Line C,500.3 +Line D,501.2 +Line A,500.2 +Line B,503.0 +Line C,499.4 +Line D,502.8 +Line A,502.8 +Line B,498.2 +Line C,500.8 +Line D,501.2 +Line A,501.9 +Line B,504.5 +Line C,498.2 +Line D,501.3 +Line A,499.9 +Line B,499.6 +Line C,501.2 +Line D,501.9 +Line A,501.5 +Line B,501.5 +Line C,496.2 +Line D,502.4 +Line A,498.8 +Line B,501.4 +Line C,491.2 +Line D,502.0 +Line A,500.0 +Line B,503.3 +Line C,498.5 +Line D,502.7 +Line A,500.1 +Line B,499.2 +Line C,497.4 +Line D,501.8 +Line A,501.3 +Line B,503.6 +Line C,497.7 +Line D,503.1 +Line A,502.2 +Line B,500.7 +Line C,499.3 +Line D,502.6 +Line A,500.8 +Line B,502.0 +Line C,498.6 +Line D,500.7 +Line A,499.2 +Line B,498.6 +Line C,501.7 +Line D,502.4 +Line A,501.1 +Line B,501.5 +Line C,495.2 +Line D,503.2 +Line A,499.1 +Line B,503.6 +Line C,498.4 +Line D,500.8 +Line A,499.8 +Line B,500.7 +Line C,497.1 +Line D,502.5 +Line A,501.9 +Line B,499.1 +Line C,499.7 +Line D,500.7 +Line A,499.9 +Line B,500.3 +Line C,498.3 +Line D,502.9 +Line A,500.5 +Line B,505.9 +Line C,501.4 +Line D,502.0 +Line A,500.6 +Line B,498.9 +Line C,498.9 +Line D,500.8 +Line A,501.8 +Line B,501.1 +Line C,501.1 +Line D,500.3 +Line A,498.7 +Line B,502.3 +Line C,498.4 +Line D,502.4 +Line A,499.0 +Line B,498.5 +Line C,498.9 +Line D,501.7 +Line A,500.2 +Line B,498.0 +Line C,501.7 +Line D,500.8 +Line A,498.6 +Line B,504.3 +Line C,501.2 +Line D,501.5 +Line A,500.0 +Line B,498.7 +Line C,500.7 +Line D,502.3 +Line A,501.6 +Line B,501.5 +Line C,500.6 +Line D,502.0 +Line A,500.7 +Line B,504.0 +Line C,499.6 +Line D,501.5 +Line A,501.8 +Line B,503.4 +Line C,499.4 +Line D,502.4 +Line A,501.2 +Line B,500.2 +Line C,496.8 +Line D,501.7 +Line A,502.5 +Line B,501.9 +Line C,509.0 +Line D,501.8 +Line A,500.4 +Line B,501.1 +Line C,500.0 +Line D,501.4 +Line A,502.1 +Line B,501.2 +Line C,498.4 +Line D,503.2 +Line A,500.3 +Line B,491.8 +Line C,498.5 +Line D,502.1 +Line A,499.5 +Line B,502.1 +Line C,499.4 +Line D,501.9 +Line A,501.6 +Line B,503.0 +Line C,498.1 +Line D,501.6 +Line A,499.3 +Line B,498.0 +Line C,498.6 +Line D,502.2 +Line A,501.3 +Line B,500.5 +Line C,499.6 +Line D,502.5 +Line A,500.2 +Line B,501.0 +Line C,500.7 +Line D,502.8 +Line A,501.4 +Line B,498.9 +Line C,496.3 +Line D,502.8 +Line A,499.2 +Line B,503.3 +Line C,500.2 +Line D,501.7 +Line A,499.6 +Line B,502.8 +Line C,499.9 +Line D,502.7 +Line A,500.5 +Line B,497.8 +Line C,498.1 +Line D,500.4 +Line A,500.5 +Line B,500.9 +Line C,501.9 +Line D,502.9 +Line A,500.8 +Line B,502.8 +Line C,497.7 +Line D,501.6 +Line A,503.1 +Line B,499.2 +Line C,498.5 +Line D,503.4 +Line A,502.0 +Line B,505.5 +Line C,499.1 +Line D,502.0 +Line A,500.2 +Line B,503.6 +Line C,499.6 +Line D,502.6 +Line A,499.2 +Line B,499.8 +Line C,500.2 +Line D,501.8 +Line A,501.7 +Line B,504.6 +Line C,499.7 +Line D,501.5 +Line A,501.9 +Line B,497.3 +Line C,497.4 +Line D,501.6 +Line A,500.2 +Line B,500.8 +Line C,496.9 +Line D,502.2 +Line A,501.4 +Line B,502.2 +Line C,497.9 +Line D,501.0 +Line A,501.6 +Line B,502.4 +Line C,498.6 +Line D,501.3 +Line A,501.4 +Line B,499.6 +Line C,497.9 +Line D,502.8 +Line A,500.2 +Line B,502.6 +Line C,500.5 +Line D,500.9 +Line A,499.7 +Line B,500.1 +Line C,499.8 +Line D,501.8 +Line A,500.7 +Line B,499.5 +Line C,500.5 +Line D,500.3 +Line A,500.4 +Line B,501.6 +Line C,500.6 +Line D,501.3 +Line A,501.2 +Line B,500.9 +Line C,498.1 +Line D,502.4 +Line A,501.0 +Line B,497.6 +Line C,497.9 +Line D,500.1 +Line A,499.4 +Line B,504.6 +Line C,499.8 +Line D,501.9 +Line A,500.8 +Line B,504.0 +Line C,499.1 +Line D,501.3 +Line A,501.6 +Line B,501.8 +Line C,497.6 +Line D,500.8 +Line A,500.4 +Line B,500.7 +Line C,499.4 +Line D,503.8 +Line A,500.4 +Line B,500.1 +Line C,502.9 +Line D,502.1 +Line A,498.5 +Line B,502.3 +Line C,501.6 +Line D,500.9 +Line A,501.1 +Line B,498.0 +Line C,499.2 +Line D,502.5 +Line A,501.2 +Line B,499.7 +Line C,498.0 +Line D,501.7 +Line A,502.1 +Line B,504.0 +Line C,501.2 +Line D,500.5 +Line A,499.4 +Line B,499.2 +Line C,500.5 +Line D,503.4 +Line A,500.5 +Line B,498.7 +Line C,499.7 +Line D,501.3 +Line A,498.7 +Line B,497.5 +Line C,499.9 +Line D,501.5 +Line A,499.3 +Line B,499.5 +Line C,500.0 +Line D,503.4 +Line A,499.4 +Line B,500.7 +Line C,498.1 +Line D,501.0 +Line A,500.5 +Line B,501.1 +Line C,499.3 +Line D,503.6 +Line A,498.6 +Line B,501.7 +Line C,499.1 +Line D,500.8 +Line A,499.6 +Line B,501.1 +Line C,498.8 +Line D,502.1 +Line A,501.2 +Line B,502.1 +Line C,498.9 +Line D,503.5 +Line A,499.1 +Line B,499.8 +Line C,498.2 +Line D,501.0 +Line A,499.8 +Line B,506.0 +Line C,499.6 +Line D,500.9 +Line A,500.4 +Line B,501.1 +Line C,499.0 +Line D,502.3 +Line A,501.2 +Line B,496.8 +Line C,500.1 +Line D,493.7 +Line A,500.7 +Line B,501.5 +Line C,498.4 +Line D,502.3 +Line A,501.5 +Line B,502.1 +Line C,502.2 +Line D,502.3 +Line A,501.6 +Line B,502.0 +Line C,500.7 +Line D,502.6 +Line A,501.8 +Line B,502.1 +Line C,505.5 +Line D,501.0 +Line A,499.5 +Line B,499.6 +Line C,498.3 +Line D,501.9 +Line A,500.7 +Line B,501.6 +Line C,508.3 +Line D,501.9 +Line A,499.4 +Line B,499.8 +Line C,497.8 +Line D,502.3 +Line A,501.2 +Line B,498.8 +Line C,500.2 +Line D,501.2 +Line A,499.2 +Line B,503.2 +Line C,498.5 +Line D,508.4 +Line A,499.5 +Line B,501.5 +Line C,500.7 +Line D,502.8 +Line A,500.2 +Line B,501.2 +Line C,499.5 +Line D,502.6 +Line A,499.3 +Line B,499.3 +Line C,496.2 +Line D,501.4 +Line A,501.3 +Line B,499.3 +Line C,498.4 +Line D,500.7 +Line A,498.6 +Line B,499.6 +Line C,500.7 +Line D,501.8 +Line A,499.8 +Line B,501.6 +Line C,499.2 +Line D,501.3 +Line A,499.6 +Line B,502.2 +Line C,497.7 +Line D,500.1 +Line A,507.0 +Line B,501.8 +Line C,500.4 +Line D,496.5 +Line A,501.4 +Line B,499.7 +Line C,497.8 +Line D,502.9 +Line A,499.8 +Line B,500.2 +Line C,498.3 +Line D,502.2 +Line A,500.5 +Line B,501.5 +Line C,498.9 +Line D,502.5 +Line A,500.0 +Line B,500.2 +Line C,501.1 +Line D,501.9 +Line A,498.8 +Line B,498.4 +Line C,498.9 +Line D,503.6 +Line A,500.1 +Line B,502.0 +Line C,500.4 +Line D,502.5 +Line A,502.9 +Line B,496.4 +Line C,498.1 +Line D,501.3 +Line A,499.4 +Line B,492.6 +Line C,495.2 +Line D,501.9 +Line A,502.5 +Line B,501.7 +Line C,502.4 +Line D,501.1 +Line A,500.0 +Line B,502.3 +Line C,501.8 +Line D,501.9 +Line A,500.2 +Line B,497.6 +Line C,498.2 +Line D,501.2 +Line A,498.2 +Line B,505.0 +Line C,497.0 +Line D,501.7 +Line A,500.6 +Line B,501.1 +Line C,501.1 +Line D,501.5 +Line A,500.5 +Line B,503.7 +Line C,500.5 +Line D,500.9 +Line A,500.3 +Line B,505.5 +Line C,498.0 +Line D,502.1 +Line A,499.7 +Line B,502.5 +Line C,500.2 +Line D,503.0 +Line A,498.9 +Line B,501.3 +Line C,497.6 +Line D,503.4 +Line A,501.4 +Line B,500.3 +Line C,497.4 +Line D,503.8 +Line A,499.3 +Line B,505.1 +Line C,498.7 +Line D,502.1 +Line A,501.9 +Line B,509.1 +Line C,501.3 +Line D,502.6 +Line A,499.8 +Line B,503.2 +Line C,500.0 +Line D,502.0 +Line A,501.2 +Line B,500.2 +Line C,500.5 +Line D,502.7 +Line A,500.1 +Line B,503.9 +Line C,499.6 +Line D,501.2 +Line A,499.2 +Line B,499.6 +Line C,497.9 +Line D,500.3 +Line A,501.2 +Line B,506.0 +Line C,501.5 +Line D,502.8 +Line A,500.9 +Line B,499.9 +Line C,497.4 +Line D,500.9 +Line A,502.1 +Line B,499.5 +Line C,496.4 +Line D,501.6 +Line A,499.8 +Line B,500.8 +Line C,498.8 +Line D,502.1 +Line A,500.5 +Line B,501.0 +Line C,497.1 +Line D,501.9 +Line A,498.8 +Line B,499.3 +Line C,498.6 +Line D,503.4 +Line A,501.5 +Line B,503.8 +Line C,498.2 +Line D,501.6 +Line A,502.5 +Line B,500.7 +Line C,500.3 +Line D,500.7 +Line A,501.6 +Line B,503.6 +Line C,499.4 +Line D,502.1 +Line A,501.9 +Line B,501.8 +Line C,500.2 +Line D,502.7 +Line A,500.8 +Line B,500.3 +Line C,497.7 +Line D,503.1 +Line A,499.6 +Line B,500.9 +Line C,499.9 +Line D,502.3 +Line A,501.1 +Line B,499.6 +Line C,500.9 +Line D,498.9 +Line A,502.4 +Line B,499.2 +Line C,500.0 +Line D,501.1 +Line A,499.9 +Line B,500.5 +Line C,500.3 +Line D,502.3 +Line A,499.5 +Line B,500.8 +Line C,497.6 +Line D,502.2 +Line A,509.1 +Line B,501.9 +Line C,499.7 +Line D,502.1 +Line A,500.4 +Line B,500.2 +Line C,499.1 +Line D,502.8 +Line A,502.0 +Line B,499.3 +Line C,498.8 +Line D,501.4 +Line A,500.1 +Line B,503.3 +Line C,498.8 +Line D,502.8 +Line A,502.2 +Line B,504.2 +Line C,497.0 +Line D,502.1 +Line A,501.5 +Line B,503.1 +Line C,498.9 +Line D,503.8 +Line A,499.7 +Line B,501.5 +Line C,498.6 +Line D,503.3 +Line A,499.7 +Line B,498.5 +Line C,500.3 +Line D,500.9 +Line A,499.5 +Line B,504.6 +Line C,497.9 +Line D,503.6 +Line A,497.7 +Line B,498.7 +Line C,499.7 +Line D,502.0 +Line A,501.3 +Line B,503.7 +Line C,500.6 +Line D,502.2 +Line A,500.9 +Line B,502.7 +Line C,498.2 +Line D,503.0 +Line A,500.1 +Line B,498.8 +Line C,500.5 +Line D,501.5 +Line A,499.0 +Line B,499.1 +Line C,501.0 +Line D,501.9 +Line A,500.5 +Line B,501.5 +Line C,500.4 +Line D,501.7 +Line A,499.7 +Line B,502.0 +Line C,499.6 +Line D,501.7 +Line A,499.0 +Line B,500.3 +Line C,500.6 +Line D,501.3 +Line A,501.1 +Line B,501.2 +Line C,499.1 +Line D,501.4 +Line A,500.2 +Line B,499.5 +Line C,499.1 +Line D,503.9 +Line A,500.8 +Line B,503.9 +Line C,499.5 +Line D,502.1 +Line A,500.9 +Line B,502.4 +Line C,502.0 +Line D,501.2 +Line A,500.6 +Line B,499.0 +Line C,498.5 +Line D,501.2 +Line A,499.2 +Line B,500.0 +Line C,501.6 +Line D,501.7 +Line A,499.2 +Line B,503.2 +Line C,495.5 +Line D,502.2 +Line A,501.8 +Line B,502.1 +Line C,499.8 +Line D,501.8 +Line A,499.7 +Line B,504.2 +Line C,489.3 +Line D,503.5 +Line A,500.6 +Line B,501.1 +Line C,497.9 +Line D,502.5 +Line A,500.6 +Line B,500.9 +Line C,498.5 +Line D,501.9 +Line A,501.1 +Line B,501.2 +Line C,498.9 +Line D,502.1 +Line A,501.0 +Line B,500.1 +Line C,507.3 +Line D,501.9 +Line A,500.6 +Line B,503.7 +Line C,500.9 +Line D,502.2 +Line A,499.4 +Line B,498.8 +Line C,499.9 +Line D,502.5 +Line A,501.1 +Line B,502.3 +Line C,499.0 +Line D,502.5 +Line A,500.3 +Line B,501.0 +Line C,500.3 +Line D,501.5 +Line A,499.6 +Line B,499.3 +Line C,497.0 +Line D,501.3 +Line A,498.3 +Line B,501.3 +Line C,497.4 +Line D,502.2 +Line A,500.1 +Line B,502.5 +Line C,498.9 +Line D,502.1 +Line A,500.9 +Line B,499.4 +Line C,498.6 +Line D,501.8 +Line A,498.7 +Line B,502.8 +Line C,500.2 +Line D,501.3 +Line A,500.6 +Line B,498.8 +Line C,499.6 +Line D,502.2 +Line A,499.7 +Line B,503.3 +Line C,499.7 +Line D,503.0 +Line A,500.8 +Line B,499.5 +Line C,499.2 +Line D,501.2 +Line A,502.8 +Line B,503.4 +Line C,501.7 +Line D,502.5 +Line A,500.9 +Line B,501.4 +Line C,497.9 +Line D,501.6 +Line A,499.0 +Line B,498.2 +Line C,502.7 +Line D,503.3 +Line A,500.4 +Line B,501.1 +Line C,498.3 +Line D,503.3 +Line A,501.4 +Line B,503.4 +Line C,498.8 +Line D,501.2 +Line A,501.2 +Line B,502.7 +Line C,496.9 +Line D,501.9 +Line A,499.3 +Line B,499.1 +Line C,503.3 +Line D,503.8 +Line A,499.9 +Line B,499.5 +Line C,500.5 +Line D,501.2 +Line A,501.1 +Line B,501.1 +Line C,499.4 +Line D,503.1 +Line A,498.9 +Line B,504.0 +Line C,502.2 +Line D,502.0 +Line A,499.6 +Line B,500.3 +Line C,497.0 +Line D,502.1 +Line A,499.7 +Line B,493.1 +Line C,499.1 +Line D,502.2 +Line A,501.8 +Line B,502.9 +Line C,497.3 +Line D,502.0 +Line A,499.3 +Line B,501.8 +Line C,497.6 +Line D,502.7 +Line A,502.7 +Line B,500.7 +Line C,501.5 +Line D,502.7 +Line A,498.9 +Line B,501.1 +Line C,498.2 +Line D,502.3 +Line A,500.5 +Line B,502.8 +Line C,499.2 +Line D,503.0 +Line A,500.6 +Line B,506.6 +Line C,497.8 +Line D,504.1 +Line A,502.3 +Line B,500.0 +Line C,496.0 +Line D,502.4 +Line A,500.5 +Line B,499.2 +Line C,500.1 +Line D,501.7 +Line A,500.6 +Line B,502.0 +Line C,501.1 +Line D,502.2 +Line A,500.8 +Line B,501.4 +Line C,497.3 +Line D,492.8 +Line A,499.5 +Line B,501.5 +Line C,503.0 +Line D,502.0 +Line A,501.0 +Line B,503.6 +Line C,501.0 +Line D,502.7 +Line A,501.9 +Line B,502.7 +Line C,501.0 +Line D,501.7 +Line A,500.8 +Line B,502.8 +Line C,499.2 +Line D,500.8 +Line A,500.6 +Line B,498.0 +Line C,500.3 +Line D,501.1 +Line A,503.6 +Line B,503.4 +Line C,497.4 +Line D,501.2 +Line A,503.5 +Line B,497.4 +Line C,497.0 +Line D,502.2 +Line A,499.1 +Line B,500.3 +Line C,499.5 +Line D,501.1 +Line A,499.2 +Line B,502.4 +Line C,498.7 +Line D,500.6 +Line A,500.1 +Line B,507.0 +Line C,496.6 +Line D,503.4 +Line A,501.1 +Line B,502.1 +Line C,499.7 +Line D,502.1 +Line A,499.2 +Line B,501.9 +Line C,499.6 +Line D,500.6 +Line A,499.5 +Line B,501.4 +Line C,496.9 +Line D,501.8 +Line A,500.7 +Line B,502.8 +Line C,500.5 +Line D,503.0 +Line A,499.6 +Line B,501.1 +Line C,500.1 +Line D,502.6 +Line A,500.9 +Line B,500.4 +Line C,497.4 +Line D,509.2 +Line A,501.9 +Line B,500.3 +Line C,500.4 +Line D,500.8 +Line A,499.7 +Line B,502.1 +Line C,500.1 +Line D,501.0 +Line A,499.3 +Line B,502.1 +Line C,498.1 +Line D,502.2 +Line A,500.2 +Line B,502.5 +Line C,498.6 +Line D,501.2 +Line A,500.7 +Line B,502.0 +Line C,498.0 +Line D,503.6 +Line A,499.6 +Line B,497.1 +Line C,498.4 +Line D,501.1 +Line A,499.3 +Line B,502.1 +Line C,499.0 +Line D,502.0 +Line A,501.7 +Line B,501.4 +Line C,497.4 +Line D,501.7 +Line A,500.1 +Line B,500.3 +Line C,498.5 +Line D,509.7 +Line A,498.2 +Line B,502.7 +Line C,498.8 +Line D,500.6 +Line A,500.9 +Line B,501.7 +Line C,500.2 +Line D,503.0 +Line A,500.6 +Line B,506.0 +Line C,500.7 +Line D,502.6 +Line A,502.0 +Line B,498.4 +Line C,501.4 +Line D,502.6 +Line A,499.0 +Line B,501.2 +Line C,498.6 +Line D,503.9 +Line A,499.8 +Line B,501.7 +Line C,498.5 +Line D,501.6 +Line A,500.4 +Line B,502.9 +Line C,499.1 +Line D,501.6 +Line A,499.0 +Line B,502.0 +Line C,500.3 +Line D,504.6 +Line A,501.8 +Line B,502.1 +Line C,498.7 +Line D,500.8 +Line A,498.9 +Line B,500.1 +Line C,497.2 +Line D,502.5 +Line A,500.8 +Line B,501.2 +Line C,500.1 +Line D,501.2 +Line A,500.1 +Line B,502.0 +Line C,498.0 +Line D,502.5 +Line A,498.4 +Line B,501.0 +Line C,501.0 +Line D,500.9 +Line A,501.3 +Line B,503.7 +Line C,497.7 +Line D,501.6 +Line A,501.0 +Line B,500.7 +Line C,499.5 +Line D,503.2 +Line A,501.0 +Line B,501.8 +Line C,496.2 +Line D,502.5 +Line A,501.7 +Line B,494.7 +Line C,498.9 +Line D,502.5 +Line A,501.3 +Line B,502.1 +Line C,497.0 +Line D,501.4 +Line A,501.8 +Line B,502.3 +Line C,498.6 +Line D,500.8 +Line A,502.9 +Line B,498.5 +Line C,498.0 +Line D,502.0 +Line A,503.2 +Line B,501.6 +Line C,499.5 +Line D,502.8 +Line A,500.4 +Line B,504.2 +Line C,502.1 +Line D,501.3 +Line A,499.4 +Line B,501.5 +Line C,499.1 +Line D,501.3 +Line A,499.9 +Line B,502.2 +Line C,498.6 +Line D,502.9 +Line A,501.5 +Line B,493.6 +Line C,499.8 +Line D,501.1 +Line A,500.1 +Line B,498.1 +Line C,499.8 +Line D,501.3 +Line A,501.1 +Line B,501.5 +Line C,497.5 +Line D,501.2 +Line A,501.1 +Line B,499.1 +Line C,499.2 +Line D,500.7 +Line A,499.7 +Line B,500.9 +Line C,498.8 +Line D,502.7 +Line A,500.1 +Line B,500.9 +Line C,499.6 +Line D,502.7 +Line A,499.5 +Line B,493.9 +Line C,499.4 +Line D,502.2 +Line A,499.5 +Line B,499.7 +Line C,500.6 +Line D,500.3 +Line A,500.5 +Line B,500.4 +Line C,499.4 +Line D,502.9 +Line A,499.5 +Line B,501.2 +Line C,498.0 +Line D,501.0 +Line A,499.7 +Line B,499.9 +Line C,498.7 +Line D,502.1 +Line A,501.2 +Line B,498.4 +Line C,499.9 +Line D,502.7 +Line A,497.8 +Line B,503.4 +Line C,497.7 +Line D,500.6 +Line A,500.3 +Line B,496.9 +Line C,499.2 +Line D,501.6 +Line A,500.0 +Line B,498.3 +Line C,497.9 +Line D,500.2 +Line A,500.4 +Line B,503.2 +Line C,498.2 +Line D,502.8 +Line A,501.0 +Line B,504.0 +Line C,500.6 +Line D,502.4 +Line A,502.6 +Line B,499.3 +Line C,502.6 +Line D,501.9 +Line A,500.2 +Line B,502.7 +Line C,501.6 +Line D,501.8 +Line A,498.9 +Line B,504.0 +Line C,498.9 +Line D,502.9 +Line A,501.1 +Line B,500.9 +Line C,501.0 +Line D,502.7 +Line A,500.0 +Line B,501.6 +Line C,500.2 +Line D,501.2 +Line A,501.4 +Line B,500.6 +Line C,496.8 +Line D,500.8 +Line A,500.7 +Line B,502.4 +Line C,499.3 +Line D,502.6 +Line A,501.4 +Line B,499.5 +Line C,499.6 +Line D,501.4 +Line A,500.9 +Line B,500.5 +Line C,499.8 +Line D,502.5 +Line A,500.4 +Line B,502.1 +Line C,499.1 +Line D,502.1 +Line A,500.7 +Line B,500.5 +Line C,499.4 +Line D,501.5 +Line A,501.8 +Line B,505.8 +Line C,498.8 +Line D,502.4 +Line A,500.4 +Line B,499.8 +Line C,501.3 +Line D,502.6 +Line A,500.7 +Line B,500.8 +Line C,500.1 +Line D,505.6 +Line A,500.1 +Line B,501.5 +Line C,497.6 +Line D,499.4 +Line A,501.0 +Line B,503.0 +Line C,501.7 +Line D,503.5 +Line A,500.5 +Line B,502.5 +Line C,498.5 +Line D,503.0 +Line A,500.2 +Line B,500.2 +Line C,498.5 +Line D,501.3 +Line A,497.1 +Line B,499.7 +Line C,500.8 +Line D,501.9 +Line A,501.7 +Line B,503.8 +Line C,497.2 +Line D,501.5 +Line A,499.3 +Line B,503.2 +Line C,495.8 +Line D,503.0 +Line A,500.2 +Line B,501.4 +Line C,497.4 +Line D,503.8 +Line A,499.7 +Line B,501.0 +Line C,499.6 +Line D,502.2 +Line A,497.2 +Line B,505.7 +Line C,502.4 +Line D,501.9 +Line A,499.1 +Line B,498.9 +Line C,497.8 +Line D,501.8 +Line A,500.3 +Line B,499.1 +Line C,502.3 +Line D,503.6 +Line A,500.2 +Line B,500.4 +Line C,501.7 +Line D,502.6 +Line A,501.0 +Line B,499.5 +Line C,497.5 +Line D,503.1 +Line A,500.1 +Line B,503.3 +Line C,498.2 +Line D,502.4 +Line A,497.7 +Line B,496.2 +Line C,500.1 +Line D,503.0 +Line A,501.2 +Line B,504.0 +Line C,497.6 +Line D,502.0 +Line A,498.4 +Line B,498.8 +Line C,498.1 +Line D,503.0 +Line A,501.5 +Line B,502.1 +Line C,496.9 +Line D,502.1 +Line A,501.9 +Line B,500.7 +Line C,498.7 +Line D,502.7 +Line A,499.7 +Line B,496.1 +Line C,499.1 +Line D,503.2 +Line A,500.9 +Line B,497.3 +Line C,499.0 +Line D,501.7 +Line A,499.6 +Line B,498.3 +Line C,497.2 +Line D,501.8 +Line A,500.0 +Line B,501.9 +Line C,499.9 +Line D,502.9 +Line A,498.6 +Line B,503.0 +Line C,497.2 +Line D,502.3 +Line A,500.6 +Line B,503.1 +Line C,498.4 +Line D,502.0 +Line A,499.7 +Line B,498.6 +Line C,502.6 +Line D,503.4 +Line A,500.3 +Line B,503.5 +Line C,500.1 +Line D,501.2 +Line A,501.1 +Line B,501.9 +Line C,500.0 +Line D,503.7 +Line A,499.8 +Line B,501.0 +Line C,500.6 +Line D,502.1 +Line A,498.8 +Line B,501.3 +Line C,499.0 +Line D,500.9 +Line A,499.8 +Line B,501.7 +Line C,500.3 +Line D,501.1 +Line A,498.0 +Line B,502.4 +Line C,500.8 +Line D,502.6 +Line A,500.6 +Line B,499.5 +Line C,498.4 +Line D,502.0 +Line A,501.6 +Line B,497.2 +Line C,500.2 +Line D,502.8 +Line A,502.5 +Line B,497.3 +Line C,498.8 +Line D,501.4 +Line A,500.8 +Line B,499.0 +Line C,500.3 +Line D,501.6 +Line A,498.0 +Line B,502.4 +Line C,498.5 +Line D,502.1 +Line A,500.9 +Line B,502.2 +Line C,498.4 +Line D,500.4 +Line A,499.3 +Line B,502.8 +Line C,498.3 +Line D,502.2 +Line A,499.1 +Line B,502.4 +Line C,498.9 +Line D,502.5 +Line A,497.9 +Line B,502.0 +Line C,499.4 +Line D,502.0 +Line A,500.0 +Line B,509.5 +Line C,499.8 +Line D,503.3 +Line A,498.9 +Line B,501.2 +Line C,500.5 +Line D,501.2 +Line A,501.4 +Line B,503.1 +Line C,498.1 +Line D,499.4 +Line A,500.0 +Line B,499.6 +Line C,491.5 +Line D,501.1 +Line A,502.0 +Line B,510.8 +Line C,498.9 +Line D,502.5 +Line A,499.7 +Line B,501.9 +Line C,500.1 +Line D,502.7 +Line A,499.6 +Line B,498.1 +Line C,499.8 +Line D,503.6 +Line A,499.4 +Line B,498.9 +Line C,499.6 +Line D,501.5 +Line A,499.2 +Line B,497.5 +Line C,500.2 +Line D,501.8 +Line A,502.4 +Line B,501.6 +Line C,497.6 +Line D,502.1 +Line A,497.7 +Line B,501.5 +Line C,498.7 +Line D,501.9 +Line A,498.7 +Line B,502.6 +Line C,500.4 +Line D,501.1 +Line A,500.6 +Line B,498.9 +Line C,500.4 +Line D,502.6 +Line A,499.8 +Line B,502.9 +Line C,499.0 +Line D,504.1 +Line A,498.7 +Line B,501.6 +Line C,499.1 +Line D,501.9 +Line A,500.3 +Line B,501.1 +Line C,496.7 +Line D,502.5 +Line A,501.7 +Line B,504.0 +Line C,500.2 +Line D,501.8 +Line A,500.0 +Line B,498.8 +Line C,496.7 +Line D,501.6 +Line A,501.5 +Line B,498.7 +Line C,501.1 +Line D,502.2 +Line A,499.0 +Line B,503.0 +Line C,496.4 +Line D,503.8 +Line A,500.7 +Line B,499.7 +Line C,500.2 +Line D,503.1 +Line A,500.7 +Line B,502.8 +Line C,498.5 +Line D,500.8 +Line A,499.8 +Line B,501.8 +Line C,500.6 +Line D,501.5 +Line A,499.9 +Line B,502.1 +Line C,500.2 +Line D,503.4 +Line A,502.0 +Line B,498.9 +Line C,502.1 +Line D,501.7 +Line A,494.7 +Line B,500.5 +Line C,499.7 +Line D,501.6 +Line A,498.7 +Line B,499.8 +Line C,498.4 +Line D,501.8 +Line A,499.5 +Line B,499.4 +Line C,495.1 +Line D,501.7 +Line A,493.9 +Line B,502.1 +Line C,500.3 +Line D,500.2 +Line A,498.6 +Line B,497.6 +Line C,500.1 +Line D,502.1 +Line A,501.5 +Line B,497.0 +Line C,498.6 +Line D,501.9 +Line A,501.3 +Line B,499.7 +Line C,495.4 +Line D,501.0 +Line A,499.7 +Line B,504.4 +Line C,500.3 +Line D,500.0 +Line A,501.1 +Line B,502.2 +Line C,498.2 +Line D,501.3 +Line A,500.2 +Line B,501.3 +Line C,499.2 +Line D,501.3 +Line A,501.3 +Line B,499.0 +Line C,500.9 +Line D,503.3 +Line A,498.6 +Line B,500.0 +Line C,496.2 +Line D,501.5 +Line A,499.2 +Line B,499.9 +Line C,499.1 +Line D,501.3 +Line A,500.8 +Line B,504.5 +Line C,499.3 +Line D,500.1 +Line A,498.6 +Line B,504.0 +Line C,498.2 +Line D,501.2 +Line A,509.0 +Line B,503.2 +Line C,496.1 +Line D,501.7 +Line A,499.4 +Line B,501.1 +Line C,497.4 +Line D,501.5 +Line A,501.0 +Line B,500.5 +Line C,498.6 +Line D,500.8 +Line A,498.9 +Line B,500.8 +Line C,496.2 +Line D,500.1 +Line A,501.0 +Line B,503.2 +Line C,499.5 +Line D,501.8 +Line A,499.3 +Line B,500.7 +Line C,499.1 +Line D,494.8 +Line A,500.4 +Line B,500.4 +Line C,498.9 +Line D,502.8 +Line A,499.2 +Line B,501.8 +Line C,498.3 +Line D,500.4 +Line A,500.6 +Line B,500.7 +Line C,497.8 +Line D,501.3 +Line A,499.7 +Line B,503.6 +Line C,499.5 +Line D,501.2 +Line A,498.9 +Line B,501.5 +Line C,497.3 +Line D,502.1 +Line A,500.7 +Line B,500.9 +Line C,498.3 +Line D,501.2 +Line A,499.5 +Line B,500.7 +Line C,498.8 +Line D,502.4 +Line A,501.6 +Line B,501.5 +Line C,500.2 +Line D,504.3 +Line A,499.2 +Line B,503.4 +Line C,498.2 +Line D,504.1 +Line A,500.6 +Line B,502.1 +Line C,499.8 +Line D,500.8 +Line A,500.2 +Line B,500.2 +Line C,497.1 +Line D,501.2 +Line A,501.2 +Line B,500.5 +Line C,500.1 +Line D,501.8 +Line A,500.8 +Line B,500.3 +Line C,498.3 +Line D,501.1 +Line A,500.0 +Line B,502.0 +Line C,499.4 +Line D,501.9 +Line A,502.0 +Line B,502.0 +Line C,500.1 +Line D,501.8 +Line A,499.0 +Line B,503.7 +Line C,497.8 +Line D,503.1 +Line A,500.3 +Line B,498.8 +Line C,499.8 +Line D,501.7 +Line A,501.1 +Line B,499.5 +Line C,497.5 +Line D,501.7 +Line A,501.3 +Line B,501.2 +Line C,496.5 +Line D,502.3 +Line A,501.5 +Line B,502.2 +Line C,498.7 +Line D,503.2 +Line A,500.6 +Line B,500.4 +Line C,497.3 +Line D,502.9 +Line A,499.3 +Line B,499.0 +Line C,500.7 +Line D,502.0 +Line A,498.5 +Line B,503.9 +Line C,499.6 +Line D,502.0 +Line A,499.3 +Line B,502.2 +Line C,492.1 +Line D,500.8 +Line A,499.7 +Line B,501.1 +Line C,502.7 +Line D,501.7 +Line A,501.0 +Line B,501.3 +Line C,498.6 +Line D,502.5 +Line A,500.5 +Line B,502.8 +Line C,497.0 +Line D,500.9 +Line A,500.1 +Line B,499.9 +Line C,499.2 +Line D,503.0 +Line A,501.3 +Line B,503.8 +Line C,500.0 +Line D,501.7 +Line A,499.4 +Line B,503.7 +Line C,499.0 +Line D,501.3 +Line A,501.2 +Line B,502.6 +Line C,495.9 +Line D,502.2 +Line A,498.5 +Line B,501.8 +Line C,501.9 +Line D,503.1 +Line A,499.9 +Line B,502.1 +Line C,497.0 +Line D,502.1 +Line A,500.5 +Line B,498.7 +Line C,498.1 +Line D,501.4 +Line A,499.5 +Line B,500.7 +Line C,500.2 +Line D,501.9 +Line A,501.0 +Line B,504.8 +Line C,499.0 +Line D,501.8 +Line A,500.2 +Line B,499.4 +Line C,499.2 +Line D,502.0 +Line A,500.8 +Line B,501.7 +Line C,500.9 +Line D,501.5 +Line A,502.7 +Line B,499.5 +Line C,499.9 +Line D,502.2 +Line A,502.1 +Line B,501.3 +Line C,500.9 +Line D,503.1 +Line A,502.6 +Line B,500.0 +Line C,500.5 +Line D,502.8 +Line A,501.0 +Line B,502.5 +Line C,497.0 +Line D,500.8 +Line A,501.4 +Line B,501.8 +Line C,499.2 +Line D,499.9 +Line A,500.0 +Line B,501.7 +Line C,501.5 +Line D,503.2 +Line A,500.9 +Line B,499.6 +Line C,498.7 +Line D,502.3 +Line A,502.6 +Line B,502.2 +Line C,499.3 +Line D,501.6 +Line A,501.8 +Line B,500.4 +Line C,497.7 +Line D,501.8 +Line A,500.8 +Line B,501.3 +Line C,500.5 +Line D,502.4 +Line A,499.9 +Line B,501.3 +Line C,501.5 +Line D,502.3 +Line A,499.1 +Line B,501.2 +Line C,498.9 +Line D,502.1 +Line A,501.9 +Line B,500.4 +Line C,501.6 +Line D,504.0 +Line A,498.1 +Line B,501.1 +Line C,499.1 +Line D,501.5 +Line A,500.1 +Line B,494.9 +Line C,497.4 +Line D,502.2 +Line A,500.9 +Line B,505.4 +Line C,497.1 +Line D,500.8 +Line A,499.3 +Line B,503.6 +Line C,497.9 +Line D,502.4 +Line A,500.7 +Line B,503.1 +Line C,496.0 +Line D,502.0 +Line A,500.6 +Line B,498.2 +Line C,499.6 +Line D,501.0 +Line A,501.3 +Line B,498.4 +Line C,497.8 +Line D,502.0 +Line A,498.7 +Line B,501.7 +Line C,497.3 +Line D,501.0 +Line A,500.9 +Line B,504.6 +Line C,497.4 +Line D,500.6 +Line A,500.8 +Line B,497.2 +Line C,499.7 +Line D,502.4 +Line A,502.0 +Line B,501.1 +Line C,505.6 +Line D,500.9 +Line A,504.7 +Line B,498.2 +Line C,501.7 +Line D,502.9 +Line A,501.2 +Line B,501.6 +Line C,501.8 +Line D,502.0 +Line A,500.6 +Line B,500.9 +Line C,499.9 +Line D,501.0 +Line A,501.7 +Line B,498.9 +Line C,498.0 +Line D,502.0 +Line A,500.5 +Line B,501.0 +Line C,498.2 +Line D,500.6 +Line A,499.4 +Line B,500.2 +Line C,497.0 +Line D,502.4 +Line A,500.1 +Line B,501.9 +Line C,499.0 +Line D,501.2 +Line A,499.4 +Line B,499.2 +Line C,498.5 +Line D,501.6 +Line A,500.2 +Line B,502.9 +Line C,502.2 +Line D,503.8 +Line A,499.9 +Line B,500.5 +Line C,500.4 +Line D,501.4 +Line A,499.9 +Line B,499.5 +Line C,500.5 +Line D,501.8 +Line A,500.9 +Line B,501.3 +Line C,496.8 +Line D,501.7 +Line A,500.6 +Line B,498.5 +Line C,499.6 +Line D,501.1 +Line A,499.0 +Line B,499.1 +Line C,497.1 +Line D,501.1 +Line A,499.5 +Line B,507.3 +Line C,501.6 +Line D,502.6 +Line A,500.5 +Line B,498.2 +Line C,498.6 +Line D,501.1 +Line A,499.6 +Line B,501.6 +Line C,499.4 +Line D,502.8 +Line A,500.7 +Line B,499.6 +Line C,499.6 +Line D,502.3 +Line A,499.8 +Line B,502.1 +Line C,498.5 +Line D,502.3 +Line A,499.0 +Line B,500.5 +Line C,499.6 +Line D,503.8 +Line A,498.3 +Line B,500.4 +Line C,500.9 +Line D,501.0 +Line A,500.0 +Line B,501.4 +Line C,500.8 +Line D,502.1 +Line A,502.2 +Line B,502.9 +Line C,498.2 +Line D,503.3 +Line A,500.7 +Line B,499.6 +Line C,497.0 +Line D,501.6 +Line A,501.4 +Line B,499.5 +Line C,497.8 +Line D,503.2 +Line A,501.4 +Line B,501.1 +Line C,499.9 +Line D,501.1 +Line A,492.5 +Line B,504.2 +Line C,499.1 +Line D,500.9 +Line A,500.0 +Line B,499.3 +Line C,496.1 +Line D,502.2 +Line A,499.9 +Line B,498.3 +Line C,500.4 +Line D,503.5 +Line A,501.5 +Line B,502.7 +Line C,500.4 +Line D,503.7 +Line A,500.7 +Line B,492.9 +Line C,498.6 +Line D,502.7 +Line A,500.6 +Line B,499.5 +Line C,499.2 +Line D,502.3 +Line A,499.2 +Line B,501.1 +Line C,499.0 +Line D,500.3 +Line A,499.3 +Line B,501.4 +Line C,500.5 +Line D,495.5 +Line A,499.1 +Line B,503.0 +Line C,498.9 +Line D,501.2 +Line A,499.1 +Line B,501.9 +Line C,499.5 +Line D,502.4 +Line A,503.0 +Line B,493.1 +Line C,500.3 +Line D,500.9 +Line A,499.3 +Line B,502.5 +Line C,499.2 +Line D,502.4 +Line A,501.0 +Line B,499.3 +Line C,498.6 +Line D,501.6 +Line A,498.3 +Line B,498.4 +Line C,499.3 +Line D,500.5 +Line A,500.1 +Line B,500.9 +Line C,499.3 +Line D,502.5 +Line A,490.7 +Line B,501.6 +Line C,498.8 +Line D,500.5 +Line A,500.2 +Line B,491.4 +Line C,498.9 +Line D,502.4 +Line A,500.4 +Line B,501.2 +Line C,509.2 +Line D,502.8 +Line A,499.7 +Line B,506.3 +Line C,497.9 +Line D,501.8 +Line A,502.5 +Line B,501.8 +Line C,497.5 +Line D,501.6 +Line A,500.8 +Line B,502.9 +Line C,498.3 +Line D,501.0 +Line A,499.6 +Line B,504.9 +Line C,497.2 +Line D,502.4 +Line A,500.1 +Line B,500.9 +Line C,499.0 +Line D,501.7 +Line A,501.3 +Line B,499.1 +Line C,498.4 +Line D,502.8 +Line A,500.5 +Line B,496.3 +Line C,498.3 +Line D,503.1 +Line A,500.3 +Line B,504.9 +Line C,497.5 +Line D,503.5 +Line A,499.2 +Line B,502.7 +Line C,497.8 +Line D,501.4 +Line A,499.5 +Line B,501.7 +Line C,499.6 +Line D,504.8 +Line A,502.7 +Line B,502.9 +Line C,501.0 +Line D,501.7 +Line A,501.6 +Line B,501.1 +Line C,496.1 +Line D,503.2 +Line A,501.0 +Line B,500.6 +Line C,497.7 +Line D,501.6 +Line A,499.3 +Line B,502.1 +Line C,497.9 +Line D,503.2 +Line A,500.0 +Line B,501.9 +Line C,497.7 +Line D,502.2 +Line A,502.7 +Line B,502.3 +Line C,496.1 +Line D,500.4 +Line A,500.4 +Line B,499.6 +Line C,499.6 +Line D,501.5 +Line A,502.2 +Line B,502.4 +Line C,499.8 +Line D,502.9 +Line A,501.7 +Line B,502.4 +Line C,498.9 +Line D,501.2 +Line A,500.5 +Line B,505.9 +Line C,499.3 +Line D,501.6 +Line A,500.6 +Line B,500.5 +Line C,497.3 +Line D,502.1 +Line A,500.3 +Line B,502.4 +Line C,499.8 +Line D,501.5 +Line A,499.4 +Line B,502.4 +Line C,498.6 +Line D,501.9 +Line A,503.4 +Line B,500.2 +Line C,501.6 +Line D,501.6 +Line A,500.1 +Line B,499.6 +Line C,500.6 +Line D,501.1 +Line A,499.1 +Line B,502.8 +Line C,503.9 +Line D,503.7 +Line A,500.9 +Line B,501.7 +Line C,498.2 +Line D,503.7 +Line A,498.3 +Line B,500.1 +Line C,499.3 +Line D,501.2 +Line A,500.7 +Line B,500.7 +Line C,498.8 +Line D,502.5 +Line A,500.4 +Line B,500.0 +Line C,499.4 +Line D,500.3 +Line A,502.2 +Line B,500.4 +Line C,499.5 +Line D,502.4 +Line A,502.3 +Line B,500.2 +Line C,498.7 +Line D,501.6 +Line A,507.5 +Line B,497.4 +Line C,499.4 +Line D,502.6 +Line A,501.8 +Line B,499.3 +Line C,498.9 +Line D,502.3 +Line A,500.4 +Line B,499.8 +Line C,496.8 +Line D,500.9 +Line A,500.5 +Line B,500.0 +Line C,500.7 +Line D,502.3 +Line A,498.2 +Line B,507.3 +Line C,500.7 +Line D,501.2 +Line A,501.1 +Line B,501.7 +Line C,501.5 +Line D,501.3 +Line A,500.7 +Line B,512.1 +Line C,499.3 +Line D,501.8 +Line A,501.8 +Line B,502.4 +Line C,495.2 +Line D,501.0 +Line A,501.0 +Line B,501.7 +Line C,496.4 +Line D,503.0 +Line A,500.8 +Line B,499.9 +Line C,499.6 +Line D,500.2 +Line A,500.2 +Line B,497.0 +Line C,498.5 +Line D,503.0 +Line A,502.7 +Line B,500.8 +Line C,498.3 +Line D,503.0 +Line A,500.5 +Line B,502.3 +Line C,499.6 +Line D,502.9 +Line A,499.2 +Line B,501.2 +Line C,499.6 +Line D,503.1 +Line A,499.3 +Line B,501.2 +Line C,495.5 +Line D,502.0 +Line A,497.9 +Line B,499.5 +Line C,500.3 +Line D,502.9 +Line A,500.4 +Line B,498.6 +Line C,499.9 +Line D,503.0 +Line A,500.9 +Line B,504.6 +Line C,489.8 +Line D,502.6 +Line A,498.9 +Line B,500.7 +Line C,497.7 +Line D,501.7 +Line A,499.3 +Line B,503.2 +Line C,497.0 +Line D,501.8 +Line A,501.1 +Line B,500.6 +Line C,499.2 +Line D,501.9 +Line A,500.9 +Line B,500.3 +Line C,499.9 +Line D,502.7 +Line A,500.9 +Line B,499.0 +Line C,498.7 +Line D,502.8 +Line A,498.7 +Line B,498.6 +Line C,496.7 +Line D,503.1 +Line A,499.4 +Line B,499.9 +Line C,499.0 +Line D,501.1 +Line A,499.5 +Line B,502.5 +Line C,500.4 +Line D,502.1 +Line A,500.3 +Line B,504.7 +Line C,497.0 +Line D,501.8 +Line A,499.8 +Line B,501.5 +Line C,499.0 +Line D,502.1 +Line A,500.0 +Line B,498.8 +Line C,498.3 +Line D,501.8 +Line A,501.1 +Line B,500.7 +Line C,498.5 +Line D,503.1 +Line A,499.8 +Line B,496.4 +Line C,499.8 +Line D,501.0 +Line A,500.5 +Line B,502.1 +Line C,497.0 +Line D,502.1 +Line A,502.4 +Line B,501.1 +Line C,498.8 +Line D,501.7 +Line A,501.0 +Line B,500.4 +Line C,500.9 +Line D,502.4 +Line A,500.4 +Line B,500.9 +Line C,508.0 +Line D,501.8 +Line A,501.3 +Line B,501.2 +Line C,499.8 +Line D,501.5 +Line A,501.9 +Line B,500.2 +Line C,499.2 +Line D,501.5 +Line A,498.5 +Line B,509.2 +Line C,498.0 +Line D,502.0 +Line A,500.8 +Line B,500.7 +Line C,500.1 +Line D,503.6 +Line A,501.3 +Line B,499.9 +Line C,499.1 +Line D,502.1 +Line A,501.1 +Line B,501.9 +Line C,498.3 +Line D,504.0 +Line A,500.7 +Line B,499.6 +Line C,509.3 +Line D,501.8 +Line A,502.2 +Line B,502.5 +Line C,499.3 +Line D,501.2 +Line A,499.9 +Line B,500.0 +Line C,499.6 +Line D,502.6 +Line A,500.7 +Line B,500.8 +Line C,497.5 +Line D,502.2 +Line A,500.8 +Line B,499.7 +Line C,499.0 +Line D,503.3 +Line A,500.2 +Line B,506.0 +Line C,499.4 +Line D,502.1 +Line A,499.5 +Line B,501.3 +Line C,499.7 +Line D,502.6 +Line A,499.2 +Line B,499.4 +Line C,500.2 +Line D,501.1 +Line A,502.6 +Line B,501.2 +Line C,497.0 +Line D,502.3 +Line A,501.0 +Line B,504.2 +Line C,499.8 +Line D,501.0 +Line A,499.5 +Line B,503.1 +Line C,499.3 +Line D,501.2 +Line A,499.3 +Line B,501.3 +Line C,501.3 +Line D,502.8 +Line A,499.3 +Line B,498.1 +Line C,497.1 +Line D,501.4 +Line A,501.0 +Line B,501.3 +Line C,497.4 +Line D,502.6 +Line A,499.5 +Line B,500.6 +Line C,499.0 +Line D,501.2 +Line A,498.4 +Line B,506.5 +Line C,499.2 +Line D,502.8 +Line A,500.4 +Line B,501.6 +Line C,498.1 +Line D,503.4 +Line A,499.9 +Line B,503.2 +Line C,501.8 +Line D,502.3 +Line A,500.4 +Line B,500.4 +Line C,499.0 +Line D,503.3 +Line A,501.0 +Line B,498.9 +Line C,497.1 +Line D,510.2 +Line A,500.1 +Line B,502.3 +Line C,497.0 +Line D,501.5 +Line A,501.1 +Line B,504.1 +Line C,500.6 +Line D,502.5 +Line A,501.6 +Line B,501.0 +Line C,500.5 +Line D,502.1 +Line A,498.6 +Line B,501.0 +Line C,495.8 +Line D,500.5 +Line A,500.9 +Line B,501.5 +Line C,499.3 +Line D,502.1 +Line A,499.6 +Line B,503.1 +Line C,498.5 +Line D,501.3 +Line A,499.3 +Line B,502.3 +Line C,497.7 +Line D,502.8 +Line A,501.3 +Line B,499.4 +Line C,498.7 +Line D,503.1 +Line A,501.1 +Line B,504.5 +Line C,502.5 +Line D,500.5 +Line A,502.2 +Line B,501.0 +Line C,497.7 +Line D,502.1 +Line A,502.5 +Line B,501.9 +Line C,490.6 +Line D,502.5 +Line A,499.6 +Line B,498.3 +Line C,500.7 +Line D,502.2 +Line A,501.0 +Line B,501.2 +Line C,498.5 +Line D,502.8 +Line A,499.7 +Line B,500.1 +Line C,499.3 +Line D,499.9 +Line A,500.5 +Line B,502.4 +Line C,501.3 +Line D,500.8 +Line A,499.6 +Line B,502.1 +Line C,500.1 +Line D,501.4 +Line A,498.2 +Line B,504.2 +Line C,498.1 +Line D,502.0 +Line A,500.4 +Line B,501.3 +Line C,498.0 +Line D,502.1 +Line A,500.1 +Line B,501.3 +Line C,499.2 +Line D,502.0 +Line A,500.9 +Line B,498.6 +Line C,499.8 +Line D,502.0 +Line A,501.4 +Line B,497.0 +Line C,499.5 +Line D,501.2 +Line A,500.3 +Line B,501.2 +Line C,497.9 +Line D,502.8 +Line A,502.1 +Line B,503.3 +Line C,495.5 +Line D,502.2 +Line A,500.1 +Line B,501.8 +Line C,499.3 +Line D,502.8 +Line A,501.0 +Line B,500.7 +Line C,501.2 +Line D,499.9 +Line A,500.2 +Line B,501.5 +Line C,501.0 +Line D,501.2 +Line A,503.3 +Line B,500.7 +Line C,502.1 +Line D,502.1 +Line A,501.6 +Line B,498.9 +Line C,499.3 +Line D,502.7 +Line A,501.8 +Line B,499.4 +Line C,500.5 +Line D,503.1 +Line A,499.7 +Line B,503.0 +Line C,498.1 +Line D,502.6 +Line A,501.2 +Line B,500.3 +Line C,498.2 +Line D,500.6 +Line A,499.8 +Line B,502.0 +Line C,498.5 +Line D,503.1 +Line A,502.2 +Line B,501.2 +Line C,499.0 +Line D,502.8 +Line A,499.7 +Line B,502.7 +Line C,498.0 +Line D,504.0 +Line A,499.7 +Line B,501.0 +Line C,496.9 +Line D,499.7 +Line A,497.7 +Line B,499.9 +Line C,500.3 +Line D,502.1 +Line A,499.7 +Line B,500.6 +Line C,499.3 +Line D,501.2 +Line A,500.5 +Line B,498.0 +Line C,501.0 +Line D,501.7 +Line A,500.9 +Line B,499.7 +Line C,501.4 +Line D,500.6 +Line A,501.5 +Line B,500.6 +Line C,501.5 +Line D,501.8 +Line A,503.4 +Line B,501.8 +Line C,498.9 +Line D,500.0 +Line A,500.6 +Line B,500.2 +Line C,499.6 +Line D,502.9 +Line A,499.9 +Line B,503.0 +Line C,498.4 +Line D,499.8 +Line A,498.7 +Line B,499.2 +Line C,497.9 +Line D,500.7 +Line A,500.6 +Line B,498.7 +Line C,498.7 +Line D,501.1 +Line A,500.3 +Line B,498.0 +Line C,499.4 +Line D,501.9 +Line A,497.3 +Line B,498.9 +Line C,500.2 +Line D,502.6 +Line A,501.3 +Line B,504.4 +Line C,499.4 +Line D,502.0 +Line A,500.7 +Line B,500.0 +Line C,498.9 +Line D,504.3 +Line A,499.3 +Line B,502.8 +Line C,498.4 +Line D,501.9 +Line A,500.3 +Line B,503.8 +Line C,500.4 +Line D,501.7 +Line A,499.4 +Line B,500.0 +Line C,498.4 +Line D,501.0 +Line A,500.6 +Line B,502.4 +Line C,498.8 +Line D,502.2 +Line A,501.3 +Line B,504.8 +Line C,497.9 +Line D,501.1 +Line A,501.1 +Line B,499.7 +Line C,500.0 +Line D,502.6 +Line A,499.8 +Line B,499.4 +Line C,500.3 +Line D,502.0 +Line A,501.6 +Line B,500.8 +Line C,495.7 +Line D,501.7 +Line A,499.4 +Line B,501.7 +Line C,499.1 +Line D,501.5 +Line A,497.8 +Line B,499.8 +Line C,499.8 +Line D,498.7 +Line A,499.8 +Line B,501.6 +Line C,497.4 +Line D,502.0 +Line A,500.2 +Line B,502.5 +Line C,499.7 +Line D,500.7 +Line A,499.8 +Line B,497.2 +Line C,498.1 +Line D,501.7 +Line A,501.0 +Line B,501.5 +Line C,497.6 +Line D,502.9 +Line A,501.7 +Line B,500.7 +Line C,499.1 +Line D,501.1 +Line A,500.3 +Line B,500.1 +Line C,499.2 +Line D,502.2 +Line A,498.9 +Line B,501.9 +Line C,497.9 +Line D,502.2 +Line A,499.9 +Line B,503.4 +Line C,499.5 +Line D,502.9 +Line A,500.5 +Line B,503.8 +Line C,499.7 +Line D,501.7 +Line A,500.8 +Line B,500.1 +Line C,500.4 +Line D,501.1 +Line A,500.3 +Line B,503.8 +Line C,496.7 +Line D,501.9 +Line A,501.0 +Line B,500.1 +Line C,500.5 +Line D,502.5 +Line A,501.2 +Line B,501.1 +Line C,499.1 +Line D,501.5 +Line A,501.5 +Line B,501.3 +Line C,502.9 +Line D,501.4 +Line A,502.0 +Line B,500.3 +Line C,498.3 +Line D,500.6 +Line A,500.7 +Line B,502.6 +Line C,501.0 +Line D,503.3 +Line A,497.4 +Line B,500.9 +Line C,499.4 +Line D,502.0 +Line A,501.0 +Line B,499.9 +Line C,498.8 +Line D,502.1 +Line A,498.6 +Line B,499.5 +Line C,496.0 +Line D,500.6 +Line A,498.3 +Line B,501.2 +Line C,497.7 +Line D,500.7 +Line A,499.0 +Line B,503.4 +Line C,502.0 +Line D,500.6 +Line A,500.8 +Line B,502.1 +Line C,500.0 +Line D,501.3 +Line A,490.3 +Line B,502.6 +Line C,499.6 +Line D,499.8 +Line A,498.4 +Line B,502.5 +Line C,497.9 +Line D,501.0 +Line A,501.0 +Line B,502.7 +Line C,499.2 +Line D,501.6 +Line A,500.8 +Line B,501.5 +Line C,499.4 +Line D,502.6 +Line A,501.4 +Line B,502.1 +Line C,498.9 +Line D,501.6 +Line A,500.8 +Line B,500.6 +Line C,499.8 +Line D,501.9 +Line A,501.3 +Line B,496.6 +Line C,497.2 +Line D,502.2 +Line A,499.2 +Line B,497.5 +Line C,497.7 +Line D,502.2 +Line A,500.6 +Line B,505.2 +Line C,499.3 +Line D,501.4 +Line A,501.0 +Line B,501.6 +Line C,500.3 +Line D,502.9 +Line A,498.9 +Line B,502.6 +Line C,500.7 +Line D,501.4 +Line A,500.6 +Line B,500.6 +Line C,498.2 +Line D,501.6 +Line A,501.1 +Line B,502.3 +Line C,499.5 +Line D,502.7 +Line A,502.7 +Line B,501.8 +Line C,498.2 +Line D,503.6 +Line A,498.7 +Line B,504.1 +Line C,499.1 +Line D,501.7 +Line A,499.7 +Line B,501.3 +Line C,497.6 +Line D,502.4 +Line A,499.8 +Line B,500.2 +Line C,497.8 +Line D,502.4 +Line A,500.0 +Line B,501.8 +Line C,499.4 +Line D,501.3 +Line A,501.3 +Line B,505.0 +Line C,497.5 +Line D,503.5 +Line A,501.1 +Line B,504.2 +Line C,498.4 +Line D,501.5 +Line A,497.9 +Line B,501.3 +Line C,499.6 +Line D,500.1 +Line A,500.0 +Line B,502.4 +Line C,499.4 +Line D,501.9 +Line A,501.3 +Line B,499.4 +Line C,499.6 +Line D,502.4 +Line A,500.4 +Line B,500.6 +Line C,494.7 +Line D,500.9 +Line A,498.9 +Line B,506.2 +Line C,496.7 +Line D,501.6 +Line A,502.1 +Line B,500.3 +Line C,501.9 +Line D,503.2 +Line A,499.2 +Line B,499.9 +Line C,499.7 +Line D,502.0 +Line A,501.2 +Line B,499.4 +Line C,499.9 +Line D,502.1 +Line A,500.1 +Line B,501.9 +Line C,498.4 +Line D,502.8 +Line A,500.3 +Line B,499.7 +Line C,498.7 +Line D,503.3 +Line A,499.9 +Line B,501.2 +Line C,498.4 +Line D,502.9 +Line A,499.5 +Line B,499.1 +Line C,499.4 +Line D,502.2 +Line A,500.4 +Line B,505.7 +Line C,498.4 +Line D,502.2 +Line A,499.8 +Line B,498.7 +Line C,496.8 +Line D,502.2 +Line A,500.7 +Line B,502.5 +Line C,498.0 +Line D,502.0 +Line A,500.5 +Line B,500.6 +Line C,498.0 +Line D,501.9 +Line A,499.0 +Line B,498.4 +Line C,498.1 +Line D,503.1 +Line A,502.1 +Line B,504.8 +Line C,499.7 +Line D,501.9 +Line A,500.5 +Line B,501.9 +Line C,499.0 +Line D,501.0 +Line A,501.2 +Line B,499.0 +Line C,501.1 +Line D,502.7 +Line A,497.8 +Line B,500.9 +Line C,498.2 +Line D,501.9 +Line A,499.6 +Line B,501.5 +Line C,497.8 +Line D,501.0 +Line A,501.0 +Line B,501.9 +Line C,501.3 +Line D,502.4 +Line A,499.7 +Line B,502.5 +Line C,497.8 +Line D,500.9 +Line A,499.7 +Line B,503.2 +Line C,499.2 +Line D,501.8 +Line A,500.6 +Line B,500.3 +Line C,498.4 +Line D,501.6 +Line A,497.7 +Line B,497.6 +Line C,500.4 +Line D,502.1 +Line A,500.2 +Line B,500.5 +Line C,499.2 +Line D,502.1 +Line A,501.5 +Line B,500.4 +Line C,500.8 +Line D,502.1 +Line A,497.9 +Line B,499.7 +Line C,498.4 +Line D,502.5 +Line A,500.7 +Line B,501.1 +Line C,498.0 +Line D,504.0 +Line A,498.5 +Line B,499.3 +Line C,499.8 +Line D,501.6 +Line A,500.8 +Line B,509.2 +Line C,499.2 +Line D,501.0 +Line A,500.2 +Line B,503.2 +Line C,501.3 +Line D,502.1 +Line A,498.3 +Line B,500.7 +Line C,496.1 +Line D,501.4 diff --git a/agents/evals/fixtures/cases/box-basic-pygal-renamed/case.json b/agents/evals/fixtures/cases/box-basic-pygal-renamed/case.json new file mode 100644 index 00000000000..c11b3d4e9a8 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-renamed/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "box-basic", + "library": "pygal", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "category", + "column": "Abfülllinie" + }, + { + "role": "value", + "column": "Füllgewicht [g]" + } + ], + "expected": "accepted", + "tags": [ + "box", + "renamed", + "synthetic", + "renamed-headers", + "non-ascii-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, renamed)" +} diff --git a/agents/evals/fixtures/cases/box-basic-pygal-renamed/data.csv b/agents/evals/fixtures/cases/box-basic-pygal-renamed/data.csv new file mode 100644 index 00000000000..f3b21176c0d --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-renamed/data.csv @@ -0,0 +1,241 @@ +Abfülllinie,Füllgewicht [g] +Line A,501.9 +Line B,498.7 +Line C,499.7 +Line D,500.5 +Line A,500.1 +Line B,500.8 +Line C,500.1 +Line D,501.4 +Line A,501.2 +Line B,499.3 +Line C,498.1 +Line D,501.0 +Line A,494.0 +Line B,496.2 +Line C,500.1 +Line D,500.4 +Line A,500.5 +Line B,501.6 +Line C,500.7 +Line D,502.7 +Line A,499.0 +Line B,502.0 +Line C,500.6 +Line D,503.4 +Line A,499.8 +Line B,500.2 +Line C,499.5 +Line D,500.9 +Line A,501.1 +Line B,503.8 +Line C,498.2 +Line D,502.6 +Line A,501.3 +Line B,503.9 +Line C,498.2 +Line D,500.8 +Line A,498.2 +Line B,502.1 +Line C,500.8 +Line D,502.4 +Line A,501.6 +Line B,499.6 +Line C,500.2 +Line D,500.6 +Line A,499.5 +Line B,496.6 +Line C,499.5 +Line D,501.8 +Line A,499.5 +Line B,501.2 +Line C,497.4 +Line D,503.8 +Line A,499.4 +Line B,505.5 +Line C,500.6 +Line D,502.4 +Line A,502.6 +Line B,501.9 +Line C,499.7 +Line D,503.4 +Line A,499.9 +Line B,502.5 +Line C,503.7 +Line D,502.3 +Line A,499.3 +Line B,499.3 +Line C,497.6 +Line D,502.2 +Line A,501.8 +Line B,503.1 +Line C,497.4 +Line D,502.7 +Line A,502.6 +Line B,500.1 +Line C,501.0 +Line D,503.3 +Line A,502.0 +Line B,496.4 +Line C,499.8 +Line D,501.9 +Line A,500.6 +Line B,498.9 +Line C,502.8 +Line D,501.7 +Line A,501.7 +Line B,503.0 +Line C,498.9 +Line D,502.2 +Line A,502.2 +Line B,498.6 +Line C,497.3 +Line D,501.8 +Line A,501.6 +Line B,500.0 +Line C,500.7 +Line D,501.7 +Line A,498.8 +Line B,500.9 +Line C,498.0 +Line D,502.1 +Line A,498.5 +Line B,502.2 +Line C,499.8 +Line D,501.6 +Line A,499.1 +Line B,499.8 +Line C,496.6 +Line D,502.4 +Line A,498.5 +Line B,499.5 +Line C,497.9 +Line D,503.3 +Line A,499.9 +Line B,501.0 +Line C,498.1 +Line D,503.6 +Line A,503.2 +Line B,502.3 +Line C,499.4 +Line D,494.3 +Line A,501.4 +Line B,501.9 +Line C,498.4 +Line D,500.3 +Line A,493.6 +Line B,501.1 +Line C,499.6 +Line D,502.3 +Line A,500.4 +Line B,501.0 +Line C,498.2 +Line D,502.3 +Line A,499.0 +Line B,500.4 +Line C,500.1 +Line D,502.6 +Line A,500.2 +Line B,500.0 +Line C,499.6 +Line D,502.4 +Line A,499.0 +Line B,500.9 +Line C,500.3 +Line D,501.3 +Line A,500.6 +Line B,500.1 +Line C,497.7 +Line D,502.4 +Line A,501.5 +Line B,501.8 +Line C,499.5 +Line D,502.0 +Line A,501.4 +Line B,503.6 +Line C,501.9 +Line D,503.7 +Line A,501.8 +Line B,500.7 +Line C,498.3 +Line D,501.3 +Line A,501.8 +Line B,501.2 +Line C,499.6 +Line D,502.6 +Line A,500.6 +Line B,499.6 +Line C,498.3 +Line D,502.7 +Line A,501.0 +Line B,498.9 +Line C,499.2 +Line D,502.1 +Line A,502.7 +Line B,502.9 +Line C,498.2 +Line D,502.2 +Line A,498.2 +Line B,498.5 +Line C,499.2 +Line D,502.0 +Line A,502.9 +Line B,505.2 +Line C,497.9 +Line D,502.5 +Line A,501.6 +Line B,501.7 +Line C,499.7 +Line D,502.9 +Line A,500.8 +Line B,502.3 +Line C,496.7 +Line D,502.1 +Line A,499.5 +Line B,502.1 +Line C,500.0 +Line D,501.1 +Line A,497.8 +Line B,499.9 +Line C,501.0 +Line D,503.2 +Line A,503.1 +Line B,499.1 +Line C,501.0 +Line D,500.2 +Line A,499.4 +Line B,497.9 +Line C,499.0 +Line D,500.5 +Line A,502.4 +Line B,500.3 +Line C,498.7 +Line D,502.0 +Line A,500.6 +Line B,498.7 +Line C,498.1 +Line D,500.6 +Line A,501.3 +Line B,505.4 +Line C,498.7 +Line D,503.2 +Line A,499.5 +Line B,502.0 +Line C,498.4 +Line D,501.3 +Line A,501.9 +Line B,489.3 +Line C,499.0 +Line D,502.6 +Line A,499.7 +Line B,500.0 +Line C,498.2 +Line D,501.4 +Line A,501.4 +Line B,506.5 +Line C,498.8 +Line D,501.7 +Line A,499.7 +Line B,502.0 +Line C,500.5 +Line D,501.4 diff --git a/agents/evals/fixtures/cases/box-basic-pygal-x10/case.json b/agents/evals/fixtures/cases/box-basic-pygal-x10/case.json new file mode 100644 index 00000000000..012ea06cb3d --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "box-basic", + "library": "pygal", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "category", + "column": "Production Line" + }, + { + "role": "value", + "column": "Fill Weight (g)" + } + ], + "expected": "accepted", + "tags": [ + "box", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 505, x10)" +} diff --git a/agents/evals/fixtures/cases/box-basic-pygal-x10/data.csv b/agents/evals/fixtures/cases/box-basic-pygal-x10/data.csv new file mode 100644 index 00000000000..05f7d36b8e3 --- /dev/null +++ b/agents/evals/fixtures/cases/box-basic-pygal-x10/data.csv @@ -0,0 +1,241 @@ +Production Line,Fill Weight (g) +Line A,5019.3 +Line B,4987.0 +Line C,4997.3 +Line D,5005.3 +Line A,5001.1 +Line B,5008.0 +Line C,5000.8 +Line D,5014.1 +Line A,5012.1 +Line B,4993.1 +Line C,4981.1 +Line D,5010.1 +Line A,4940.3 +Line B,4961.5 +Line C,5001.0 +Line D,5004.5 +Line A,5004.5 +Line B,5015.9 +Line C,5007.5 +Line D,5026.6 +Line A,4990.5 +Line B,5019.9 +Line C,5006.2 +Line D,5034.4 +Line A,4997.9 +Line B,5001.6 +Line C,4995.3 +Line D,5009.2 +Line A,5011.0 +Line B,5037.7 +Line C,4982.4 +Line D,5026.2 +Line A,5013.1 +Line B,5039.0 +Line C,4981.6 +Line D,5008.1 +Line A,4981.6 +Line B,5021.1 +Line C,5008.0 +Line D,5024.1 +Line A,5015.9 +Line B,4995.8 +Line C,5001.5 +Line D,5006.5 +Line A,4995.0 +Line B,4966.0 +Line C,4994.8 +Line D,5017.9 +Line A,4994.8 +Line B,5011.7 +Line C,4974.4 +Line D,5037.6 +Line A,4993.5 +Line B,5054.9 +Line C,5006.1 +Line D,5023.9 +Line A,5025.9 +Line B,5018.9 +Line C,4996.8 +Line D,5033.5 +Line A,4999.3 +Line B,5025.0 +Line C,5036.7 +Line D,5023.0 +Line A,4993.3 +Line B,4993.3 +Line C,4976.2 +Line D,5021.8 +Line A,5018.0 +Line B,5030.6 +Line C,4974.2 +Line D,5027.4 +Line A,5026.2 +Line B,5000.8 +Line C,5009.9 +Line D,5032.7 +Line A,5020.5 +Line B,4964.3 +Line C,4998.3 +Line D,5019.3 +Line A,5005.6 +Line B,4989.3 +Line C,5028.5 +Line D,5017.5 +Line A,5016.7 +Line B,5029.9 +Line C,4989.0 +Line D,5021.8 +Line A,5022.1 +Line B,4986.4 +Line C,4972.7 +Line D,5018.2 +Line A,5015.8 +Line B,4999.5 +Line C,5006.8 +Line D,5017.5 +Line A,4987.6 +Line B,5009.3 +Line C,4979.7 +Line D,5021.0 +Line A,4985.4 +Line B,5021.6 +Line C,4998.1 +Line D,5015.7 +Line A,4991.1 +Line B,4997.8 +Line C,4966.4 +Line D,5023.5 +Line A,4985.4 +Line B,4995.1 +Line C,4979.4 +Line D,5033.1 +Line A,4998.9 +Line B,5010.2 +Line C,4981.0 +Line D,5036.0 +Line A,5032.0 +Line B,5022.6 +Line C,4993.8 +Line D,4943.3 +Line A,5013.8 +Line B,5019.0 +Line C,4984.1 +Line D,5003.3 +Line A,4936.3 +Line B,5011.3 +Line C,4995.7 +Line D,5022.7 +Line A,5004.2 +Line B,5009.9 +Line C,4981.5 +Line D,5023.4 +Line A,4990.1 +Line B,5004.2 +Line C,5000.9 +Line D,5026.3 +Line A,5001.8 +Line B,5000.0 +Line C,4995.9 +Line D,5024.4 +Line A,4989.9 +Line B,5009.1 +Line C,5002.9 +Line D,5013.4 +Line A,5006.0 +Line B,5000.9 +Line C,4976.7 +Line D,5024.1 +Line A,5014.7 +Line B,5017.9 +Line C,4995.4 +Line D,5019.5 +Line A,5014.4 +Line B,5036.1 +Line C,5019.0 +Line D,5036.7 +Line A,5018.0 +Line B,5007.2 +Line C,4983.1 +Line D,5013.1 +Line A,5018.0 +Line B,5012.5 +Line C,4996.0 +Line D,5026.4 +Line A,5006.5 +Line B,4995.6 +Line C,4982.8 +Line D,5027.3 +Line A,5009.7 +Line B,4988.8 +Line C,4992.4 +Line D,5021.1 +Line A,5027.1 +Line B,5029.3 +Line C,4981.8 +Line D,5022.3 +Line A,4981.5 +Line B,4985.4 +Line C,4992.1 +Line D,5020.5 +Line A,5028.6 +Line B,5051.6 +Line C,4978.5 +Line D,5024.9 +Line A,5016.4 +Line B,5016.6 +Line C,4996.8 +Line D,5029.1 +Line A,5008.2 +Line B,5022.8 +Line C,4967.4 +Line D,5021.0 +Line A,4995.2 +Line B,5021.1 +Line C,5000.4 +Line D,5011.3 +Line A,4977.7 +Line B,4998.6 +Line C,5009.6 +Line D,5031.8 +Line A,5031.2 +Line B,4991.4 +Line C,5009.6 +Line D,5002.3 +Line A,4994.3 +Line B,4978.5 +Line C,4989.9 +Line D,5004.9 +Line A,5023.7 +Line B,5003.5 +Line C,4987.0 +Line D,5020.4 +Line A,5006.5 +Line B,4986.7 +Line C,4981.4 +Line D,5006.2 +Line A,5013.4 +Line B,5053.7 +Line C,4986.8 +Line D,5031.8 +Line A,4995.4 +Line B,5020.4 +Line C,4983.7 +Line D,5012.8 +Line A,5019.2 +Line B,4892.8 +Line C,4989.8 +Line D,5025.9 +Line A,4996.7 +Line B,5000.1 +Line C,4981.6 +Line D,5014.4 +Line A,5013.7 +Line B,5065.0 +Line C,4988.4 +Line D,5017.0 +Line A,4997.4 +Line B,5019.9 +Line C,5004.9 +Line D,5014.4 diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-date/case.json b/agents/evals/fixtures/cases/heatmap-basic-letsplot-date/case.json new file mode 100644 index 00000000000..b37cfb468ee --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-date/case.json @@ -0,0 +1,30 @@ +{ + "spec_id": "heatmap-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "y", + "column": "Weekday" + }, + { + "role": "x", + "column": "Hour" + }, + { + "role": "value", + "column": "Response Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, date)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-date/data.csv b/agents/evals/fixtures/cases/heatmap-basic-letsplot-date/data.csv new file mode 100644 index 00000000000..3e75b7d7aeb --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-date/data.csv @@ -0,0 +1,169 @@ +Weekday,Hour,Response Time (min),Week Of,Exported On +Monday,0,14.2,26.01.2026,2026-01-27 +Monday,1,15.3,07.01.2026,2026-01-09 +Monday,2,14.3,31.01.2026,2026-02-02 +Monday,3,14.8,08.03.2026,2026-03-12 +Monday,4,14.6,20.04.2026,2026-04-20 +Monday,5,14.8,06.04.2026,2026-04-06 +Monday,6,13.5,09.03.2026,2026-03-12 +Monday,7,8.7,11.05.2026,2026-05-12 +Monday,8,10.2,16.06.2026,2026-06-20 +Monday,9,11.4,26.04.2026,2026-04-29 +Monday,10,14.5,11.02.2026,2026-02-12 +Monday,11,16.2,10.04.2026,2026-04-14 +Monday,12,17.9,30.03.2026,2026-04-03 +Monday,13,16.8,12.03.2026,2026-03-14 +Monday,14,14.7,10.03.2026,2026-03-14 +Monday,15,13.2,14.04.2026,2026-04-16 +Monday,16,10.9,26.04.2026,2026-04-26 +Monday,17,8.6,18.05.2026,2026-05-18 +Monday,18,6.9,29.05.2026,2026-05-30 +Monday,19,6.0,23.05.2026,2026-05-23 +Monday,20,6.5,10.01.2026,2026-01-13 +Monday,21,13.8,16.02.2026,2026-02-19 +Monday,22,13.1,20.06.2026,2026-06-22 +Monday,23,14.4,29.01.2026,2026-01-31 +Tuesday,0,14.2,25.06.2026,2026-06-25 +Tuesday,1,13.3,20.02.2026,2026-02-21 +Tuesday,2,13.6,06.01.2026,2026-01-10 +Tuesday,3,14.8,12.06.2026,2026-06-12 +Tuesday,4,14.2,18.02.2026,2026-02-20 +Tuesday,5,14.2,25.03.2026,2026-03-28 +Tuesday,6,14.2,03.02.2026,2026-02-05 +Tuesday,7,6.7,10.05.2026,2026-05-12 +Tuesday,8,9.5,06.03.2026,2026-03-09 +Tuesday,9,13.2,04.05.2026,2026-05-07 +Tuesday,10,15.7,15.03.2026,2026-03-17 +Tuesday,11,17.4,22.02.2026,2026-02-23 +Tuesday,12,18.2,19.06.2026,2026-06-21 +Tuesday,13,16.1,03.06.2026,2026-06-06 +Tuesday,14,15.4,29.04.2026,2026-05-01 +Tuesday,15,13.5,05.02.2026,2026-02-08 +Tuesday,16,12.0,23.01.2026,2026-01-23 +Tuesday,17,9.8,17.05.2026,2026-05-18 +Tuesday,18,7.0,23.06.2026,2026-06-24 +Tuesday,19,7.1,04.02.2026,2026-02-05 +Tuesday,20,5.8,04.04.2026,2026-04-04 +Tuesday,21,14.1,03.03.2026,2026-03-03 +Tuesday,22,13.7,26.05.2026,2026-05-27 +Tuesday,23,14.3,14.02.2026,2026-02-18 +Wednesday,0,15.4,24.03.2026,2026-03-25 +Wednesday,1,14.5,31.01.2026,2026-01-31 +Wednesday,2,14.1,05.01.2026,2026-01-05 +Wednesday,3,12.6,25.04.2026,2026-04-26 +Wednesday,4,14.3,26.06.2026,2026-06-30 +Wednesday,5,13.4,07.05.2026,2026-05-09 +Wednesday,6,16.0,18.03.2026,2026-03-18 +Wednesday,7,7.4,15.05.2026,2026-05-15 +Wednesday,8,8.7,07.05.2026,2026-05-11 +Wednesday,9,11.8,24.02.2026,2026-02-27 +Wednesday,10,15.3,08.02.2026,2026-02-12 +Wednesday,11,14.9,25.05.2026,2026-05-26 +Wednesday,12,16.2,10.02.2026,2026-02-11 +Wednesday,13,15.9,02.05.2026,2026-05-05 +Wednesday,14,15.3,24.06.2026,2026-06-25 +Wednesday,15,13.4,20.05.2026,2026-05-22 +Wednesday,16,10.9,08.05.2026,2026-05-11 +Wednesday,17,10.1,20.02.2026,2026-02-24 +Wednesday,18,7.9,11.01.2026,2026-01-11 +Wednesday,19,6.0,20.05.2026,2026-05-24 +Wednesday,20,6.2,03.03.2026,2026-03-03 +Wednesday,21,13.9,06.04.2026,2026-04-08 +Wednesday,22,14.5,16.01.2026,2026-01-19 +Wednesday,23,13.2,07.01.2026,2026-01-10 +Thursday,0,13.0,25.05.2026,2026-05-26 +Thursday,1,14.3,27.01.2026,2026-01-29 +Thursday,2,14.4,19.03.2026,2026-03-23 +Thursday,3,13.6,27.03.2026,2026-03-30 +Thursday,4,13.9,28.02.2026,2026-03-02 +Thursday,5,12.9,11.04.2026,2026-04-15 +Thursday,6,13.6,26.03.2026,2026-03-26 +Thursday,7,7.7,15.02.2026,2026-02-16 +Thursday,8,9.5,19.03.2026,2026-03-20 +Thursday,9,12.8,15.05.2026,2026-05-15 +Thursday,10,14.7,15.05.2026,2026-05-17 +Thursday,11,17.0,12.01.2026,2026-01-13 +Thursday,12,15.3,21.01.2026,2026-01-23 +Thursday,13,15.7,23.02.2026,2026-02-23 +Thursday,14,14.7,28.05.2026,2026-05-31 +Thursday,15,13.1,25.02.2026,2026-02-27 +Thursday,16,12.0,19.05.2026,2026-05-19 +Thursday,17,9.4,15.05.2026,2026-05-15 +Thursday,18,6.7,08.03.2026,2026-03-12 +Thursday,19,7.3,06.04.2026,2026-04-07 +Thursday,20,7.8,06.04.2026,2026-04-07 +Thursday,21,13.4,12.04.2026,2026-04-14 +Thursday,22,13.8,18.02.2026,2026-02-21 +Thursday,23,14.0,10.06.2026,2026-06-11 +Friday,0,14.6,28.03.2026,2026-04-01 +Friday,1,14.6,25.01.2026,2026-01-28 +Friday,2,14.3,02.06.2026,2026-06-06 +Friday,3,14.8,07.06.2026,2026-06-09 +Friday,4,13.7,08.01.2026,2026-01-10 +Friday,5,13.9,09.04.2026,2026-04-11 +Friday,6,15.0,09.04.2026,2026-04-10 +Friday,7,7.6,02.03.2026,2026-03-02 +Friday,8,9.2,29.04.2026,2026-05-03 +Friday,9,12.3,12.02.2026,2026-02-13 +Friday,10,15.0,13.05.2026,2026-05-17 +Friday,11,14.7,18.04.2026,2026-04-22 +Friday,12,15.5,01.02.2026,2026-02-04 +Friday,13,15.7,01.04.2026,2026-04-02 +Friday,14,15.4,25.01.2026,2026-01-26 +Friday,15,14.0,17.05.2026,2026-05-20 +Friday,16,12.4,08.02.2026,2026-02-09 +Friday,17,9.2,03.07.2026,2026-07-03 +Friday,18,5.9,14.03.2026,2026-03-18 +Friday,19,6.6,19.01.2026,2026-01-21 +Friday,20,5.9,15.03.2026,2026-03-19 +Friday,21,14.4,22.01.2026,2026-01-25 +Friday,22,14.4,15.05.2026,2026-05-15 +Friday,23,13.5,29.06.2026,2026-07-03 +Saturday,0,14.3,08.01.2026,2026-01-10 +Saturday,1,14.4,23.02.2026,2026-02-24 +Saturday,2,13.4,24.01.2026,2026-01-26 +Saturday,3,14.3,30.06.2026,2026-07-03 +Saturday,4,13.3,26.02.2026,2026-02-28 +Saturday,5,14.2,31.05.2026,2026-06-04 +Saturday,6,14.0,03.03.2026,2026-03-03 +Saturday,7,5.2,04.05.2026,2026-05-05 +Saturday,8,8.2,15.03.2026,2026-03-19 +Saturday,9,9.4,16.04.2026,2026-04-19 +Saturday,10,10.2,14.03.2026,2026-03-16 +Saturday,11,12.1,10.05.2026,2026-05-11 +Saturday,12,11.9,24.04.2026,2026-04-25 +Saturday,13,12.1,04.06.2026,2026-06-08 +Saturday,14,11.1,31.05.2026,2026-06-04 +Saturday,15,9.6,02.03.2026,2026-03-02 +Saturday,16,8.6,16.03.2026,2026-03-20 +Saturday,17,8.3,28.05.2026,2026-05-29 +Saturday,18,6.6,13.01.2026,2026-01-14 +Saturday,19,5.6,26.02.2026,2026-03-02 +Saturday,20,4.0,28.04.2026,2026-05-01 +Saturday,21,12.9,23.03.2026,2026-03-25 +Saturday,22,14.1,08.03.2026,2026-03-10 +Saturday,23,14.2,19.03.2026,2026-03-21 +Sunday,0,14.9,11.05.2026,2026-05-14 +Sunday,1,13.9,05.05.2026,2026-05-09 +Sunday,2,11.5,26.04.2026,2026-04-29 +Sunday,3,13.8,10.03.2026,2026-03-12 +Sunday,4,14.2,28.04.2026,2026-05-01 +Sunday,5,14.9,23.06.2026,2026-06-27 +Sunday,6,13.6,23.04.2026,2026-04-26 +Sunday,7,6.7,20.04.2026,2026-04-24 +Sunday,8,8.8,23.06.2026,2026-06-23 +Sunday,9,8.8,13.01.2026,2026-01-17 +Sunday,10,11.1,30.06.2026,2026-07-01 +Sunday,11,12.1,16.06.2026,2026-06-18 +Sunday,12,11.0,11.02.2026,2026-02-14 +Sunday,13,10.3,29.03.2026,2026-03-29 +Sunday,14,10.7,06.02.2026,2026-02-06 +Sunday,15,9.7,10.02.2026,2026-02-10 +Sunday,16,9.2,29.05.2026,2026-05-30 +Sunday,17,8.9,10.04.2026,2026-04-13 +Sunday,18,6.4,05.01.2026,2026-01-06 +Sunday,19,6.9,01.03.2026,2026-03-05 +Sunday,20,6.0,23.05.2026,2026-05-23 +Sunday,21,12.8,09.06.2026,2026-06-13 +Sunday,22,12.7,31.03.2026,2026-04-03 +Sunday,23,12.4,21.03.2026,2026-03-21 diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-decimal-comma/case.json b/agents/evals/fixtures/cases/heatmap-basic-letsplot-decimal-comma/case.json new file mode 100644 index 00000000000..fb7993cc233 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-decimal-comma/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "heatmap-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "y", + "column": "Weekday" + }, + { + "role": "x", + "column": "Hour" + }, + { + "role": "value", + "column": "Response Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-decimal-comma/data.csv b/agents/evals/fixtures/cases/heatmap-basic-letsplot-decimal-comma/data.csv new file mode 100644 index 00000000000..8b23d956716 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-decimal-comma/data.csv @@ -0,0 +1,169 @@ +Weekday;Hour;Response Time (min) +Monday;0;14,2 +Monday;1;15,3 +Monday;2;14,3 +Monday;3;14,8 +Monday;4;14,6 +Monday;5;14,8 +Monday;6;13,5 +Monday;7;8,7 +Monday;8;10,2 +Monday;9;11,4 +Monday;10;14,5 +Monday;11;16,2 +Monday;12;17,9 +Monday;13;16,8 +Monday;14;14,7 +Monday;15;13,2 +Monday;16;10,9 +Monday;17;8,6 +Monday;18;6,9 +Monday;19;6,0 +Monday;20;6,5 +Monday;21;13,8 +Monday;22;13,1 +Monday;23;14,4 +Tuesday;0;14,2 +Tuesday;1;13,3 +Tuesday;2;13,6 +Tuesday;3;14,8 +Tuesday;4;14,2 +Tuesday;5;14,2 +Tuesday;6;14,2 +Tuesday;7;6,7 +Tuesday;8;9,5 +Tuesday;9;13,2 +Tuesday;10;15,7 +Tuesday;11;17,4 +Tuesday;12;18,2 +Tuesday;13;16,1 +Tuesday;14;15,4 +Tuesday;15;13,5 +Tuesday;16;12,0 +Tuesday;17;9,8 +Tuesday;18;7,0 +Tuesday;19;7,1 +Tuesday;20;5,8 +Tuesday;21;14,1 +Tuesday;22;13,7 +Tuesday;23;14,3 +Wednesday;0;15,4 +Wednesday;1;14,5 +Wednesday;2;14,1 +Wednesday;3;12,6 +Wednesday;4;14,3 +Wednesday;5;13,4 +Wednesday;6;16,0 +Wednesday;7;7,4 +Wednesday;8;8,7 +Wednesday;9;11,8 +Wednesday;10;15,3 +Wednesday;11;14,9 +Wednesday;12;16,2 +Wednesday;13;15,9 +Wednesday;14;15,3 +Wednesday;15;13,4 +Wednesday;16;10,9 +Wednesday;17;10,1 +Wednesday;18;7,9 +Wednesday;19;6,0 +Wednesday;20;6,2 +Wednesday;21;13,9 +Wednesday;22;14,5 +Wednesday;23;13,2 +Thursday;0;13,0 +Thursday;1;14,3 +Thursday;2;14,4 +Thursday;3;13,6 +Thursday;4;13,9 +Thursday;5;12,9 +Thursday;6;13,6 +Thursday;7;7,7 +Thursday;8;9,5 +Thursday;9;12,8 +Thursday;10;14,7 +Thursday;11;17,0 +Thursday;12;15,3 +Thursday;13;15,7 +Thursday;14;14,7 +Thursday;15;13,1 +Thursday;16;12,0 +Thursday;17;9,4 +Thursday;18;6,7 +Thursday;19;7,3 +Thursday;20;7,8 +Thursday;21;13,4 +Thursday;22;13,8 +Thursday;23;14,0 +Friday;0;14,6 +Friday;1;14,6 +Friday;2;14,3 +Friday;3;14,8 +Friday;4;13,7 +Friday;5;13,9 +Friday;6;15,0 +Friday;7;7,6 +Friday;8;9,2 +Friday;9;12,3 +Friday;10;15,0 +Friday;11;14,7 +Friday;12;15,5 +Friday;13;15,7 +Friday;14;15,4 +Friday;15;14,0 +Friday;16;12,4 +Friday;17;9,2 +Friday;18;5,9 +Friday;19;6,6 +Friday;20;5,9 +Friday;21;14,4 +Friday;22;14,4 +Friday;23;13,5 +Saturday;0;14,3 +Saturday;1;14,4 +Saturday;2;13,4 +Saturday;3;14,3 +Saturday;4;13,3 +Saturday;5;14,2 +Saturday;6;14,0 +Saturday;7;5,2 +Saturday;8;8,2 +Saturday;9;9,4 +Saturday;10;10,2 +Saturday;11;12,1 +Saturday;12;11,9 +Saturday;13;12,1 +Saturday;14;11,1 +Saturday;15;9,6 +Saturday;16;8,6 +Saturday;17;8,3 +Saturday;18;6,6 +Saturday;19;5,6 +Saturday;20;4,0 +Saturday;21;12,9 +Saturday;22;14,1 +Saturday;23;14,2 +Sunday;0;14,9 +Sunday;1;13,9 +Sunday;2;11,5 +Sunday;3;13,8 +Sunday;4;14,2 +Sunday;5;14,9 +Sunday;6;13,6 +Sunday;7;6,7 +Sunday;8;8,8 +Sunday;9;8,8 +Sunday;10;11,1 +Sunday;11;12,1 +Sunday;12;11,0 +Sunday;13;10,3 +Sunday;14;10,7 +Sunday;15;9,7 +Sunday;16;9,2 +Sunday;17;8,9 +Sunday;18;6,4 +Sunday;19;6,9 +Sunday;20;6,0 +Sunday;21;12,8 +Sunday;22;12,7 +Sunday;23;12,4 diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-n12/case.json b/agents/evals/fixtures/cases/heatmap-basic-letsplot-n12/case.json new file mode 100644 index 00000000000..89067fcc56a --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-n12/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "heatmap-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "y", + "column": "Weekday" + }, + { + "role": "x", + "column": "Hour" + }, + { + "role": "value", + "column": "Response Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, n12)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-n12/data.csv b/agents/evals/fixtures/cases/heatmap-basic-letsplot-n12/data.csv new file mode 100644 index 00000000000..ca5beb0ecfb --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-n12/data.csv @@ -0,0 +1,13 @@ +Weekday,Hour,Response Time (min) +Monday,8,9.1 +Monday,12,16.5 +Monday,16,10.8 +Monday,20,4.8 +Wednesday,8,10.9 +Wednesday,12,18.3 +Wednesday,16,11.6 +Wednesday,20,5.5 +Friday,8,10.8 +Friday,12,17.4 +Friday,16,11.9 +Friday,20,4.9 diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-n5000/case.json b/agents/evals/fixtures/cases/heatmap-basic-letsplot-n5000/case.json new file mode 100644 index 00000000000..9da5aec4580 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-n5000/case.json @@ -0,0 +1,29 @@ +{ + "spec_id": "heatmap-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "y", + "column": "Weekday" + }, + { + "role": "x", + "column": "Hour" + }, + { + "role": "value", + "column": "Response Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "n5000", + "synthetic", + "large", + "aggregation" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, n5000)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-n5000/data.csv b/agents/evals/fixtures/cases/heatmap-basic-letsplot-n5000/data.csv new file mode 100644 index 00000000000..37329786f72 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-n5000/data.csv @@ -0,0 +1,5001 @@ +Weekday,Hour,Response Time (min) +Friday,17,18.0 +Monday,20,6.2 +Wednesday,10,10.0 +Wednesday,7,9.5 +Wednesday,19,3.7 +Thursday,8,24.6 +Sunday,15,3.3 +Friday,5,59.2 +Sunday,16,8.2 +Friday,15,3.4 +Sunday,17,10.6 +Sunday,12,8.6 +Friday,20,2.6 +Tuesday,18,3.0 +Thursday,20,9.2 +Friday,6,43.2 +Saturday,18,10.5 +Thursday,10,57.3 +Friday,12,25.6 +Monday,21,15.0 +Thursday,19,2.2 +Friday,10,50.4 +Monday,7,4.1 +Wednesday,14,13.3 +Monday,12,29.1 +Tuesday,10,31.2 +Wednesday,13,6.8 +Tuesday,17,0.3 +Tuesday,16,5.4 +Wednesday,10,16.2 +Saturday,13,13.0 +Sunday,8,3.9 +Friday,11,21.0 +Wednesday,21,17.4 +Monday,8,30.5 +Sunday,7,4.0 +Wednesday,12,17.1 +Saturday,8,0.5 +Thursday,12,24.5 +Wednesday,18,7.1 +Sunday,3,10.6 +Friday,18,4.4 +Friday,18,3.8 +Friday,15,27.1 +Friday,7,6.5 +Saturday,17,5.5 +Thursday,14,12.5 +Monday,19,3.3 +Monday,20,8.1 +Thursday,14,38.2 +Wednesday,2,12.4 +Monday,19,6.4 +Thursday,9,2.9 +Sunday,5,2.1 +Wednesday,20,3.6 +Saturday,0,15.5 +Wednesday,17,31.3 +Tuesday,20,5.5 +Tuesday,12,6.4 +Thursday,1,22.6 +Wednesday,7,8.1 +Monday,17,5.3 +Wednesday,11,25.0 +Thursday,19,1.6 +Wednesday,13,27.8 +Monday,20,6.9 +Thursday,13,9.7 +Tuesday,18,1.9 +Tuesday,19,1.8 +Saturday,1,16.2 +Wednesday,10,32.6 +Thursday,7,4.8 +Wednesday,8,9.1 +Monday,19,2.3 +Saturday,18,3.9 +Thursday,20,3.7 +Saturday,13,8.4 +Tuesday,20,10.0 +Monday,10,9.7 +Wednesday,23,5.0 +Saturday,18,9.9 +Friday,13,11.6 +Thursday,16,16.0 +Friday,16,17.0 +Friday,11,21.5 +Monday,15,6.2 +Sunday,8,2.7 +Monday,10,2.8 +Saturday,12,26.9 +Friday,9,38.9 +Friday,14,11.8 +Thursday,19,6.1 +Saturday,12,8.2 +Tuesday,21,8.2 +Saturday,20,2.0 +Sunday,13,11.4 +Tuesday,12,18.2 +Sunday,11,8.2 +Friday,20,8.7 +Saturday,21,6.2 +Saturday,10,24.2 +Friday,6,20.1 +Sunday,22,12.6 +Sunday,17,6.1 +Wednesday,13,6.6 +Thursday,20,4.3 +Saturday,12,2.3 +Sunday,18,4.2 +Tuesday,9,14.1 +Tuesday,12,3.6 +Thursday,10,9.2 +Wednesday,10,4.3 +Thursday,2,3.1 +Friday,12,13.8 +Tuesday,13,12.2 +Monday,10,18.7 +Tuesday,20,6.2 +Thursday,7,5.8 +Wednesday,9,17.6 +Friday,21,4.0 +Tuesday,14,12.0 +Wednesday,17,10.6 +Thursday,0,15.1 +Wednesday,16,10.8 +Sunday,18,4.1 +Saturday,8,1.8 +Friday,12,12.2 +Wednesday,7,8.2 +Friday,12,15.4 +Monday,2,5.8 +Thursday,8,10.2 +Wednesday,16,15.1 +Sunday,5,1.5 +Monday,9,6.0 +Thursday,20,3.6 +Sunday,18,6.1 +Monday,11,5.8 +Monday,15,10.4 +Monday,13,6.8 +Tuesday,10,2.5 +Sunday,17,3.5 +Saturday,7,4.9 +Friday,7,4.6 +Thursday,15,5.7 +Saturday,11,18.6 +Wednesday,16,16.3 +Sunday,16,8.5 +Thursday,5,64.0 +Saturday,14,5.0 +Tuesday,19,2.7 +Friday,20,5.6 +Friday,13,20.3 +Friday,9,9.5 +Sunday,17,20.2 +Tuesday,12,28.6 +Monday,15,17.7 +Sunday,17,11.0 +Saturday,12,12.0 +Monday,8,7.2 +Thursday,13,10.4 +Tuesday,20,8.7 +Tuesday,7,13.9 +Tuesday,18,8.3 +Tuesday,7,0.8 +Sunday,19,8.3 +Saturday,1,22.8 +Tuesday,16,17.7 +Sunday,9,7.1 +Wednesday,7,13.5 +Sunday,0,5.5 +Thursday,9,7.8 +Sunday,19,8.3 +Sunday,0,2.5 +Saturday,17,12.3 +Friday,22,17.9 +Saturday,15,2.8 +Wednesday,12,9.4 +Sunday,14,18.7 +Wednesday,9,6.0 +Friday,18,5.7 +Wednesday,12,12.5 +Thursday,17,8.9 +Thursday,10,4.7 +Thursday,9,48.3 +Tuesday,20,4.2 +Friday,9,18.3 +Tuesday,10,10.4 +Saturday,21,8.0 +Monday,20,9.9 +Thursday,16,12.2 +Friday,19,4.3 +Friday,17,2.9 +Sunday,11,10.1 +Thursday,8,15.1 +Sunday,20,5.4 +Thursday,3,12.2 +Sunday,13,14.1 +Tuesday,7,12.3 +Monday,16,1.3 +Thursday,23,8.4 +Monday,10,11.7 +Saturday,8,8.6 +Sunday,10,22.6 +Tuesday,20,7.1 +Thursday,16,17.5 +Saturday,10,9.9 +Sunday,22,22.5 +Thursday,17,10.8 +Sunday,19,10.8 +Tuesday,10,17.5 +Sunday,11,12.0 +Friday,9,4.0 +Monday,14,5.3 +Tuesday,19,3.7 +Friday,9,8.9 +Friday,10,19.0 +Thursday,13,11.5 +Monday,20,8.4 +Friday,1,7.0 +Saturday,13,4.5 +Monday,15,5.3 +Tuesday,20,7.0 +Wednesday,19,6.9 +Saturday,11,6.6 +Thursday,15,21.3 +Sunday,18,6.9 +Sunday,17,13.2 +Monday,16,16.6 +Saturday,8,5.9 +Thursday,7,17.4 +Thursday,9,6.7 +Tuesday,15,15.2 +Wednesday,17,5.2 +Monday,18,6.5 +Wednesday,19,21.4 +Tuesday,7,19.4 +Friday,11,0.2 +Tuesday,18,6.5 +Sunday,17,11.1 +Tuesday,11,23.7 +Friday,10,29.5 +Monday,5,5.9 +Sunday,16,17.0 +Saturday,19,12.6 +Monday,19,8.8 +Saturday,7,1.5 +Saturday,18,6.9 +Tuesday,18,5.6 +Monday,20,2.5 +Tuesday,4,17.5 +Saturday,8,2.5 +Friday,15,23.1 +Saturday,8,13.6 +Friday,22,23.6 +Tuesday,4,30.1 +Friday,8,4.3 +Sunday,14,21.6 +Sunday,12,13.8 +Friday,4,18.8 +Wednesday,15,2.2 +Monday,18,5.4 +Thursday,11,13.2 +Tuesday,1,6.6 +Thursday,17,11.8 +Wednesday,16,16.0 +Monday,15,5.2 +Thursday,5,27.6 +Thursday,17,5.4 +Tuesday,10,25.9 +Sunday,20,5.5 +Wednesday,14,35.1 +Wednesday,9,11.1 +Sunday,14,5.8 +Monday,9,10.9 +Monday,9,15.1 +Monday,5,5.1 +Tuesday,19,6.6 +Saturday,8,2.2 +Wednesday,19,2.8 +Thursday,13,17.4 +Monday,18,5.3 +Tuesday,15,3.3 +Friday,16,8.5 +Friday,20,11.1 +Sunday,12,5.6 +Sunday,19,5.8 +Monday,11,18.7 +Sunday,15,1.8 +Thursday,20,13.8 +Monday,2,23.3 +Monday,9,0.8 +Monday,14,3.0 +Thursday,9,16.8 +Wednesday,12,22.3 +Saturday,11,2.8 +Wednesday,11,4.1 +Sunday,5,9.6 +Tuesday,23,27.6 +Wednesday,10,6.1 +Wednesday,12,14.6 +Friday,14,12.8 +Tuesday,11,11.0 +Friday,19,2.2 +Sunday,19,2.4 +Tuesday,10,12.4 +Sunday,9,15.8 +Monday,8,6.3 +Friday,20,4.3 +Friday,17,5.5 +Tuesday,4,7.8 +Saturday,12,25.0 +Friday,7,18.0 +Wednesday,10,6.0 +Tuesday,19,0.8 +Monday,11,58.7 +Tuesday,0,6.4 +Tuesday,4,21.5 +Monday,17,12.7 +Friday,15,12.6 +Friday,7,11.0 +Sunday,20,8.7 +Saturday,10,30.1 +Friday,14,17.0 +Tuesday,15,11.9 +Wednesday,16,15.3 +Saturday,16,11.1 +Sunday,14,25.5 +Thursday,11,7.7 +Friday,9,4.1 +Friday,21,14.4 +Thursday,1,16.1 +Friday,17,7.3 +Friday,13,8.8 +Monday,15,14.1 +Tuesday,11,14.0 +Saturday,20,3.0 +Wednesday,11,11.5 +Thursday,5,10.3 +Tuesday,15,13.9 +Saturday,10,24.4 +Wednesday,18,12.6 +Sunday,8,8.8 +Sunday,19,3.1 +Saturday,9,7.6 +Saturday,11,16.7 +Friday,7,1.3 +Sunday,8,13.8 +Wednesday,11,5.5 +Thursday,10,3.9 +Thursday,9,9.6 +Wednesday,7,11.5 +Sunday,17,4.3 +Saturday,7,1.8 +Monday,15,5.3 +Sunday,20,6.3 +Tuesday,8,8.1 +Tuesday,19,3.9 +Wednesday,11,11.9 +Friday,15,3.4 +Tuesday,7,5.5 +Friday,17,6.0 +Wednesday,7,14.3 +Friday,17,8.6 +Wednesday,6,9.6 +Thursday,8,5.6 +Tuesday,8,13.9 +Tuesday,9,7.6 +Saturday,7,3.0 +Monday,22,1.1 +Saturday,23,12.6 +Tuesday,1,12.6 +Monday,7,5.1 +Wednesday,13,14.6 +Thursday,10,6.1 +Monday,7,2.4 +Saturday,17,3.9 +Saturday,13,5.0 +Monday,8,14.9 +Saturday,8,1.3 +Wednesday,18,7.3 +Sunday,20,13.3 +Saturday,8,1.8 +Saturday,14,12.2 +Monday,20,5.8 +Thursday,7,8.5 +Thursday,12,10.7 +Friday,19,6.3 +Wednesday,19,1.9 +Thursday,0,10.7 +Thursday,17,11.4 +Wednesday,7,3.1 +Sunday,10,6.7 +Monday,8,10.9 +Monday,17,9.1 +Tuesday,13,15.1 +Friday,16,12.1 +Monday,17,4.1 +Thursday,9,8.2 +Thursday,17,0.6 +Thursday,5,6.6 +Friday,16,9.5 +Sunday,13,0.6 +Thursday,17,1.9 +Tuesday,14,9.1 +Wednesday,20,3.4 +Tuesday,17,4.3 +Monday,23,11.1 +Monday,12,16.4 +Friday,8,9.5 +Thursday,7,13.0 +Sunday,18,7.4 +Wednesday,12,13.3 +Monday,13,8.3 +Sunday,8,7.3 +Tuesday,14,1.8 +Tuesday,9,22.1 +Thursday,12,21.6 +Saturday,20,0.6 +Tuesday,14,19.5 +Friday,8,8.0 +Wednesday,16,5.3 +Saturday,13,4.9 +Sunday,8,9.2 +Wednesday,20,5.7 +Sunday,8,7.6 +Thursday,11,15.5 +Sunday,17,9.2 +Monday,15,18.8 +Tuesday,13,14.3 +Friday,14,14.9 +Monday,10,12.6 +Saturday,17,4.0 +Wednesday,12,28.1 +Saturday,19,12.3 +Monday,20,18.0 +Sunday,13,9.9 +Monday,17,4.9 +Saturday,15,19.3 +Tuesday,15,16.5 +Saturday,18,4.2 +Tuesday,20,5.3 +Thursday,15,21.5 +Wednesday,8,5.4 +Monday,12,2.8 +Friday,9,20.7 +Wednesday,13,31.6 +Monday,9,7.8 +Monday,13,13.4 +Thursday,3,37.9 +Monday,16,29.1 +Sunday,16,29.3 +Thursday,19,2.5 +Thursday,15,16.5 +Saturday,7,7.9 +Monday,0,6.0 +Sunday,8,5.4 +Monday,20,3.4 +Saturday,2,18.8 +Thursday,10,1.0 +Friday,16,5.3 +Friday,13,13.2 +Monday,9,19.6 +Monday,17,4.8 +Tuesday,10,2.2 +Sunday,14,0.5 +Saturday,20,4.1 +Wednesday,9,0.9 +Tuesday,13,11.3 +Saturday,9,21.0 +Sunday,16,16.5 +Wednesday,10,12.6 +Monday,14,14.2 +Tuesday,8,16.6 +Friday,12,47.1 +Saturday,11,9.3 +Thursday,18,3.1 +Thursday,8,4.9 +Thursday,13,6.6 +Wednesday,12,30.4 +Saturday,15,6.8 +Friday,9,9.3 +Sunday,8,7.3 +Wednesday,18,10.8 +Friday,8,13.8 +Tuesday,20,6.0 +Saturday,11,20.9 +Wednesday,8,10.5 +Monday,21,7.2 +Tuesday,12,6.0 +Monday,10,25.8 +Sunday,17,3.0 +Monday,3,2.2 +Saturday,6,3.8 +Saturday,7,3.3 +Monday,17,2.4 +Friday,17,3.1 +Saturday,5,5.0 +Saturday,20,0.1 +Tuesday,18,7.9 +Wednesday,8,6.2 +Wednesday,10,12.9 +Thursday,16,18.5 +Sunday,7,6.1 +Wednesday,5,4.0 +Wednesday,7,12.4 +Monday,15,9.5 +Wednesday,8,12.7 +Wednesday,8,12.1 +Saturday,14,10.1 +Friday,21,17.9 +Monday,17,15.2 +Tuesday,16,24.4 +Sunday,9,5.0 +Tuesday,9,7.0 +Monday,16,21.3 +Monday,9,16.9 +Monday,9,8.5 +Saturday,11,25.7 +Saturday,6,9.5 +Wednesday,9,5.0 +Wednesday,7,4.7 +Tuesday,16,6.5 +Friday,0,8.9 +Thursday,10,15.3 +Friday,18,1.5 +Tuesday,9,9.3 +Thursday,21,28.7 +Thursday,11,19.2 +Saturday,15,3.4 +Wednesday,4,8.3 +Tuesday,8,17.3 +Monday,20,1.4 +Thursday,12,18.6 +Saturday,7,4.7 +Saturday,19,4.2 +Tuesday,16,15.9 +Monday,9,0.7 +Thursday,11,21.9 +Thursday,13,3.4 +Monday,18,5.6 +Monday,3,6.8 +Wednesday,1,42.4 +Wednesday,19,3.1 +Thursday,7,4.4 +Tuesday,17,13.9 +Tuesday,19,7.1 +Sunday,15,14.2 +Friday,4,11.2 +Wednesday,11,18.3 +Wednesday,21,5.2 +Friday,13,15.7 +Thursday,7,13.5 +Sunday,13,3.3 +Wednesday,7,2.2 +Saturday,14,5.7 +Sunday,7,3.4 +Monday,12,25.0 +Friday,10,9.2 +Monday,11,8.1 +Monday,19,2.8 +Wednesday,10,5.7 +Monday,19,2.7 +Wednesday,7,1.9 +Wednesday,5,8.6 +Thursday,9,4.8 +Thursday,14,42.3 +Monday,19,5.4 +Saturday,12,4.5 +Wednesday,13,4.1 +Tuesday,10,1.4 +Tuesday,14,20.7 +Tuesday,14,12.7 +Saturday,7,2.2 +Tuesday,20,1.2 +Saturday,3,8.8 +Friday,11,28.0 +Thursday,11,5.4 +Thursday,7,5.6 +Saturday,7,8.1 +Thursday,8,11.6 +Sunday,10,8.0 +Sunday,15,10.6 +Saturday,12,26.8 +Thursday,3,34.9 +Sunday,14,14.1 +Monday,8,3.1 +Thursday,9,11.0 +Monday,8,8.2 +Friday,19,5.6 +Saturday,13,13.7 +Sunday,17,2.6 +Sunday,1,6.5 +Thursday,15,6.2 +Saturday,17,1.7 +Sunday,13,28.1 +Friday,9,22.0 +Saturday,15,38.6 +Friday,18,14.4 +Friday,2,21.5 +Saturday,12,2.8 +Tuesday,9,19.3 +Tuesday,10,1.3 +Monday,22,9.2 +Thursday,13,19.1 +Friday,11,24.6 +Friday,8,5.6 +Tuesday,11,16.9 +Monday,10,6.2 +Friday,16,10.5 +Tuesday,23,34.0 +Friday,20,7.4 +Friday,15,21.8 +Monday,13,18.7 +Saturday,19,3.4 +Thursday,13,14.4 +Thursday,13,15.5 +Saturday,12,10.3 +Friday,12,4.2 +Wednesday,11,9.1 +Thursday,2,4.9 +Wednesday,7,12.2 +Sunday,12,1.5 +Friday,10,25.6 +Monday,16,5.6 +Wednesday,18,9.9 +Thursday,10,11.2 +Tuesday,0,6.0 +Friday,11,18.7 +Tuesday,12,18.3 +Sunday,16,10.4 +Friday,13,31.1 +Sunday,23,2.8 +Friday,10,4.1 +Friday,12,28.0 +Thursday,10,16.0 +Tuesday,20,2.1 +Saturday,15,7.2 +Wednesday,11,12.8 +Tuesday,16,15.0 +Saturday,12,6.8 +Wednesday,20,0.9 +Tuesday,8,14.4 +Friday,12,19.5 +Friday,18,17.9 +Thursday,11,21.5 +Wednesday,13,7.3 +Sunday,11,4.3 +Tuesday,16,10.7 +Thursday,8,10.7 +Sunday,17,8.3 +Friday,16,15.8 +Monday,6,7.1 +Monday,14,20.5 +Wednesday,11,13.5 +Thursday,13,19.8 +Tuesday,17,8.5 +Thursday,11,23.1 +Wednesday,23,19.9 +Tuesday,20,4.1 +Sunday,14,12.2 +Friday,10,17.5 +Saturday,18,11.1 +Saturday,3,8.5 +Monday,4,27.7 +Wednesday,15,25.4 +Friday,4,26.8 +Tuesday,17,15.1 +Thursday,22,19.5 +Sunday,13,6.2 +Friday,7,18.3 +Tuesday,14,10.6 +Thursday,12,6.5 +Sunday,7,9.8 +Thursday,10,28.3 +Thursday,17,13.7 +Wednesday,7,13.0 +Saturday,4,21.4 +Wednesday,1,11.4 +Wednesday,15,8.7 +Friday,20,8.2 +Friday,11,18.2 +Thursday,9,8.6 +Friday,9,9.0 +Saturday,19,4.7 +Friday,21,16.1 +Wednesday,19,5.2 +Monday,20,4.8 +Tuesday,15,23.2 +Friday,7,2.1 +Thursday,1,0.2 +Thursday,19,1.1 +Saturday,11,10.9 +Monday,7,4.4 +Saturday,13,9.2 +Sunday,9,2.1 +Sunday,20,6.1 +Monday,7,7.5 +Sunday,7,15.6 +Tuesday,9,26.5 +Friday,19,2.4 +Monday,17,12.5 +Thursday,16,9.2 +Tuesday,18,9.8 +Sunday,16,0.7 +Monday,17,20.9 +Monday,10,4.3 +Friday,23,38.2 +Tuesday,0,5.5 +Tuesday,19,5.1 +Wednesday,17,1.4 +Tuesday,8,16.7 +Friday,23,17.1 +Sunday,11,0.9 +Tuesday,18,9.3 +Wednesday,18,13.1 +Friday,14,7.4 +Tuesday,12,14.9 +Thursday,20,1.2 +Saturday,10,27.5 +Tuesday,16,4.0 +Friday,9,10.2 +Thursday,23,8.4 +Saturday,12,20.6 +Friday,17,1.0 +Monday,7,5.9 +Saturday,9,6.1 +Monday,20,14.7 +Tuesday,15,22.7 +Tuesday,19,11.1 +Thursday,10,5.1 +Saturday,8,5.5 +Saturday,21,3.8 +Friday,20,4.4 +Saturday,19,2.0 +Wednesday,17,23.9 +Tuesday,6,12.0 +Wednesday,0,10.7 +Sunday,3,9.5 +Tuesday,8,13.5 +Saturday,18,5.9 +Saturday,18,10.3 +Monday,10,26.1 +Saturday,8,8.0 +Sunday,13,6.6 +Wednesday,7,11.1 +Wednesday,19,2.4 +Sunday,20,5.1 +Tuesday,18,5.0 +Friday,22,18.4 +Wednesday,17,8.6 +Monday,8,3.2 +Friday,11,25.1 +Tuesday,10,17.9 +Wednesday,13,7.7 +Wednesday,16,2.1 +Friday,9,10.6 +Friday,12,26.2 +Monday,18,12.4 +Monday,18,9.0 +Sunday,18,6.9 +Monday,1,12.5 +Wednesday,15,12.2 +Wednesday,10,33.0 +Sunday,10,3.5 +Wednesday,2,13.7 +Friday,12,1.3 +Wednesday,8,28.2 +Sunday,9,4.4 +Saturday,18,0.3 +Thursday,10,9.5 +Tuesday,12,9.8 +Thursday,19,10.3 +Friday,4,15.2 +Sunday,7,5.8 +Thursday,13,5.7 +Wednesday,5,2.5 +Friday,7,4.2 +Wednesday,17,4.4 +Thursday,17,15.4 +Tuesday,14,3.3 +Friday,19,7.5 +Sunday,12,36.6 +Saturday,12,2.9 +Thursday,15,16.0 +Tuesday,15,14.2 +Sunday,12,14.5 +Wednesday,10,13.2 +Sunday,19,3.2 +Monday,19,11.1 +Wednesday,10,15.5 +Wednesday,22,19.7 +Sunday,18,13.1 +Thursday,9,6.0 +Sunday,16,2.7 +Friday,11,9.9 +Saturday,20,1.6 +Friday,12,15.8 +Saturday,13,11.9 +Wednesday,19,1.2 +Saturday,11,17.3 +Sunday,18,16.0 +Friday,14,8.5 +Saturday,10,6.9 +Tuesday,20,2.5 +Monday,19,18.2 +Sunday,23,2.7 +Saturday,7,1.7 +Sunday,12,19.0 +Sunday,10,9.5 +Sunday,7,2.9 +Monday,13,18.4 +Monday,8,4.0 +Wednesday,9,7.3 +Saturday,19,4.8 +Thursday,12,15.4 +Monday,11,32.9 +Friday,17,6.9 +Wednesday,7,4.3 +Monday,13,20.2 +Sunday,19,7.4 +Sunday,16,14.0 +Tuesday,9,11.4 +Sunday,17,13.3 +Friday,10,19.2 +Saturday,18,11.7 +Monday,18,4.8 +Thursday,8,9.1 +Wednesday,8,0.6 +Wednesday,8,4.7 +Wednesday,18,8.3 +Friday,19,10.7 +Sunday,12,22.4 +Friday,14,14.8 +Thursday,5,29.6 +Wednesday,15,8.5 +Thursday,9,11.8 +Monday,18,0.9 +Monday,11,10.2 +Sunday,8,3.8 +Thursday,13,18.6 +Sunday,14,17.2 +Saturday,16,10.8 +Saturday,7,5.3 +Wednesday,15,3.8 +Tuesday,11,16.4 +Tuesday,15,12.5 +Thursday,14,7.3 +Friday,16,26.1 +Sunday,7,8.1 +Monday,10,15.7 +Saturday,18,16.4 +Thursday,0,12.1 +Tuesday,0,5.2 +Thursday,7,6.8 +Thursday,13,10.7 +Tuesday,10,16.3 +Thursday,22,5.6 +Friday,16,9.2 +Wednesday,9,3.4 +Wednesday,19,0.5 +Thursday,14,3.0 +Saturday,23,10.7 +Friday,19,9.3 +Friday,2,16.7 +Sunday,16,8.0 +Sunday,22,9.0 +Friday,21,21.5 +Friday,7,8.3 +Tuesday,20,7.3 +Tuesday,8,9.9 +Sunday,4,31.4 +Friday,2,16.6 +Thursday,11,25.6 +Wednesday,9,27.3 +Sunday,20,3.4 +Sunday,15,2.2 +Saturday,3,8.9 +Tuesday,12,28.2 +Saturday,7,5.9 +Sunday,19,5.1 +Thursday,7,7.8 +Thursday,19,9.0 +Sunday,7,13.7 +Saturday,11,7.8 +Friday,11,25.7 +Saturday,18,9.5 +Thursday,18,5.3 +Thursday,9,4.1 +Saturday,11,5.1 +Sunday,3,21.9 +Wednesday,13,10.8 +Wednesday,4,11.6 +Wednesday,2,3.6 +Thursday,13,11.6 +Thursday,4,12.3 +Friday,12,18.7 +Wednesday,11,5.7 +Friday,10,15.8 +Friday,15,5.2 +Thursday,17,1.4 +Friday,12,9.9 +Friday,0,19.3 +Tuesday,16,5.5 +Monday,3,27.6 +Tuesday,13,5.4 +Thursday,12,10.6 +Monday,10,4.9 +Thursday,22,5.1 +Saturday,4,18.2 +Sunday,8,5.2 +Wednesday,0,10.4 +Sunday,9,5.3 +Wednesday,12,38.3 +Thursday,12,21.1 +Thursday,16,6.8 +Monday,19,6.2 +Wednesday,0,11.0 +Tuesday,10,25.6 +Monday,16,13.9 +Tuesday,3,17.0 +Monday,2,8.7 +Monday,12,13.4 +Saturday,8,2.3 +Tuesday,14,18.4 +Friday,13,13.2 +Monday,0,11.6 +Tuesday,15,23.2 +Sunday,18,7.7 +Friday,8,10.7 +Sunday,17,24.8 +Wednesday,16,18.1 +Friday,15,37.2 +Tuesday,19,8.6 +Wednesday,9,8.1 +Sunday,15,11.8 +Friday,20,2.9 +Thursday,18,7.7 +Thursday,9,13.4 +Sunday,20,7.1 +Sunday,8,7.6 +Tuesday,19,2.0 +Friday,1,23.2 +Tuesday,16,21.2 +Wednesday,11,7.7 +Friday,12,32.0 +Saturday,8,7.3 +Monday,11,11.3 +Monday,18,6.5 +Friday,14,5.4 +Wednesday,12,5.5 +Wednesday,13,8.0 +Sunday,15,3.9 +Wednesday,18,3.6 +Monday,13,17.1 +Saturday,13,7.1 +Wednesday,19,11.1 +Wednesday,21,7.5 +Wednesday,11,16.4 +Tuesday,15,23.2 +Friday,16,5.9 +Tuesday,16,7.3 +Friday,12,5.3 +Monday,13,16.3 +Tuesday,8,5.8 +Thursday,14,31.7 +Thursday,12,8.0 +Sunday,10,5.9 +Saturday,16,14.5 +Thursday,3,5.6 +Saturday,19,2.3 +Sunday,20,2.7 +Friday,11,42.4 +Thursday,9,15.9 +Thursday,8,10.2 +Wednesday,5,33.3 +Thursday,7,7.2 +Saturday,9,9.1 +Sunday,17,4.5 +Sunday,11,1.1 +Saturday,8,10.5 +Wednesday,16,8.7 +Saturday,21,33.7 +Tuesday,19,15.2 +Friday,15,4.6 +Friday,15,7.7 +Friday,8,8.0 +Wednesday,22,8.6 +Wednesday,15,28.9 +Sunday,22,24.8 +Thursday,16,10.9 +Wednesday,11,13.2 +Thursday,10,1.3 +Sunday,16,9.8 +Tuesday,15,7.2 +Saturday,19,17.7 +Sunday,12,8.6 +Tuesday,20,6.9 +Saturday,11,23.6 +Friday,8,20.3 +Sunday,11,2.1 +Monday,20,6.8 +Thursday,13,3.7 +Saturday,15,10.7 +Sunday,21,11.2 +Monday,7,1.3 +Sunday,11,2.9 +Monday,9,15.9 +Monday,21,10.7 +Saturday,11,8.1 +Friday,19,7.8 +Saturday,11,12.4 +Wednesday,8,0.5 +Thursday,21,5.1 +Sunday,3,3.6 +Saturday,14,13.1 +Monday,20,12.3 +Wednesday,8,9.9 +Monday,10,12.6 +Thursday,16,4.9 +Saturday,14,1.6 +Wednesday,14,12.7 +Sunday,12,10.5 +Tuesday,23,6.0 +Wednesday,9,11.3 +Saturday,7,14.0 +Wednesday,12,6.5 +Friday,14,3.8 +Sunday,10,7.6 +Monday,8,6.0 +Tuesday,13,3.5 +Monday,3,2.4 +Wednesday,1,11.4 +Wednesday,9,3.7 +Monday,15,16.4 +Wednesday,18,12.6 +Monday,23,14.6 +Sunday,11,9.1 +Sunday,3,17.3 +Tuesday,17,17.6 +Thursday,12,18.9 +Friday,14,34.9 +Friday,1,13.7 +Monday,9,19.3 +Sunday,15,5.4 +Saturday,17,12.4 +Saturday,20,4.7 +Monday,5,29.8 +Friday,4,13.3 +Monday,11,14.4 +Wednesday,8,10.4 +Friday,7,1.3 +Monday,3,12.5 +Monday,11,10.2 +Monday,18,16.3 +Wednesday,19,2.5 +Saturday,6,11.4 +Friday,10,6.1 +Thursday,8,7.0 +Sunday,14,4.6 +Wednesday,15,8.6 +Wednesday,11,13.0 +Saturday,8,1.3 +Sunday,9,3.4 +Monday,8,16.9 +Monday,17,17.1 +Thursday,14,11.2 +Friday,7,3.5 +Sunday,14,10.9 +Sunday,19,6.1 +Saturday,15,5.0 +Sunday,15,23.7 +Saturday,13,5.7 +Friday,10,7.3 +Tuesday,7,0.7 +Thursday,9,10.7 +Tuesday,11,11.6 +Wednesday,8,3.7 +Friday,17,35.1 +Sunday,13,6.4 +Saturday,18,0.9 +Thursday,18,3.3 +Wednesday,13,22.8 +Thursday,23,18.0 +Saturday,13,1.9 +Monday,5,20.8 +Thursday,17,20.5 +Sunday,7,7.9 +Saturday,19,5.7 +Sunday,17,8.4 +Friday,7,3.3 +Saturday,12,4.1 +Tuesday,10,14.6 +Thursday,14,16.2 +Thursday,5,6.2 +Thursday,20,6.1 +Wednesday,8,9.0 +Saturday,12,15.9 +Monday,19,3.5 +Sunday,9,6.7 +Sunday,8,7.0 +Tuesday,9,23.7 +Monday,13,15.0 +Thursday,8,5.6 +Saturday,15,5.2 +Wednesday,7,6.4 +Sunday,18,5.8 +Friday,20,1.1 +Tuesday,18,4.8 +Friday,12,15.2 +Monday,13,13.8 +Friday,20,13.2 +Thursday,8,6.1 +Sunday,1,5.8 +Saturday,17,3.3 +Wednesday,9,15.1 +Wednesday,7,4.2 +Friday,16,15.2 +Wednesday,16,9.1 +Monday,12,16.7 +Thursday,1,25.2 +Thursday,17,6.9 +Friday,12,10.2 +Saturday,19,3.2 +Wednesday,12,13.4 +Tuesday,19,12.4 +Wednesday,15,9.9 +Saturday,8,1.6 +Monday,13,1.2 +Thursday,10,6.7 +Wednesday,15,3.1 +Sunday,15,11.4 +Thursday,16,9.6 +Sunday,12,14.4 +Friday,17,3.0 +Wednesday,23,4.2 +Wednesday,14,23.6 +Thursday,11,14.2 +Saturday,14,6.4 +Saturday,4,11.8 +Sunday,7,1.5 +Wednesday,8,1.7 +Thursday,18,2.7 +Friday,17,4.0 +Wednesday,18,11.3 +Saturday,8,4.2 +Saturday,14,10.3 +Sunday,12,8.2 +Monday,7,1.1 +Monday,11,17.8 +Sunday,10,1.3 +Friday,19,3.7 +Thursday,8,20.8 +Sunday,4,33.7 +Friday,10,14.8 +Friday,20,0.3 +Monday,7,14.5 +Thursday,9,3.0 +Monday,18,22.1 +Sunday,18,5.4 +Friday,16,15.8 +Tuesday,12,56.8 +Thursday,4,10.1 +Wednesday,11,23.2 +Saturday,11,3.7 +Saturday,18,8.3 +Saturday,11,15.6 +Friday,20,15.4 +Tuesday,7,1.6 +Sunday,20,7.7 +Saturday,19,2.1 +Thursday,20,8.0 +Tuesday,8,6.3 +Friday,18,6.4 +Friday,19,7.8 +Sunday,9,11.0 +Thursday,12,30.6 +Wednesday,11,23.4 +Thursday,10,37.5 +Saturday,9,9.1 +Sunday,13,22.4 +Wednesday,14,9.9 +Tuesday,15,13.2 +Friday,16,4.0 +Tuesday,7,1.7 +Wednesday,9,1.3 +Sunday,2,14.7 +Friday,19,10.7 +Wednesday,7,12.8 +Tuesday,15,27.3 +Monday,9,23.1 +Wednesday,13,13.0 +Sunday,17,17.5 +Monday,13,27.4 +Monday,10,0.9 +Saturday,10,4.3 +Thursday,23,9.4 +Monday,10,28.8 +Saturday,21,28.5 +Thursday,8,3.2 +Friday,10,3.2 +Thursday,17,5.9 +Saturday,12,20.9 +Sunday,19,8.9 +Monday,14,18.6 +Saturday,12,17.8 +Monday,23,23.0 +Wednesday,18,4.7 +Sunday,17,19.9 +Saturday,13,7.9 +Tuesday,17,15.5 +Friday,12,3.7 +Sunday,12,29.1 +Wednesday,13,22.0 +Wednesday,16,22.3 +Wednesday,13,8.7 +Sunday,7,33.9 +Tuesday,8,4.1 +Friday,2,6.7 +Tuesday,19,26.1 +Sunday,4,4.7 +Saturday,18,3.0 +Monday,20,5.6 +Wednesday,9,7.0 +Saturday,16,10.7 +Saturday,7,8.0 +Tuesday,4,4.6 +Tuesday,5,4.5 +Thursday,8,6.0 +Monday,15,7.0 +Friday,16,27.7 +Thursday,12,4.7 +Wednesday,17,7.0 +Sunday,14,42.2 +Tuesday,21,6.7 +Monday,8,14.3 +Saturday,12,5.5 +Monday,7,8.3 +Friday,10,18.8 +Friday,0,22.8 +Friday,12,24.8 +Friday,9,21.9 +Tuesday,4,5.0 +Wednesday,13,20.6 +Thursday,16,14.4 +Monday,18,7.0 +Wednesday,12,22.8 +Thursday,8,3.2 +Saturday,7,5.3 +Thursday,11,1.2 +Wednesday,7,12.3 +Monday,4,18.9 +Tuesday,9,12.0 +Friday,20,5.5 +Wednesday,20,1.1 +Friday,16,5.5 +Tuesday,16,28.7 +Saturday,12,8.7 +Monday,17,5.4 +Tuesday,15,11.7 +Friday,8,7.5 +Wednesday,20,2.5 +Thursday,19,1.6 +Sunday,10,5.9 +Monday,20,6.6 +Wednesday,19,7.4 +Monday,12,8.8 +Wednesday,13,8.3 +Wednesday,20,5.2 +Sunday,13,5.0 +Saturday,19,5.9 +Friday,3,11.2 +Monday,9,7.5 +Tuesday,10,23.0 +Tuesday,22,25.9 +Sunday,9,1.6 +Friday,10,8.0 +Friday,8,11.0 +Thursday,18,5.1 +Monday,9,5.1 +Friday,16,6.6 +Wednesday,15,27.7 +Wednesday,15,3.7 +Wednesday,10,37.0 +Sunday,11,3.5 +Thursday,18,9.7 +Sunday,14,9.7 +Sunday,5,4.4 +Sunday,17,9.5 +Wednesday,14,5.1 +Saturday,10,10.4 +Wednesday,15,9.9 +Thursday,9,8.6 +Friday,8,5.0 +Sunday,20,3.2 +Tuesday,20,7.8 +Wednesday,18,6.2 +Tuesday,12,25.9 +Monday,10,27.9 +Friday,9,9.1 +Friday,6,6.0 +Sunday,9,12.2 +Sunday,5,18.6 +Monday,8,7.3 +Monday,8,13.1 +Saturday,18,3.0 +Tuesday,10,18.5 +Monday,16,12.1 +Thursday,18,0.7 +Thursday,12,6.2 +Monday,11,20.4 +Tuesday,8,6.6 +Saturday,0,11.9 +Thursday,17,4.0 +Tuesday,14,16.5 +Tuesday,18,6.2 +Friday,16,6.0 +Sunday,11,2.4 +Saturday,14,9.7 +Friday,11,27.9 +Friday,8,3.5 +Tuesday,9,10.2 +Tuesday,16,10.3 +Saturday,13,13.4 +Tuesday,18,10.8 +Wednesday,20,10.9 +Tuesday,18,4.8 +Friday,7,2.2 +Saturday,10,16.2 +Friday,13,9.0 +Sunday,9,7.9 +Thursday,16,10.1 +Saturday,16,3.7 +Thursday,7,16.2 +Monday,10,7.8 +Tuesday,18,13.7 +Sunday,18,2.6 +Saturday,20,6.1 +Sunday,9,23.2 +Thursday,16,12.5 +Friday,15,7.1 +Sunday,17,15.1 +Saturday,12,10.3 +Tuesday,15,2.6 +Friday,0,16.7 +Monday,20,2.3 +Saturday,10,15.9 +Monday,13,21.9 +Thursday,8,3.1 +Tuesday,8,2.4 +Saturday,7,9.5 +Thursday,9,13.1 +Tuesday,14,8.6 +Monday,9,8.7 +Monday,13,3.0 +Wednesday,13,8.2 +Wednesday,19,8.1 +Sunday,9,25.4 +Friday,19,8.5 +Friday,17,15.5 +Friday,15,21.8 +Friday,19,2.1 +Wednesday,14,12.6 +Thursday,18,5.4 +Sunday,9,5.1 +Thursday,11,14.4 +Monday,4,12.4 +Wednesday,8,6.8 +Tuesday,7,3.5 +Saturday,8,19.7 +Friday,9,17.6 +Tuesday,12,20.5 +Monday,8,3.3 +Saturday,12,6.0 +Saturday,5,19.7 +Tuesday,9,16.6 +Thursday,9,19.3 +Thursday,14,16.5 +Friday,18,2.1 +Friday,10,6.1 +Monday,19,3.9 +Friday,9,18.1 +Saturday,18,8.7 +Tuesday,15,6.4 +Thursday,10,12.6 +Thursday,19,2.3 +Wednesday,18,9.5 +Friday,20,5.8 +Thursday,9,4.4 +Saturday,18,2.8 +Friday,13,8.7 +Sunday,16,8.0 +Wednesday,13,20.2 +Sunday,10,22.4 +Sunday,3,11.0 +Saturday,15,9.9 +Thursday,11,17.4 +Thursday,20,4.3 +Monday,14,32.1 +Thursday,20,6.8 +Sunday,15,16.0 +Thursday,10,10.6 +Sunday,8,7.9 +Sunday,16,6.3 +Sunday,18,1.0 +Wednesday,5,9.5 +Tuesday,14,8.4 +Friday,11,25.9 +Sunday,14,26.5 +Thursday,16,4.5 +Friday,17,3.6 +Thursday,16,12.5 +Sunday,15,15.0 +Thursday,8,11.0 +Friday,14,67.5 +Wednesday,23,24.0 +Friday,16,7.7 +Saturday,13,10.1 +Thursday,17,5.9 +Tuesday,23,28.1 +Friday,11,15.2 +Tuesday,11,9.5 +Monday,3,9.2 +Sunday,20,1.6 +Wednesday,18,12.1 +Sunday,15,16.4 +Friday,14,24.7 +Monday,16,6.9 +Sunday,14,6.7 +Saturday,7,1.6 +Sunday,10,0.9 +Thursday,16,11.6 +Friday,14,31.1 +Sunday,10,8.4 +Friday,19,3.2 +Friday,14,17.7 +Monday,13,1.4 +Wednesday,9,20.9 +Sunday,20,2.7 +Tuesday,9,8.3 +Wednesday,10,3.9 +Thursday,9,5.6 +Friday,20,1.5 +Monday,10,75.2 +Friday,15,24.2 +Monday,12,9.9 +Monday,9,17.2 +Saturday,7,1.8 +Tuesday,19,19.5 +Tuesday,12,6.2 +Saturday,17,0.3 +Saturday,16,8.7 +Friday,16,7.2 +Wednesday,14,44.3 +Wednesday,14,5.7 +Thursday,7,2.3 +Saturday,13,3.9 +Sunday,9,11.4 +Thursday,19,6.8 +Wednesday,14,25.5 +Wednesday,13,8.3 +Wednesday,20,6.0 +Saturday,15,14.1 +Tuesday,5,11.8 +Wednesday,10,7.9 +Wednesday,8,1.2 +Tuesday,19,0.8 +Tuesday,18,6.6 +Wednesday,20,1.0 +Saturday,12,10.3 +Sunday,7,2.6 +Thursday,11,8.1 +Saturday,19,13.0 +Thursday,12,13.6 +Saturday,13,2.6 +Saturday,8,10.3 +Thursday,13,29.3 +Wednesday,4,4.5 +Sunday,12,3.5 +Tuesday,13,9.4 +Saturday,10,11.3 +Tuesday,1,2.4 +Tuesday,13,12.1 +Monday,8,2.0 +Saturday,11,5.9 +Wednesday,16,5.7 +Friday,20,8.0 +Monday,20,3.2 +Monday,7,5.0 +Sunday,17,5.4 +Wednesday,9,8.6 +Friday,19,8.3 +Sunday,12,22.5 +Monday,9,8.5 +Friday,7,6.4 +Tuesday,14,23.3 +Wednesday,13,24.9 +Saturday,18,5.8 +Friday,12,18.7 +Thursday,7,1.2 +Saturday,0,12.8 +Tuesday,10,3.4 +Thursday,7,11.5 +Friday,18,11.1 +Saturday,4,10.7 +Monday,22,27.7 +Wednesday,0,7.4 +Friday,18,2.8 +Wednesday,14,21.0 +Friday,17,0.9 +Tuesday,20,4.2 +Sunday,17,0.7 +Sunday,11,14.9 +Sunday,16,7.0 +Monday,16,3.9 +Wednesday,21,14.4 +Tuesday,4,9.4 +Tuesday,15,2.6 +Saturday,10,13.5 +Saturday,14,18.4 +Tuesday,10,1.6 +Friday,12,16.0 +Saturday,18,7.4 +Sunday,16,12.8 +Monday,15,30.1 +Wednesday,3,8.2 +Thursday,21,7.5 +Thursday,22,0.4 +Wednesday,20,4.8 +Sunday,2,7.6 +Tuesday,0,8.8 +Thursday,18,11.3 +Thursday,8,10.3 +Monday,8,2.5 +Monday,11,9.1 +Monday,19,7.7 +Wednesday,6,11.0 +Saturday,15,3.6 +Wednesday,11,23.7 +Saturday,18,5.8 +Tuesday,8,1.6 +Monday,15,3.6 +Wednesday,19,2.2 +Thursday,8,17.1 +Wednesday,14,11.7 +Friday,19,1.9 +Wednesday,12,11.8 +Wednesday,4,27.6 +Monday,12,23.0 +Tuesday,7,3.0 +Wednesday,5,28.9 +Tuesday,16,19.9 +Thursday,10,4.2 +Thursday,11,7.4 +Saturday,16,13.1 +Friday,12,6.1 +Thursday,11,18.9 +Wednesday,13,8.4 +Wednesday,7,3.8 +Friday,16,16.4 +Wednesday,9,26.5 +Friday,3,24.5 +Sunday,10,7.9 +Tuesday,12,9.6 +Wednesday,16,15.3 +Saturday,7,4.9 +Saturday,14,9.6 +Thursday,14,5.4 +Monday,9,15.1 +Tuesday,5,10.5 +Thursday,13,31.6 +Thursday,19,5.2 +Tuesday,18,13.0 +Sunday,18,11.6 +Tuesday,15,9.1 +Friday,3,6.6 +Saturday,23,5.1 +Friday,5,22.5 +Monday,19,6.8 +Tuesday,19,0.6 +Monday,10,9.8 +Sunday,15,18.1 +Sunday,20,6.2 +Tuesday,7,6.3 +Wednesday,1,7.0 +Monday,8,22.3 +Sunday,17,13.9 +Monday,20,10.6 +Thursday,15,2.7 +Wednesday,8,4.4 +Sunday,15,13.4 +Sunday,8,2.4 +Wednesday,4,3.2 +Saturday,2,3.2 +Thursday,16,6.1 +Saturday,7,3.9 +Wednesday,5,26.5 +Monday,7,2.1 +Saturday,20,6.4 +Wednesday,16,20.7 +Wednesday,23,22.9 +Wednesday,20,4.1 +Friday,10,10.6 +Wednesday,2,28.5 +Thursday,11,43.3 +Monday,18,3.8 +Wednesday,11,33.0 +Sunday,17,5.4 +Saturday,20,2.3 +Tuesday,14,10.2 +Friday,13,3.1 +Wednesday,18,16.8 +Monday,3,14.1 +Saturday,14,7.3 +Wednesday,12,21.1 +Tuesday,16,9.0 +Friday,12,54.7 +Friday,18,11.6 +Saturday,8,2.4 +Tuesday,19,2.6 +Saturday,13,5.3 +Tuesday,20,3.3 +Saturday,13,2.2 +Wednesday,9,18.2 +Wednesday,16,46.0 +Thursday,12,27.1 +Saturday,9,7.9 +Friday,20,3.2 +Friday,20,10.7 +Wednesday,9,4.8 +Saturday,11,15.5 +Thursday,14,6.9 +Thursday,9,34.9 +Wednesday,16,6.2 +Thursday,10,12.3 +Thursday,12,14.9 +Thursday,3,5.3 +Tuesday,14,19.1 +Saturday,22,15.4 +Monday,8,3.6 +Tuesday,10,19.8 +Wednesday,19,11.3 +Friday,12,10.6 +Monday,19,7.8 +Thursday,17,6.4 +Tuesday,17,16.9 +Friday,10,3.7 +Sunday,2,4.0 +Friday,7,2.4 +Wednesday,13,9.9 +Thursday,12,2.5 +Tuesday,4,15.5 +Saturday,19,8.8 +Thursday,19,10.8 +Friday,17,3.9 +Monday,12,17.4 +Monday,20,2.4 +Thursday,10,15.0 +Wednesday,7,4.6 +Wednesday,7,12.0 +Sunday,1,3.3 +Friday,15,7.5 +Sunday,23,18.2 +Friday,13,19.2 +Monday,10,12.3 +Wednesday,7,5.7 +Wednesday,9,14.3 +Wednesday,14,27.7 +Saturday,16,2.6 +Wednesday,9,2.1 +Monday,5,13.9 +Friday,12,7.6 +Monday,9,1.9 +Wednesday,14,44.6 +Wednesday,7,29.3 +Thursday,6,24.2 +Tuesday,15,3.3 +Saturday,7,13.6 +Thursday,20,3.1 +Saturday,18,8.9 +Saturday,14,4.2 +Monday,12,15.8 +Wednesday,10,1.0 +Thursday,8,7.6 +Tuesday,15,20.9 +Saturday,17,9.8 +Tuesday,18,3.8 +Wednesday,7,11.7 +Tuesday,3,21.4 +Tuesday,19,1.5 +Saturday,18,5.5 +Monday,20,1.2 +Thursday,10,4.7 +Tuesday,3,22.4 +Tuesday,22,12.2 +Monday,15,2.7 +Wednesday,20,6.2 +Wednesday,17,7.3 +Saturday,19,3.5 +Sunday,6,7.2 +Thursday,15,26.8 +Tuesday,18,3.3 +Thursday,8,10.6 +Friday,12,31.5 +Monday,4,16.2 +Wednesday,7,5.0 +Wednesday,5,0.2 +Saturday,19,5.4 +Monday,9,11.9 +Wednesday,19,2.5 +Wednesday,13,17.4 +Thursday,9,17.8 +Tuesday,20,1.1 +Tuesday,13,36.3 +Monday,12,36.0 +Friday,19,15.4 +Friday,8,11.4 +Thursday,14,6.6 +Wednesday,7,5.6 +Thursday,10,18.1 +Tuesday,15,8.9 +Monday,14,23.7 +Wednesday,13,6.2 +Friday,16,14.4 +Tuesday,8,3.3 +Wednesday,6,11.0 +Saturday,9,13.4 +Saturday,11,22.6 +Friday,21,15.5 +Saturday,13,19.3 +Monday,9,29.0 +Sunday,14,3.4 +Monday,14,10.3 +Monday,11,5.9 +Wednesday,11,71.5 +Sunday,9,3.1 +Thursday,9,11.2 +Saturday,8,4.4 +Monday,9,11.6 +Wednesday,8,1.3 +Tuesday,15,4.3 +Saturday,10,11.3 +Friday,11,34.6 +Wednesday,8,9.8 +Friday,9,11.6 +Tuesday,18,12.0 +Tuesday,8,12.1 +Thursday,16,15.3 +Thursday,20,10.3 +Saturday,13,6.6 +Tuesday,19,9.7 +Wednesday,8,17.5 +Saturday,11,4.2 +Wednesday,13,11.6 +Monday,14,13.6 +Wednesday,14,11.1 +Wednesday,9,5.8 +Saturday,16,4.8 +Friday,9,2.7 +Friday,11,22.8 +Saturday,19,4.7 +Sunday,14,9.3 +Monday,17,26.1 +Sunday,16,4.8 +Tuesday,18,3.6 +Saturday,9,2.7 +Thursday,20,10.0 +Saturday,11,14.0 +Sunday,4,35.2 +Friday,20,4.1 +Friday,10,39.4 +Tuesday,11,37.6 +Thursday,9,1.6 +Saturday,20,4.8 +Wednesday,20,4.7 +Monday,4,14.6 +Tuesday,12,7.4 +Friday,21,25.1 +Wednesday,20,16.8 +Saturday,18,2.3 +Wednesday,20,9.4 +Wednesday,5,11.4 +Monday,17,2.2 +Wednesday,15,10.9 +Friday,10,11.7 +Tuesday,14,20.4 +Thursday,18,6.7 +Saturday,13,16.6 +Wednesday,20,1.8 +Wednesday,9,21.2 +Wednesday,19,10.7 +Tuesday,14,22.4 +Tuesday,9,2.9 +Friday,11,1.7 +Monday,20,2.2 +Wednesday,17,7.2 +Thursday,20,1.5 +Saturday,19,16.9 +Tuesday,15,10.9 +Wednesday,18,8.2 +Thursday,22,15.7 +Tuesday,2,2.1 +Friday,17,20.0 +Thursday,16,18.0 +Thursday,11,4.3 +Wednesday,19,2.3 +Tuesday,6,19.5 +Wednesday,18,3.8 +Tuesday,14,11.9 +Friday,23,10.4 +Sunday,12,9.0 +Monday,15,6.7 +Friday,12,3.4 +Tuesday,1,4.5 +Monday,16,3.9 +Monday,9,20.6 +Thursday,13,21.8 +Saturday,18,10.9 +Saturday,20,4.4 +Tuesday,17,13.8 +Saturday,17,7.2 +Saturday,14,1.0 +Monday,18,3.8 +Sunday,19,7.3 +Sunday,9,2.2 +Thursday,16,14.6 +Wednesday,20,16.6 +Wednesday,1,15.2 +Tuesday,17,1.4 +Saturday,11,6.0 +Wednesday,16,11.8 +Thursday,0,8.6 +Wednesday,14,24.7 +Thursday,4,5.7 +Monday,9,12.5 +Monday,9,2.6 +Thursday,21,16.1 +Sunday,8,6.1 +Tuesday,17,1.5 +Monday,12,24.0 +Tuesday,9,0.1 +Sunday,7,3.0 +Sunday,8,4.0 +Tuesday,18,14.7 +Sunday,17,3.7 +Tuesday,19,4.3 +Friday,7,4.8 +Wednesday,18,9.9 +Thursday,17,3.5 +Saturday,17,1.7 +Wednesday,18,2.0 +Friday,20,11.2 +Sunday,2,2.7 +Friday,22,22.9 +Monday,14,20.5 +Wednesday,17,2.6 +Friday,17,17.8 +Wednesday,13,1.2 +Sunday,20,5.8 +Monday,9,1.7 +Sunday,15,23.5 +Thursday,2,5.8 +Tuesday,18,9.5 +Wednesday,11,3.4 +Thursday,17,13.2 +Saturday,10,11.6 +Friday,11,22.7 +Monday,9,18.4 +Monday,9,5.6 +Saturday,7,3.7 +Friday,6,16.1 +Monday,9,7.6 +Thursday,20,4.6 +Tuesday,17,1.8 +Saturday,16,5.8 +Wednesday,16,6.3 +Monday,20,1.8 +Wednesday,12,17.5 +Saturday,10,6.6 +Thursday,9,10.7 +Wednesday,10,23.9 +Thursday,8,7.4 +Monday,13,3.7 +Tuesday,20,1.1 +Tuesday,17,17.0 +Thursday,4,9.8 +Monday,23,10.6 +Sunday,20,2.9 +Wednesday,8,15.8 +Saturday,20,10.0 +Tuesday,6,38.6 +Wednesday,15,8.4 +Wednesday,6,12.5 +Wednesday,0,2.8 +Tuesday,10,14.8 +Monday,17,19.6 +Friday,20,11.1 +Friday,14,7.4 +Wednesday,19,2.6 +Tuesday,20,5.1 +Monday,9,8.8 +Saturday,19,9.2 +Sunday,11,19.6 +Saturday,4,11.6 +Friday,11,8.9 +Sunday,15,5.8 +Friday,9,11.4 +Tuesday,8,13.1 +Sunday,11,14.9 +Sunday,12,9.9 +Tuesday,16,3.3 +Monday,16,18.2 +Saturday,12,14.5 +Thursday,20,1.9 +Saturday,11,5.2 +Friday,19,11.8 +Tuesday,15,5.5 +Monday,13,9.8 +Saturday,16,3.0 +Wednesday,14,10.9 +Sunday,10,43.0 +Tuesday,15,28.6 +Sunday,19,4.0 +Monday,20,6.8 +Monday,12,20.3 +Thursday,12,4.3 +Tuesday,12,29.5 +Wednesday,20,2.6 +Saturday,2,7.8 +Monday,19,6.6 +Saturday,11,13.0 +Saturday,7,6.4 +Monday,9,14.3 +Sunday,3,4.7 +Tuesday,12,6.2 +Wednesday,10,9.2 +Saturday,13,11.1 +Thursday,16,11.5 +Friday,13,20.5 +Thursday,14,7.5 +Tuesday,9,16.5 +Monday,14,2.7 +Thursday,17,19.7 +Sunday,4,20.8 +Saturday,0,13.8 +Wednesday,0,18.1 +Friday,16,7.8 +Saturday,10,8.7 +Friday,18,8.1 +Saturday,22,10.1 +Friday,17,26.0 +Friday,12,9.8 +Sunday,11,13.5 +Sunday,17,8.4 +Thursday,17,2.4 +Wednesday,15,13.3 +Sunday,16,2.1 +Friday,1,39.2 +Wednesday,13,11.6 +Monday,11,6.9 +Thursday,18,9.3 +Saturday,17,7.7 +Tuesday,18,4.1 +Tuesday,14,5.1 +Thursday,14,14.8 +Wednesday,16,37.4 +Sunday,22,2.2 +Sunday,18,13.0 +Saturday,12,12.0 +Saturday,19,3.3 +Monday,11,15.7 +Friday,19,5.2 +Friday,13,12.1 +Wednesday,22,10.2 +Thursday,7,2.7 +Tuesday,19,9.8 +Wednesday,17,26.9 +Saturday,20,11.6 +Saturday,18,3.6 +Tuesday,10,23.4 +Sunday,11,15.6 +Saturday,17,13.5 +Monday,18,16.7 +Wednesday,15,8.8 +Friday,14,18.4 +Thursday,13,11.6 +Friday,13,6.5 +Wednesday,22,14.4 +Monday,16,2.8 +Tuesday,14,13.8 +Wednesday,7,5.9 +Thursday,8,2.5 +Monday,16,4.5 +Thursday,13,0.8 +Wednesday,9,12.0 +Monday,20,14.6 +Monday,21,20.1 +Monday,7,14.3 +Sunday,18,6.5 +Tuesday,8,13.8 +Monday,10,21.0 +Tuesday,8,9.1 +Monday,9,22.3 +Wednesday,15,16.3 +Friday,16,5.3 +Sunday,10,12.5 +Friday,1,12.1 +Wednesday,18,6.0 +Monday,11,27.6 +Thursday,7,3.5 +Wednesday,18,1.6 +Sunday,16,18.0 +Monday,20,5.3 +Saturday,3,16.5 +Sunday,17,6.7 +Friday,9,4.8 +Thursday,7,13.7 +Saturday,7,1.7 +Wednesday,16,26.6 +Thursday,16,17.4 +Wednesday,19,16.7 +Wednesday,22,16.8 +Monday,21,15.6 +Thursday,15,12.6 +Thursday,16,12.4 +Monday,10,19.1 +Monday,13,7.3 +Sunday,19,6.3 +Saturday,10,26.0 +Saturday,6,21.5 +Tuesday,9,3.9 +Monday,17,14.1 +Saturday,14,10.5 +Wednesday,12,11.2 +Friday,18,7.5 +Thursday,15,26.0 +Tuesday,13,4.5 +Sunday,9,12.9 +Wednesday,2,32.1 +Saturday,8,10.9 +Sunday,9,0.8 +Saturday,19,5.8 +Monday,14,8.8 +Monday,14,35.1 +Friday,9,6.1 +Wednesday,15,13.6 +Wednesday,11,6.1 +Sunday,9,13.2 +Tuesday,12,6.0 +Friday,1,30.4 +Friday,14,6.0 +Tuesday,15,17.1 +Wednesday,19,6.3 +Wednesday,18,3.1 +Tuesday,10,11.0 +Thursday,16,7.8 +Thursday,10,24.5 +Monday,15,17.4 +Sunday,19,2.1 +Friday,20,5.2 +Thursday,20,5.6 +Saturday,16,11.0 +Monday,9,3.9 +Thursday,18,6.7 +Monday,15,15.0 +Saturday,18,4.9 +Saturday,14,3.3 +Wednesday,20,4.0 +Wednesday,7,10.3 +Wednesday,17,13.1 +Wednesday,12,21.4 +Saturday,12,11.9 +Wednesday,12,14.4 +Thursday,14,10.0 +Friday,9,9.6 +Friday,9,15.3 +Saturday,18,6.9 +Sunday,7,0.4 +Friday,18,0.7 +Saturday,17,8.2 +Sunday,11,9.5 +Tuesday,8,15.0 +Sunday,11,15.4 +Sunday,14,4.2 +Saturday,12,4.3 +Wednesday,15,7.5 +Friday,14,13.2 +Thursday,17,7.0 +Wednesday,14,9.2 +Thursday,11,7.6 +Friday,15,14.0 +Tuesday,17,3.8 +Wednesday,7,13.7 +Tuesday,19,2.4 +Tuesday,11,24.1 +Tuesday,18,3.6 +Tuesday,10,42.7 +Friday,7,7.9 +Tuesday,12,16.3 +Friday,15,17.3 +Wednesday,10,9.6 +Tuesday,16,6.1 +Friday,12,12.8 +Monday,10,56.6 +Thursday,19,2.4 +Friday,23,1.4 +Monday,20,14.8 +Saturday,18,19.2 +Monday,7,7.5 +Wednesday,9,1.4 +Saturday,15,6.7 +Saturday,19,5.6 +Saturday,11,6.6 +Saturday,19,1.8 +Monday,10,14.7 +Monday,8,12.8 +Friday,11,6.4 +Monday,18,5.3 +Thursday,12,40.1 +Sunday,9,14.2 +Friday,7,15.2 +Tuesday,11,6.1 +Wednesday,16,0.6 +Tuesday,20,1.2 +Monday,8,7.9 +Wednesday,11,21.0 +Thursday,19,3.3 +Tuesday,0,11.1 +Wednesday,13,3.4 +Wednesday,15,2.5 +Friday,15,14.7 +Friday,8,10.1 +Thursday,12,1.9 +Monday,5,14.8 +Monday,7,16.1 +Thursday,2,10.9 +Wednesday,15,18.4 +Sunday,11,7.7 +Sunday,16,5.8 +Tuesday,19,4.6 +Tuesday,11,9.1 +Saturday,11,1.5 +Thursday,9,8.9 +Saturday,9,8.7 +Thursday,8,4.4 +Friday,8,11.3 +Friday,13,20.3 +Thursday,7,10.8 +Sunday,20,7.1 +Saturday,4,10.1 +Saturday,13,16.9 +Thursday,8,8.4 +Tuesday,20,1.9 +Sunday,19,2.9 +Thursday,18,10.3 +Tuesday,11,15.8 +Wednesday,9,11.4 +Tuesday,12,19.2 +Sunday,16,7.3 +Friday,11,45.3 +Monday,11,30.5 +Sunday,11,17.4 +Friday,17,25.3 +Monday,10,35.4 +Wednesday,8,2.3 +Tuesday,10,5.2 +Saturday,17,25.7 +Wednesday,17,6.6 +Saturday,17,1.3 +Friday,5,20.0 +Friday,13,5.5 +Sunday,9,17.6 +Friday,1,20.5 +Thursday,17,8.7 +Friday,14,17.4 +Friday,17,4.0 +Monday,9,1.1 +Wednesday,12,14.5 +Wednesday,8,3.7 +Friday,12,13.7 +Wednesday,18,16.8 +Wednesday,8,10.8 +Wednesday,11,15.2 +Wednesday,9,17.8 +Wednesday,15,8.6 +Tuesday,8,20.2 +Thursday,7,2.4 +Sunday,17,6.7 +Sunday,20,8.4 +Saturday,11,13.2 +Thursday,18,5.3 +Saturday,10,15.9 +Thursday,9,11.3 +Wednesday,19,5.5 +Tuesday,22,28.4 +Wednesday,9,10.1 +Tuesday,18,12.8 +Tuesday,14,9.2 +Monday,14,6.6 +Sunday,19,11.1 +Friday,4,8.8 +Wednesday,13,17.5 +Thursday,8,7.4 +Saturday,13,9.3 +Tuesday,11,27.4 +Tuesday,12,24.2 +Tuesday,14,13.4 +Wednesday,11,59.4 +Sunday,19,5.4 +Thursday,13,42.3 +Sunday,10,16.8 +Friday,13,11.5 +Monday,9,11.8 +Wednesday,7,12.8 +Thursday,19,8.8 +Sunday,8,6.5 +Wednesday,11,15.8 +Friday,7,4.0 +Friday,14,4.1 +Saturday,21,1.7 +Tuesday,11,9.9 +Friday,20,7.6 +Sunday,19,7.9 +Thursday,19,4.4 +Saturday,16,1.5 +Saturday,11,21.3 +Friday,19,1.8 +Saturday,13,3.5 +Monday,12,18.7 +Monday,16,16.4 +Sunday,15,0.5 +Friday,13,12.3 +Monday,5,23.4 +Thursday,12,9.4 +Saturday,9,3.9 +Thursday,22,14.7 +Thursday,11,21.8 +Tuesday,8,23.4 +Wednesday,13,9.3 +Friday,22,20.1 +Saturday,10,7.8 +Wednesday,18,2.9 +Thursday,6,4.7 +Friday,15,13.6 +Tuesday,12,14.3 +Sunday,21,5.0 +Saturday,14,8.5 +Sunday,1,11.2 +Thursday,17,5.6 +Tuesday,18,2.0 +Friday,7,1.7 +Friday,4,10.1 +Sunday,17,10.6 +Tuesday,19,5.1 +Sunday,19,8.0 +Sunday,11,16.0 +Saturday,14,6.4 +Tuesday,8,9.6 +Sunday,11,19.9 +Wednesday,12,11.4 +Tuesday,8,15.3 +Wednesday,12,21.4 +Tuesday,12,52.9 +Monday,17,8.9 +Friday,8,4.7 +Sunday,20,12.3 +Wednesday,20,2.3 +Wednesday,8,4.0 +Friday,19,5.9 +Saturday,8,5.5 +Friday,16,10.4 +Monday,13,4.6 +Thursday,9,7.6 +Friday,7,2.3 +Friday,11,29.8 +Friday,17,10.2 +Saturday,12,17.5 +Friday,20,7.3 +Tuesday,9,6.3 +Sunday,18,6.0 +Monday,14,4.7 +Monday,18,5.2 +Wednesday,13,13.5 +Sunday,14,1.6 +Friday,18,6.8 +Tuesday,18,5.2 +Wednesday,9,10.5 +Thursday,15,17.6 +Tuesday,13,8.6 +Sunday,14,2.7 +Monday,14,13.5 +Saturday,22,11.5 +Monday,14,7.3 +Sunday,11,29.9 +Wednesday,2,6.2 +Saturday,14,6.7 +Sunday,2,13.1 +Friday,17,1.5 +Sunday,19,1.8 +Wednesday,10,21.8 +Thursday,7,4.7 +Tuesday,11,30.2 +Saturday,15,7.4 +Wednesday,6,18.0 +Monday,7,9.0 +Sunday,17,12.5 +Sunday,17,7.2 +Wednesday,19,11.4 +Tuesday,16,2.8 +Wednesday,8,15.2 +Sunday,18,1.9 +Monday,7,5.3 +Sunday,14,12.7 +Friday,9,3.2 +Thursday,10,8.0 +Tuesday,11,3.7 +Monday,11,7.8 +Sunday,9,4.5 +Sunday,15,23.9 +Wednesday,2,11.6 +Monday,14,20.2 +Thursday,12,31.3 +Monday,13,17.1 +Thursday,11,22.5 +Thursday,19,3.0 +Wednesday,20,20.9 +Thursday,18,7.5 +Saturday,9,4.3 +Saturday,17,2.7 +Saturday,15,2.3 +Tuesday,16,28.8 +Tuesday,13,7.5 +Monday,16,9.3 +Sunday,16,2.5 +Sunday,17,5.0 +Saturday,8,2.5 +Tuesday,19,8.6 +Sunday,16,3.7 +Friday,20,15.8 +Sunday,20,2.3 +Saturday,16,12.8 +Monday,12,6.3 +Monday,20,10.9 +Thursday,13,17.5 +Friday,20,12.6 +Friday,20,4.5 +Wednesday,22,6.3 +Monday,21,23.6 +Wednesday,17,6.6 +Tuesday,13,2.1 +Monday,1,1.0 +Monday,9,17.5 +Wednesday,12,13.1 +Tuesday,15,14.7 +Monday,18,10.2 +Saturday,20,0.9 +Tuesday,2,13.7 +Sunday,14,4.7 +Sunday,12,7.7 +Thursday,14,11.7 +Wednesday,10,11.9 +Thursday,11,46.1 +Saturday,18,3.1 +Thursday,0,5.6 +Wednesday,8,8.0 +Wednesday,13,10.0 +Friday,16,12.5 +Sunday,15,3.7 +Thursday,19,8.8 +Friday,2,8.8 +Wednesday,12,41.6 +Saturday,13,3.1 +Monday,20,6.7 +Friday,18,5.7 +Wednesday,3,25.9 +Sunday,7,3.5 +Tuesday,16,29.8 +Monday,22,10.6 +Thursday,20,2.8 +Sunday,15,10.0 +Thursday,23,23.1 +Tuesday,12,85.9 +Thursday,20,9.4 +Saturday,11,10.0 +Friday,13,8.3 +Sunday,8,7.0 +Tuesday,17,27.4 +Wednesday,23,17.6 +Saturday,20,16.5 +Saturday,2,20.8 +Wednesday,18,11.4 +Monday,8,16.2 +Saturday,8,1.3 +Tuesday,17,9.7 +Saturday,17,3.2 +Thursday,11,11.8 +Saturday,13,7.8 +Wednesday,8,5.9 +Tuesday,5,9.3 +Monday,4,16.2 +Monday,12,8.4 +Monday,10,22.9 +Monday,9,7.4 +Saturday,16,4.9 +Sunday,10,9.8 +Wednesday,21,5.2 +Tuesday,9,20.2 +Thursday,8,2.0 +Monday,18,15.3 +Sunday,12,8.9 +Saturday,7,7.8 +Wednesday,13,19.5 +Saturday,12,9.6 +Friday,10,8.0 +Monday,17,9.7 +Thursday,19,15.0 +Sunday,18,3.6 +Friday,7,13.4 +Saturday,16,14.2 +Wednesday,9,25.3 +Wednesday,19,23.0 +Sunday,16,10.2 +Wednesday,9,12.9 +Monday,7,2.9 +Tuesday,0,9.0 +Saturday,15,17.0 +Monday,16,7.0 +Sunday,10,17.9 +Monday,17,9.8 +Tuesday,6,10.3 +Wednesday,10,30.5 +Monday,17,2.4 +Sunday,17,4.7 +Sunday,8,8.4 +Saturday,7,2.9 +Friday,10,12.5 +Saturday,18,9.6 +Wednesday,9,16.8 +Sunday,17,11.4 +Wednesday,17,5.0 +Saturday,16,9.0 +Sunday,22,5.6 +Wednesday,9,26.2 +Saturday,11,6.0 +Sunday,7,4.0 +Sunday,19,7.7 +Tuesday,12,11.5 +Friday,14,10.1 +Monday,23,5.8 +Friday,15,4.5 +Wednesday,15,6.7 +Friday,13,13.9 +Monday,13,13.8 +Monday,13,18.4 +Thursday,19,5.3 +Monday,16,9.9 +Tuesday,12,24.3 +Monday,7,2.5 +Wednesday,4,6.8 +Monday,23,18.5 +Saturday,18,22.8 +Wednesday,14,2.2 +Thursday,7,3.6 +Saturday,19,7.4 +Sunday,17,5.2 +Wednesday,4,7.1 +Monday,21,7.9 +Wednesday,10,3.0 +Monday,20,7.8 +Saturday,8,1.3 +Wednesday,13,19.1 +Friday,9,8.7 +Tuesday,18,1.5 +Friday,20,2.1 +Monday,18,7.2 +Saturday,10,7.5 +Thursday,10,22.0 +Tuesday,15,3.5 +Wednesday,13,16.4 +Thursday,20,7.6 +Tuesday,14,10.2 +Thursday,8,5.1 +Friday,8,23.5 +Friday,17,12.9 +Sunday,17,6.4 +Tuesday,20,6.8 +Saturday,8,4.4 +Thursday,11,22.7 +Friday,7,4.2 +Wednesday,5,8.2 +Friday,12,2.8 +Tuesday,19,17.3 +Friday,13,28.8 +Friday,16,12.2 +Friday,10,19.0 +Friday,20,5.9 +Saturday,9,0.4 +Monday,11,13.2 +Tuesday,16,4.9 +Monday,10,27.1 +Saturday,19,4.4 +Wednesday,17,24.8 +Wednesday,11,28.3 +Thursday,23,9.2 +Thursday,15,0.2 +Monday,15,28.8 +Tuesday,8,13.7 +Sunday,15,4.2 +Friday,14,3.3 +Friday,12,27.4 +Tuesday,14,21.8 +Saturday,18,8.5 +Tuesday,8,11.0 +Thursday,14,15.7 +Saturday,10,10.0 +Tuesday,17,9.3 +Saturday,18,14.9 +Wednesday,11,27.1 +Wednesday,13,12.0 +Wednesday,19,5.1 +Thursday,16,29.8 +Thursday,9,8.4 +Tuesday,9,6.6 +Friday,12,9.7 +Monday,23,8.2 +Monday,18,5.7 +Friday,7,11.0 +Tuesday,18,6.3 +Saturday,12,3.6 +Sunday,20,10.4 +Sunday,18,1.1 +Tuesday,11,4.9 +Wednesday,15,8.2 +Monday,16,12.8 +Saturday,8,4.6 +Wednesday,11,55.0 +Wednesday,15,1.6 +Monday,18,3.3 +Wednesday,10,12.3 +Sunday,11,5.3 +Sunday,18,2.8 +Sunday,10,27.8 +Friday,16,15.4 +Tuesday,11,16.9 +Saturday,6,4.7 +Sunday,0,17.4 +Saturday,16,16.9 +Tuesday,2,26.6 +Tuesday,7,3.3 +Monday,7,6.2 +Friday,9,19.5 +Wednesday,12,23.4 +Thursday,16,16.8 +Wednesday,19,5.1 +Thursday,17,8.5 +Sunday,14,4.7 +Sunday,13,10.0 +Sunday,10,31.1 +Sunday,16,2.7 +Tuesday,13,2.4 +Wednesday,18,2.7 +Thursday,19,4.9 +Thursday,9,31.5 +Tuesday,9,14.6 +Sunday,17,6.7 +Saturday,13,11.2 +Wednesday,15,5.5 +Monday,19,6.0 +Sunday,15,14.0 +Thursday,19,3.1 +Friday,19,3.9 +Saturday,13,4.7 +Thursday,5,7.9 +Sunday,15,3.8 +Saturday,14,7.3 +Tuesday,20,3.6 +Wednesday,7,14.1 +Saturday,16,1.1 +Thursday,10,17.8 +Saturday,21,34.4 +Friday,20,1.4 +Monday,14,50.4 +Sunday,10,18.6 +Thursday,20,15.5 +Thursday,10,22.1 +Sunday,13,3.4 +Monday,18,5.3 +Friday,13,20.1 +Tuesday,16,29.7 +Sunday,8,5.3 +Wednesday,13,10.3 +Wednesday,20,2.9 +Wednesday,18,3.8 +Tuesday,12,13.3 +Wednesday,14,3.0 +Tuesday,16,4.3 +Monday,6,1.7 +Friday,8,2.9 +Wednesday,16,7.8 +Tuesday,18,20.8 +Friday,22,15.7 +Wednesday,8,6.3 +Sunday,18,5.5 +Tuesday,13,14.3 +Wednesday,10,39.3 +Wednesday,9,9.1 +Monday,7,11.5 +Monday,10,18.9 +Wednesday,19,9.1 +Thursday,8,10.5 +Thursday,23,4.9 +Friday,14,4.6 +Tuesday,7,13.2 +Wednesday,19,15.5 +Saturday,19,4.0 +Friday,13,14.9 +Tuesday,7,17.0 +Thursday,14,15.5 +Wednesday,10,0.5 +Monday,10,1.3 +Monday,14,29.1 +Wednesday,12,23.0 +Wednesday,16,18.6 +Tuesday,17,11.7 +Friday,17,11.8 +Tuesday,23,5.9 +Monday,15,14.0 +Monday,9,10.6 +Thursday,13,11.4 +Friday,5,8.1 +Tuesday,2,6.6 +Friday,19,9.8 +Thursday,13,13.2 +Friday,1,5.6 +Friday,21,19.4 +Thursday,12,3.9 +Monday,15,18.9 +Monday,17,14.2 +Friday,13,7.7 +Monday,14,20.1 +Monday,14,34.2 +Wednesday,12,16.9 +Sunday,18,9.8 +Monday,18,3.0 +Monday,10,4.0 +Friday,14,2.3 +Friday,12,22.3 +Monday,13,26.3 +Sunday,12,11.7 +Thursday,8,11.9 +Thursday,13,29.8 +Sunday,9,5.5 +Thursday,15,0.2 +Thursday,21,9.9 +Thursday,10,12.3 +Sunday,10,5.9 +Wednesday,19,6.7 +Thursday,7,5.5 +Saturday,19,11.2 +Thursday,7,25.6 +Saturday,19,8.3 +Wednesday,19,20.2 +Monday,18,4.3 +Saturday,5,14.0 +Friday,8,26.0 +Friday,14,6.2 +Saturday,0,6.3 +Wednesday,9,11.8 +Friday,17,5.4 +Tuesday,20,10.2 +Thursday,11,2.0 +Monday,10,5.5 +Wednesday,16,10.1 +Monday,20,2.5 +Tuesday,19,7.1 +Monday,11,14.0 +Wednesday,3,9.5 +Saturday,10,4.0 +Sunday,10,3.0 +Tuesday,18,8.5 +Friday,7,3.0 +Friday,12,3.0 +Monday,17,7.2 +Monday,10,26.5 +Sunday,11,10.8 +Monday,20,2.1 +Friday,19,4.4 +Friday,12,6.5 +Monday,9,2.6 +Sunday,15,13.7 +Tuesday,15,34.5 +Monday,21,10.3 +Wednesday,9,2.8 +Wednesday,9,16.7 +Saturday,13,25.3 +Sunday,20,9.9 +Thursday,7,5.9 +Saturday,21,7.8 +Friday,9,9.9 +Thursday,16,3.1 +Tuesday,9,3.7 +Friday,17,5.0 +Friday,10,18.9 +Saturday,18,4.4 +Friday,9,30.9 +Monday,20,2.6 +Wednesday,14,15.2 +Friday,9,22.7 +Saturday,8,12.7 +Monday,4,4.1 +Saturday,11,35.7 +Thursday,12,18.9 +Wednesday,8,6.2 +Friday,19,2.7 +Friday,5,11.3 +Monday,7,7.0 +Monday,2,22.8 +Saturday,10,6.0 +Monday,11,36.8 +Friday,0,14.4 +Saturday,7,3.2 +Tuesday,10,17.4 +Monday,13,14.9 +Friday,13,14.4 +Tuesday,17,8.5 +Saturday,7,13.6 +Saturday,10,6.6 +Thursday,11,16.2 +Sunday,12,3.9 +Wednesday,19,4.2 +Monday,19,3.1 +Tuesday,11,7.8 +Friday,5,16.9 +Monday,18,2.7 +Saturday,2,19.4 +Friday,2,23.5 +Thursday,18,11.3 +Monday,16,16.9 +Wednesday,20,9.4 +Saturday,17,5.8 +Monday,11,10.6 +Tuesday,17,20.7 +Thursday,14,12.5 +Sunday,10,25.4 +Wednesday,14,18.1 +Wednesday,15,6.3 +Wednesday,8,1.4 +Tuesday,12,45.0 +Tuesday,19,5.0 +Thursday,9,15.5 +Wednesday,9,4.8 +Sunday,9,3.0 +Wednesday,8,6.8 +Wednesday,10,14.3 +Saturday,7,1.8 +Wednesday,12,10.4 +Sunday,0,8.3 +Friday,8,6.6 +Monday,19,5.1 +Wednesday,1,1.9 +Monday,11,23.0 +Wednesday,9,11.4 +Thursday,7,6.5 +Thursday,10,11.6 +Thursday,19,6.0 +Saturday,9,7.6 +Sunday,14,11.1 +Saturday,19,5.8 +Saturday,9,3.5 +Saturday,13,18.8 +Thursday,12,7.7 +Saturday,13,9.9 +Thursday,10,13.5 +Sunday,19,3.7 +Monday,20,6.0 +Tuesday,17,8.9 +Friday,7,5.1 +Thursday,10,24.3 +Thursday,19,11.5 +Friday,9,6.9 +Wednesday,19,1.6 +Wednesday,15,2.1 +Monday,9,9.9 +Friday,11,24.9 +Saturday,19,3.5 +Wednesday,7,5.3 +Friday,10,6.2 +Monday,15,28.9 +Thursday,20,9.6 +Tuesday,12,17.7 +Wednesday,20,5.2 +Sunday,7,0.7 +Wednesday,9,2.5 +Thursday,18,12.2 +Friday,17,24.6 +Saturday,20,2.0 +Tuesday,10,15.8 +Sunday,7,2.6 +Saturday,15,14.9 +Friday,17,2.0 +Sunday,17,1.5 +Tuesday,12,19.1 +Thursday,12,18.1 +Thursday,8,21.2 +Monday,10,4.6 +Sunday,20,11.7 +Tuesday,13,9.9 +Wednesday,18,2.3 +Friday,9,27.1 +Friday,11,9.4 +Thursday,18,11.8 +Thursday,17,17.6 +Saturday,17,2.5 +Tuesday,7,1.2 +Thursday,13,15.3 +Sunday,17,1.6 +Monday,14,10.4 +Wednesday,16,13.9 +Wednesday,7,1.3 +Friday,20,7.0 +Saturday,19,3.1 +Friday,17,3.6 +Friday,22,6.4 +Thursday,19,5.0 +Tuesday,9,13.1 +Wednesday,12,5.1 +Friday,7,1.8 +Monday,17,1.6 +Monday,14,19.1 +Friday,7,0.2 +Thursday,14,18.6 +Monday,19,11.9 +Sunday,15,9.6 +Monday,2,16.5 +Wednesday,10,23.3 +Sunday,17,7.1 +Monday,15,8.8 +Tuesday,9,9.0 +Wednesday,20,3.0 +Tuesday,7,1.4 +Friday,19,0.6 +Wednesday,15,14.9 +Friday,14,35.3 +Friday,18,1.4 +Thursday,18,16.8 +Tuesday,17,9.4 +Saturday,7,1.7 +Thursday,13,20.4 +Monday,14,4.4 +Monday,16,6.7 +Wednesday,5,5.8 +Monday,15,5.7 +Tuesday,19,4.8 +Saturday,9,4.6 +Thursday,19,5.0 +Monday,18,0.4 +Saturday,11,5.9 +Friday,9,4.2 +Friday,19,2.8 +Monday,23,12.2 +Wednesday,19,4.8 +Friday,13,18.4 +Sunday,19,11.1 +Saturday,19,3.1 +Saturday,12,1.2 +Saturday,18,13.9 +Saturday,12,5.6 +Sunday,18,4.7 +Saturday,17,5.6 +Saturday,1,18.4 +Tuesday,17,10.7 +Tuesday,19,2.6 +Wednesday,14,21.7 +Tuesday,20,2.6 +Wednesday,10,11.3 +Thursday,19,28.9 +Friday,7,10.0 +Sunday,11,11.1 +Monday,2,8.2 +Monday,21,20.1 +Monday,18,8.0 +Thursday,15,8.7 +Sunday,20,20.4 +Wednesday,21,8.5 +Thursday,16,6.9 +Friday,15,12.1 +Sunday,20,1.5 +Friday,18,5.2 +Sunday,4,31.2 +Friday,7,9.0 +Monday,16,26.0 +Sunday,19,5.0 +Sunday,0,49.2 +Tuesday,16,8.1 +Monday,18,8.0 +Wednesday,21,13.7 +Friday,21,23.0 +Wednesday,6,41.6 +Sunday,11,12.2 +Saturday,13,17.3 +Sunday,18,1.9 +Monday,9,8.1 +Tuesday,19,1.1 +Thursday,7,12.5 +Friday,20,5.4 +Sunday,21,48.5 +Saturday,7,3.5 +Monday,18,10.5 +Sunday,11,22.2 +Wednesday,20,8.7 +Wednesday,15,23.5 +Thursday,14,9.4 +Friday,5,9.8 +Thursday,17,16.1 +Sunday,0,15.8 +Thursday,16,41.5 +Friday,15,2.2 +Friday,20,1.9 +Friday,15,9.4 +Sunday,19,7.0 +Saturday,20,2.9 +Sunday,3,27.9 +Wednesday,6,7.9 +Sunday,15,6.3 +Friday,16,8.3 +Sunday,21,15.1 +Tuesday,18,3.4 +Friday,21,3.3 +Tuesday,16,2.2 +Friday,13,27.9 +Saturday,12,6.2 +Wednesday,5,18.2 +Thursday,9,10.3 +Tuesday,20,5.7 +Sunday,11,12.8 +Tuesday,18,6.9 +Monday,2,33.6 +Monday,15,14.7 +Sunday,8,6.5 +Thursday,15,11.5 +Friday,16,5.3 +Wednesday,8,2.0 +Sunday,2,13.5 +Friday,13,13.9 +Monday,9,17.2 +Thursday,16,13.7 +Tuesday,10,8.5 +Wednesday,21,20.2 +Thursday,11,4.2 +Sunday,0,28.7 +Friday,10,4.8 +Tuesday,18,9.1 +Wednesday,10,5.5 +Monday,11,1.6 +Sunday,13,20.8 +Monday,18,13.8 +Monday,9,11.3 +Thursday,12,0.4 +Monday,19,14.5 +Monday,16,14.6 +Tuesday,1,3.8 +Sunday,22,9.1 +Tuesday,18,10.0 +Saturday,13,5.4 +Monday,2,23.6 +Monday,12,12.9 +Monday,13,11.1 +Friday,13,22.9 +Saturday,9,14.2 +Saturday,14,8.3 +Thursday,20,6.1 +Monday,8,14.3 +Friday,7,6.2 +Wednesday,14,27.2 +Wednesday,12,7.4 +Wednesday,18,2.2 +Friday,15,13.3 +Wednesday,10,7.8 +Thursday,15,30.7 +Thursday,8,7.4 +Tuesday,10,5.2 +Tuesday,11,20.3 +Wednesday,17,12.3 +Wednesday,20,4.2 +Sunday,7,1.6 +Tuesday,8,13.4 +Thursday,17,18.6 +Saturday,16,9.4 +Tuesday,12,5.6 +Sunday,15,14.5 +Friday,18,3.4 +Sunday,17,0.8 +Sunday,13,3.4 +Friday,17,3.9 +Saturday,17,9.4 +Sunday,18,1.1 +Sunday,18,4.1 +Tuesday,10,11.2 +Friday,7,12.9 +Sunday,7,2.0 +Saturday,15,8.9 +Thursday,14,16.6 +Monday,13,27.4 +Thursday,20,2.4 +Saturday,19,7.6 +Saturday,10,10.4 +Friday,10,10.2 +Thursday,13,3.9 +Wednesday,9,4.0 +Tuesday,12,15.1 +Thursday,14,2.4 +Thursday,9,15.3 +Monday,13,24.7 +Thursday,14,8.4 +Tuesday,9,6.5 +Tuesday,8,12.9 +Friday,8,7.7 +Wednesday,11,21.1 +Friday,12,24.7 +Thursday,15,17.9 +Sunday,9,5.2 +Thursday,11,16.9 +Friday,9,3.1 +Sunday,19,9.1 +Thursday,19,4.8 +Friday,7,6.1 +Wednesday,7,6.2 +Sunday,18,12.1 +Thursday,15,10.7 +Tuesday,17,2.1 +Thursday,20,0.8 +Monday,20,3.4 +Monday,17,16.0 +Friday,20,11.0 +Wednesday,13,23.6 +Sunday,19,5.8 +Thursday,9,4.4 +Sunday,4,14.8 +Wednesday,15,6.9 +Friday,9,25.2 +Monday,17,4.0 +Thursday,20,2.2 +Thursday,5,19.6 +Tuesday,16,24.1 +Thursday,17,4.1 +Monday,2,4.4 +Wednesday,10,1.4 +Monday,7,5.8 +Tuesday,14,10.2 +Saturday,17,0.7 +Tuesday,16,3.1 +Thursday,12,6.1 +Friday,13,33.8 +Tuesday,11,2.6 +Monday,9,7.2 +Tuesday,19,3.8 +Friday,13,25.8 +Monday,17,7.9 +Monday,15,30.2 +Thursday,16,12.7 +Monday,13,19.7 +Wednesday,17,4.0 +Thursday,11,13.9 +Sunday,15,6.4 +Wednesday,10,18.2 +Monday,4,18.2 +Saturday,11,6.6 +Sunday,20,2.2 +Tuesday,14,18.1 +Tuesday,12,20.6 +Wednesday,17,25.7 +Monday,15,5.3 +Tuesday,17,12.1 +Friday,18,1.6 +Monday,13,22.0 +Tuesday,13,8.3 +Wednesday,18,19.4 +Tuesday,9,6.8 +Tuesday,8,4.5 +Saturday,10,8.3 +Thursday,13,9.2 +Saturday,17,8.6 +Monday,12,14.5 +Thursday,20,4.7 +Thursday,11,19.8 +Friday,15,27.2 +Sunday,19,4.4 +Tuesday,16,0.5 +Saturday,5,8.2 +Sunday,10,8.3 +Monday,16,6.5 +Saturday,12,11.1 +Friday,12,33.1 +Tuesday,17,8.1 +Tuesday,3,5.9 +Monday,17,6.7 +Saturday,3,6.6 +Tuesday,14,18.6 +Wednesday,12,43.2 +Saturday,0,6.9 +Monday,0,13.3 +Thursday,13,10.4 +Monday,16,2.2 +Saturday,14,17.1 +Wednesday,8,18.0 +Friday,18,9.2 +Saturday,15,15.0 +Friday,11,0.7 +Friday,18,9.3 +Thursday,0,47.7 +Wednesday,5,11.1 +Sunday,16,6.0 +Friday,1,9.8 +Tuesday,16,10.7 +Wednesday,19,10.2 +Friday,9,20.4 +Sunday,7,1.3 +Wednesday,18,3.6 +Friday,10,9.7 +Friday,16,10.7 +Wednesday,20,2.8 +Sunday,20,3.6 +Tuesday,18,8.5 +Tuesday,17,5.4 +Monday,14,15.0 +Friday,12,14.9 +Sunday,16,8.6 +Friday,12,21.2 +Friday,16,13.8 +Wednesday,18,9.1 +Tuesday,17,3.2 +Tuesday,19,4.1 +Sunday,15,19.4 +Thursday,4,4.5 +Saturday,8,7.6 +Friday,2,11.9 +Friday,9,4.1 +Wednesday,19,5.0 +Thursday,12,11.8 +Monday,12,36.6 +Friday,14,12.8 +Saturday,7,4.4 +Tuesday,15,8.4 +Wednesday,11,15.2 +Thursday,16,13.6 +Wednesday,17,5.2 +Thursday,8,3.8 +Saturday,15,11.7 +Thursday,21,15.4 +Thursday,16,7.9 +Wednesday,8,11.4 +Saturday,10,5.7 +Thursday,16,5.9 +Saturday,19,8.7 +Sunday,10,5.6 +Wednesday,1,17.3 +Tuesday,10,12.3 +Friday,13,6.3 +Monday,19,3.0 +Friday,13,3.4 +Friday,20,3.5 +Tuesday,21,18.0 +Monday,15,13.2 +Saturday,1,20.3 +Tuesday,20,8.3 +Sunday,2,11.4 +Wednesday,13,15.8 +Saturday,21,5.3 +Wednesday,15,12.6 +Thursday,6,7.2 +Friday,12,9.5 +Saturday,9,12.0 +Monday,15,1.8 +Saturday,13,10.6 +Wednesday,11,17.1 +Friday,3,9.1 +Monday,17,1.3 +Thursday,0,41.7 +Saturday,7,6.3 +Sunday,15,7.1 +Wednesday,12,2.4 +Wednesday,20,6.6 +Monday,14,8.0 +Sunday,8,11.9 +Friday,13,10.6 +Wednesday,20,10.9 +Sunday,3,7.4 +Saturday,18,8.1 +Thursday,15,4.3 +Monday,13,6.3 +Sunday,15,7.7 +Wednesday,22,12.4 +Monday,9,17.2 +Wednesday,15,4.4 +Monday,17,1.8 +Thursday,19,3.3 +Thursday,16,6.0 +Sunday,15,12.0 +Sunday,10,8.1 +Tuesday,7,13.8 +Tuesday,16,5.0 +Sunday,15,21.8 +Saturday,17,1.6 +Thursday,13,1.4 +Saturday,19,8.8 +Sunday,13,11.2 +Monday,9,20.4 +Wednesday,20,1.5 +Wednesday,18,4.8 +Tuesday,12,8.7 +Friday,15,2.8 +Sunday,10,9.1 +Saturday,6,8.0 +Monday,19,10.1 +Friday,11,8.5 +Sunday,16,7.1 +Friday,11,27.3 +Tuesday,0,15.7 +Monday,9,5.5 +Thursday,12,7.8 +Monday,9,11.2 +Monday,20,4.7 +Thursday,1,20.8 +Saturday,12,10.0 +Tuesday,16,23.1 +Monday,17,4.1 +Wednesday,20,8.0 +Friday,14,11.9 +Wednesday,16,7.6 +Monday,10,19.6 +Thursday,14,15.3 +Friday,19,6.6 +Wednesday,6,10.4 +Thursday,10,16.0 +Friday,11,17.4 +Sunday,20,4.6 +Wednesday,18,1.9 +Tuesday,6,3.4 +Friday,15,14.6 +Friday,16,8.2 +Friday,7,9.1 +Sunday,18,2.8 +Tuesday,13,27.1 +Monday,10,7.2 +Thursday,10,17.1 +Thursday,13,27.7 +Friday,11,25.0 +Wednesday,11,38.2 +Monday,11,33.6 +Saturday,14,5.1 +Monday,13,16.9 +Friday,11,18.1 +Saturday,16,10.7 +Friday,17,3.7 +Friday,8,4.0 +Saturday,18,8.9 +Friday,23,18.4 +Saturday,10,6.8 +Wednesday,17,8.0 +Friday,5,3.2 +Friday,4,5.4 +Monday,20,3.1 +Tuesday,7,1.1 +Wednesday,21,13.9 +Thursday,20,4.5 +Friday,22,25.8 +Tuesday,20,1.3 +Friday,16,3.3 +Saturday,10,11.6 +Thursday,22,7.5 +Tuesday,13,8.7 +Saturday,7,7.9 +Saturday,15,4.9 +Thursday,19,3.5 +Wednesday,20,14.7 +Friday,13,3.2 +Thursday,3,22.9 +Wednesday,7,3.8 +Thursday,12,14.1 +Saturday,17,5.5 +Tuesday,4,11.4 +Thursday,13,24.7 +Thursday,13,22.3 +Sunday,18,8.0 +Tuesday,7,5.8 +Saturday,19,5.8 +Wednesday,12,9.9 +Friday,14,8.2 +Sunday,14,8.7 +Tuesday,15,3.9 +Thursday,16,27.1 +Saturday,20,3.2 +Friday,16,15.1 +Monday,8,6.1 +Friday,8,11.8 +Monday,17,4.6 +Friday,19,4.9 +Sunday,19,3.2 +Monday,9,12.1 +Wednesday,14,32.4 +Tuesday,12,12.3 +Saturday,9,7.3 +Wednesday,19,4.7 +Saturday,13,9.9 +Friday,19,4.2 +Thursday,16,4.3 +Wednesday,6,18.5 +Monday,14,4.3 +Wednesday,13,10.7 +Sunday,19,2.2 +Monday,20,3.9 +Tuesday,22,19.7 +Monday,18,3.2 +Tuesday,16,31.6 +Sunday,8,2.9 +Friday,17,6.7 +Wednesday,16,14.3 +Thursday,18,14.7 +Friday,18,10.6 +Sunday,3,4.8 +Friday,0,10.0 +Thursday,18,7.8 +Sunday,10,24.2 +Wednesday,12,6.7 +Saturday,9,2.8 +Friday,12,20.0 +Tuesday,12,15.5 +Monday,9,4.9 +Tuesday,16,2.2 +Tuesday,18,2.9 +Thursday,15,8.9 +Tuesday,7,5.2 +Wednesday,7,3.6 +Sunday,19,12.6 +Tuesday,19,2.9 +Tuesday,20,8.5 +Sunday,12,2.4 +Wednesday,18,2.8 +Wednesday,14,49.1 +Wednesday,17,2.8 +Saturday,13,9.0 +Thursday,12,15.9 +Friday,9,3.6 +Monday,19,15.3 +Wednesday,2,10.5 +Thursday,13,20.7 +Monday,17,8.2 +Thursday,19,8.5 +Saturday,19,12.7 +Monday,7,12.1 +Friday,9,15.5 +Monday,9,33.2 +Monday,12,32.6 +Thursday,19,2.3 +Thursday,10,9.2 +Tuesday,14,5.1 +Saturday,10,10.7 +Wednesday,11,8.4 +Wednesday,7,10.7 +Monday,13,14.3 +Tuesday,13,5.4 +Wednesday,9,16.5 +Thursday,18,5.3 +Friday,11,4.1 +Sunday,14,10.6 +Friday,15,14.8 +Saturday,18,7.6 +Thursday,16,4.8 +Thursday,18,21.7 +Monday,11,11.0 +Tuesday,5,52.1 +Friday,10,12.6 +Sunday,9,12.1 +Saturday,4,17.5 +Monday,0,2.9 +Monday,12,15.8 +Wednesday,8,22.8 +Monday,9,9.3 +Thursday,14,11.9 +Wednesday,5,23.6 +Sunday,17,3.5 +Sunday,17,11.7 +Monday,19,10.3 +Monday,20,2.5 +Saturday,12,0.8 +Friday,7,7.8 +Thursday,11,7.0 +Tuesday,0,6.8 +Wednesday,17,10.8 +Saturday,7,6.7 +Tuesday,7,2.9 +Sunday,11,10.8 +Saturday,20,2.8 +Saturday,11,16.5 +Thursday,13,7.9 +Wednesday,18,6.3 +Monday,15,13.9 +Wednesday,14,10.0 +Saturday,17,0.9 +Sunday,16,0.7 +Tuesday,5,7.2 +Wednesday,20,4.9 +Wednesday,12,6.9 +Thursday,17,2.9 +Thursday,7,12.4 +Wednesday,9,3.0 +Friday,3,24.9 +Monday,10,19.3 +Saturday,15,6.0 +Thursday,12,8.6 +Tuesday,16,25.3 +Wednesday,16,5.0 +Thursday,22,5.7 +Thursday,23,15.1 +Sunday,20,14.4 +Wednesday,7,7.9 +Sunday,13,3.3 +Monday,8,5.4 +Saturday,13,7.3 +Friday,13,19.9 +Thursday,17,7.7 +Monday,20,2.2 +Tuesday,18,8.4 +Tuesday,5,9.9 +Wednesday,19,13.5 +Thursday,13,31.4 +Monday,10,12.2 +Tuesday,17,4.5 +Thursday,7,5.4 +Sunday,15,15.5 +Tuesday,0,14.4 +Thursday,20,3.1 +Friday,19,1.0 +Saturday,14,5.7 +Tuesday,14,2.9 +Monday,12,19.9 +Friday,20,7.0 +Monday,10,6.6 +Sunday,18,31.5 +Sunday,18,13.5 +Tuesday,14,7.7 +Thursday,8,4.4 +Thursday,9,3.5 +Sunday,13,9.7 +Friday,8,14.9 +Wednesday,17,2.2 +Friday,12,21.1 +Thursday,13,19.3 +Wednesday,13,4.0 +Thursday,15,3.3 +Friday,23,2.3 +Thursday,13,31.7 +Saturday,8,5.6 +Saturday,17,15.5 +Wednesday,15,4.6 +Tuesday,16,22.9 +Friday,7,5.5 +Friday,16,7.4 +Saturday,14,3.3 +Tuesday,12,12.1 +Saturday,18,8.8 +Sunday,12,14.0 +Thursday,10,12.8 +Wednesday,9,10.6 +Sunday,10,18.4 +Tuesday,22,26.4 +Tuesday,14,6.4 +Tuesday,7,7.2 +Saturday,17,5.7 +Tuesday,9,23.8 +Friday,13,21.6 +Sunday,18,2.1 +Friday,19,3.4 +Tuesday,19,10.4 +Saturday,20,22.2 +Wednesday,14,12.9 +Friday,10,30.7 +Wednesday,19,12.1 +Wednesday,4,11.0 +Thursday,11,8.3 +Saturday,9,6.4 +Sunday,19,2.5 +Tuesday,16,6.1 +Saturday,17,4.5 +Friday,4,4.4 +Sunday,17,10.8 +Monday,8,28.3 +Monday,13,4.1 +Thursday,14,6.3 +Monday,8,17.6 +Saturday,9,6.0 +Wednesday,14,8.4 +Wednesday,8,20.3 +Wednesday,11,6.3 +Sunday,13,21.2 +Friday,19,2.6 +Monday,14,3.3 +Thursday,5,14.2 +Friday,18,13.6 +Friday,8,10.1 +Sunday,22,19.3 +Tuesday,14,15.7 +Thursday,17,2.7 +Saturday,17,6.7 +Friday,10,8.0 +Monday,12,17.6 +Friday,8,27.0 +Wednesday,5,13.5 +Thursday,18,10.4 +Sunday,19,15.6 +Thursday,18,4.1 +Saturday,11,40.7 +Wednesday,6,12.5 +Sunday,10,10.8 +Friday,14,27.8 +Tuesday,10,40.3 +Saturday,15,22.0 +Monday,16,32.6 +Wednesday,15,12.7 +Thursday,10,7.4 +Friday,13,28.3 +Saturday,15,15.6 +Thursday,12,29.4 +Sunday,11,11.3 +Monday,19,5.1 +Wednesday,15,5.2 +Tuesday,19,5.8 +Monday,13,10.8 +Wednesday,15,9.0 +Wednesday,8,13.2 +Saturday,13,6.3 +Thursday,17,2.1 +Thursday,1,2.7 +Tuesday,15,34.1 +Wednesday,7,6.2 +Friday,1,24.8 +Friday,5,7.7 +Thursday,11,25.2 +Thursday,4,9.0 +Friday,15,17.0 +Saturday,11,8.9 +Monday,16,16.5 +Sunday,15,4.5 +Friday,23,46.6 +Wednesday,18,21.8 +Thursday,12,13.4 +Friday,15,5.2 +Tuesday,13,7.4 +Monday,8,7.9 +Wednesday,16,9.7 +Friday,12,26.4 +Thursday,7,8.7 +Tuesday,20,1.2 +Saturday,16,5.8 +Saturday,15,11.8 +Wednesday,14,12.5 +Tuesday,17,6.4 +Thursday,7,7.1 +Sunday,16,11.5 +Tuesday,13,14.5 +Thursday,17,9.8 +Wednesday,20,8.2 +Friday,14,15.1 +Friday,18,8.4 +Sunday,10,5.9 +Friday,11,3.4 +Thursday,19,5.8 +Saturday,16,2.6 +Saturday,8,7.5 +Tuesday,15,4.8 +Friday,14,24.5 +Sunday,0,11.9 +Saturday,9,8.1 +Tuesday,19,9.2 +Wednesday,10,16.8 +Monday,20,9.2 +Friday,7,5.3 +Saturday,15,3.4 +Monday,6,21.9 +Saturday,12,4.3 +Saturday,18,1.7 +Sunday,13,7.0 +Sunday,15,3.8 +Saturday,11,7.6 +Monday,21,18.8 +Saturday,20,4.0 +Wednesday,9,15.0 +Sunday,12,7.3 +Thursday,3,11.6 +Thursday,7,5.8 +Tuesday,1,9.5 +Wednesday,10,18.7 +Tuesday,11,19.2 +Saturday,12,1.3 +Friday,16,15.2 +Monday,2,15.3 +Saturday,15,5.1 +Wednesday,20,9.8 +Wednesday,21,7.4 +Monday,8,10.1 +Monday,14,1.7 +Saturday,20,8.0 +Sunday,9,7.1 +Friday,8,7.9 +Wednesday,10,17.3 +Thursday,14,7.8 +Thursday,1,3.4 +Wednesday,20,9.1 +Sunday,20,3.7 +Monday,19,8.7 +Sunday,10,1.2 +Wednesday,14,12.8 +Friday,15,21.2 +Thursday,15,8.1 +Sunday,9,17.5 +Sunday,10,37.2 +Tuesday,9,6.6 +Monday,6,14.4 +Sunday,18,2.9 +Wednesday,14,9.8 +Saturday,4,3.9 +Thursday,15,33.7 +Sunday,9,2.0 +Monday,9,9.4 +Saturday,9,2.8 +Friday,13,22.9 +Tuesday,18,5.7 +Saturday,17,3.3 +Wednesday,12,21.6 +Thursday,13,9.0 +Wednesday,17,16.9 +Wednesday,14,8.9 +Wednesday,18,8.2 +Saturday,1,23.9 +Wednesday,15,8.2 +Tuesday,16,13.4 +Wednesday,11,3.7 +Tuesday,19,12.8 +Monday,20,4.5 +Monday,19,9.9 +Tuesday,15,17.7 +Thursday,12,6.9 +Saturday,8,6.2 +Tuesday,22,25.1 +Wednesday,20,6.8 +Monday,17,7.6 +Wednesday,11,6.1 +Thursday,2,8.8 +Wednesday,22,2.5 +Saturday,13,26.1 +Wednesday,14,6.5 +Tuesday,11,39.9 +Sunday,11,7.2 +Friday,18,6.9 +Monday,10,2.6 +Thursday,13,7.9 +Tuesday,7,10.1 +Monday,15,2.7 +Sunday,7,3.4 +Thursday,11,29.7 +Thursday,18,3.0 +Saturday,10,16.3 +Saturday,18,5.5 +Friday,19,1.8 +Monday,12,1.3 +Tuesday,15,2.0 +Wednesday,16,16.0 +Sunday,11,18.4 +Friday,19,2.7 +Thursday,16,16.3 +Saturday,0,26.8 +Sunday,13,6.8 +Friday,8,2.1 +Friday,14,11.3 +Saturday,10,25.2 +Friday,19,3.3 +Sunday,20,1.4 +Tuesday,14,3.7 +Sunday,8,9.4 +Saturday,13,13.1 +Monday,12,6.9 +Saturday,9,17.7 +Thursday,9,8.6 +Sunday,17,10.5 +Sunday,13,13.7 +Monday,8,7.0 +Thursday,12,6.2 +Tuesday,18,8.6 +Saturday,18,1.8 +Thursday,8,7.1 +Friday,9,11.8 +Saturday,19,5.6 +Saturday,17,1.9 +Tuesday,17,12.5 +Wednesday,14,6.6 +Sunday,18,4.1 +Saturday,9,24.6 +Sunday,1,21.4 +Saturday,17,8.1 +Tuesday,13,11.2 +Friday,13,2.7 +Tuesday,18,13.7 +Tuesday,15,18.4 +Sunday,17,8.9 +Sunday,17,1.0 +Wednesday,23,7.9 +Saturday,19,4.5 +Sunday,20,1.8 +Wednesday,15,1.8 +Saturday,13,16.7 +Tuesday,16,10.4 +Saturday,13,6.8 +Tuesday,16,13.3 +Wednesday,9,19.5 +Thursday,13,9.0 +Friday,10,8.3 +Monday,19,0.7 +Tuesday,11,12.1 +Monday,15,5.0 +Thursday,18,9.6 +Friday,12,7.4 +Sunday,19,4.1 +Wednesday,14,13.4 +Monday,18,3.7 +Thursday,19,12.2 +Thursday,5,20.8 +Thursday,19,8.6 +Monday,20,4.6 +Wednesday,10,10.5 +Thursday,14,5.5 +Tuesday,10,4.8 +Monday,16,10.9 +Saturday,18,16.0 +Wednesday,13,1.2 +Wednesday,19,3.7 +Monday,8,7.5 +Friday,10,29.9 +Tuesday,17,18.7 +Saturday,13,21.9 +Thursday,18,7.4 +Thursday,11,41.8 +Thursday,7,5.4 +Saturday,18,2.3 +Saturday,16,21.0 +Saturday,14,8.7 +Saturday,17,6.0 +Sunday,9,18.3 +Thursday,12,15.1 +Wednesday,15,5.1 +Wednesday,9,11.0 +Tuesday,21,9.5 +Saturday,15,7.6 +Monday,8,5.2 +Sunday,21,9.7 +Tuesday,10,10.5 +Thursday,17,1.4 +Thursday,1,6.8 +Wednesday,13,14.3 +Friday,4,25.7 +Monday,19,10.6 +Sunday,17,15.1 +Wednesday,7,14.9 +Monday,15,17.0 +Sunday,16,6.7 +Friday,17,9.3 +Tuesday,17,3.7 +Thursday,8,2.4 +Sunday,20,3.6 +Thursday,0,10.7 +Wednesday,18,7.6 +Saturday,10,22.5 +Tuesday,11,8.0 +Sunday,12,4.4 +Wednesday,16,7.7 +Tuesday,18,4.7 +Monday,10,7.3 +Monday,19,6.3 +Sunday,13,8.1 +Tuesday,17,3.0 +Wednesday,10,19.2 +Wednesday,16,4.5 +Wednesday,22,46.9 +Saturday,7,4.4 +Sunday,20,2.3 +Wednesday,11,3.1 +Sunday,11,12.0 +Saturday,15,11.6 +Tuesday,11,37.7 +Monday,15,15.4 +Thursday,7,4.4 +Wednesday,12,20.9 +Sunday,10,12.0 +Wednesday,10,34.9 +Friday,19,2.8 +Thursday,14,15.9 +Tuesday,11,18.9 +Wednesday,8,9.8 +Sunday,9,2.5 +Tuesday,11,15.4 +Friday,18,1.9 +Monday,7,16.9 +Monday,9,10.5 +Tuesday,12,29.7 +Friday,13,42.3 +Friday,6,2.9 +Thursday,2,12.4 +Sunday,11,17.9 +Saturday,17,7.8 +Wednesday,8,9.9 +Friday,17,13.8 +Monday,16,22.9 +Sunday,11,8.6 +Sunday,15,13.8 +Thursday,20,2.6 +Monday,10,7.0 +Monday,9,13.4 +Tuesday,17,16.5 +Monday,7,1.5 +Friday,8,10.8 +Friday,15,35.2 +Monday,12,15.1 +Wednesday,10,27.6 +Saturday,14,8.1 +Monday,15,5.7 +Monday,10,28.0 +Sunday,13,33.5 +Saturday,9,2.5 +Thursday,14,1.0 +Saturday,19,8.2 +Tuesday,10,10.5 +Wednesday,13,12.8 +Saturday,19,1.7 +Monday,12,26.6 +Tuesday,20,19.0 +Friday,15,10.0 +Wednesday,18,4.5 +Saturday,10,2.1 +Saturday,16,7.8 +Wednesday,14,10.4 +Monday,19,14.8 +Wednesday,20,5.1 +Friday,14,11.6 +Wednesday,7,2.0 +Friday,11,7.5 +Friday,5,15.2 +Thursday,7,9.3 +Saturday,17,4.3 +Saturday,22,29.3 +Saturday,10,2.1 +Monday,17,26.6 +Saturday,8,9.8 +Sunday,20,5.0 +Monday,14,6.4 +Saturday,7,11.9 +Sunday,6,15.0 +Saturday,10,10.6 +Thursday,20,5.5 +Wednesday,23,28.2 +Thursday,14,6.4 +Thursday,13,9.9 +Sunday,9,4.5 +Sunday,5,11.8 +Thursday,17,19.1 +Monday,19,11.7 +Monday,15,12.8 +Saturday,20,3.7 +Wednesday,19,13.1 +Monday,17,1.7 +Thursday,13,29.7 +Wednesday,13,17.4 +Tuesday,18,2.8 +Monday,15,13.2 +Monday,9,16.4 +Monday,10,17.3 +Wednesday,8,3.2 +Sunday,17,2.1 +Tuesday,9,24.1 +Friday,17,3.9 +Thursday,7,11.4 +Tuesday,19,2.8 +Thursday,13,11.9 +Monday,19,10.6 +Wednesday,8,5.9 +Thursday,20,1.2 +Sunday,17,5.5 +Thursday,2,14.0 +Friday,8,11.5 +Friday,7,5.2 +Wednesday,5,10.4 +Saturday,3,6.5 +Saturday,3,12.7 +Thursday,8,9.2 +Thursday,15,3.0 +Tuesday,12,16.0 +Saturday,19,3.8 +Monday,12,38.3 +Thursday,12,23.9 +Wednesday,18,5.6 +Tuesday,14,6.1 +Friday,11,30.2 +Sunday,18,18.9 +Thursday,7,3.6 +Friday,9,2.4 +Wednesday,2,5.5 +Sunday,14,9.7 +Saturday,9,7.0 +Thursday,19,11.2 +Thursday,9,5.5 +Monday,19,5.2 +Wednesday,12,10.5 +Saturday,14,13.1 +Monday,12,10.8 +Sunday,9,15.0 +Thursday,10,8.9 +Saturday,9,16.3 +Saturday,0,31.0 +Friday,12,23.9 +Thursday,11,18.4 +Tuesday,14,7.0 +Saturday,0,17.0 +Monday,5,14.8 +Wednesday,18,11.2 +Sunday,19,19.9 +Wednesday,19,14.6 +Saturday,16,6.9 +Monday,7,3.3 +Sunday,9,14.1 +Monday,21,14.3 +Wednesday,15,21.1 +Tuesday,15,21.8 +Wednesday,14,30.1 +Saturday,11,2.0 +Friday,14,2.2 +Tuesday,18,9.2 +Saturday,9,13.3 +Sunday,20,1.8 +Monday,15,9.1 +Wednesday,8,3.7 +Saturday,7,5.8 +Sunday,10,4.7 +Friday,10,11.3 +Sunday,12,10.6 +Wednesday,14,15.8 +Monday,15,13.1 +Tuesday,11,4.0 +Tuesday,15,10.4 +Thursday,13,11.6 +Thursday,22,14.2 +Thursday,13,6.5 +Wednesday,11,11.2 +Sunday,17,9.4 +Saturday,14,0.8 +Thursday,19,1.8 +Friday,17,4.3 +Thursday,12,19.9 +Thursday,15,10.2 +Monday,10,13.6 +Friday,9,21.0 +Monday,16,19.9 +Friday,14,4.5 +Wednesday,15,29.4 +Monday,16,10.9 +Wednesday,17,7.2 +Saturday,9,17.5 +Thursday,21,9.7 +Sunday,10,10.8 +Thursday,20,5.1 +Sunday,10,19.6 +Tuesday,9,6.5 +Tuesday,16,19.3 +Wednesday,9,7.4 +Sunday,12,5.3 +Saturday,0,11.3 +Monday,1,1.1 +Friday,14,9.3 +Tuesday,8,19.4 +Saturday,10,10.7 +Friday,19,10.6 +Sunday,10,16.9 +Friday,11,17.1 +Friday,0,8.2 +Friday,13,7.3 +Wednesday,14,0.8 +Monday,10,4.2 +Sunday,16,6.2 +Saturday,7,2.5 +Friday,14,32.8 +Friday,8,5.1 +Friday,22,16.1 +Wednesday,18,7.8 +Thursday,20,8.6 +Thursday,17,13.9 +Thursday,11,1.6 +Monday,20,5.3 +Monday,17,4.3 +Wednesday,19,5.9 +Saturday,12,5.1 +Monday,11,23.4 +Monday,4,11.6 +Wednesday,10,6.9 +Tuesday,14,15.1 +Tuesday,17,5.3 +Saturday,8,7.9 +Tuesday,10,28.6 +Friday,8,0.9 +Thursday,7,21.0 +Monday,10,6.2 +Friday,9,8.4 +Monday,20,11.1 +Wednesday,18,7.5 +Tuesday,10,37.0 +Tuesday,17,29.4 +Saturday,14,7.8 +Monday,14,10.1 +Sunday,7,2.7 +Monday,20,1.5 +Thursday,13,9.4 +Friday,20,6.1 +Monday,20,5.8 +Monday,16,37.4 +Thursday,12,20.9 +Tuesday,19,6.3 +Thursday,14,11.3 +Thursday,7,21.5 +Friday,13,8.0 +Wednesday,9,4.5 +Tuesday,12,22.8 +Monday,14,17.4 +Sunday,10,9.9 +Tuesday,20,5.5 +Tuesday,5,6.2 +Wednesday,17,16.5 +Monday,8,8.0 +Tuesday,14,8.8 +Wednesday,7,3.2 +Friday,12,15.8 +Thursday,9,8.3 +Sunday,15,23.1 +Sunday,20,14.8 +Tuesday,9,4.8 +Monday,7,10.9 +Sunday,13,32.7 +Monday,12,13.2 +Monday,13,20.2 +Sunday,15,11.8 +Sunday,10,8.4 +Saturday,19,5.5 +Sunday,12,6.9 +Monday,16,19.3 +Friday,11,5.2 +Thursday,8,11.3 +Sunday,14,3.6 +Wednesday,20,5.3 +Saturday,13,11.3 +Wednesday,14,16.6 +Friday,12,14.4 +Tuesday,18,6.9 +Saturday,16,13.2 +Friday,16,10.9 +Wednesday,17,0.7 +Saturday,17,8.4 +Wednesday,17,5.5 +Tuesday,17,12.9 +Monday,14,19.1 +Tuesday,15,16.4 +Friday,12,30.0 +Saturday,20,8.0 +Friday,10,3.0 +Monday,13,10.4 +Saturday,17,5.4 +Friday,14,6.7 +Tuesday,13,31.7 +Wednesday,0,3.9 +Sunday,18,13.2 +Friday,10,11.8 +Wednesday,9,8.7 +Friday,11,15.4 +Friday,12,0.9 +Thursday,10,4.9 +Sunday,15,13.4 +Saturday,7,5.9 +Saturday,8,9.5 +Tuesday,20,1.9 +Wednesday,11,38.0 +Thursday,20,2.7 +Monday,11,6.2 +Saturday,19,3.3 +Wednesday,1,38.8 +Saturday,9,11.5 +Tuesday,3,14.5 +Saturday,11,4.7 +Thursday,16,16.2 +Monday,15,18.8 +Sunday,13,2.1 +Friday,2,5.0 +Monday,18,4.6 +Friday,22,17.4 +Tuesday,20,3.2 +Friday,0,29.5 +Saturday,15,15.5 +Wednesday,13,23.2 +Sunday,0,16.3 +Thursday,15,9.0 +Saturday,1,13.3 +Saturday,9,11.4 +Wednesday,10,23.8 +Wednesday,0,14.2 +Friday,14,3.9 +Wednesday,16,12.6 +Thursday,12,6.6 +Monday,7,6.3 +Friday,12,35.8 +Monday,14,16.0 +Wednesday,12,19.7 +Sunday,15,20.9 +Sunday,8,12.1 +Wednesday,3,12.1 +Monday,20,6.8 +Friday,12,14.4 +Monday,18,7.1 +Saturday,17,1.4 +Wednesday,19,1.7 +Friday,8,4.4 +Tuesday,20,3.9 +Tuesday,19,5.5 +Saturday,11,7.8 +Monday,18,4.8 +Friday,17,14.5 +Saturday,8,5.4 +Friday,1,10.6 +Saturday,9,9.9 +Saturday,15,16.8 +Friday,16,2.7 +Sunday,14,6.2 +Tuesday,20,5.1 +Sunday,9,32.1 +Thursday,14,8.3 +Saturday,17,4.8 +Saturday,13,6.5 +Saturday,21,1.0 +Friday,13,7.7 +Sunday,10,2.8 +Sunday,10,6.1 +Friday,22,10.4 +Tuesday,7,7.5 +Saturday,19,5.3 +Monday,7,14.6 +Tuesday,18,5.8 +Tuesday,14,3.7 +Wednesday,19,1.4 +Monday,9,40.7 +Thursday,16,16.4 +Sunday,18,2.4 +Wednesday,20,6.0 +Wednesday,19,1.2 +Friday,18,1.0 +Friday,15,14.3 +Friday,10,15.8 +Saturday,10,18.2 +Saturday,19,19.1 +Thursday,12,9.0 +Monday,22,14.1 +Tuesday,12,7.1 +Saturday,7,0.5 +Monday,2,22.3 +Wednesday,20,1.6 +Tuesday,22,9.2 +Monday,21,7.9 +Wednesday,17,10.9 +Wednesday,12,17.9 +Wednesday,12,12.3 +Monday,13,24.4 +Sunday,18,2.3 +Tuesday,6,0.7 +Sunday,20,12.2 +Wednesday,9,15.1 +Monday,1,7.8 +Friday,12,3.8 +Thursday,15,0.8 +Sunday,8,12.8 +Thursday,14,12.1 +Thursday,17,6.2 +Wednesday,12,14.8 +Monday,12,10.7 +Tuesday,13,18.3 +Friday,10,1.5 +Tuesday,22,8.7 +Sunday,20,2.6 +Tuesday,18,11.3 +Friday,19,1.2 +Sunday,9,9.2 +Tuesday,11,12.3 +Saturday,16,1.2 +Monday,15,11.4 +Thursday,11,31.7 +Saturday,14,1.3 +Saturday,18,2.4 +Thursday,13,21.6 +Monday,12,6.4 +Sunday,18,10.8 +Thursday,8,5.7 +Sunday,10,5.6 +Tuesday,20,6.1 +Thursday,15,9.6 +Friday,20,5.1 +Wednesday,19,9.6 +Saturday,19,2.8 +Friday,4,20.6 +Wednesday,7,11.2 +Saturday,19,12.6 +Sunday,20,5.7 +Thursday,10,5.3 +Wednesday,15,9.7 +Saturday,15,9.9 +Wednesday,19,6.0 +Thursday,20,1.7 +Saturday,8,1.0 +Monday,18,9.7 +Tuesday,5,4.0 +Tuesday,10,2.8 +Saturday,7,6.0 +Friday,11,14.7 +Tuesday,8,7.7 +Saturday,17,3.6 +Wednesday,12,16.4 +Friday,11,18.0 +Thursday,7,7.0 +Monday,6,18.7 +Monday,11,1.7 +Friday,9,4.4 +Saturday,19,8.3 +Sunday,17,17.1 +Wednesday,10,10.6 +Saturday,3,15.5 +Tuesday,17,9.7 +Wednesday,6,25.7 +Wednesday,7,5.0 +Tuesday,22,1.2 +Saturday,7,11.2 +Monday,20,1.0 +Wednesday,8,14.3 +Sunday,14,6.9 +Thursday,15,9.3 +Thursday,4,25.1 +Sunday,19,9.2 +Wednesday,14,16.3 +Sunday,15,16.7 +Saturday,12,7.4 +Wednesday,21,18.9 +Thursday,13,14.7 +Sunday,12,11.5 +Sunday,11,16.4 +Wednesday,13,22.0 +Thursday,17,11.0 +Saturday,14,24.5 +Tuesday,21,17.3 +Tuesday,6,12.3 +Tuesday,12,16.7 +Tuesday,7,7.3 +Wednesday,15,16.8 +Saturday,9,24.5 +Saturday,10,13.9 +Wednesday,20,3.2 +Saturday,4,23.2 +Sunday,19,6.2 +Wednesday,5,17.4 +Friday,20,5.6 +Monday,11,22.9 +Friday,15,8.5 +Wednesday,10,10.1 +Thursday,15,5.2 +Sunday,13,8.4 +Monday,19,10.2 +Monday,13,16.7 +Saturday,19,7.4 +Monday,17,5.6 +Tuesday,20,1.9 +Saturday,15,15.5 +Friday,14,57.3 +Saturday,2,4.8 +Thursday,1,11.7 +Monday,20,14.5 +Tuesday,1,7.5 +Wednesday,17,5.0 +Wednesday,8,3.7 +Saturday,15,21.9 +Tuesday,6,7.3 +Saturday,17,1.7 +Sunday,18,4.3 +Saturday,9,11.7 +Wednesday,20,8.0 +Monday,19,5.3 +Thursday,19,2.7 +Friday,17,8.3 +Saturday,18,2.6 +Thursday,16,9.8 +Thursday,14,22.4 +Sunday,9,2.7 +Sunday,6,5.8 +Thursday,2,9.0 +Wednesday,1,5.4 +Monday,14,16.3 +Wednesday,17,14.4 +Tuesday,8,15.1 +Monday,9,13.5 +Friday,1,5.3 +Sunday,11,14.7 +Thursday,17,5.9 +Sunday,10,7.8 +Monday,3,8.0 +Thursday,20,0.9 +Saturday,9,8.6 +Sunday,7,13.8 +Friday,3,6.1 +Friday,18,15.8 +Wednesday,14,39.5 +Tuesday,14,16.0 +Sunday,11,17.5 +Tuesday,10,9.5 +Sunday,10,16.6 +Thursday,10,5.6 +Tuesday,10,4.8 +Sunday,12,19.8 +Monday,20,5.7 +Thursday,5,3.6 +Friday,20,6.5 +Saturday,10,22.7 +Sunday,18,8.2 +Wednesday,13,31.6 +Wednesday,22,6.9 +Monday,9,10.3 +Tuesday,22,11.9 +Friday,9,9.9 +Wednesday,6,9.6 +Monday,7,2.1 +Sunday,9,2.7 +Sunday,12,3.7 +Thursday,13,43.7 +Sunday,11,6.4 +Sunday,14,5.9 +Saturday,13,21.8 +Monday,0,26.8 +Wednesday,14,16.7 +Monday,14,10.9 +Sunday,16,2.7 +Wednesday,11,27.1 +Monday,12,2.5 +Thursday,8,7.6 +Tuesday,15,4.9 +Sunday,14,30.5 +Tuesday,9,11.4 +Wednesday,18,4.8 +Monday,19,12.8 +Sunday,14,11.8 +Wednesday,20,4.9 +Friday,13,4.3 +Friday,7,8.4 +Tuesday,8,3.7 +Sunday,18,3.5 +Friday,8,15.9 +Wednesday,13,27.9 +Monday,10,2.5 +Saturday,20,2.5 +Thursday,20,2.3 +Sunday,4,25.8 +Saturday,0,13.8 +Thursday,17,5.5 +Friday,13,16.4 +Thursday,11,4.8 +Wednesday,19,7.2 +Monday,9,29.0 +Friday,8,10.9 +Wednesday,9,11.9 +Wednesday,18,6.2 +Monday,20,4.7 +Wednesday,16,10.5 +Saturday,21,2.2 +Saturday,10,5.2 +Wednesday,13,2.5 +Sunday,8,3.9 +Saturday,20,4.2 +Wednesday,15,2.6 +Saturday,14,31.1 +Sunday,18,0.9 +Sunday,14,5.9 +Wednesday,21,1.9 +Saturday,9,4.1 +Monday,11,49.4 +Monday,20,8.6 +Wednesday,9,19.7 +Wednesday,19,6.7 +Friday,17,10.1 +Monday,19,5.3 +Saturday,15,18.3 +Friday,20,12.2 +Wednesday,19,8.5 +Thursday,17,5.6 +Thursday,10,24.1 +Wednesday,22,10.8 +Monday,20,7.8 +Monday,10,7.4 +Friday,10,10.2 +Sunday,13,7.1 +Saturday,2,10.9 +Saturday,9,11.0 +Sunday,0,5.9 +Friday,19,4.5 +Tuesday,21,5.5 +Wednesday,12,12.0 +Thursday,18,8.7 +Wednesday,19,7.0 +Wednesday,22,16.9 +Monday,19,1.8 +Sunday,15,4.4 +Thursday,4,5.4 +Tuesday,17,7.9 +Tuesday,17,4.9 +Sunday,18,16.6 +Wednesday,7,6.2 +Tuesday,12,2.2 +Thursday,19,0.6 +Wednesday,8,7.2 +Wednesday,12,15.5 +Saturday,18,5.4 +Saturday,2,11.6 +Sunday,12,24.2 +Sunday,11,8.4 +Wednesday,20,1.7 +Tuesday,10,11.2 +Thursday,20,4.6 +Wednesday,19,20.2 +Monday,17,8.1 +Monday,7,11.2 +Tuesday,14,8.2 +Wednesday,11,8.7 +Tuesday,16,20.0 +Wednesday,12,10.5 +Saturday,2,15.2 +Friday,10,8.7 +Friday,20,1.8 +Monday,9,11.8 +Tuesday,12,8.2 +Tuesday,13,9.8 +Monday,11,11.9 +Thursday,15,12.0 +Tuesday,10,4.6 +Saturday,7,2.8 +Saturday,15,9.8 +Thursday,2,24.6 +Thursday,20,5.2 +Saturday,19,3.1 +Wednesday,3,5.1 +Saturday,19,1.4 +Sunday,2,9.4 +Thursday,3,12.6 +Friday,11,24.3 +Saturday,9,3.0 +Sunday,9,5.9 +Monday,7,0.3 +Sunday,10,12.9 +Wednesday,9,9.6 +Saturday,10,14.7 +Thursday,9,2.7 +Monday,13,58.2 +Monday,16,20.9 +Thursday,8,16.8 +Tuesday,14,15.3 +Saturday,15,11.7 +Monday,18,5.5 +Monday,23,20.4 +Monday,5,12.0 +Wednesday,4,24.2 +Wednesday,13,4.6 +Sunday,7,7.3 +Friday,11,48.7 +Sunday,17,4.8 +Thursday,13,12.7 +Saturday,9,8.9 +Monday,8,16.5 +Thursday,14,7.8 +Tuesday,13,6.4 +Thursday,15,10.1 +Sunday,14,5.6 +Wednesday,15,18.0 +Saturday,8,5.6 +Thursday,17,20.4 +Friday,9,4.6 +Saturday,23,5.6 +Wednesday,20,15.2 +Monday,13,6.6 +Monday,16,0.6 +Tuesday,16,14.7 +Friday,9,2.1 +Tuesday,15,13.8 +Sunday,18,16.5 +Thursday,3,3.9 +Tuesday,14,5.3 +Tuesday,19,6.3 +Sunday,20,12.1 +Monday,14,17.6 +Tuesday,7,12.9 +Monday,8,5.6 +Monday,20,8.2 +Tuesday,5,26.6 +Friday,9,12.8 +Monday,20,0.8 +Saturday,8,11.6 +Thursday,0,19.4 +Saturday,18,10.4 +Tuesday,8,3.4 +Saturday,19,2.6 +Monday,10,6.7 +Friday,11,5.1 +Monday,20,6.2 +Tuesday,14,23.8 +Wednesday,4,25.6 +Thursday,18,8.0 +Monday,20,15.0 +Tuesday,8,6.9 +Sunday,13,37.4 +Friday,6,24.9 +Monday,19,23.7 +Sunday,16,5.8 +Sunday,21,26.6 +Sunday,18,6.9 +Saturday,8,18.5 +Friday,7,7.2 +Sunday,7,11.1 +Saturday,8,12.1 +Monday,20,8.6 +Wednesday,10,11.9 +Friday,20,1.2 +Tuesday,19,4.8 +Friday,5,19.2 +Thursday,19,2.9 +Tuesday,1,17.4 +Friday,6,3.8 +Thursday,18,8.4 +Monday,7,14.0 +Saturday,9,9.6 +Tuesday,19,3.4 +Friday,15,5.5 +Monday,7,13.9 +Friday,10,29.1 +Wednesday,9,16.7 +Sunday,17,10.6 +Friday,13,7.3 +Sunday,11,31.3 +Tuesday,20,8.7 +Monday,7,7.0 +Sunday,8,11.7 +Thursday,22,2.5 +Monday,18,7.0 +Friday,16,24.3 +Monday,17,11.3 +Monday,20,8.0 +Thursday,0,14.2 +Thursday,19,7.2 +Friday,12,9.6 +Tuesday,3,3.8 +Friday,20,15.4 +Thursday,19,8.3 +Thursday,12,14.4 +Sunday,11,12.8 +Monday,16,7.5 +Friday,10,13.2 +Thursday,6,3.4 +Friday,5,23.3 +Sunday,20,3.1 +Friday,13,14.2 +Wednesday,10,32.8 +Thursday,14,7.9 +Friday,14,6.5 +Thursday,10,3.1 +Thursday,13,4.8 +Sunday,16,8.7 +Thursday,19,12.0 +Friday,7,6.5 +Friday,11,10.9 +Friday,12,1.7 +Sunday,8,4.4 +Thursday,12,11.4 +Friday,20,12.8 +Wednesday,22,29.2 +Sunday,7,7.5 +Friday,15,1.6 +Wednesday,12,9.4 +Sunday,8,9.8 +Thursday,21,8.7 +Saturday,8,13.4 +Thursday,0,8.7 +Saturday,10,10.8 +Thursday,11,34.4 +Monday,8,8.2 +Sunday,13,6.1 +Saturday,13,6.1 +Tuesday,17,0.8 +Monday,22,13.0 +Sunday,19,8.8 +Tuesday,14,14.0 +Tuesday,14,10.7 +Tuesday,18,2.7 +Sunday,0,9.5 +Friday,4,4.4 +Thursday,14,26.6 +Wednesday,14,6.1 +Wednesday,19,17.0 +Friday,11,32.1 +Thursday,11,17.7 +Wednesday,1,26.3 +Thursday,20,3.4 +Friday,9,4.0 +Thursday,15,12.0 +Tuesday,17,12.8 +Saturday,7,7.6 +Saturday,18,4.2 +Friday,14,12.3 +Thursday,6,4.6 +Sunday,11,19.7 +Wednesday,8,6.8 +Friday,17,8.5 +Wednesday,8,21.0 +Tuesday,13,20.6 +Saturday,7,8.2 +Friday,20,3.1 +Thursday,15,4.2 +Monday,18,5.7 +Wednesday,13,12.4 +Monday,15,4.1 +Saturday,7,2.9 +Thursday,8,10.2 +Tuesday,15,9.3 +Tuesday,11,14.6 +Monday,18,0.7 +Friday,18,10.7 +Monday,4,16.1 +Tuesday,11,11.2 +Friday,17,10.5 +Friday,11,25.0 +Sunday,11,11.4 +Sunday,14,19.6 +Friday,4,21.8 +Saturday,12,17.4 +Sunday,23,3.3 +Thursday,16,3.2 +Tuesday,12,34.5 +Friday,19,14.7 +Saturday,1,16.8 +Friday,20,7.0 +Thursday,20,3.9 +Saturday,9,31.5 +Sunday,20,4.7 +Monday,9,19.0 +Saturday,20,4.7 +Friday,23,12.0 +Wednesday,20,6.5 +Monday,8,24.0 +Saturday,17,9.0 +Wednesday,12,31.1 +Monday,8,15.1 +Wednesday,6,14.2 +Wednesday,12,29.6 +Tuesday,9,8.1 +Sunday,9,9.4 +Wednesday,15,2.1 +Tuesday,8,1.5 +Tuesday,14,31.3 +Friday,15,32.2 +Sunday,18,2.3 +Wednesday,10,40.3 +Friday,2,17.0 +Thursday,11,16.9 +Friday,9,29.5 +Wednesday,10,6.5 +Saturday,16,3.8 +Monday,18,5.8 +Tuesday,18,6.5 +Tuesday,19,7.5 +Friday,18,4.6 +Wednesday,20,1.2 +Saturday,9,8.5 +Sunday,17,1.7 +Thursday,20,2.4 +Wednesday,9,26.5 +Wednesday,15,21.9 +Tuesday,13,2.9 +Thursday,18,3.8 +Monday,19,0.9 +Monday,15,11.6 +Tuesday,7,11.0 +Saturday,10,12.6 +Tuesday,9,3.8 +Sunday,18,5.9 +Monday,8,6.5 +Sunday,8,8.5 +Monday,20,18.4 +Saturday,23,9.1 +Thursday,15,12.8 +Friday,9,12.4 +Wednesday,20,8.2 +Saturday,7,9.5 +Friday,15,1.8 +Monday,11,11.5 +Tuesday,14,15.4 +Tuesday,17,2.9 +Wednesday,18,10.4 +Monday,9,4.3 +Friday,12,1.2 +Wednesday,12,12.0 +Sunday,7,16.5 +Friday,14,8.2 +Tuesday,19,3.8 +Monday,4,19.0 +Wednesday,15,8.8 +Wednesday,23,1.7 +Saturday,4,9.0 +Monday,8,2.0 +Friday,23,1.7 +Sunday,4,11.1 +Wednesday,14,38.7 +Sunday,15,15.2 +Sunday,3,6.5 +Saturday,19,16.8 +Tuesday,4,22.6 +Tuesday,11,2.4 +Tuesday,18,6.5 +Friday,3,5.8 +Tuesday,18,6.7 +Saturday,18,13.4 +Friday,17,19.0 +Tuesday,12,8.9 +Monday,2,24.2 +Wednesday,9,6.8 +Friday,11,9.2 +Saturday,16,0.7 +Friday,10,39.9 +Thursday,15,2.0 +Monday,3,22.8 +Tuesday,10,2.7 +Tuesday,18,6.0 +Monday,17,1.5 +Thursday,8,4.6 +Thursday,9,6.4 +Wednesday,16,4.3 +Saturday,13,22.0 +Tuesday,19,9.6 +Wednesday,17,3.5 +Wednesday,7,1.3 +Wednesday,17,6.0 +Friday,8,4.8 +Monday,13,12.0 +Thursday,19,11.0 +Saturday,17,0.9 +Tuesday,8,10.9 +Tuesday,20,1.5 +Tuesday,20,5.8 +Monday,14,13.3 +Saturday,4,18.4 +Monday,17,6.3 +Saturday,8,6.0 +Thursday,15,10.8 +Wednesday,17,17.9 +Thursday,12,6.5 +Friday,10,28.7 +Saturday,13,9.5 +Monday,9,0.9 +Thursday,7,1.3 +Thursday,4,3.7 +Friday,8,4.6 +Monday,14,12.0 +Monday,15,5.0 +Monday,4,12.2 +Friday,17,30.5 +Monday,11,19.2 +Sunday,10,3.0 +Sunday,11,6.8 +Sunday,15,8.0 +Saturday,9,13.5 +Friday,0,16.3 +Friday,19,3.0 +Wednesday,10,20.9 +Tuesday,10,17.0 +Wednesday,8,19.8 +Monday,10,0.8 +Friday,17,8.2 +Friday,7,13.3 +Wednesday,17,16.0 +Friday,7,1.1 +Saturday,11,6.5 +Saturday,13,11.4 +Friday,18,1.6 +Tuesday,8,8.8 +Saturday,10,5.3 +Sunday,16,0.7 +Friday,19,13.7 +Friday,19,0.2 +Monday,7,10.1 +Saturday,18,0.9 +Saturday,17,9.8 +Thursday,14,12.5 +Sunday,11,24.6 +Saturday,18,8.5 +Friday,18,9.7 +Wednesday,15,8.0 +Tuesday,10,12.6 +Tuesday,0,10.6 +Wednesday,5,9.1 +Sunday,18,5.7 +Friday,10,8.8 +Sunday,8,10.2 +Friday,6,4.0 +Thursday,22,17.6 +Tuesday,12,6.4 +Thursday,14,5.1 +Friday,7,8.2 +Monday,12,14.8 +Sunday,10,3.1 +Saturday,10,30.2 +Sunday,15,14.3 +Thursday,14,10.2 +Wednesday,2,24.7 +Monday,18,13.5 +Monday,4,16.1 +Thursday,11,26.3 +Tuesday,16,9.1 +Thursday,16,4.4 +Wednesday,12,11.2 +Friday,12,0.5 +Wednesday,12,6.4 +Sunday,15,7.9 +Thursday,22,20.2 +Friday,17,3.4 +Thursday,11,14.4 +Sunday,17,6.5 +Thursday,14,12.9 +Wednesday,11,30.9 +Wednesday,12,23.1 +Saturday,14,9.1 +Wednesday,15,17.7 +Friday,22,11.4 +Friday,20,6.3 +Wednesday,3,2.5 +Friday,13,13.3 +Tuesday,9,15.4 +Monday,1,15.9 +Wednesday,8,5.3 +Tuesday,12,52.5 +Monday,8,4.1 +Thursday,19,3.4 +Tuesday,10,10.6 +Friday,9,7.1 +Saturday,7,4.6 +Wednesday,19,2.2 +Saturday,10,16.6 +Sunday,15,4.9 +Wednesday,7,10.8 +Friday,6,12.4 +Friday,15,18.4 +Monday,11,33.3 +Wednesday,19,4.9 +Sunday,14,30.1 +Thursday,16,9.7 +Saturday,14,34.1 +Sunday,18,11.9 +Wednesday,10,31.2 +Monday,14,16.2 +Friday,14,19.6 +Friday,14,6.7 +Friday,16,9.5 +Thursday,16,17.7 +Monday,18,8.0 +Thursday,10,26.2 +Saturday,23,2.1 +Wednesday,20,5.6 +Monday,12,5.8 +Wednesday,11,11.6 +Monday,16,8.4 +Tuesday,11,10.2 +Tuesday,9,26.0 +Wednesday,8,10.8 +Saturday,21,14.9 +Sunday,5,13.3 +Friday,8,8.5 +Monday,9,39.8 +Thursday,20,2.6 +Thursday,14,11.1 +Friday,1,34.5 +Tuesday,0,28.3 +Friday,20,17.2 +Monday,15,10.9 +Saturday,19,6.3 +Monday,9,8.5 +Saturday,8,4.4 +Saturday,20,8.1 +Thursday,20,4.5 +Monday,1,17.0 +Saturday,4,11.9 +Wednesday,7,12.9 +Tuesday,11,7.1 +Thursday,9,10.2 +Saturday,13,4.7 +Friday,16,7.9 +Friday,13,4.3 +Wednesday,20,7.2 +Saturday,4,13.0 +Friday,12,8.2 +Wednesday,13,11.2 +Thursday,15,15.0 +Wednesday,10,20.1 +Sunday,8,10.1 +Friday,9,8.1 +Friday,17,3.8 +Wednesday,12,20.0 +Sunday,10,6.3 +Thursday,9,3.9 +Saturday,12,10.9 +Monday,18,4.3 +Tuesday,7,9.3 +Saturday,16,9.7 +Thursday,16,1.7 +Sunday,15,8.8 +Friday,19,7.3 +Tuesday,11,5.1 +Monday,18,7.1 +Sunday,20,1.2 +Sunday,8,14.0 +Tuesday,9,31.0 +Saturday,14,25.8 +Sunday,20,15.8 +Tuesday,13,20.0 +Saturday,4,10.5 +Wednesday,16,2.5 +Friday,20,5.2 +Monday,19,7.6 +Monday,19,8.4 +Sunday,2,7.1 +Wednesday,7,1.4 +Monday,17,3.1 +Friday,11,19.2 +Tuesday,5,33.4 +Saturday,3,4.8 +Friday,18,6.8 +Monday,7,21.4 +Wednesday,13,5.7 +Thursday,15,18.1 +Sunday,16,4.8 +Friday,8,13.4 +Saturday,11,5.1 +Tuesday,8,7.8 +Wednesday,6,11.1 +Thursday,0,2.1 +Sunday,12,13.6 +Friday,23,2.0 +Tuesday,17,3.7 +Monday,18,4.8 +Wednesday,0,16.2 +Tuesday,10,4.8 +Tuesday,20,7.3 +Sunday,18,2.7 +Tuesday,23,5.7 +Saturday,14,0.7 +Thursday,8,13.6 +Sunday,19,12.0 +Saturday,12,6.5 +Wednesday,23,3.3 +Monday,20,0.3 +Monday,8,3.9 +Sunday,11,16.2 +Monday,19,2.6 +Thursday,17,8.3 +Wednesday,8,33.0 +Tuesday,15,8.6 +Wednesday,8,3.2 +Tuesday,11,3.4 +Tuesday,11,5.4 +Tuesday,13,6.9 +Sunday,8,2.2 +Sunday,17,4.0 +Monday,8,6.7 +Sunday,16,8.4 +Monday,11,30.7 +Friday,7,7.7 +Friday,11,4.8 +Sunday,17,2.1 +Tuesday,12,27.1 +Sunday,3,8.8 +Monday,23,15.1 +Tuesday,13,13.3 +Wednesday,1,5.5 +Tuesday,9,9.2 +Saturday,11,15.2 +Tuesday,7,4.5 +Wednesday,12,3.7 +Tuesday,12,13.4 +Monday,16,11.3 +Saturday,11,30.3 +Monday,20,17.8 +Monday,18,5.7 +Monday,7,5.9 +Saturday,12,15.1 +Thursday,9,10.2 diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-renamed/case.json b/agents/evals/fixtures/cases/heatmap-basic-letsplot-renamed/case.json new file mode 100644 index 00000000000..261aab3c33f --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-renamed/case.json @@ -0,0 +1,29 @@ +{ + "spec_id": "heatmap-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "y", + "column": "Wochentag" + }, + { + "role": "x", + "column": "Stunde" + }, + { + "role": "value", + "column": "Antwortzeit Ø (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "renamed", + "synthetic", + "renamed-headers", + "non-ascii-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, renamed)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-renamed/data.csv b/agents/evals/fixtures/cases/heatmap-basic-letsplot-renamed/data.csv new file mode 100644 index 00000000000..9ecbdd0a6d9 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-renamed/data.csv @@ -0,0 +1,169 @@ +Wochentag,Stunde,Antwortzeit Ø (min) +Monday,0,14.2 +Monday,1,15.3 +Monday,2,14.3 +Monday,3,14.8 +Monday,4,14.6 +Monday,5,14.8 +Monday,6,13.5 +Monday,7,8.7 +Monday,8,10.2 +Monday,9,11.4 +Monday,10,14.5 +Monday,11,16.2 +Monday,12,17.9 +Monday,13,16.8 +Monday,14,14.7 +Monday,15,13.2 +Monday,16,10.9 +Monday,17,8.6 +Monday,18,6.9 +Monday,19,6.0 +Monday,20,6.5 +Monday,21,13.8 +Monday,22,13.1 +Monday,23,14.4 +Tuesday,0,14.2 +Tuesday,1,13.3 +Tuesday,2,13.6 +Tuesday,3,14.8 +Tuesday,4,14.2 +Tuesday,5,14.2 +Tuesday,6,14.2 +Tuesday,7,6.7 +Tuesday,8,9.5 +Tuesday,9,13.2 +Tuesday,10,15.7 +Tuesday,11,17.4 +Tuesday,12,18.2 +Tuesday,13,16.1 +Tuesday,14,15.4 +Tuesday,15,13.5 +Tuesday,16,12.0 +Tuesday,17,9.8 +Tuesday,18,7.0 +Tuesday,19,7.1 +Tuesday,20,5.8 +Tuesday,21,14.1 +Tuesday,22,13.7 +Tuesday,23,14.3 +Wednesday,0,15.4 +Wednesday,1,14.5 +Wednesday,2,14.1 +Wednesday,3,12.6 +Wednesday,4,14.3 +Wednesday,5,13.4 +Wednesday,6,16.0 +Wednesday,7,7.4 +Wednesday,8,8.7 +Wednesday,9,11.8 +Wednesday,10,15.3 +Wednesday,11,14.9 +Wednesday,12,16.2 +Wednesday,13,15.9 +Wednesday,14,15.3 +Wednesday,15,13.4 +Wednesday,16,10.9 +Wednesday,17,10.1 +Wednesday,18,7.9 +Wednesday,19,6.0 +Wednesday,20,6.2 +Wednesday,21,13.9 +Wednesday,22,14.5 +Wednesday,23,13.2 +Thursday,0,13.0 +Thursday,1,14.3 +Thursday,2,14.4 +Thursday,3,13.6 +Thursday,4,13.9 +Thursday,5,12.9 +Thursday,6,13.6 +Thursday,7,7.7 +Thursday,8,9.5 +Thursday,9,12.8 +Thursday,10,14.7 +Thursday,11,17.0 +Thursday,12,15.3 +Thursday,13,15.7 +Thursday,14,14.7 +Thursday,15,13.1 +Thursday,16,12.0 +Thursday,17,9.4 +Thursday,18,6.7 +Thursday,19,7.3 +Thursday,20,7.8 +Thursday,21,13.4 +Thursday,22,13.8 +Thursday,23,14.0 +Friday,0,14.6 +Friday,1,14.6 +Friday,2,14.3 +Friday,3,14.8 +Friday,4,13.7 +Friday,5,13.9 +Friday,6,15.0 +Friday,7,7.6 +Friday,8,9.2 +Friday,9,12.3 +Friday,10,15.0 +Friday,11,14.7 +Friday,12,15.5 +Friday,13,15.7 +Friday,14,15.4 +Friday,15,14.0 +Friday,16,12.4 +Friday,17,9.2 +Friday,18,5.9 +Friday,19,6.6 +Friday,20,5.9 +Friday,21,14.4 +Friday,22,14.4 +Friday,23,13.5 +Saturday,0,14.3 +Saturday,1,14.4 +Saturday,2,13.4 +Saturday,3,14.3 +Saturday,4,13.3 +Saturday,5,14.2 +Saturday,6,14.0 +Saturday,7,5.2 +Saturday,8,8.2 +Saturday,9,9.4 +Saturday,10,10.2 +Saturday,11,12.1 +Saturday,12,11.9 +Saturday,13,12.1 +Saturday,14,11.1 +Saturday,15,9.6 +Saturday,16,8.6 +Saturday,17,8.3 +Saturday,18,6.6 +Saturday,19,5.6 +Saturday,20,4.0 +Saturday,21,12.9 +Saturday,22,14.1 +Saturday,23,14.2 +Sunday,0,14.9 +Sunday,1,13.9 +Sunday,2,11.5 +Sunday,3,13.8 +Sunday,4,14.2 +Sunday,5,14.9 +Sunday,6,13.6 +Sunday,7,6.7 +Sunday,8,8.8 +Sunday,9,8.8 +Sunday,10,11.1 +Sunday,11,12.1 +Sunday,12,11.0 +Sunday,13,10.3 +Sunday,14,10.7 +Sunday,15,9.7 +Sunday,16,9.2 +Sunday,17,8.9 +Sunday,18,6.4 +Sunday,19,6.9 +Sunday,20,6.0 +Sunday,21,12.8 +Sunday,22,12.7 +Sunday,23,12.4 diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-x10/case.json b/agents/evals/fixtures/cases/heatmap-basic-letsplot-x10/case.json new file mode 100644 index 00000000000..aa935bd048d --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-x10/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "heatmap-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "y", + "column": "Weekday" + }, + { + "role": "x", + "column": "Hour" + }, + { + "role": "value", + "column": "Response Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, x10)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-letsplot-x10/data.csv b/agents/evals/fixtures/cases/heatmap-basic-letsplot-x10/data.csv new file mode 100644 index 00000000000..0acbde41bff --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-letsplot-x10/data.csv @@ -0,0 +1,169 @@ +Weekday,Hour,Response Time (min) +Monday,0,142.1 +Monday,1,153.0 +Monday,2,142.9 +Monday,3,147.9 +Monday,4,146.3 +Monday,5,147.8 +Monday,6,134.9 +Monday,7,86.6 +Monday,8,101.7 +Monday,9,113.6 +Monday,10,145.0 +Monday,11,161.6 +Monday,12,178.7 +Monday,13,167.8 +Monday,14,147.1 +Monday,15,131.8 +Monday,16,109.1 +Monday,17,85.7 +Monday,18,69.1 +Monday,19,60.2 +Monday,20,65.4 +Monday,21,138.5 +Monday,22,131.0 +Monday,23,144.0 +Tuesday,0,141.8 +Tuesday,1,132.7 +Tuesday,2,136.2 +Tuesday,3,148.4 +Tuesday,4,142.0 +Tuesday,5,142.4 +Tuesday,6,142.2 +Tuesday,7,67.3 +Tuesday,8,94.6 +Tuesday,9,131.5 +Tuesday,10,157.5 +Tuesday,11,174.2 +Tuesday,12,181.8 +Tuesday,13,161.2 +Tuesday,14,154.4 +Tuesday,15,134.8 +Tuesday,16,120.1 +Tuesday,17,98.2 +Tuesday,18,70.2 +Tuesday,19,70.7 +Tuesday,20,57.5 +Tuesday,21,141.1 +Tuesday,22,136.7 +Tuesday,23,142.7 +Wednesday,0,153.6 +Wednesday,1,145.3 +Wednesday,2,141.1 +Wednesday,3,125.5 +Wednesday,4,142.9 +Wednesday,5,134.1 +Wednesday,6,160.3 +Wednesday,7,74.2 +Wednesday,8,87.0 +Wednesday,9,117.6 +Wednesday,10,153.1 +Wednesday,11,148.8 +Wednesday,12,162.2 +Wednesday,13,158.8 +Wednesday,14,152.9 +Wednesday,15,133.9 +Wednesday,16,109.1 +Wednesday,17,101.2 +Wednesday,18,78.6 +Wednesday,19,59.6 +Wednesday,20,62.4 +Wednesday,21,138.5 +Wednesday,22,145.5 +Wednesday,23,132.3 +Thursday,0,129.6 +Thursday,1,142.6 +Thursday,2,144.2 +Thursday,3,136.2 +Thursday,4,139.3 +Thursday,5,129.1 +Thursday,6,135.7 +Thursday,7,77.0 +Thursday,8,94.6 +Thursday,9,128.4 +Thursday,10,147.4 +Thursday,11,169.8 +Thursday,12,153.4 +Thursday,13,156.7 +Thursday,14,146.6 +Thursday,15,131.2 +Thursday,16,120.1 +Thursday,17,94.3 +Thursday,18,66.6 +Thursday,19,72.7 +Thursday,20,78.0 +Thursday,21,134.2 +Thursday,22,137.9 +Thursday,23,139.9 +Friday,0,145.6 +Friday,1,145.8 +Friday,2,143.1 +Friday,3,148.2 +Friday,4,136.9 +Friday,5,139.1 +Friday,6,150.2 +Friday,7,75.7 +Friday,8,91.6 +Friday,9,122.6 +Friday,10,150.2 +Friday,11,147.5 +Friday,12,154.8 +Friday,13,156.9 +Friday,14,154.4 +Friday,15,139.7 +Friday,16,123.6 +Friday,17,91.7 +Friday,18,59.3 +Friday,19,65.5 +Friday,20,58.6 +Friday,21,143.7 +Friday,22,143.7 +Friday,23,135.4 +Saturday,0,142.9 +Saturday,1,143.9 +Saturday,2,133.6 +Saturday,3,142.8 +Saturday,4,132.7 +Saturday,5,142.3 +Saturday,6,139.6 +Saturday,7,52.0 +Saturday,8,81.9 +Saturday,9,93.8 +Saturday,10,102.2 +Saturday,11,121.3 +Saturday,12,119.1 +Saturday,13,121.1 +Saturday,14,110.7 +Saturday,15,96.3 +Saturday,16,86.3 +Saturday,17,83.2 +Saturday,18,66.4 +Saturday,19,55.6 +Saturday,20,40.1 +Saturday,21,128.9 +Saturday,22,141.5 +Saturday,23,142.4 +Sunday,0,148.8 +Sunday,1,139.5 +Sunday,2,114.9 +Sunday,3,138.4 +Sunday,4,142.3 +Sunday,5,148.6 +Sunday,6,136.0 +Sunday,7,67.1 +Sunday,8,88.3 +Sunday,9,88.3 +Sunday,10,110.8 +Sunday,11,121.3 +Sunday,12,110.4 +Sunday,13,102.6 +Sunday,14,107.0 +Sunday,15,97.3 +Sunday,16,91.8 +Sunday,17,89.3 +Sunday,18,63.5 +Sunday,19,69.3 +Sunday,20,59.7 +Sunday,21,128.1 +Sunday,22,127.1 +Sunday,23,124.0 diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-date/case.json b/agents/evals/fixtures/cases/heatmap-basic-pygal-date/case.json new file mode 100644 index 00000000000..16c8d069e83 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-date/case.json @@ -0,0 +1,30 @@ +{ + "spec_id": "heatmap-basic", + "library": "pygal", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "y", + "column": "Weekday" + }, + { + "role": "x", + "column": "Hour" + }, + { + "role": "value", + "column": "Response Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, date)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-date/data.csv b/agents/evals/fixtures/cases/heatmap-basic-pygal-date/data.csv new file mode 100644 index 00000000000..3e75b7d7aeb --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-date/data.csv @@ -0,0 +1,169 @@ +Weekday,Hour,Response Time (min),Week Of,Exported On +Monday,0,14.2,26.01.2026,2026-01-27 +Monday,1,15.3,07.01.2026,2026-01-09 +Monday,2,14.3,31.01.2026,2026-02-02 +Monday,3,14.8,08.03.2026,2026-03-12 +Monday,4,14.6,20.04.2026,2026-04-20 +Monday,5,14.8,06.04.2026,2026-04-06 +Monday,6,13.5,09.03.2026,2026-03-12 +Monday,7,8.7,11.05.2026,2026-05-12 +Monday,8,10.2,16.06.2026,2026-06-20 +Monday,9,11.4,26.04.2026,2026-04-29 +Monday,10,14.5,11.02.2026,2026-02-12 +Monday,11,16.2,10.04.2026,2026-04-14 +Monday,12,17.9,30.03.2026,2026-04-03 +Monday,13,16.8,12.03.2026,2026-03-14 +Monday,14,14.7,10.03.2026,2026-03-14 +Monday,15,13.2,14.04.2026,2026-04-16 +Monday,16,10.9,26.04.2026,2026-04-26 +Monday,17,8.6,18.05.2026,2026-05-18 +Monday,18,6.9,29.05.2026,2026-05-30 +Monday,19,6.0,23.05.2026,2026-05-23 +Monday,20,6.5,10.01.2026,2026-01-13 +Monday,21,13.8,16.02.2026,2026-02-19 +Monday,22,13.1,20.06.2026,2026-06-22 +Monday,23,14.4,29.01.2026,2026-01-31 +Tuesday,0,14.2,25.06.2026,2026-06-25 +Tuesday,1,13.3,20.02.2026,2026-02-21 +Tuesday,2,13.6,06.01.2026,2026-01-10 +Tuesday,3,14.8,12.06.2026,2026-06-12 +Tuesday,4,14.2,18.02.2026,2026-02-20 +Tuesday,5,14.2,25.03.2026,2026-03-28 +Tuesday,6,14.2,03.02.2026,2026-02-05 +Tuesday,7,6.7,10.05.2026,2026-05-12 +Tuesday,8,9.5,06.03.2026,2026-03-09 +Tuesday,9,13.2,04.05.2026,2026-05-07 +Tuesday,10,15.7,15.03.2026,2026-03-17 +Tuesday,11,17.4,22.02.2026,2026-02-23 +Tuesday,12,18.2,19.06.2026,2026-06-21 +Tuesday,13,16.1,03.06.2026,2026-06-06 +Tuesday,14,15.4,29.04.2026,2026-05-01 +Tuesday,15,13.5,05.02.2026,2026-02-08 +Tuesday,16,12.0,23.01.2026,2026-01-23 +Tuesday,17,9.8,17.05.2026,2026-05-18 +Tuesday,18,7.0,23.06.2026,2026-06-24 +Tuesday,19,7.1,04.02.2026,2026-02-05 +Tuesday,20,5.8,04.04.2026,2026-04-04 +Tuesday,21,14.1,03.03.2026,2026-03-03 +Tuesday,22,13.7,26.05.2026,2026-05-27 +Tuesday,23,14.3,14.02.2026,2026-02-18 +Wednesday,0,15.4,24.03.2026,2026-03-25 +Wednesday,1,14.5,31.01.2026,2026-01-31 +Wednesday,2,14.1,05.01.2026,2026-01-05 +Wednesday,3,12.6,25.04.2026,2026-04-26 +Wednesday,4,14.3,26.06.2026,2026-06-30 +Wednesday,5,13.4,07.05.2026,2026-05-09 +Wednesday,6,16.0,18.03.2026,2026-03-18 +Wednesday,7,7.4,15.05.2026,2026-05-15 +Wednesday,8,8.7,07.05.2026,2026-05-11 +Wednesday,9,11.8,24.02.2026,2026-02-27 +Wednesday,10,15.3,08.02.2026,2026-02-12 +Wednesday,11,14.9,25.05.2026,2026-05-26 +Wednesday,12,16.2,10.02.2026,2026-02-11 +Wednesday,13,15.9,02.05.2026,2026-05-05 +Wednesday,14,15.3,24.06.2026,2026-06-25 +Wednesday,15,13.4,20.05.2026,2026-05-22 +Wednesday,16,10.9,08.05.2026,2026-05-11 +Wednesday,17,10.1,20.02.2026,2026-02-24 +Wednesday,18,7.9,11.01.2026,2026-01-11 +Wednesday,19,6.0,20.05.2026,2026-05-24 +Wednesday,20,6.2,03.03.2026,2026-03-03 +Wednesday,21,13.9,06.04.2026,2026-04-08 +Wednesday,22,14.5,16.01.2026,2026-01-19 +Wednesday,23,13.2,07.01.2026,2026-01-10 +Thursday,0,13.0,25.05.2026,2026-05-26 +Thursday,1,14.3,27.01.2026,2026-01-29 +Thursday,2,14.4,19.03.2026,2026-03-23 +Thursday,3,13.6,27.03.2026,2026-03-30 +Thursday,4,13.9,28.02.2026,2026-03-02 +Thursday,5,12.9,11.04.2026,2026-04-15 +Thursday,6,13.6,26.03.2026,2026-03-26 +Thursday,7,7.7,15.02.2026,2026-02-16 +Thursday,8,9.5,19.03.2026,2026-03-20 +Thursday,9,12.8,15.05.2026,2026-05-15 +Thursday,10,14.7,15.05.2026,2026-05-17 +Thursday,11,17.0,12.01.2026,2026-01-13 +Thursday,12,15.3,21.01.2026,2026-01-23 +Thursday,13,15.7,23.02.2026,2026-02-23 +Thursday,14,14.7,28.05.2026,2026-05-31 +Thursday,15,13.1,25.02.2026,2026-02-27 +Thursday,16,12.0,19.05.2026,2026-05-19 +Thursday,17,9.4,15.05.2026,2026-05-15 +Thursday,18,6.7,08.03.2026,2026-03-12 +Thursday,19,7.3,06.04.2026,2026-04-07 +Thursday,20,7.8,06.04.2026,2026-04-07 +Thursday,21,13.4,12.04.2026,2026-04-14 +Thursday,22,13.8,18.02.2026,2026-02-21 +Thursday,23,14.0,10.06.2026,2026-06-11 +Friday,0,14.6,28.03.2026,2026-04-01 +Friday,1,14.6,25.01.2026,2026-01-28 +Friday,2,14.3,02.06.2026,2026-06-06 +Friday,3,14.8,07.06.2026,2026-06-09 +Friday,4,13.7,08.01.2026,2026-01-10 +Friday,5,13.9,09.04.2026,2026-04-11 +Friday,6,15.0,09.04.2026,2026-04-10 +Friday,7,7.6,02.03.2026,2026-03-02 +Friday,8,9.2,29.04.2026,2026-05-03 +Friday,9,12.3,12.02.2026,2026-02-13 +Friday,10,15.0,13.05.2026,2026-05-17 +Friday,11,14.7,18.04.2026,2026-04-22 +Friday,12,15.5,01.02.2026,2026-02-04 +Friday,13,15.7,01.04.2026,2026-04-02 +Friday,14,15.4,25.01.2026,2026-01-26 +Friday,15,14.0,17.05.2026,2026-05-20 +Friday,16,12.4,08.02.2026,2026-02-09 +Friday,17,9.2,03.07.2026,2026-07-03 +Friday,18,5.9,14.03.2026,2026-03-18 +Friday,19,6.6,19.01.2026,2026-01-21 +Friday,20,5.9,15.03.2026,2026-03-19 +Friday,21,14.4,22.01.2026,2026-01-25 +Friday,22,14.4,15.05.2026,2026-05-15 +Friday,23,13.5,29.06.2026,2026-07-03 +Saturday,0,14.3,08.01.2026,2026-01-10 +Saturday,1,14.4,23.02.2026,2026-02-24 +Saturday,2,13.4,24.01.2026,2026-01-26 +Saturday,3,14.3,30.06.2026,2026-07-03 +Saturday,4,13.3,26.02.2026,2026-02-28 +Saturday,5,14.2,31.05.2026,2026-06-04 +Saturday,6,14.0,03.03.2026,2026-03-03 +Saturday,7,5.2,04.05.2026,2026-05-05 +Saturday,8,8.2,15.03.2026,2026-03-19 +Saturday,9,9.4,16.04.2026,2026-04-19 +Saturday,10,10.2,14.03.2026,2026-03-16 +Saturday,11,12.1,10.05.2026,2026-05-11 +Saturday,12,11.9,24.04.2026,2026-04-25 +Saturday,13,12.1,04.06.2026,2026-06-08 +Saturday,14,11.1,31.05.2026,2026-06-04 +Saturday,15,9.6,02.03.2026,2026-03-02 +Saturday,16,8.6,16.03.2026,2026-03-20 +Saturday,17,8.3,28.05.2026,2026-05-29 +Saturday,18,6.6,13.01.2026,2026-01-14 +Saturday,19,5.6,26.02.2026,2026-03-02 +Saturday,20,4.0,28.04.2026,2026-05-01 +Saturday,21,12.9,23.03.2026,2026-03-25 +Saturday,22,14.1,08.03.2026,2026-03-10 +Saturday,23,14.2,19.03.2026,2026-03-21 +Sunday,0,14.9,11.05.2026,2026-05-14 +Sunday,1,13.9,05.05.2026,2026-05-09 +Sunday,2,11.5,26.04.2026,2026-04-29 +Sunday,3,13.8,10.03.2026,2026-03-12 +Sunday,4,14.2,28.04.2026,2026-05-01 +Sunday,5,14.9,23.06.2026,2026-06-27 +Sunday,6,13.6,23.04.2026,2026-04-26 +Sunday,7,6.7,20.04.2026,2026-04-24 +Sunday,8,8.8,23.06.2026,2026-06-23 +Sunday,9,8.8,13.01.2026,2026-01-17 +Sunday,10,11.1,30.06.2026,2026-07-01 +Sunday,11,12.1,16.06.2026,2026-06-18 +Sunday,12,11.0,11.02.2026,2026-02-14 +Sunday,13,10.3,29.03.2026,2026-03-29 +Sunday,14,10.7,06.02.2026,2026-02-06 +Sunday,15,9.7,10.02.2026,2026-02-10 +Sunday,16,9.2,29.05.2026,2026-05-30 +Sunday,17,8.9,10.04.2026,2026-04-13 +Sunday,18,6.4,05.01.2026,2026-01-06 +Sunday,19,6.9,01.03.2026,2026-03-05 +Sunday,20,6.0,23.05.2026,2026-05-23 +Sunday,21,12.8,09.06.2026,2026-06-13 +Sunday,22,12.7,31.03.2026,2026-04-03 +Sunday,23,12.4,21.03.2026,2026-03-21 diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-decimal-comma/case.json b/agents/evals/fixtures/cases/heatmap-basic-pygal-decimal-comma/case.json new file mode 100644 index 00000000000..f51aa20756e --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-decimal-comma/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "heatmap-basic", + "library": "pygal", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "y", + "column": "Weekday" + }, + { + "role": "x", + "column": "Hour" + }, + { + "role": "value", + "column": "Response Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-decimal-comma/data.csv b/agents/evals/fixtures/cases/heatmap-basic-pygal-decimal-comma/data.csv new file mode 100644 index 00000000000..8b23d956716 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-decimal-comma/data.csv @@ -0,0 +1,169 @@ +Weekday;Hour;Response Time (min) +Monday;0;14,2 +Monday;1;15,3 +Monday;2;14,3 +Monday;3;14,8 +Monday;4;14,6 +Monday;5;14,8 +Monday;6;13,5 +Monday;7;8,7 +Monday;8;10,2 +Monday;9;11,4 +Monday;10;14,5 +Monday;11;16,2 +Monday;12;17,9 +Monday;13;16,8 +Monday;14;14,7 +Monday;15;13,2 +Monday;16;10,9 +Monday;17;8,6 +Monday;18;6,9 +Monday;19;6,0 +Monday;20;6,5 +Monday;21;13,8 +Monday;22;13,1 +Monday;23;14,4 +Tuesday;0;14,2 +Tuesday;1;13,3 +Tuesday;2;13,6 +Tuesday;3;14,8 +Tuesday;4;14,2 +Tuesday;5;14,2 +Tuesday;6;14,2 +Tuesday;7;6,7 +Tuesday;8;9,5 +Tuesday;9;13,2 +Tuesday;10;15,7 +Tuesday;11;17,4 +Tuesday;12;18,2 +Tuesday;13;16,1 +Tuesday;14;15,4 +Tuesday;15;13,5 +Tuesday;16;12,0 +Tuesday;17;9,8 +Tuesday;18;7,0 +Tuesday;19;7,1 +Tuesday;20;5,8 +Tuesday;21;14,1 +Tuesday;22;13,7 +Tuesday;23;14,3 +Wednesday;0;15,4 +Wednesday;1;14,5 +Wednesday;2;14,1 +Wednesday;3;12,6 +Wednesday;4;14,3 +Wednesday;5;13,4 +Wednesday;6;16,0 +Wednesday;7;7,4 +Wednesday;8;8,7 +Wednesday;9;11,8 +Wednesday;10;15,3 +Wednesday;11;14,9 +Wednesday;12;16,2 +Wednesday;13;15,9 +Wednesday;14;15,3 +Wednesday;15;13,4 +Wednesday;16;10,9 +Wednesday;17;10,1 +Wednesday;18;7,9 +Wednesday;19;6,0 +Wednesday;20;6,2 +Wednesday;21;13,9 +Wednesday;22;14,5 +Wednesday;23;13,2 +Thursday;0;13,0 +Thursday;1;14,3 +Thursday;2;14,4 +Thursday;3;13,6 +Thursday;4;13,9 +Thursday;5;12,9 +Thursday;6;13,6 +Thursday;7;7,7 +Thursday;8;9,5 +Thursday;9;12,8 +Thursday;10;14,7 +Thursday;11;17,0 +Thursday;12;15,3 +Thursday;13;15,7 +Thursday;14;14,7 +Thursday;15;13,1 +Thursday;16;12,0 +Thursday;17;9,4 +Thursday;18;6,7 +Thursday;19;7,3 +Thursday;20;7,8 +Thursday;21;13,4 +Thursday;22;13,8 +Thursday;23;14,0 +Friday;0;14,6 +Friday;1;14,6 +Friday;2;14,3 +Friday;3;14,8 +Friday;4;13,7 +Friday;5;13,9 +Friday;6;15,0 +Friday;7;7,6 +Friday;8;9,2 +Friday;9;12,3 +Friday;10;15,0 +Friday;11;14,7 +Friday;12;15,5 +Friday;13;15,7 +Friday;14;15,4 +Friday;15;14,0 +Friday;16;12,4 +Friday;17;9,2 +Friday;18;5,9 +Friday;19;6,6 +Friday;20;5,9 +Friday;21;14,4 +Friday;22;14,4 +Friday;23;13,5 +Saturday;0;14,3 +Saturday;1;14,4 +Saturday;2;13,4 +Saturday;3;14,3 +Saturday;4;13,3 +Saturday;5;14,2 +Saturday;6;14,0 +Saturday;7;5,2 +Saturday;8;8,2 +Saturday;9;9,4 +Saturday;10;10,2 +Saturday;11;12,1 +Saturday;12;11,9 +Saturday;13;12,1 +Saturday;14;11,1 +Saturday;15;9,6 +Saturday;16;8,6 +Saturday;17;8,3 +Saturday;18;6,6 +Saturday;19;5,6 +Saturday;20;4,0 +Saturday;21;12,9 +Saturday;22;14,1 +Saturday;23;14,2 +Sunday;0;14,9 +Sunday;1;13,9 +Sunday;2;11,5 +Sunday;3;13,8 +Sunday;4;14,2 +Sunday;5;14,9 +Sunday;6;13,6 +Sunday;7;6,7 +Sunday;8;8,8 +Sunday;9;8,8 +Sunday;10;11,1 +Sunday;11;12,1 +Sunday;12;11,0 +Sunday;13;10,3 +Sunday;14;10,7 +Sunday;15;9,7 +Sunday;16;9,2 +Sunday;17;8,9 +Sunday;18;6,4 +Sunday;19;6,9 +Sunday;20;6,0 +Sunday;21;12,8 +Sunday;22;12,7 +Sunday;23;12,4 diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-n12/case.json b/agents/evals/fixtures/cases/heatmap-basic-pygal-n12/case.json new file mode 100644 index 00000000000..15044555549 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-n12/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "heatmap-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "y", + "column": "Weekday" + }, + { + "role": "x", + "column": "Hour" + }, + { + "role": "value", + "column": "Response Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, n12)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-n12/data.csv b/agents/evals/fixtures/cases/heatmap-basic-pygal-n12/data.csv new file mode 100644 index 00000000000..ca5beb0ecfb --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-n12/data.csv @@ -0,0 +1,13 @@ +Weekday,Hour,Response Time (min) +Monday,8,9.1 +Monday,12,16.5 +Monday,16,10.8 +Monday,20,4.8 +Wednesday,8,10.9 +Wednesday,12,18.3 +Wednesday,16,11.6 +Wednesday,20,5.5 +Friday,8,10.8 +Friday,12,17.4 +Friday,16,11.9 +Friday,20,4.9 diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-n5000/case.json b/agents/evals/fixtures/cases/heatmap-basic-pygal-n5000/case.json new file mode 100644 index 00000000000..764f2df9e23 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-n5000/case.json @@ -0,0 +1,29 @@ +{ + "spec_id": "heatmap-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "y", + "column": "Weekday" + }, + { + "role": "x", + "column": "Hour" + }, + { + "role": "value", + "column": "Response Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "n5000", + "synthetic", + "large", + "aggregation" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, n5000)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-n5000/data.csv b/agents/evals/fixtures/cases/heatmap-basic-pygal-n5000/data.csv new file mode 100644 index 00000000000..37329786f72 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-n5000/data.csv @@ -0,0 +1,5001 @@ +Weekday,Hour,Response Time (min) +Friday,17,18.0 +Monday,20,6.2 +Wednesday,10,10.0 +Wednesday,7,9.5 +Wednesday,19,3.7 +Thursday,8,24.6 +Sunday,15,3.3 +Friday,5,59.2 +Sunday,16,8.2 +Friday,15,3.4 +Sunday,17,10.6 +Sunday,12,8.6 +Friday,20,2.6 +Tuesday,18,3.0 +Thursday,20,9.2 +Friday,6,43.2 +Saturday,18,10.5 +Thursday,10,57.3 +Friday,12,25.6 +Monday,21,15.0 +Thursday,19,2.2 +Friday,10,50.4 +Monday,7,4.1 +Wednesday,14,13.3 +Monday,12,29.1 +Tuesday,10,31.2 +Wednesday,13,6.8 +Tuesday,17,0.3 +Tuesday,16,5.4 +Wednesday,10,16.2 +Saturday,13,13.0 +Sunday,8,3.9 +Friday,11,21.0 +Wednesday,21,17.4 +Monday,8,30.5 +Sunday,7,4.0 +Wednesday,12,17.1 +Saturday,8,0.5 +Thursday,12,24.5 +Wednesday,18,7.1 +Sunday,3,10.6 +Friday,18,4.4 +Friday,18,3.8 +Friday,15,27.1 +Friday,7,6.5 +Saturday,17,5.5 +Thursday,14,12.5 +Monday,19,3.3 +Monday,20,8.1 +Thursday,14,38.2 +Wednesday,2,12.4 +Monday,19,6.4 +Thursday,9,2.9 +Sunday,5,2.1 +Wednesday,20,3.6 +Saturday,0,15.5 +Wednesday,17,31.3 +Tuesday,20,5.5 +Tuesday,12,6.4 +Thursday,1,22.6 +Wednesday,7,8.1 +Monday,17,5.3 +Wednesday,11,25.0 +Thursday,19,1.6 +Wednesday,13,27.8 +Monday,20,6.9 +Thursday,13,9.7 +Tuesday,18,1.9 +Tuesday,19,1.8 +Saturday,1,16.2 +Wednesday,10,32.6 +Thursday,7,4.8 +Wednesday,8,9.1 +Monday,19,2.3 +Saturday,18,3.9 +Thursday,20,3.7 +Saturday,13,8.4 +Tuesday,20,10.0 +Monday,10,9.7 +Wednesday,23,5.0 +Saturday,18,9.9 +Friday,13,11.6 +Thursday,16,16.0 +Friday,16,17.0 +Friday,11,21.5 +Monday,15,6.2 +Sunday,8,2.7 +Monday,10,2.8 +Saturday,12,26.9 +Friday,9,38.9 +Friday,14,11.8 +Thursday,19,6.1 +Saturday,12,8.2 +Tuesday,21,8.2 +Saturday,20,2.0 +Sunday,13,11.4 +Tuesday,12,18.2 +Sunday,11,8.2 +Friday,20,8.7 +Saturday,21,6.2 +Saturday,10,24.2 +Friday,6,20.1 +Sunday,22,12.6 +Sunday,17,6.1 +Wednesday,13,6.6 +Thursday,20,4.3 +Saturday,12,2.3 +Sunday,18,4.2 +Tuesday,9,14.1 +Tuesday,12,3.6 +Thursday,10,9.2 +Wednesday,10,4.3 +Thursday,2,3.1 +Friday,12,13.8 +Tuesday,13,12.2 +Monday,10,18.7 +Tuesday,20,6.2 +Thursday,7,5.8 +Wednesday,9,17.6 +Friday,21,4.0 +Tuesday,14,12.0 +Wednesday,17,10.6 +Thursday,0,15.1 +Wednesday,16,10.8 +Sunday,18,4.1 +Saturday,8,1.8 +Friday,12,12.2 +Wednesday,7,8.2 +Friday,12,15.4 +Monday,2,5.8 +Thursday,8,10.2 +Wednesday,16,15.1 +Sunday,5,1.5 +Monday,9,6.0 +Thursday,20,3.6 +Sunday,18,6.1 +Monday,11,5.8 +Monday,15,10.4 +Monday,13,6.8 +Tuesday,10,2.5 +Sunday,17,3.5 +Saturday,7,4.9 +Friday,7,4.6 +Thursday,15,5.7 +Saturday,11,18.6 +Wednesday,16,16.3 +Sunday,16,8.5 +Thursday,5,64.0 +Saturday,14,5.0 +Tuesday,19,2.7 +Friday,20,5.6 +Friday,13,20.3 +Friday,9,9.5 +Sunday,17,20.2 +Tuesday,12,28.6 +Monday,15,17.7 +Sunday,17,11.0 +Saturday,12,12.0 +Monday,8,7.2 +Thursday,13,10.4 +Tuesday,20,8.7 +Tuesday,7,13.9 +Tuesday,18,8.3 +Tuesday,7,0.8 +Sunday,19,8.3 +Saturday,1,22.8 +Tuesday,16,17.7 +Sunday,9,7.1 +Wednesday,7,13.5 +Sunday,0,5.5 +Thursday,9,7.8 +Sunday,19,8.3 +Sunday,0,2.5 +Saturday,17,12.3 +Friday,22,17.9 +Saturday,15,2.8 +Wednesday,12,9.4 +Sunday,14,18.7 +Wednesday,9,6.0 +Friday,18,5.7 +Wednesday,12,12.5 +Thursday,17,8.9 +Thursday,10,4.7 +Thursday,9,48.3 +Tuesday,20,4.2 +Friday,9,18.3 +Tuesday,10,10.4 +Saturday,21,8.0 +Monday,20,9.9 +Thursday,16,12.2 +Friday,19,4.3 +Friday,17,2.9 +Sunday,11,10.1 +Thursday,8,15.1 +Sunday,20,5.4 +Thursday,3,12.2 +Sunday,13,14.1 +Tuesday,7,12.3 +Monday,16,1.3 +Thursday,23,8.4 +Monday,10,11.7 +Saturday,8,8.6 +Sunday,10,22.6 +Tuesday,20,7.1 +Thursday,16,17.5 +Saturday,10,9.9 +Sunday,22,22.5 +Thursday,17,10.8 +Sunday,19,10.8 +Tuesday,10,17.5 +Sunday,11,12.0 +Friday,9,4.0 +Monday,14,5.3 +Tuesday,19,3.7 +Friday,9,8.9 +Friday,10,19.0 +Thursday,13,11.5 +Monday,20,8.4 +Friday,1,7.0 +Saturday,13,4.5 +Monday,15,5.3 +Tuesday,20,7.0 +Wednesday,19,6.9 +Saturday,11,6.6 +Thursday,15,21.3 +Sunday,18,6.9 +Sunday,17,13.2 +Monday,16,16.6 +Saturday,8,5.9 +Thursday,7,17.4 +Thursday,9,6.7 +Tuesday,15,15.2 +Wednesday,17,5.2 +Monday,18,6.5 +Wednesday,19,21.4 +Tuesday,7,19.4 +Friday,11,0.2 +Tuesday,18,6.5 +Sunday,17,11.1 +Tuesday,11,23.7 +Friday,10,29.5 +Monday,5,5.9 +Sunday,16,17.0 +Saturday,19,12.6 +Monday,19,8.8 +Saturday,7,1.5 +Saturday,18,6.9 +Tuesday,18,5.6 +Monday,20,2.5 +Tuesday,4,17.5 +Saturday,8,2.5 +Friday,15,23.1 +Saturday,8,13.6 +Friday,22,23.6 +Tuesday,4,30.1 +Friday,8,4.3 +Sunday,14,21.6 +Sunday,12,13.8 +Friday,4,18.8 +Wednesday,15,2.2 +Monday,18,5.4 +Thursday,11,13.2 +Tuesday,1,6.6 +Thursday,17,11.8 +Wednesday,16,16.0 +Monday,15,5.2 +Thursday,5,27.6 +Thursday,17,5.4 +Tuesday,10,25.9 +Sunday,20,5.5 +Wednesday,14,35.1 +Wednesday,9,11.1 +Sunday,14,5.8 +Monday,9,10.9 +Monday,9,15.1 +Monday,5,5.1 +Tuesday,19,6.6 +Saturday,8,2.2 +Wednesday,19,2.8 +Thursday,13,17.4 +Monday,18,5.3 +Tuesday,15,3.3 +Friday,16,8.5 +Friday,20,11.1 +Sunday,12,5.6 +Sunday,19,5.8 +Monday,11,18.7 +Sunday,15,1.8 +Thursday,20,13.8 +Monday,2,23.3 +Monday,9,0.8 +Monday,14,3.0 +Thursday,9,16.8 +Wednesday,12,22.3 +Saturday,11,2.8 +Wednesday,11,4.1 +Sunday,5,9.6 +Tuesday,23,27.6 +Wednesday,10,6.1 +Wednesday,12,14.6 +Friday,14,12.8 +Tuesday,11,11.0 +Friday,19,2.2 +Sunday,19,2.4 +Tuesday,10,12.4 +Sunday,9,15.8 +Monday,8,6.3 +Friday,20,4.3 +Friday,17,5.5 +Tuesday,4,7.8 +Saturday,12,25.0 +Friday,7,18.0 +Wednesday,10,6.0 +Tuesday,19,0.8 +Monday,11,58.7 +Tuesday,0,6.4 +Tuesday,4,21.5 +Monday,17,12.7 +Friday,15,12.6 +Friday,7,11.0 +Sunday,20,8.7 +Saturday,10,30.1 +Friday,14,17.0 +Tuesday,15,11.9 +Wednesday,16,15.3 +Saturday,16,11.1 +Sunday,14,25.5 +Thursday,11,7.7 +Friday,9,4.1 +Friday,21,14.4 +Thursday,1,16.1 +Friday,17,7.3 +Friday,13,8.8 +Monday,15,14.1 +Tuesday,11,14.0 +Saturday,20,3.0 +Wednesday,11,11.5 +Thursday,5,10.3 +Tuesday,15,13.9 +Saturday,10,24.4 +Wednesday,18,12.6 +Sunday,8,8.8 +Sunday,19,3.1 +Saturday,9,7.6 +Saturday,11,16.7 +Friday,7,1.3 +Sunday,8,13.8 +Wednesday,11,5.5 +Thursday,10,3.9 +Thursday,9,9.6 +Wednesday,7,11.5 +Sunday,17,4.3 +Saturday,7,1.8 +Monday,15,5.3 +Sunday,20,6.3 +Tuesday,8,8.1 +Tuesday,19,3.9 +Wednesday,11,11.9 +Friday,15,3.4 +Tuesday,7,5.5 +Friday,17,6.0 +Wednesday,7,14.3 +Friday,17,8.6 +Wednesday,6,9.6 +Thursday,8,5.6 +Tuesday,8,13.9 +Tuesday,9,7.6 +Saturday,7,3.0 +Monday,22,1.1 +Saturday,23,12.6 +Tuesday,1,12.6 +Monday,7,5.1 +Wednesday,13,14.6 +Thursday,10,6.1 +Monday,7,2.4 +Saturday,17,3.9 +Saturday,13,5.0 +Monday,8,14.9 +Saturday,8,1.3 +Wednesday,18,7.3 +Sunday,20,13.3 +Saturday,8,1.8 +Saturday,14,12.2 +Monday,20,5.8 +Thursday,7,8.5 +Thursday,12,10.7 +Friday,19,6.3 +Wednesday,19,1.9 +Thursday,0,10.7 +Thursday,17,11.4 +Wednesday,7,3.1 +Sunday,10,6.7 +Monday,8,10.9 +Monday,17,9.1 +Tuesday,13,15.1 +Friday,16,12.1 +Monday,17,4.1 +Thursday,9,8.2 +Thursday,17,0.6 +Thursday,5,6.6 +Friday,16,9.5 +Sunday,13,0.6 +Thursday,17,1.9 +Tuesday,14,9.1 +Wednesday,20,3.4 +Tuesday,17,4.3 +Monday,23,11.1 +Monday,12,16.4 +Friday,8,9.5 +Thursday,7,13.0 +Sunday,18,7.4 +Wednesday,12,13.3 +Monday,13,8.3 +Sunday,8,7.3 +Tuesday,14,1.8 +Tuesday,9,22.1 +Thursday,12,21.6 +Saturday,20,0.6 +Tuesday,14,19.5 +Friday,8,8.0 +Wednesday,16,5.3 +Saturday,13,4.9 +Sunday,8,9.2 +Wednesday,20,5.7 +Sunday,8,7.6 +Thursday,11,15.5 +Sunday,17,9.2 +Monday,15,18.8 +Tuesday,13,14.3 +Friday,14,14.9 +Monday,10,12.6 +Saturday,17,4.0 +Wednesday,12,28.1 +Saturday,19,12.3 +Monday,20,18.0 +Sunday,13,9.9 +Monday,17,4.9 +Saturday,15,19.3 +Tuesday,15,16.5 +Saturday,18,4.2 +Tuesday,20,5.3 +Thursday,15,21.5 +Wednesday,8,5.4 +Monday,12,2.8 +Friday,9,20.7 +Wednesday,13,31.6 +Monday,9,7.8 +Monday,13,13.4 +Thursday,3,37.9 +Monday,16,29.1 +Sunday,16,29.3 +Thursday,19,2.5 +Thursday,15,16.5 +Saturday,7,7.9 +Monday,0,6.0 +Sunday,8,5.4 +Monday,20,3.4 +Saturday,2,18.8 +Thursday,10,1.0 +Friday,16,5.3 +Friday,13,13.2 +Monday,9,19.6 +Monday,17,4.8 +Tuesday,10,2.2 +Sunday,14,0.5 +Saturday,20,4.1 +Wednesday,9,0.9 +Tuesday,13,11.3 +Saturday,9,21.0 +Sunday,16,16.5 +Wednesday,10,12.6 +Monday,14,14.2 +Tuesday,8,16.6 +Friday,12,47.1 +Saturday,11,9.3 +Thursday,18,3.1 +Thursday,8,4.9 +Thursday,13,6.6 +Wednesday,12,30.4 +Saturday,15,6.8 +Friday,9,9.3 +Sunday,8,7.3 +Wednesday,18,10.8 +Friday,8,13.8 +Tuesday,20,6.0 +Saturday,11,20.9 +Wednesday,8,10.5 +Monday,21,7.2 +Tuesday,12,6.0 +Monday,10,25.8 +Sunday,17,3.0 +Monday,3,2.2 +Saturday,6,3.8 +Saturday,7,3.3 +Monday,17,2.4 +Friday,17,3.1 +Saturday,5,5.0 +Saturday,20,0.1 +Tuesday,18,7.9 +Wednesday,8,6.2 +Wednesday,10,12.9 +Thursday,16,18.5 +Sunday,7,6.1 +Wednesday,5,4.0 +Wednesday,7,12.4 +Monday,15,9.5 +Wednesday,8,12.7 +Wednesday,8,12.1 +Saturday,14,10.1 +Friday,21,17.9 +Monday,17,15.2 +Tuesday,16,24.4 +Sunday,9,5.0 +Tuesday,9,7.0 +Monday,16,21.3 +Monday,9,16.9 +Monday,9,8.5 +Saturday,11,25.7 +Saturday,6,9.5 +Wednesday,9,5.0 +Wednesday,7,4.7 +Tuesday,16,6.5 +Friday,0,8.9 +Thursday,10,15.3 +Friday,18,1.5 +Tuesday,9,9.3 +Thursday,21,28.7 +Thursday,11,19.2 +Saturday,15,3.4 +Wednesday,4,8.3 +Tuesday,8,17.3 +Monday,20,1.4 +Thursday,12,18.6 +Saturday,7,4.7 +Saturday,19,4.2 +Tuesday,16,15.9 +Monday,9,0.7 +Thursday,11,21.9 +Thursday,13,3.4 +Monday,18,5.6 +Monday,3,6.8 +Wednesday,1,42.4 +Wednesday,19,3.1 +Thursday,7,4.4 +Tuesday,17,13.9 +Tuesday,19,7.1 +Sunday,15,14.2 +Friday,4,11.2 +Wednesday,11,18.3 +Wednesday,21,5.2 +Friday,13,15.7 +Thursday,7,13.5 +Sunday,13,3.3 +Wednesday,7,2.2 +Saturday,14,5.7 +Sunday,7,3.4 +Monday,12,25.0 +Friday,10,9.2 +Monday,11,8.1 +Monday,19,2.8 +Wednesday,10,5.7 +Monday,19,2.7 +Wednesday,7,1.9 +Wednesday,5,8.6 +Thursday,9,4.8 +Thursday,14,42.3 +Monday,19,5.4 +Saturday,12,4.5 +Wednesday,13,4.1 +Tuesday,10,1.4 +Tuesday,14,20.7 +Tuesday,14,12.7 +Saturday,7,2.2 +Tuesday,20,1.2 +Saturday,3,8.8 +Friday,11,28.0 +Thursday,11,5.4 +Thursday,7,5.6 +Saturday,7,8.1 +Thursday,8,11.6 +Sunday,10,8.0 +Sunday,15,10.6 +Saturday,12,26.8 +Thursday,3,34.9 +Sunday,14,14.1 +Monday,8,3.1 +Thursday,9,11.0 +Monday,8,8.2 +Friday,19,5.6 +Saturday,13,13.7 +Sunday,17,2.6 +Sunday,1,6.5 +Thursday,15,6.2 +Saturday,17,1.7 +Sunday,13,28.1 +Friday,9,22.0 +Saturday,15,38.6 +Friday,18,14.4 +Friday,2,21.5 +Saturday,12,2.8 +Tuesday,9,19.3 +Tuesday,10,1.3 +Monday,22,9.2 +Thursday,13,19.1 +Friday,11,24.6 +Friday,8,5.6 +Tuesday,11,16.9 +Monday,10,6.2 +Friday,16,10.5 +Tuesday,23,34.0 +Friday,20,7.4 +Friday,15,21.8 +Monday,13,18.7 +Saturday,19,3.4 +Thursday,13,14.4 +Thursday,13,15.5 +Saturday,12,10.3 +Friday,12,4.2 +Wednesday,11,9.1 +Thursday,2,4.9 +Wednesday,7,12.2 +Sunday,12,1.5 +Friday,10,25.6 +Monday,16,5.6 +Wednesday,18,9.9 +Thursday,10,11.2 +Tuesday,0,6.0 +Friday,11,18.7 +Tuesday,12,18.3 +Sunday,16,10.4 +Friday,13,31.1 +Sunday,23,2.8 +Friday,10,4.1 +Friday,12,28.0 +Thursday,10,16.0 +Tuesday,20,2.1 +Saturday,15,7.2 +Wednesday,11,12.8 +Tuesday,16,15.0 +Saturday,12,6.8 +Wednesday,20,0.9 +Tuesday,8,14.4 +Friday,12,19.5 +Friday,18,17.9 +Thursday,11,21.5 +Wednesday,13,7.3 +Sunday,11,4.3 +Tuesday,16,10.7 +Thursday,8,10.7 +Sunday,17,8.3 +Friday,16,15.8 +Monday,6,7.1 +Monday,14,20.5 +Wednesday,11,13.5 +Thursday,13,19.8 +Tuesday,17,8.5 +Thursday,11,23.1 +Wednesday,23,19.9 +Tuesday,20,4.1 +Sunday,14,12.2 +Friday,10,17.5 +Saturday,18,11.1 +Saturday,3,8.5 +Monday,4,27.7 +Wednesday,15,25.4 +Friday,4,26.8 +Tuesday,17,15.1 +Thursday,22,19.5 +Sunday,13,6.2 +Friday,7,18.3 +Tuesday,14,10.6 +Thursday,12,6.5 +Sunday,7,9.8 +Thursday,10,28.3 +Thursday,17,13.7 +Wednesday,7,13.0 +Saturday,4,21.4 +Wednesday,1,11.4 +Wednesday,15,8.7 +Friday,20,8.2 +Friday,11,18.2 +Thursday,9,8.6 +Friday,9,9.0 +Saturday,19,4.7 +Friday,21,16.1 +Wednesday,19,5.2 +Monday,20,4.8 +Tuesday,15,23.2 +Friday,7,2.1 +Thursday,1,0.2 +Thursday,19,1.1 +Saturday,11,10.9 +Monday,7,4.4 +Saturday,13,9.2 +Sunday,9,2.1 +Sunday,20,6.1 +Monday,7,7.5 +Sunday,7,15.6 +Tuesday,9,26.5 +Friday,19,2.4 +Monday,17,12.5 +Thursday,16,9.2 +Tuesday,18,9.8 +Sunday,16,0.7 +Monday,17,20.9 +Monday,10,4.3 +Friday,23,38.2 +Tuesday,0,5.5 +Tuesday,19,5.1 +Wednesday,17,1.4 +Tuesday,8,16.7 +Friday,23,17.1 +Sunday,11,0.9 +Tuesday,18,9.3 +Wednesday,18,13.1 +Friday,14,7.4 +Tuesday,12,14.9 +Thursday,20,1.2 +Saturday,10,27.5 +Tuesday,16,4.0 +Friday,9,10.2 +Thursday,23,8.4 +Saturday,12,20.6 +Friday,17,1.0 +Monday,7,5.9 +Saturday,9,6.1 +Monday,20,14.7 +Tuesday,15,22.7 +Tuesday,19,11.1 +Thursday,10,5.1 +Saturday,8,5.5 +Saturday,21,3.8 +Friday,20,4.4 +Saturday,19,2.0 +Wednesday,17,23.9 +Tuesday,6,12.0 +Wednesday,0,10.7 +Sunday,3,9.5 +Tuesday,8,13.5 +Saturday,18,5.9 +Saturday,18,10.3 +Monday,10,26.1 +Saturday,8,8.0 +Sunday,13,6.6 +Wednesday,7,11.1 +Wednesday,19,2.4 +Sunday,20,5.1 +Tuesday,18,5.0 +Friday,22,18.4 +Wednesday,17,8.6 +Monday,8,3.2 +Friday,11,25.1 +Tuesday,10,17.9 +Wednesday,13,7.7 +Wednesday,16,2.1 +Friday,9,10.6 +Friday,12,26.2 +Monday,18,12.4 +Monday,18,9.0 +Sunday,18,6.9 +Monday,1,12.5 +Wednesday,15,12.2 +Wednesday,10,33.0 +Sunday,10,3.5 +Wednesday,2,13.7 +Friday,12,1.3 +Wednesday,8,28.2 +Sunday,9,4.4 +Saturday,18,0.3 +Thursday,10,9.5 +Tuesday,12,9.8 +Thursday,19,10.3 +Friday,4,15.2 +Sunday,7,5.8 +Thursday,13,5.7 +Wednesday,5,2.5 +Friday,7,4.2 +Wednesday,17,4.4 +Thursday,17,15.4 +Tuesday,14,3.3 +Friday,19,7.5 +Sunday,12,36.6 +Saturday,12,2.9 +Thursday,15,16.0 +Tuesday,15,14.2 +Sunday,12,14.5 +Wednesday,10,13.2 +Sunday,19,3.2 +Monday,19,11.1 +Wednesday,10,15.5 +Wednesday,22,19.7 +Sunday,18,13.1 +Thursday,9,6.0 +Sunday,16,2.7 +Friday,11,9.9 +Saturday,20,1.6 +Friday,12,15.8 +Saturday,13,11.9 +Wednesday,19,1.2 +Saturday,11,17.3 +Sunday,18,16.0 +Friday,14,8.5 +Saturday,10,6.9 +Tuesday,20,2.5 +Monday,19,18.2 +Sunday,23,2.7 +Saturday,7,1.7 +Sunday,12,19.0 +Sunday,10,9.5 +Sunday,7,2.9 +Monday,13,18.4 +Monday,8,4.0 +Wednesday,9,7.3 +Saturday,19,4.8 +Thursday,12,15.4 +Monday,11,32.9 +Friday,17,6.9 +Wednesday,7,4.3 +Monday,13,20.2 +Sunday,19,7.4 +Sunday,16,14.0 +Tuesday,9,11.4 +Sunday,17,13.3 +Friday,10,19.2 +Saturday,18,11.7 +Monday,18,4.8 +Thursday,8,9.1 +Wednesday,8,0.6 +Wednesday,8,4.7 +Wednesday,18,8.3 +Friday,19,10.7 +Sunday,12,22.4 +Friday,14,14.8 +Thursday,5,29.6 +Wednesday,15,8.5 +Thursday,9,11.8 +Monday,18,0.9 +Monday,11,10.2 +Sunday,8,3.8 +Thursday,13,18.6 +Sunday,14,17.2 +Saturday,16,10.8 +Saturday,7,5.3 +Wednesday,15,3.8 +Tuesday,11,16.4 +Tuesday,15,12.5 +Thursday,14,7.3 +Friday,16,26.1 +Sunday,7,8.1 +Monday,10,15.7 +Saturday,18,16.4 +Thursday,0,12.1 +Tuesday,0,5.2 +Thursday,7,6.8 +Thursday,13,10.7 +Tuesday,10,16.3 +Thursday,22,5.6 +Friday,16,9.2 +Wednesday,9,3.4 +Wednesday,19,0.5 +Thursday,14,3.0 +Saturday,23,10.7 +Friday,19,9.3 +Friday,2,16.7 +Sunday,16,8.0 +Sunday,22,9.0 +Friday,21,21.5 +Friday,7,8.3 +Tuesday,20,7.3 +Tuesday,8,9.9 +Sunday,4,31.4 +Friday,2,16.6 +Thursday,11,25.6 +Wednesday,9,27.3 +Sunday,20,3.4 +Sunday,15,2.2 +Saturday,3,8.9 +Tuesday,12,28.2 +Saturday,7,5.9 +Sunday,19,5.1 +Thursday,7,7.8 +Thursday,19,9.0 +Sunday,7,13.7 +Saturday,11,7.8 +Friday,11,25.7 +Saturday,18,9.5 +Thursday,18,5.3 +Thursday,9,4.1 +Saturday,11,5.1 +Sunday,3,21.9 +Wednesday,13,10.8 +Wednesday,4,11.6 +Wednesday,2,3.6 +Thursday,13,11.6 +Thursday,4,12.3 +Friday,12,18.7 +Wednesday,11,5.7 +Friday,10,15.8 +Friday,15,5.2 +Thursday,17,1.4 +Friday,12,9.9 +Friday,0,19.3 +Tuesday,16,5.5 +Monday,3,27.6 +Tuesday,13,5.4 +Thursday,12,10.6 +Monday,10,4.9 +Thursday,22,5.1 +Saturday,4,18.2 +Sunday,8,5.2 +Wednesday,0,10.4 +Sunday,9,5.3 +Wednesday,12,38.3 +Thursday,12,21.1 +Thursday,16,6.8 +Monday,19,6.2 +Wednesday,0,11.0 +Tuesday,10,25.6 +Monday,16,13.9 +Tuesday,3,17.0 +Monday,2,8.7 +Monday,12,13.4 +Saturday,8,2.3 +Tuesday,14,18.4 +Friday,13,13.2 +Monday,0,11.6 +Tuesday,15,23.2 +Sunday,18,7.7 +Friday,8,10.7 +Sunday,17,24.8 +Wednesday,16,18.1 +Friday,15,37.2 +Tuesday,19,8.6 +Wednesday,9,8.1 +Sunday,15,11.8 +Friday,20,2.9 +Thursday,18,7.7 +Thursday,9,13.4 +Sunday,20,7.1 +Sunday,8,7.6 +Tuesday,19,2.0 +Friday,1,23.2 +Tuesday,16,21.2 +Wednesday,11,7.7 +Friday,12,32.0 +Saturday,8,7.3 +Monday,11,11.3 +Monday,18,6.5 +Friday,14,5.4 +Wednesday,12,5.5 +Wednesday,13,8.0 +Sunday,15,3.9 +Wednesday,18,3.6 +Monday,13,17.1 +Saturday,13,7.1 +Wednesday,19,11.1 +Wednesday,21,7.5 +Wednesday,11,16.4 +Tuesday,15,23.2 +Friday,16,5.9 +Tuesday,16,7.3 +Friday,12,5.3 +Monday,13,16.3 +Tuesday,8,5.8 +Thursday,14,31.7 +Thursday,12,8.0 +Sunday,10,5.9 +Saturday,16,14.5 +Thursday,3,5.6 +Saturday,19,2.3 +Sunday,20,2.7 +Friday,11,42.4 +Thursday,9,15.9 +Thursday,8,10.2 +Wednesday,5,33.3 +Thursday,7,7.2 +Saturday,9,9.1 +Sunday,17,4.5 +Sunday,11,1.1 +Saturday,8,10.5 +Wednesday,16,8.7 +Saturday,21,33.7 +Tuesday,19,15.2 +Friday,15,4.6 +Friday,15,7.7 +Friday,8,8.0 +Wednesday,22,8.6 +Wednesday,15,28.9 +Sunday,22,24.8 +Thursday,16,10.9 +Wednesday,11,13.2 +Thursday,10,1.3 +Sunday,16,9.8 +Tuesday,15,7.2 +Saturday,19,17.7 +Sunday,12,8.6 +Tuesday,20,6.9 +Saturday,11,23.6 +Friday,8,20.3 +Sunday,11,2.1 +Monday,20,6.8 +Thursday,13,3.7 +Saturday,15,10.7 +Sunday,21,11.2 +Monday,7,1.3 +Sunday,11,2.9 +Monday,9,15.9 +Monday,21,10.7 +Saturday,11,8.1 +Friday,19,7.8 +Saturday,11,12.4 +Wednesday,8,0.5 +Thursday,21,5.1 +Sunday,3,3.6 +Saturday,14,13.1 +Monday,20,12.3 +Wednesday,8,9.9 +Monday,10,12.6 +Thursday,16,4.9 +Saturday,14,1.6 +Wednesday,14,12.7 +Sunday,12,10.5 +Tuesday,23,6.0 +Wednesday,9,11.3 +Saturday,7,14.0 +Wednesday,12,6.5 +Friday,14,3.8 +Sunday,10,7.6 +Monday,8,6.0 +Tuesday,13,3.5 +Monday,3,2.4 +Wednesday,1,11.4 +Wednesday,9,3.7 +Monday,15,16.4 +Wednesday,18,12.6 +Monday,23,14.6 +Sunday,11,9.1 +Sunday,3,17.3 +Tuesday,17,17.6 +Thursday,12,18.9 +Friday,14,34.9 +Friday,1,13.7 +Monday,9,19.3 +Sunday,15,5.4 +Saturday,17,12.4 +Saturday,20,4.7 +Monday,5,29.8 +Friday,4,13.3 +Monday,11,14.4 +Wednesday,8,10.4 +Friday,7,1.3 +Monday,3,12.5 +Monday,11,10.2 +Monday,18,16.3 +Wednesday,19,2.5 +Saturday,6,11.4 +Friday,10,6.1 +Thursday,8,7.0 +Sunday,14,4.6 +Wednesday,15,8.6 +Wednesday,11,13.0 +Saturday,8,1.3 +Sunday,9,3.4 +Monday,8,16.9 +Monday,17,17.1 +Thursday,14,11.2 +Friday,7,3.5 +Sunday,14,10.9 +Sunday,19,6.1 +Saturday,15,5.0 +Sunday,15,23.7 +Saturday,13,5.7 +Friday,10,7.3 +Tuesday,7,0.7 +Thursday,9,10.7 +Tuesday,11,11.6 +Wednesday,8,3.7 +Friday,17,35.1 +Sunday,13,6.4 +Saturday,18,0.9 +Thursday,18,3.3 +Wednesday,13,22.8 +Thursday,23,18.0 +Saturday,13,1.9 +Monday,5,20.8 +Thursday,17,20.5 +Sunday,7,7.9 +Saturday,19,5.7 +Sunday,17,8.4 +Friday,7,3.3 +Saturday,12,4.1 +Tuesday,10,14.6 +Thursday,14,16.2 +Thursday,5,6.2 +Thursday,20,6.1 +Wednesday,8,9.0 +Saturday,12,15.9 +Monday,19,3.5 +Sunday,9,6.7 +Sunday,8,7.0 +Tuesday,9,23.7 +Monday,13,15.0 +Thursday,8,5.6 +Saturday,15,5.2 +Wednesday,7,6.4 +Sunday,18,5.8 +Friday,20,1.1 +Tuesday,18,4.8 +Friday,12,15.2 +Monday,13,13.8 +Friday,20,13.2 +Thursday,8,6.1 +Sunday,1,5.8 +Saturday,17,3.3 +Wednesday,9,15.1 +Wednesday,7,4.2 +Friday,16,15.2 +Wednesday,16,9.1 +Monday,12,16.7 +Thursday,1,25.2 +Thursday,17,6.9 +Friday,12,10.2 +Saturday,19,3.2 +Wednesday,12,13.4 +Tuesday,19,12.4 +Wednesday,15,9.9 +Saturday,8,1.6 +Monday,13,1.2 +Thursday,10,6.7 +Wednesday,15,3.1 +Sunday,15,11.4 +Thursday,16,9.6 +Sunday,12,14.4 +Friday,17,3.0 +Wednesday,23,4.2 +Wednesday,14,23.6 +Thursday,11,14.2 +Saturday,14,6.4 +Saturday,4,11.8 +Sunday,7,1.5 +Wednesday,8,1.7 +Thursday,18,2.7 +Friday,17,4.0 +Wednesday,18,11.3 +Saturday,8,4.2 +Saturday,14,10.3 +Sunday,12,8.2 +Monday,7,1.1 +Monday,11,17.8 +Sunday,10,1.3 +Friday,19,3.7 +Thursday,8,20.8 +Sunday,4,33.7 +Friday,10,14.8 +Friday,20,0.3 +Monday,7,14.5 +Thursday,9,3.0 +Monday,18,22.1 +Sunday,18,5.4 +Friday,16,15.8 +Tuesday,12,56.8 +Thursday,4,10.1 +Wednesday,11,23.2 +Saturday,11,3.7 +Saturday,18,8.3 +Saturday,11,15.6 +Friday,20,15.4 +Tuesday,7,1.6 +Sunday,20,7.7 +Saturday,19,2.1 +Thursday,20,8.0 +Tuesday,8,6.3 +Friday,18,6.4 +Friday,19,7.8 +Sunday,9,11.0 +Thursday,12,30.6 +Wednesday,11,23.4 +Thursday,10,37.5 +Saturday,9,9.1 +Sunday,13,22.4 +Wednesday,14,9.9 +Tuesday,15,13.2 +Friday,16,4.0 +Tuesday,7,1.7 +Wednesday,9,1.3 +Sunday,2,14.7 +Friday,19,10.7 +Wednesday,7,12.8 +Tuesday,15,27.3 +Monday,9,23.1 +Wednesday,13,13.0 +Sunday,17,17.5 +Monday,13,27.4 +Monday,10,0.9 +Saturday,10,4.3 +Thursday,23,9.4 +Monday,10,28.8 +Saturday,21,28.5 +Thursday,8,3.2 +Friday,10,3.2 +Thursday,17,5.9 +Saturday,12,20.9 +Sunday,19,8.9 +Monday,14,18.6 +Saturday,12,17.8 +Monday,23,23.0 +Wednesday,18,4.7 +Sunday,17,19.9 +Saturday,13,7.9 +Tuesday,17,15.5 +Friday,12,3.7 +Sunday,12,29.1 +Wednesday,13,22.0 +Wednesday,16,22.3 +Wednesday,13,8.7 +Sunday,7,33.9 +Tuesday,8,4.1 +Friday,2,6.7 +Tuesday,19,26.1 +Sunday,4,4.7 +Saturday,18,3.0 +Monday,20,5.6 +Wednesday,9,7.0 +Saturday,16,10.7 +Saturday,7,8.0 +Tuesday,4,4.6 +Tuesday,5,4.5 +Thursday,8,6.0 +Monday,15,7.0 +Friday,16,27.7 +Thursday,12,4.7 +Wednesday,17,7.0 +Sunday,14,42.2 +Tuesday,21,6.7 +Monday,8,14.3 +Saturday,12,5.5 +Monday,7,8.3 +Friday,10,18.8 +Friday,0,22.8 +Friday,12,24.8 +Friday,9,21.9 +Tuesday,4,5.0 +Wednesday,13,20.6 +Thursday,16,14.4 +Monday,18,7.0 +Wednesday,12,22.8 +Thursday,8,3.2 +Saturday,7,5.3 +Thursday,11,1.2 +Wednesday,7,12.3 +Monday,4,18.9 +Tuesday,9,12.0 +Friday,20,5.5 +Wednesday,20,1.1 +Friday,16,5.5 +Tuesday,16,28.7 +Saturday,12,8.7 +Monday,17,5.4 +Tuesday,15,11.7 +Friday,8,7.5 +Wednesday,20,2.5 +Thursday,19,1.6 +Sunday,10,5.9 +Monday,20,6.6 +Wednesday,19,7.4 +Monday,12,8.8 +Wednesday,13,8.3 +Wednesday,20,5.2 +Sunday,13,5.0 +Saturday,19,5.9 +Friday,3,11.2 +Monday,9,7.5 +Tuesday,10,23.0 +Tuesday,22,25.9 +Sunday,9,1.6 +Friday,10,8.0 +Friday,8,11.0 +Thursday,18,5.1 +Monday,9,5.1 +Friday,16,6.6 +Wednesday,15,27.7 +Wednesday,15,3.7 +Wednesday,10,37.0 +Sunday,11,3.5 +Thursday,18,9.7 +Sunday,14,9.7 +Sunday,5,4.4 +Sunday,17,9.5 +Wednesday,14,5.1 +Saturday,10,10.4 +Wednesday,15,9.9 +Thursday,9,8.6 +Friday,8,5.0 +Sunday,20,3.2 +Tuesday,20,7.8 +Wednesday,18,6.2 +Tuesday,12,25.9 +Monday,10,27.9 +Friday,9,9.1 +Friday,6,6.0 +Sunday,9,12.2 +Sunday,5,18.6 +Monday,8,7.3 +Monday,8,13.1 +Saturday,18,3.0 +Tuesday,10,18.5 +Monday,16,12.1 +Thursday,18,0.7 +Thursday,12,6.2 +Monday,11,20.4 +Tuesday,8,6.6 +Saturday,0,11.9 +Thursday,17,4.0 +Tuesday,14,16.5 +Tuesday,18,6.2 +Friday,16,6.0 +Sunday,11,2.4 +Saturday,14,9.7 +Friday,11,27.9 +Friday,8,3.5 +Tuesday,9,10.2 +Tuesday,16,10.3 +Saturday,13,13.4 +Tuesday,18,10.8 +Wednesday,20,10.9 +Tuesday,18,4.8 +Friday,7,2.2 +Saturday,10,16.2 +Friday,13,9.0 +Sunday,9,7.9 +Thursday,16,10.1 +Saturday,16,3.7 +Thursday,7,16.2 +Monday,10,7.8 +Tuesday,18,13.7 +Sunday,18,2.6 +Saturday,20,6.1 +Sunday,9,23.2 +Thursday,16,12.5 +Friday,15,7.1 +Sunday,17,15.1 +Saturday,12,10.3 +Tuesday,15,2.6 +Friday,0,16.7 +Monday,20,2.3 +Saturday,10,15.9 +Monday,13,21.9 +Thursday,8,3.1 +Tuesday,8,2.4 +Saturday,7,9.5 +Thursday,9,13.1 +Tuesday,14,8.6 +Monday,9,8.7 +Monday,13,3.0 +Wednesday,13,8.2 +Wednesday,19,8.1 +Sunday,9,25.4 +Friday,19,8.5 +Friday,17,15.5 +Friday,15,21.8 +Friday,19,2.1 +Wednesday,14,12.6 +Thursday,18,5.4 +Sunday,9,5.1 +Thursday,11,14.4 +Monday,4,12.4 +Wednesday,8,6.8 +Tuesday,7,3.5 +Saturday,8,19.7 +Friday,9,17.6 +Tuesday,12,20.5 +Monday,8,3.3 +Saturday,12,6.0 +Saturday,5,19.7 +Tuesday,9,16.6 +Thursday,9,19.3 +Thursday,14,16.5 +Friday,18,2.1 +Friday,10,6.1 +Monday,19,3.9 +Friday,9,18.1 +Saturday,18,8.7 +Tuesday,15,6.4 +Thursday,10,12.6 +Thursday,19,2.3 +Wednesday,18,9.5 +Friday,20,5.8 +Thursday,9,4.4 +Saturday,18,2.8 +Friday,13,8.7 +Sunday,16,8.0 +Wednesday,13,20.2 +Sunday,10,22.4 +Sunday,3,11.0 +Saturday,15,9.9 +Thursday,11,17.4 +Thursday,20,4.3 +Monday,14,32.1 +Thursday,20,6.8 +Sunday,15,16.0 +Thursday,10,10.6 +Sunday,8,7.9 +Sunday,16,6.3 +Sunday,18,1.0 +Wednesday,5,9.5 +Tuesday,14,8.4 +Friday,11,25.9 +Sunday,14,26.5 +Thursday,16,4.5 +Friday,17,3.6 +Thursday,16,12.5 +Sunday,15,15.0 +Thursday,8,11.0 +Friday,14,67.5 +Wednesday,23,24.0 +Friday,16,7.7 +Saturday,13,10.1 +Thursday,17,5.9 +Tuesday,23,28.1 +Friday,11,15.2 +Tuesday,11,9.5 +Monday,3,9.2 +Sunday,20,1.6 +Wednesday,18,12.1 +Sunday,15,16.4 +Friday,14,24.7 +Monday,16,6.9 +Sunday,14,6.7 +Saturday,7,1.6 +Sunday,10,0.9 +Thursday,16,11.6 +Friday,14,31.1 +Sunday,10,8.4 +Friday,19,3.2 +Friday,14,17.7 +Monday,13,1.4 +Wednesday,9,20.9 +Sunday,20,2.7 +Tuesday,9,8.3 +Wednesday,10,3.9 +Thursday,9,5.6 +Friday,20,1.5 +Monday,10,75.2 +Friday,15,24.2 +Monday,12,9.9 +Monday,9,17.2 +Saturday,7,1.8 +Tuesday,19,19.5 +Tuesday,12,6.2 +Saturday,17,0.3 +Saturday,16,8.7 +Friday,16,7.2 +Wednesday,14,44.3 +Wednesday,14,5.7 +Thursday,7,2.3 +Saturday,13,3.9 +Sunday,9,11.4 +Thursday,19,6.8 +Wednesday,14,25.5 +Wednesday,13,8.3 +Wednesday,20,6.0 +Saturday,15,14.1 +Tuesday,5,11.8 +Wednesday,10,7.9 +Wednesday,8,1.2 +Tuesday,19,0.8 +Tuesday,18,6.6 +Wednesday,20,1.0 +Saturday,12,10.3 +Sunday,7,2.6 +Thursday,11,8.1 +Saturday,19,13.0 +Thursday,12,13.6 +Saturday,13,2.6 +Saturday,8,10.3 +Thursday,13,29.3 +Wednesday,4,4.5 +Sunday,12,3.5 +Tuesday,13,9.4 +Saturday,10,11.3 +Tuesday,1,2.4 +Tuesday,13,12.1 +Monday,8,2.0 +Saturday,11,5.9 +Wednesday,16,5.7 +Friday,20,8.0 +Monday,20,3.2 +Monday,7,5.0 +Sunday,17,5.4 +Wednesday,9,8.6 +Friday,19,8.3 +Sunday,12,22.5 +Monday,9,8.5 +Friday,7,6.4 +Tuesday,14,23.3 +Wednesday,13,24.9 +Saturday,18,5.8 +Friday,12,18.7 +Thursday,7,1.2 +Saturday,0,12.8 +Tuesday,10,3.4 +Thursday,7,11.5 +Friday,18,11.1 +Saturday,4,10.7 +Monday,22,27.7 +Wednesday,0,7.4 +Friday,18,2.8 +Wednesday,14,21.0 +Friday,17,0.9 +Tuesday,20,4.2 +Sunday,17,0.7 +Sunday,11,14.9 +Sunday,16,7.0 +Monday,16,3.9 +Wednesday,21,14.4 +Tuesday,4,9.4 +Tuesday,15,2.6 +Saturday,10,13.5 +Saturday,14,18.4 +Tuesday,10,1.6 +Friday,12,16.0 +Saturday,18,7.4 +Sunday,16,12.8 +Monday,15,30.1 +Wednesday,3,8.2 +Thursday,21,7.5 +Thursday,22,0.4 +Wednesday,20,4.8 +Sunday,2,7.6 +Tuesday,0,8.8 +Thursday,18,11.3 +Thursday,8,10.3 +Monday,8,2.5 +Monday,11,9.1 +Monday,19,7.7 +Wednesday,6,11.0 +Saturday,15,3.6 +Wednesday,11,23.7 +Saturday,18,5.8 +Tuesday,8,1.6 +Monday,15,3.6 +Wednesday,19,2.2 +Thursday,8,17.1 +Wednesday,14,11.7 +Friday,19,1.9 +Wednesday,12,11.8 +Wednesday,4,27.6 +Monday,12,23.0 +Tuesday,7,3.0 +Wednesday,5,28.9 +Tuesday,16,19.9 +Thursday,10,4.2 +Thursday,11,7.4 +Saturday,16,13.1 +Friday,12,6.1 +Thursday,11,18.9 +Wednesday,13,8.4 +Wednesday,7,3.8 +Friday,16,16.4 +Wednesday,9,26.5 +Friday,3,24.5 +Sunday,10,7.9 +Tuesday,12,9.6 +Wednesday,16,15.3 +Saturday,7,4.9 +Saturday,14,9.6 +Thursday,14,5.4 +Monday,9,15.1 +Tuesday,5,10.5 +Thursday,13,31.6 +Thursday,19,5.2 +Tuesday,18,13.0 +Sunday,18,11.6 +Tuesday,15,9.1 +Friday,3,6.6 +Saturday,23,5.1 +Friday,5,22.5 +Monday,19,6.8 +Tuesday,19,0.6 +Monday,10,9.8 +Sunday,15,18.1 +Sunday,20,6.2 +Tuesday,7,6.3 +Wednesday,1,7.0 +Monday,8,22.3 +Sunday,17,13.9 +Monday,20,10.6 +Thursday,15,2.7 +Wednesday,8,4.4 +Sunday,15,13.4 +Sunday,8,2.4 +Wednesday,4,3.2 +Saturday,2,3.2 +Thursday,16,6.1 +Saturday,7,3.9 +Wednesday,5,26.5 +Monday,7,2.1 +Saturday,20,6.4 +Wednesday,16,20.7 +Wednesday,23,22.9 +Wednesday,20,4.1 +Friday,10,10.6 +Wednesday,2,28.5 +Thursday,11,43.3 +Monday,18,3.8 +Wednesday,11,33.0 +Sunday,17,5.4 +Saturday,20,2.3 +Tuesday,14,10.2 +Friday,13,3.1 +Wednesday,18,16.8 +Monday,3,14.1 +Saturday,14,7.3 +Wednesday,12,21.1 +Tuesday,16,9.0 +Friday,12,54.7 +Friday,18,11.6 +Saturday,8,2.4 +Tuesday,19,2.6 +Saturday,13,5.3 +Tuesday,20,3.3 +Saturday,13,2.2 +Wednesday,9,18.2 +Wednesday,16,46.0 +Thursday,12,27.1 +Saturday,9,7.9 +Friday,20,3.2 +Friday,20,10.7 +Wednesday,9,4.8 +Saturday,11,15.5 +Thursday,14,6.9 +Thursday,9,34.9 +Wednesday,16,6.2 +Thursday,10,12.3 +Thursday,12,14.9 +Thursday,3,5.3 +Tuesday,14,19.1 +Saturday,22,15.4 +Monday,8,3.6 +Tuesday,10,19.8 +Wednesday,19,11.3 +Friday,12,10.6 +Monday,19,7.8 +Thursday,17,6.4 +Tuesday,17,16.9 +Friday,10,3.7 +Sunday,2,4.0 +Friday,7,2.4 +Wednesday,13,9.9 +Thursday,12,2.5 +Tuesday,4,15.5 +Saturday,19,8.8 +Thursday,19,10.8 +Friday,17,3.9 +Monday,12,17.4 +Monday,20,2.4 +Thursday,10,15.0 +Wednesday,7,4.6 +Wednesday,7,12.0 +Sunday,1,3.3 +Friday,15,7.5 +Sunday,23,18.2 +Friday,13,19.2 +Monday,10,12.3 +Wednesday,7,5.7 +Wednesday,9,14.3 +Wednesday,14,27.7 +Saturday,16,2.6 +Wednesday,9,2.1 +Monday,5,13.9 +Friday,12,7.6 +Monday,9,1.9 +Wednesday,14,44.6 +Wednesday,7,29.3 +Thursday,6,24.2 +Tuesday,15,3.3 +Saturday,7,13.6 +Thursday,20,3.1 +Saturday,18,8.9 +Saturday,14,4.2 +Monday,12,15.8 +Wednesday,10,1.0 +Thursday,8,7.6 +Tuesday,15,20.9 +Saturday,17,9.8 +Tuesday,18,3.8 +Wednesday,7,11.7 +Tuesday,3,21.4 +Tuesday,19,1.5 +Saturday,18,5.5 +Monday,20,1.2 +Thursday,10,4.7 +Tuesday,3,22.4 +Tuesday,22,12.2 +Monday,15,2.7 +Wednesday,20,6.2 +Wednesday,17,7.3 +Saturday,19,3.5 +Sunday,6,7.2 +Thursday,15,26.8 +Tuesday,18,3.3 +Thursday,8,10.6 +Friday,12,31.5 +Monday,4,16.2 +Wednesday,7,5.0 +Wednesday,5,0.2 +Saturday,19,5.4 +Monday,9,11.9 +Wednesday,19,2.5 +Wednesday,13,17.4 +Thursday,9,17.8 +Tuesday,20,1.1 +Tuesday,13,36.3 +Monday,12,36.0 +Friday,19,15.4 +Friday,8,11.4 +Thursday,14,6.6 +Wednesday,7,5.6 +Thursday,10,18.1 +Tuesday,15,8.9 +Monday,14,23.7 +Wednesday,13,6.2 +Friday,16,14.4 +Tuesday,8,3.3 +Wednesday,6,11.0 +Saturday,9,13.4 +Saturday,11,22.6 +Friday,21,15.5 +Saturday,13,19.3 +Monday,9,29.0 +Sunday,14,3.4 +Monday,14,10.3 +Monday,11,5.9 +Wednesday,11,71.5 +Sunday,9,3.1 +Thursday,9,11.2 +Saturday,8,4.4 +Monday,9,11.6 +Wednesday,8,1.3 +Tuesday,15,4.3 +Saturday,10,11.3 +Friday,11,34.6 +Wednesday,8,9.8 +Friday,9,11.6 +Tuesday,18,12.0 +Tuesday,8,12.1 +Thursday,16,15.3 +Thursday,20,10.3 +Saturday,13,6.6 +Tuesday,19,9.7 +Wednesday,8,17.5 +Saturday,11,4.2 +Wednesday,13,11.6 +Monday,14,13.6 +Wednesday,14,11.1 +Wednesday,9,5.8 +Saturday,16,4.8 +Friday,9,2.7 +Friday,11,22.8 +Saturday,19,4.7 +Sunday,14,9.3 +Monday,17,26.1 +Sunday,16,4.8 +Tuesday,18,3.6 +Saturday,9,2.7 +Thursday,20,10.0 +Saturday,11,14.0 +Sunday,4,35.2 +Friday,20,4.1 +Friday,10,39.4 +Tuesday,11,37.6 +Thursday,9,1.6 +Saturday,20,4.8 +Wednesday,20,4.7 +Monday,4,14.6 +Tuesday,12,7.4 +Friday,21,25.1 +Wednesday,20,16.8 +Saturday,18,2.3 +Wednesday,20,9.4 +Wednesday,5,11.4 +Monday,17,2.2 +Wednesday,15,10.9 +Friday,10,11.7 +Tuesday,14,20.4 +Thursday,18,6.7 +Saturday,13,16.6 +Wednesday,20,1.8 +Wednesday,9,21.2 +Wednesday,19,10.7 +Tuesday,14,22.4 +Tuesday,9,2.9 +Friday,11,1.7 +Monday,20,2.2 +Wednesday,17,7.2 +Thursday,20,1.5 +Saturday,19,16.9 +Tuesday,15,10.9 +Wednesday,18,8.2 +Thursday,22,15.7 +Tuesday,2,2.1 +Friday,17,20.0 +Thursday,16,18.0 +Thursday,11,4.3 +Wednesday,19,2.3 +Tuesday,6,19.5 +Wednesday,18,3.8 +Tuesday,14,11.9 +Friday,23,10.4 +Sunday,12,9.0 +Monday,15,6.7 +Friday,12,3.4 +Tuesday,1,4.5 +Monday,16,3.9 +Monday,9,20.6 +Thursday,13,21.8 +Saturday,18,10.9 +Saturday,20,4.4 +Tuesday,17,13.8 +Saturday,17,7.2 +Saturday,14,1.0 +Monday,18,3.8 +Sunday,19,7.3 +Sunday,9,2.2 +Thursday,16,14.6 +Wednesday,20,16.6 +Wednesday,1,15.2 +Tuesday,17,1.4 +Saturday,11,6.0 +Wednesday,16,11.8 +Thursday,0,8.6 +Wednesday,14,24.7 +Thursday,4,5.7 +Monday,9,12.5 +Monday,9,2.6 +Thursday,21,16.1 +Sunday,8,6.1 +Tuesday,17,1.5 +Monday,12,24.0 +Tuesday,9,0.1 +Sunday,7,3.0 +Sunday,8,4.0 +Tuesday,18,14.7 +Sunday,17,3.7 +Tuesday,19,4.3 +Friday,7,4.8 +Wednesday,18,9.9 +Thursday,17,3.5 +Saturday,17,1.7 +Wednesday,18,2.0 +Friday,20,11.2 +Sunday,2,2.7 +Friday,22,22.9 +Monday,14,20.5 +Wednesday,17,2.6 +Friday,17,17.8 +Wednesday,13,1.2 +Sunday,20,5.8 +Monday,9,1.7 +Sunday,15,23.5 +Thursday,2,5.8 +Tuesday,18,9.5 +Wednesday,11,3.4 +Thursday,17,13.2 +Saturday,10,11.6 +Friday,11,22.7 +Monday,9,18.4 +Monday,9,5.6 +Saturday,7,3.7 +Friday,6,16.1 +Monday,9,7.6 +Thursday,20,4.6 +Tuesday,17,1.8 +Saturday,16,5.8 +Wednesday,16,6.3 +Monday,20,1.8 +Wednesday,12,17.5 +Saturday,10,6.6 +Thursday,9,10.7 +Wednesday,10,23.9 +Thursday,8,7.4 +Monday,13,3.7 +Tuesday,20,1.1 +Tuesday,17,17.0 +Thursday,4,9.8 +Monday,23,10.6 +Sunday,20,2.9 +Wednesday,8,15.8 +Saturday,20,10.0 +Tuesday,6,38.6 +Wednesday,15,8.4 +Wednesday,6,12.5 +Wednesday,0,2.8 +Tuesday,10,14.8 +Monday,17,19.6 +Friday,20,11.1 +Friday,14,7.4 +Wednesday,19,2.6 +Tuesday,20,5.1 +Monday,9,8.8 +Saturday,19,9.2 +Sunday,11,19.6 +Saturday,4,11.6 +Friday,11,8.9 +Sunday,15,5.8 +Friday,9,11.4 +Tuesday,8,13.1 +Sunday,11,14.9 +Sunday,12,9.9 +Tuesday,16,3.3 +Monday,16,18.2 +Saturday,12,14.5 +Thursday,20,1.9 +Saturday,11,5.2 +Friday,19,11.8 +Tuesday,15,5.5 +Monday,13,9.8 +Saturday,16,3.0 +Wednesday,14,10.9 +Sunday,10,43.0 +Tuesday,15,28.6 +Sunday,19,4.0 +Monday,20,6.8 +Monday,12,20.3 +Thursday,12,4.3 +Tuesday,12,29.5 +Wednesday,20,2.6 +Saturday,2,7.8 +Monday,19,6.6 +Saturday,11,13.0 +Saturday,7,6.4 +Monday,9,14.3 +Sunday,3,4.7 +Tuesday,12,6.2 +Wednesday,10,9.2 +Saturday,13,11.1 +Thursday,16,11.5 +Friday,13,20.5 +Thursday,14,7.5 +Tuesday,9,16.5 +Monday,14,2.7 +Thursday,17,19.7 +Sunday,4,20.8 +Saturday,0,13.8 +Wednesday,0,18.1 +Friday,16,7.8 +Saturday,10,8.7 +Friday,18,8.1 +Saturday,22,10.1 +Friday,17,26.0 +Friday,12,9.8 +Sunday,11,13.5 +Sunday,17,8.4 +Thursday,17,2.4 +Wednesday,15,13.3 +Sunday,16,2.1 +Friday,1,39.2 +Wednesday,13,11.6 +Monday,11,6.9 +Thursday,18,9.3 +Saturday,17,7.7 +Tuesday,18,4.1 +Tuesday,14,5.1 +Thursday,14,14.8 +Wednesday,16,37.4 +Sunday,22,2.2 +Sunday,18,13.0 +Saturday,12,12.0 +Saturday,19,3.3 +Monday,11,15.7 +Friday,19,5.2 +Friday,13,12.1 +Wednesday,22,10.2 +Thursday,7,2.7 +Tuesday,19,9.8 +Wednesday,17,26.9 +Saturday,20,11.6 +Saturday,18,3.6 +Tuesday,10,23.4 +Sunday,11,15.6 +Saturday,17,13.5 +Monday,18,16.7 +Wednesday,15,8.8 +Friday,14,18.4 +Thursday,13,11.6 +Friday,13,6.5 +Wednesday,22,14.4 +Monday,16,2.8 +Tuesday,14,13.8 +Wednesday,7,5.9 +Thursday,8,2.5 +Monday,16,4.5 +Thursday,13,0.8 +Wednesday,9,12.0 +Monday,20,14.6 +Monday,21,20.1 +Monday,7,14.3 +Sunday,18,6.5 +Tuesday,8,13.8 +Monday,10,21.0 +Tuesday,8,9.1 +Monday,9,22.3 +Wednesday,15,16.3 +Friday,16,5.3 +Sunday,10,12.5 +Friday,1,12.1 +Wednesday,18,6.0 +Monday,11,27.6 +Thursday,7,3.5 +Wednesday,18,1.6 +Sunday,16,18.0 +Monday,20,5.3 +Saturday,3,16.5 +Sunday,17,6.7 +Friday,9,4.8 +Thursday,7,13.7 +Saturday,7,1.7 +Wednesday,16,26.6 +Thursday,16,17.4 +Wednesday,19,16.7 +Wednesday,22,16.8 +Monday,21,15.6 +Thursday,15,12.6 +Thursday,16,12.4 +Monday,10,19.1 +Monday,13,7.3 +Sunday,19,6.3 +Saturday,10,26.0 +Saturday,6,21.5 +Tuesday,9,3.9 +Monday,17,14.1 +Saturday,14,10.5 +Wednesday,12,11.2 +Friday,18,7.5 +Thursday,15,26.0 +Tuesday,13,4.5 +Sunday,9,12.9 +Wednesday,2,32.1 +Saturday,8,10.9 +Sunday,9,0.8 +Saturday,19,5.8 +Monday,14,8.8 +Monday,14,35.1 +Friday,9,6.1 +Wednesday,15,13.6 +Wednesday,11,6.1 +Sunday,9,13.2 +Tuesday,12,6.0 +Friday,1,30.4 +Friday,14,6.0 +Tuesday,15,17.1 +Wednesday,19,6.3 +Wednesday,18,3.1 +Tuesday,10,11.0 +Thursday,16,7.8 +Thursday,10,24.5 +Monday,15,17.4 +Sunday,19,2.1 +Friday,20,5.2 +Thursday,20,5.6 +Saturday,16,11.0 +Monday,9,3.9 +Thursday,18,6.7 +Monday,15,15.0 +Saturday,18,4.9 +Saturday,14,3.3 +Wednesday,20,4.0 +Wednesday,7,10.3 +Wednesday,17,13.1 +Wednesday,12,21.4 +Saturday,12,11.9 +Wednesday,12,14.4 +Thursday,14,10.0 +Friday,9,9.6 +Friday,9,15.3 +Saturday,18,6.9 +Sunday,7,0.4 +Friday,18,0.7 +Saturday,17,8.2 +Sunday,11,9.5 +Tuesday,8,15.0 +Sunday,11,15.4 +Sunday,14,4.2 +Saturday,12,4.3 +Wednesday,15,7.5 +Friday,14,13.2 +Thursday,17,7.0 +Wednesday,14,9.2 +Thursday,11,7.6 +Friday,15,14.0 +Tuesday,17,3.8 +Wednesday,7,13.7 +Tuesday,19,2.4 +Tuesday,11,24.1 +Tuesday,18,3.6 +Tuesday,10,42.7 +Friday,7,7.9 +Tuesday,12,16.3 +Friday,15,17.3 +Wednesday,10,9.6 +Tuesday,16,6.1 +Friday,12,12.8 +Monday,10,56.6 +Thursday,19,2.4 +Friday,23,1.4 +Monday,20,14.8 +Saturday,18,19.2 +Monday,7,7.5 +Wednesday,9,1.4 +Saturday,15,6.7 +Saturday,19,5.6 +Saturday,11,6.6 +Saturday,19,1.8 +Monday,10,14.7 +Monday,8,12.8 +Friday,11,6.4 +Monday,18,5.3 +Thursday,12,40.1 +Sunday,9,14.2 +Friday,7,15.2 +Tuesday,11,6.1 +Wednesday,16,0.6 +Tuesday,20,1.2 +Monday,8,7.9 +Wednesday,11,21.0 +Thursday,19,3.3 +Tuesday,0,11.1 +Wednesday,13,3.4 +Wednesday,15,2.5 +Friday,15,14.7 +Friday,8,10.1 +Thursday,12,1.9 +Monday,5,14.8 +Monday,7,16.1 +Thursday,2,10.9 +Wednesday,15,18.4 +Sunday,11,7.7 +Sunday,16,5.8 +Tuesday,19,4.6 +Tuesday,11,9.1 +Saturday,11,1.5 +Thursday,9,8.9 +Saturday,9,8.7 +Thursday,8,4.4 +Friday,8,11.3 +Friday,13,20.3 +Thursday,7,10.8 +Sunday,20,7.1 +Saturday,4,10.1 +Saturday,13,16.9 +Thursday,8,8.4 +Tuesday,20,1.9 +Sunday,19,2.9 +Thursday,18,10.3 +Tuesday,11,15.8 +Wednesday,9,11.4 +Tuesday,12,19.2 +Sunday,16,7.3 +Friday,11,45.3 +Monday,11,30.5 +Sunday,11,17.4 +Friday,17,25.3 +Monday,10,35.4 +Wednesday,8,2.3 +Tuesday,10,5.2 +Saturday,17,25.7 +Wednesday,17,6.6 +Saturday,17,1.3 +Friday,5,20.0 +Friday,13,5.5 +Sunday,9,17.6 +Friday,1,20.5 +Thursday,17,8.7 +Friday,14,17.4 +Friday,17,4.0 +Monday,9,1.1 +Wednesday,12,14.5 +Wednesday,8,3.7 +Friday,12,13.7 +Wednesday,18,16.8 +Wednesday,8,10.8 +Wednesday,11,15.2 +Wednesday,9,17.8 +Wednesday,15,8.6 +Tuesday,8,20.2 +Thursday,7,2.4 +Sunday,17,6.7 +Sunday,20,8.4 +Saturday,11,13.2 +Thursday,18,5.3 +Saturday,10,15.9 +Thursday,9,11.3 +Wednesday,19,5.5 +Tuesday,22,28.4 +Wednesday,9,10.1 +Tuesday,18,12.8 +Tuesday,14,9.2 +Monday,14,6.6 +Sunday,19,11.1 +Friday,4,8.8 +Wednesday,13,17.5 +Thursday,8,7.4 +Saturday,13,9.3 +Tuesday,11,27.4 +Tuesday,12,24.2 +Tuesday,14,13.4 +Wednesday,11,59.4 +Sunday,19,5.4 +Thursday,13,42.3 +Sunday,10,16.8 +Friday,13,11.5 +Monday,9,11.8 +Wednesday,7,12.8 +Thursday,19,8.8 +Sunday,8,6.5 +Wednesday,11,15.8 +Friday,7,4.0 +Friday,14,4.1 +Saturday,21,1.7 +Tuesday,11,9.9 +Friday,20,7.6 +Sunday,19,7.9 +Thursday,19,4.4 +Saturday,16,1.5 +Saturday,11,21.3 +Friday,19,1.8 +Saturday,13,3.5 +Monday,12,18.7 +Monday,16,16.4 +Sunday,15,0.5 +Friday,13,12.3 +Monday,5,23.4 +Thursday,12,9.4 +Saturday,9,3.9 +Thursday,22,14.7 +Thursday,11,21.8 +Tuesday,8,23.4 +Wednesday,13,9.3 +Friday,22,20.1 +Saturday,10,7.8 +Wednesday,18,2.9 +Thursday,6,4.7 +Friday,15,13.6 +Tuesday,12,14.3 +Sunday,21,5.0 +Saturday,14,8.5 +Sunday,1,11.2 +Thursday,17,5.6 +Tuesday,18,2.0 +Friday,7,1.7 +Friday,4,10.1 +Sunday,17,10.6 +Tuesday,19,5.1 +Sunday,19,8.0 +Sunday,11,16.0 +Saturday,14,6.4 +Tuesday,8,9.6 +Sunday,11,19.9 +Wednesday,12,11.4 +Tuesday,8,15.3 +Wednesday,12,21.4 +Tuesday,12,52.9 +Monday,17,8.9 +Friday,8,4.7 +Sunday,20,12.3 +Wednesday,20,2.3 +Wednesday,8,4.0 +Friday,19,5.9 +Saturday,8,5.5 +Friday,16,10.4 +Monday,13,4.6 +Thursday,9,7.6 +Friday,7,2.3 +Friday,11,29.8 +Friday,17,10.2 +Saturday,12,17.5 +Friday,20,7.3 +Tuesday,9,6.3 +Sunday,18,6.0 +Monday,14,4.7 +Monday,18,5.2 +Wednesday,13,13.5 +Sunday,14,1.6 +Friday,18,6.8 +Tuesday,18,5.2 +Wednesday,9,10.5 +Thursday,15,17.6 +Tuesday,13,8.6 +Sunday,14,2.7 +Monday,14,13.5 +Saturday,22,11.5 +Monday,14,7.3 +Sunday,11,29.9 +Wednesday,2,6.2 +Saturday,14,6.7 +Sunday,2,13.1 +Friday,17,1.5 +Sunday,19,1.8 +Wednesday,10,21.8 +Thursday,7,4.7 +Tuesday,11,30.2 +Saturday,15,7.4 +Wednesday,6,18.0 +Monday,7,9.0 +Sunday,17,12.5 +Sunday,17,7.2 +Wednesday,19,11.4 +Tuesday,16,2.8 +Wednesday,8,15.2 +Sunday,18,1.9 +Monday,7,5.3 +Sunday,14,12.7 +Friday,9,3.2 +Thursday,10,8.0 +Tuesday,11,3.7 +Monday,11,7.8 +Sunday,9,4.5 +Sunday,15,23.9 +Wednesday,2,11.6 +Monday,14,20.2 +Thursday,12,31.3 +Monday,13,17.1 +Thursday,11,22.5 +Thursday,19,3.0 +Wednesday,20,20.9 +Thursday,18,7.5 +Saturday,9,4.3 +Saturday,17,2.7 +Saturday,15,2.3 +Tuesday,16,28.8 +Tuesday,13,7.5 +Monday,16,9.3 +Sunday,16,2.5 +Sunday,17,5.0 +Saturday,8,2.5 +Tuesday,19,8.6 +Sunday,16,3.7 +Friday,20,15.8 +Sunday,20,2.3 +Saturday,16,12.8 +Monday,12,6.3 +Monday,20,10.9 +Thursday,13,17.5 +Friday,20,12.6 +Friday,20,4.5 +Wednesday,22,6.3 +Monday,21,23.6 +Wednesday,17,6.6 +Tuesday,13,2.1 +Monday,1,1.0 +Monday,9,17.5 +Wednesday,12,13.1 +Tuesday,15,14.7 +Monday,18,10.2 +Saturday,20,0.9 +Tuesday,2,13.7 +Sunday,14,4.7 +Sunday,12,7.7 +Thursday,14,11.7 +Wednesday,10,11.9 +Thursday,11,46.1 +Saturday,18,3.1 +Thursday,0,5.6 +Wednesday,8,8.0 +Wednesday,13,10.0 +Friday,16,12.5 +Sunday,15,3.7 +Thursday,19,8.8 +Friday,2,8.8 +Wednesday,12,41.6 +Saturday,13,3.1 +Monday,20,6.7 +Friday,18,5.7 +Wednesday,3,25.9 +Sunday,7,3.5 +Tuesday,16,29.8 +Monday,22,10.6 +Thursday,20,2.8 +Sunday,15,10.0 +Thursday,23,23.1 +Tuesday,12,85.9 +Thursday,20,9.4 +Saturday,11,10.0 +Friday,13,8.3 +Sunday,8,7.0 +Tuesday,17,27.4 +Wednesday,23,17.6 +Saturday,20,16.5 +Saturday,2,20.8 +Wednesday,18,11.4 +Monday,8,16.2 +Saturday,8,1.3 +Tuesday,17,9.7 +Saturday,17,3.2 +Thursday,11,11.8 +Saturday,13,7.8 +Wednesday,8,5.9 +Tuesday,5,9.3 +Monday,4,16.2 +Monday,12,8.4 +Monday,10,22.9 +Monday,9,7.4 +Saturday,16,4.9 +Sunday,10,9.8 +Wednesday,21,5.2 +Tuesday,9,20.2 +Thursday,8,2.0 +Monday,18,15.3 +Sunday,12,8.9 +Saturday,7,7.8 +Wednesday,13,19.5 +Saturday,12,9.6 +Friday,10,8.0 +Monday,17,9.7 +Thursday,19,15.0 +Sunday,18,3.6 +Friday,7,13.4 +Saturday,16,14.2 +Wednesday,9,25.3 +Wednesday,19,23.0 +Sunday,16,10.2 +Wednesday,9,12.9 +Monday,7,2.9 +Tuesday,0,9.0 +Saturday,15,17.0 +Monday,16,7.0 +Sunday,10,17.9 +Monday,17,9.8 +Tuesday,6,10.3 +Wednesday,10,30.5 +Monday,17,2.4 +Sunday,17,4.7 +Sunday,8,8.4 +Saturday,7,2.9 +Friday,10,12.5 +Saturday,18,9.6 +Wednesday,9,16.8 +Sunday,17,11.4 +Wednesday,17,5.0 +Saturday,16,9.0 +Sunday,22,5.6 +Wednesday,9,26.2 +Saturday,11,6.0 +Sunday,7,4.0 +Sunday,19,7.7 +Tuesday,12,11.5 +Friday,14,10.1 +Monday,23,5.8 +Friday,15,4.5 +Wednesday,15,6.7 +Friday,13,13.9 +Monday,13,13.8 +Monday,13,18.4 +Thursday,19,5.3 +Monday,16,9.9 +Tuesday,12,24.3 +Monday,7,2.5 +Wednesday,4,6.8 +Monday,23,18.5 +Saturday,18,22.8 +Wednesday,14,2.2 +Thursday,7,3.6 +Saturday,19,7.4 +Sunday,17,5.2 +Wednesday,4,7.1 +Monday,21,7.9 +Wednesday,10,3.0 +Monday,20,7.8 +Saturday,8,1.3 +Wednesday,13,19.1 +Friday,9,8.7 +Tuesday,18,1.5 +Friday,20,2.1 +Monday,18,7.2 +Saturday,10,7.5 +Thursday,10,22.0 +Tuesday,15,3.5 +Wednesday,13,16.4 +Thursday,20,7.6 +Tuesday,14,10.2 +Thursday,8,5.1 +Friday,8,23.5 +Friday,17,12.9 +Sunday,17,6.4 +Tuesday,20,6.8 +Saturday,8,4.4 +Thursday,11,22.7 +Friday,7,4.2 +Wednesday,5,8.2 +Friday,12,2.8 +Tuesday,19,17.3 +Friday,13,28.8 +Friday,16,12.2 +Friday,10,19.0 +Friday,20,5.9 +Saturday,9,0.4 +Monday,11,13.2 +Tuesday,16,4.9 +Monday,10,27.1 +Saturday,19,4.4 +Wednesday,17,24.8 +Wednesday,11,28.3 +Thursday,23,9.2 +Thursday,15,0.2 +Monday,15,28.8 +Tuesday,8,13.7 +Sunday,15,4.2 +Friday,14,3.3 +Friday,12,27.4 +Tuesday,14,21.8 +Saturday,18,8.5 +Tuesday,8,11.0 +Thursday,14,15.7 +Saturday,10,10.0 +Tuesday,17,9.3 +Saturday,18,14.9 +Wednesday,11,27.1 +Wednesday,13,12.0 +Wednesday,19,5.1 +Thursday,16,29.8 +Thursday,9,8.4 +Tuesday,9,6.6 +Friday,12,9.7 +Monday,23,8.2 +Monday,18,5.7 +Friday,7,11.0 +Tuesday,18,6.3 +Saturday,12,3.6 +Sunday,20,10.4 +Sunday,18,1.1 +Tuesday,11,4.9 +Wednesday,15,8.2 +Monday,16,12.8 +Saturday,8,4.6 +Wednesday,11,55.0 +Wednesday,15,1.6 +Monday,18,3.3 +Wednesday,10,12.3 +Sunday,11,5.3 +Sunday,18,2.8 +Sunday,10,27.8 +Friday,16,15.4 +Tuesday,11,16.9 +Saturday,6,4.7 +Sunday,0,17.4 +Saturday,16,16.9 +Tuesday,2,26.6 +Tuesday,7,3.3 +Monday,7,6.2 +Friday,9,19.5 +Wednesday,12,23.4 +Thursday,16,16.8 +Wednesday,19,5.1 +Thursday,17,8.5 +Sunday,14,4.7 +Sunday,13,10.0 +Sunday,10,31.1 +Sunday,16,2.7 +Tuesday,13,2.4 +Wednesday,18,2.7 +Thursday,19,4.9 +Thursday,9,31.5 +Tuesday,9,14.6 +Sunday,17,6.7 +Saturday,13,11.2 +Wednesday,15,5.5 +Monday,19,6.0 +Sunday,15,14.0 +Thursday,19,3.1 +Friday,19,3.9 +Saturday,13,4.7 +Thursday,5,7.9 +Sunday,15,3.8 +Saturday,14,7.3 +Tuesday,20,3.6 +Wednesday,7,14.1 +Saturday,16,1.1 +Thursday,10,17.8 +Saturday,21,34.4 +Friday,20,1.4 +Monday,14,50.4 +Sunday,10,18.6 +Thursday,20,15.5 +Thursday,10,22.1 +Sunday,13,3.4 +Monday,18,5.3 +Friday,13,20.1 +Tuesday,16,29.7 +Sunday,8,5.3 +Wednesday,13,10.3 +Wednesday,20,2.9 +Wednesday,18,3.8 +Tuesday,12,13.3 +Wednesday,14,3.0 +Tuesday,16,4.3 +Monday,6,1.7 +Friday,8,2.9 +Wednesday,16,7.8 +Tuesday,18,20.8 +Friday,22,15.7 +Wednesday,8,6.3 +Sunday,18,5.5 +Tuesday,13,14.3 +Wednesday,10,39.3 +Wednesday,9,9.1 +Monday,7,11.5 +Monday,10,18.9 +Wednesday,19,9.1 +Thursday,8,10.5 +Thursday,23,4.9 +Friday,14,4.6 +Tuesday,7,13.2 +Wednesday,19,15.5 +Saturday,19,4.0 +Friday,13,14.9 +Tuesday,7,17.0 +Thursday,14,15.5 +Wednesday,10,0.5 +Monday,10,1.3 +Monday,14,29.1 +Wednesday,12,23.0 +Wednesday,16,18.6 +Tuesday,17,11.7 +Friday,17,11.8 +Tuesday,23,5.9 +Monday,15,14.0 +Monday,9,10.6 +Thursday,13,11.4 +Friday,5,8.1 +Tuesday,2,6.6 +Friday,19,9.8 +Thursday,13,13.2 +Friday,1,5.6 +Friday,21,19.4 +Thursday,12,3.9 +Monday,15,18.9 +Monday,17,14.2 +Friday,13,7.7 +Monday,14,20.1 +Monday,14,34.2 +Wednesday,12,16.9 +Sunday,18,9.8 +Monday,18,3.0 +Monday,10,4.0 +Friday,14,2.3 +Friday,12,22.3 +Monday,13,26.3 +Sunday,12,11.7 +Thursday,8,11.9 +Thursday,13,29.8 +Sunday,9,5.5 +Thursday,15,0.2 +Thursday,21,9.9 +Thursday,10,12.3 +Sunday,10,5.9 +Wednesday,19,6.7 +Thursday,7,5.5 +Saturday,19,11.2 +Thursday,7,25.6 +Saturday,19,8.3 +Wednesday,19,20.2 +Monday,18,4.3 +Saturday,5,14.0 +Friday,8,26.0 +Friday,14,6.2 +Saturday,0,6.3 +Wednesday,9,11.8 +Friday,17,5.4 +Tuesday,20,10.2 +Thursday,11,2.0 +Monday,10,5.5 +Wednesday,16,10.1 +Monday,20,2.5 +Tuesday,19,7.1 +Monday,11,14.0 +Wednesday,3,9.5 +Saturday,10,4.0 +Sunday,10,3.0 +Tuesday,18,8.5 +Friday,7,3.0 +Friday,12,3.0 +Monday,17,7.2 +Monday,10,26.5 +Sunday,11,10.8 +Monday,20,2.1 +Friday,19,4.4 +Friday,12,6.5 +Monday,9,2.6 +Sunday,15,13.7 +Tuesday,15,34.5 +Monday,21,10.3 +Wednesday,9,2.8 +Wednesday,9,16.7 +Saturday,13,25.3 +Sunday,20,9.9 +Thursday,7,5.9 +Saturday,21,7.8 +Friday,9,9.9 +Thursday,16,3.1 +Tuesday,9,3.7 +Friday,17,5.0 +Friday,10,18.9 +Saturday,18,4.4 +Friday,9,30.9 +Monday,20,2.6 +Wednesday,14,15.2 +Friday,9,22.7 +Saturday,8,12.7 +Monday,4,4.1 +Saturday,11,35.7 +Thursday,12,18.9 +Wednesday,8,6.2 +Friday,19,2.7 +Friday,5,11.3 +Monday,7,7.0 +Monday,2,22.8 +Saturday,10,6.0 +Monday,11,36.8 +Friday,0,14.4 +Saturday,7,3.2 +Tuesday,10,17.4 +Monday,13,14.9 +Friday,13,14.4 +Tuesday,17,8.5 +Saturday,7,13.6 +Saturday,10,6.6 +Thursday,11,16.2 +Sunday,12,3.9 +Wednesday,19,4.2 +Monday,19,3.1 +Tuesday,11,7.8 +Friday,5,16.9 +Monday,18,2.7 +Saturday,2,19.4 +Friday,2,23.5 +Thursday,18,11.3 +Monday,16,16.9 +Wednesday,20,9.4 +Saturday,17,5.8 +Monday,11,10.6 +Tuesday,17,20.7 +Thursday,14,12.5 +Sunday,10,25.4 +Wednesday,14,18.1 +Wednesday,15,6.3 +Wednesday,8,1.4 +Tuesday,12,45.0 +Tuesday,19,5.0 +Thursday,9,15.5 +Wednesday,9,4.8 +Sunday,9,3.0 +Wednesday,8,6.8 +Wednesday,10,14.3 +Saturday,7,1.8 +Wednesday,12,10.4 +Sunday,0,8.3 +Friday,8,6.6 +Monday,19,5.1 +Wednesday,1,1.9 +Monday,11,23.0 +Wednesday,9,11.4 +Thursday,7,6.5 +Thursday,10,11.6 +Thursday,19,6.0 +Saturday,9,7.6 +Sunday,14,11.1 +Saturday,19,5.8 +Saturday,9,3.5 +Saturday,13,18.8 +Thursday,12,7.7 +Saturday,13,9.9 +Thursday,10,13.5 +Sunday,19,3.7 +Monday,20,6.0 +Tuesday,17,8.9 +Friday,7,5.1 +Thursday,10,24.3 +Thursday,19,11.5 +Friday,9,6.9 +Wednesday,19,1.6 +Wednesday,15,2.1 +Monday,9,9.9 +Friday,11,24.9 +Saturday,19,3.5 +Wednesday,7,5.3 +Friday,10,6.2 +Monday,15,28.9 +Thursday,20,9.6 +Tuesday,12,17.7 +Wednesday,20,5.2 +Sunday,7,0.7 +Wednesday,9,2.5 +Thursday,18,12.2 +Friday,17,24.6 +Saturday,20,2.0 +Tuesday,10,15.8 +Sunday,7,2.6 +Saturday,15,14.9 +Friday,17,2.0 +Sunday,17,1.5 +Tuesday,12,19.1 +Thursday,12,18.1 +Thursday,8,21.2 +Monday,10,4.6 +Sunday,20,11.7 +Tuesday,13,9.9 +Wednesday,18,2.3 +Friday,9,27.1 +Friday,11,9.4 +Thursday,18,11.8 +Thursday,17,17.6 +Saturday,17,2.5 +Tuesday,7,1.2 +Thursday,13,15.3 +Sunday,17,1.6 +Monday,14,10.4 +Wednesday,16,13.9 +Wednesday,7,1.3 +Friday,20,7.0 +Saturday,19,3.1 +Friday,17,3.6 +Friday,22,6.4 +Thursday,19,5.0 +Tuesday,9,13.1 +Wednesday,12,5.1 +Friday,7,1.8 +Monday,17,1.6 +Monday,14,19.1 +Friday,7,0.2 +Thursday,14,18.6 +Monday,19,11.9 +Sunday,15,9.6 +Monday,2,16.5 +Wednesday,10,23.3 +Sunday,17,7.1 +Monday,15,8.8 +Tuesday,9,9.0 +Wednesday,20,3.0 +Tuesday,7,1.4 +Friday,19,0.6 +Wednesday,15,14.9 +Friday,14,35.3 +Friday,18,1.4 +Thursday,18,16.8 +Tuesday,17,9.4 +Saturday,7,1.7 +Thursday,13,20.4 +Monday,14,4.4 +Monday,16,6.7 +Wednesday,5,5.8 +Monday,15,5.7 +Tuesday,19,4.8 +Saturday,9,4.6 +Thursday,19,5.0 +Monday,18,0.4 +Saturday,11,5.9 +Friday,9,4.2 +Friday,19,2.8 +Monday,23,12.2 +Wednesday,19,4.8 +Friday,13,18.4 +Sunday,19,11.1 +Saturday,19,3.1 +Saturday,12,1.2 +Saturday,18,13.9 +Saturday,12,5.6 +Sunday,18,4.7 +Saturday,17,5.6 +Saturday,1,18.4 +Tuesday,17,10.7 +Tuesday,19,2.6 +Wednesday,14,21.7 +Tuesday,20,2.6 +Wednesday,10,11.3 +Thursday,19,28.9 +Friday,7,10.0 +Sunday,11,11.1 +Monday,2,8.2 +Monday,21,20.1 +Monday,18,8.0 +Thursday,15,8.7 +Sunday,20,20.4 +Wednesday,21,8.5 +Thursday,16,6.9 +Friday,15,12.1 +Sunday,20,1.5 +Friday,18,5.2 +Sunday,4,31.2 +Friday,7,9.0 +Monday,16,26.0 +Sunday,19,5.0 +Sunday,0,49.2 +Tuesday,16,8.1 +Monday,18,8.0 +Wednesday,21,13.7 +Friday,21,23.0 +Wednesday,6,41.6 +Sunday,11,12.2 +Saturday,13,17.3 +Sunday,18,1.9 +Monday,9,8.1 +Tuesday,19,1.1 +Thursday,7,12.5 +Friday,20,5.4 +Sunday,21,48.5 +Saturday,7,3.5 +Monday,18,10.5 +Sunday,11,22.2 +Wednesday,20,8.7 +Wednesday,15,23.5 +Thursday,14,9.4 +Friday,5,9.8 +Thursday,17,16.1 +Sunday,0,15.8 +Thursday,16,41.5 +Friday,15,2.2 +Friday,20,1.9 +Friday,15,9.4 +Sunday,19,7.0 +Saturday,20,2.9 +Sunday,3,27.9 +Wednesday,6,7.9 +Sunday,15,6.3 +Friday,16,8.3 +Sunday,21,15.1 +Tuesday,18,3.4 +Friday,21,3.3 +Tuesday,16,2.2 +Friday,13,27.9 +Saturday,12,6.2 +Wednesday,5,18.2 +Thursday,9,10.3 +Tuesday,20,5.7 +Sunday,11,12.8 +Tuesday,18,6.9 +Monday,2,33.6 +Monday,15,14.7 +Sunday,8,6.5 +Thursday,15,11.5 +Friday,16,5.3 +Wednesday,8,2.0 +Sunday,2,13.5 +Friday,13,13.9 +Monday,9,17.2 +Thursday,16,13.7 +Tuesday,10,8.5 +Wednesday,21,20.2 +Thursday,11,4.2 +Sunday,0,28.7 +Friday,10,4.8 +Tuesday,18,9.1 +Wednesday,10,5.5 +Monday,11,1.6 +Sunday,13,20.8 +Monday,18,13.8 +Monday,9,11.3 +Thursday,12,0.4 +Monday,19,14.5 +Monday,16,14.6 +Tuesday,1,3.8 +Sunday,22,9.1 +Tuesday,18,10.0 +Saturday,13,5.4 +Monday,2,23.6 +Monday,12,12.9 +Monday,13,11.1 +Friday,13,22.9 +Saturday,9,14.2 +Saturday,14,8.3 +Thursday,20,6.1 +Monday,8,14.3 +Friday,7,6.2 +Wednesday,14,27.2 +Wednesday,12,7.4 +Wednesday,18,2.2 +Friday,15,13.3 +Wednesday,10,7.8 +Thursday,15,30.7 +Thursday,8,7.4 +Tuesday,10,5.2 +Tuesday,11,20.3 +Wednesday,17,12.3 +Wednesday,20,4.2 +Sunday,7,1.6 +Tuesday,8,13.4 +Thursday,17,18.6 +Saturday,16,9.4 +Tuesday,12,5.6 +Sunday,15,14.5 +Friday,18,3.4 +Sunday,17,0.8 +Sunday,13,3.4 +Friday,17,3.9 +Saturday,17,9.4 +Sunday,18,1.1 +Sunday,18,4.1 +Tuesday,10,11.2 +Friday,7,12.9 +Sunday,7,2.0 +Saturday,15,8.9 +Thursday,14,16.6 +Monday,13,27.4 +Thursday,20,2.4 +Saturday,19,7.6 +Saturday,10,10.4 +Friday,10,10.2 +Thursday,13,3.9 +Wednesday,9,4.0 +Tuesday,12,15.1 +Thursday,14,2.4 +Thursday,9,15.3 +Monday,13,24.7 +Thursday,14,8.4 +Tuesday,9,6.5 +Tuesday,8,12.9 +Friday,8,7.7 +Wednesday,11,21.1 +Friday,12,24.7 +Thursday,15,17.9 +Sunday,9,5.2 +Thursday,11,16.9 +Friday,9,3.1 +Sunday,19,9.1 +Thursday,19,4.8 +Friday,7,6.1 +Wednesday,7,6.2 +Sunday,18,12.1 +Thursday,15,10.7 +Tuesday,17,2.1 +Thursday,20,0.8 +Monday,20,3.4 +Monday,17,16.0 +Friday,20,11.0 +Wednesday,13,23.6 +Sunday,19,5.8 +Thursday,9,4.4 +Sunday,4,14.8 +Wednesday,15,6.9 +Friday,9,25.2 +Monday,17,4.0 +Thursday,20,2.2 +Thursday,5,19.6 +Tuesday,16,24.1 +Thursday,17,4.1 +Monday,2,4.4 +Wednesday,10,1.4 +Monday,7,5.8 +Tuesday,14,10.2 +Saturday,17,0.7 +Tuesday,16,3.1 +Thursday,12,6.1 +Friday,13,33.8 +Tuesday,11,2.6 +Monday,9,7.2 +Tuesday,19,3.8 +Friday,13,25.8 +Monday,17,7.9 +Monday,15,30.2 +Thursday,16,12.7 +Monday,13,19.7 +Wednesday,17,4.0 +Thursday,11,13.9 +Sunday,15,6.4 +Wednesday,10,18.2 +Monday,4,18.2 +Saturday,11,6.6 +Sunday,20,2.2 +Tuesday,14,18.1 +Tuesday,12,20.6 +Wednesday,17,25.7 +Monday,15,5.3 +Tuesday,17,12.1 +Friday,18,1.6 +Monday,13,22.0 +Tuesday,13,8.3 +Wednesday,18,19.4 +Tuesday,9,6.8 +Tuesday,8,4.5 +Saturday,10,8.3 +Thursday,13,9.2 +Saturday,17,8.6 +Monday,12,14.5 +Thursday,20,4.7 +Thursday,11,19.8 +Friday,15,27.2 +Sunday,19,4.4 +Tuesday,16,0.5 +Saturday,5,8.2 +Sunday,10,8.3 +Monday,16,6.5 +Saturday,12,11.1 +Friday,12,33.1 +Tuesday,17,8.1 +Tuesday,3,5.9 +Monday,17,6.7 +Saturday,3,6.6 +Tuesday,14,18.6 +Wednesday,12,43.2 +Saturday,0,6.9 +Monday,0,13.3 +Thursday,13,10.4 +Monday,16,2.2 +Saturday,14,17.1 +Wednesday,8,18.0 +Friday,18,9.2 +Saturday,15,15.0 +Friday,11,0.7 +Friday,18,9.3 +Thursday,0,47.7 +Wednesday,5,11.1 +Sunday,16,6.0 +Friday,1,9.8 +Tuesday,16,10.7 +Wednesday,19,10.2 +Friday,9,20.4 +Sunday,7,1.3 +Wednesday,18,3.6 +Friday,10,9.7 +Friday,16,10.7 +Wednesday,20,2.8 +Sunday,20,3.6 +Tuesday,18,8.5 +Tuesday,17,5.4 +Monday,14,15.0 +Friday,12,14.9 +Sunday,16,8.6 +Friday,12,21.2 +Friday,16,13.8 +Wednesday,18,9.1 +Tuesday,17,3.2 +Tuesday,19,4.1 +Sunday,15,19.4 +Thursday,4,4.5 +Saturday,8,7.6 +Friday,2,11.9 +Friday,9,4.1 +Wednesday,19,5.0 +Thursday,12,11.8 +Monday,12,36.6 +Friday,14,12.8 +Saturday,7,4.4 +Tuesday,15,8.4 +Wednesday,11,15.2 +Thursday,16,13.6 +Wednesday,17,5.2 +Thursday,8,3.8 +Saturday,15,11.7 +Thursday,21,15.4 +Thursday,16,7.9 +Wednesday,8,11.4 +Saturday,10,5.7 +Thursday,16,5.9 +Saturday,19,8.7 +Sunday,10,5.6 +Wednesday,1,17.3 +Tuesday,10,12.3 +Friday,13,6.3 +Monday,19,3.0 +Friday,13,3.4 +Friday,20,3.5 +Tuesday,21,18.0 +Monday,15,13.2 +Saturday,1,20.3 +Tuesday,20,8.3 +Sunday,2,11.4 +Wednesday,13,15.8 +Saturday,21,5.3 +Wednesday,15,12.6 +Thursday,6,7.2 +Friday,12,9.5 +Saturday,9,12.0 +Monday,15,1.8 +Saturday,13,10.6 +Wednesday,11,17.1 +Friday,3,9.1 +Monday,17,1.3 +Thursday,0,41.7 +Saturday,7,6.3 +Sunday,15,7.1 +Wednesday,12,2.4 +Wednesday,20,6.6 +Monday,14,8.0 +Sunday,8,11.9 +Friday,13,10.6 +Wednesday,20,10.9 +Sunday,3,7.4 +Saturday,18,8.1 +Thursday,15,4.3 +Monday,13,6.3 +Sunday,15,7.7 +Wednesday,22,12.4 +Monday,9,17.2 +Wednesday,15,4.4 +Monday,17,1.8 +Thursday,19,3.3 +Thursday,16,6.0 +Sunday,15,12.0 +Sunday,10,8.1 +Tuesday,7,13.8 +Tuesday,16,5.0 +Sunday,15,21.8 +Saturday,17,1.6 +Thursday,13,1.4 +Saturday,19,8.8 +Sunday,13,11.2 +Monday,9,20.4 +Wednesday,20,1.5 +Wednesday,18,4.8 +Tuesday,12,8.7 +Friday,15,2.8 +Sunday,10,9.1 +Saturday,6,8.0 +Monday,19,10.1 +Friday,11,8.5 +Sunday,16,7.1 +Friday,11,27.3 +Tuesday,0,15.7 +Monday,9,5.5 +Thursday,12,7.8 +Monday,9,11.2 +Monday,20,4.7 +Thursday,1,20.8 +Saturday,12,10.0 +Tuesday,16,23.1 +Monday,17,4.1 +Wednesday,20,8.0 +Friday,14,11.9 +Wednesday,16,7.6 +Monday,10,19.6 +Thursday,14,15.3 +Friday,19,6.6 +Wednesday,6,10.4 +Thursday,10,16.0 +Friday,11,17.4 +Sunday,20,4.6 +Wednesday,18,1.9 +Tuesday,6,3.4 +Friday,15,14.6 +Friday,16,8.2 +Friday,7,9.1 +Sunday,18,2.8 +Tuesday,13,27.1 +Monday,10,7.2 +Thursday,10,17.1 +Thursday,13,27.7 +Friday,11,25.0 +Wednesday,11,38.2 +Monday,11,33.6 +Saturday,14,5.1 +Monday,13,16.9 +Friday,11,18.1 +Saturday,16,10.7 +Friday,17,3.7 +Friday,8,4.0 +Saturday,18,8.9 +Friday,23,18.4 +Saturday,10,6.8 +Wednesday,17,8.0 +Friday,5,3.2 +Friday,4,5.4 +Monday,20,3.1 +Tuesday,7,1.1 +Wednesday,21,13.9 +Thursday,20,4.5 +Friday,22,25.8 +Tuesday,20,1.3 +Friday,16,3.3 +Saturday,10,11.6 +Thursday,22,7.5 +Tuesday,13,8.7 +Saturday,7,7.9 +Saturday,15,4.9 +Thursday,19,3.5 +Wednesday,20,14.7 +Friday,13,3.2 +Thursday,3,22.9 +Wednesday,7,3.8 +Thursday,12,14.1 +Saturday,17,5.5 +Tuesday,4,11.4 +Thursday,13,24.7 +Thursday,13,22.3 +Sunday,18,8.0 +Tuesday,7,5.8 +Saturday,19,5.8 +Wednesday,12,9.9 +Friday,14,8.2 +Sunday,14,8.7 +Tuesday,15,3.9 +Thursday,16,27.1 +Saturday,20,3.2 +Friday,16,15.1 +Monday,8,6.1 +Friday,8,11.8 +Monday,17,4.6 +Friday,19,4.9 +Sunday,19,3.2 +Monday,9,12.1 +Wednesday,14,32.4 +Tuesday,12,12.3 +Saturday,9,7.3 +Wednesday,19,4.7 +Saturday,13,9.9 +Friday,19,4.2 +Thursday,16,4.3 +Wednesday,6,18.5 +Monday,14,4.3 +Wednesday,13,10.7 +Sunday,19,2.2 +Monday,20,3.9 +Tuesday,22,19.7 +Monday,18,3.2 +Tuesday,16,31.6 +Sunday,8,2.9 +Friday,17,6.7 +Wednesday,16,14.3 +Thursday,18,14.7 +Friday,18,10.6 +Sunday,3,4.8 +Friday,0,10.0 +Thursday,18,7.8 +Sunday,10,24.2 +Wednesday,12,6.7 +Saturday,9,2.8 +Friday,12,20.0 +Tuesday,12,15.5 +Monday,9,4.9 +Tuesday,16,2.2 +Tuesday,18,2.9 +Thursday,15,8.9 +Tuesday,7,5.2 +Wednesday,7,3.6 +Sunday,19,12.6 +Tuesday,19,2.9 +Tuesday,20,8.5 +Sunday,12,2.4 +Wednesday,18,2.8 +Wednesday,14,49.1 +Wednesday,17,2.8 +Saturday,13,9.0 +Thursday,12,15.9 +Friday,9,3.6 +Monday,19,15.3 +Wednesday,2,10.5 +Thursday,13,20.7 +Monday,17,8.2 +Thursday,19,8.5 +Saturday,19,12.7 +Monday,7,12.1 +Friday,9,15.5 +Monday,9,33.2 +Monday,12,32.6 +Thursday,19,2.3 +Thursday,10,9.2 +Tuesday,14,5.1 +Saturday,10,10.7 +Wednesday,11,8.4 +Wednesday,7,10.7 +Monday,13,14.3 +Tuesday,13,5.4 +Wednesday,9,16.5 +Thursday,18,5.3 +Friday,11,4.1 +Sunday,14,10.6 +Friday,15,14.8 +Saturday,18,7.6 +Thursday,16,4.8 +Thursday,18,21.7 +Monday,11,11.0 +Tuesday,5,52.1 +Friday,10,12.6 +Sunday,9,12.1 +Saturday,4,17.5 +Monday,0,2.9 +Monday,12,15.8 +Wednesday,8,22.8 +Monday,9,9.3 +Thursday,14,11.9 +Wednesday,5,23.6 +Sunday,17,3.5 +Sunday,17,11.7 +Monday,19,10.3 +Monday,20,2.5 +Saturday,12,0.8 +Friday,7,7.8 +Thursday,11,7.0 +Tuesday,0,6.8 +Wednesday,17,10.8 +Saturday,7,6.7 +Tuesday,7,2.9 +Sunday,11,10.8 +Saturday,20,2.8 +Saturday,11,16.5 +Thursday,13,7.9 +Wednesday,18,6.3 +Monday,15,13.9 +Wednesday,14,10.0 +Saturday,17,0.9 +Sunday,16,0.7 +Tuesday,5,7.2 +Wednesday,20,4.9 +Wednesday,12,6.9 +Thursday,17,2.9 +Thursday,7,12.4 +Wednesday,9,3.0 +Friday,3,24.9 +Monday,10,19.3 +Saturday,15,6.0 +Thursday,12,8.6 +Tuesday,16,25.3 +Wednesday,16,5.0 +Thursday,22,5.7 +Thursday,23,15.1 +Sunday,20,14.4 +Wednesday,7,7.9 +Sunday,13,3.3 +Monday,8,5.4 +Saturday,13,7.3 +Friday,13,19.9 +Thursday,17,7.7 +Monday,20,2.2 +Tuesday,18,8.4 +Tuesday,5,9.9 +Wednesday,19,13.5 +Thursday,13,31.4 +Monday,10,12.2 +Tuesday,17,4.5 +Thursday,7,5.4 +Sunday,15,15.5 +Tuesday,0,14.4 +Thursday,20,3.1 +Friday,19,1.0 +Saturday,14,5.7 +Tuesday,14,2.9 +Monday,12,19.9 +Friday,20,7.0 +Monday,10,6.6 +Sunday,18,31.5 +Sunday,18,13.5 +Tuesday,14,7.7 +Thursday,8,4.4 +Thursday,9,3.5 +Sunday,13,9.7 +Friday,8,14.9 +Wednesday,17,2.2 +Friday,12,21.1 +Thursday,13,19.3 +Wednesday,13,4.0 +Thursday,15,3.3 +Friday,23,2.3 +Thursday,13,31.7 +Saturday,8,5.6 +Saturday,17,15.5 +Wednesday,15,4.6 +Tuesday,16,22.9 +Friday,7,5.5 +Friday,16,7.4 +Saturday,14,3.3 +Tuesday,12,12.1 +Saturday,18,8.8 +Sunday,12,14.0 +Thursday,10,12.8 +Wednesday,9,10.6 +Sunday,10,18.4 +Tuesday,22,26.4 +Tuesday,14,6.4 +Tuesday,7,7.2 +Saturday,17,5.7 +Tuesday,9,23.8 +Friday,13,21.6 +Sunday,18,2.1 +Friday,19,3.4 +Tuesday,19,10.4 +Saturday,20,22.2 +Wednesday,14,12.9 +Friday,10,30.7 +Wednesday,19,12.1 +Wednesday,4,11.0 +Thursday,11,8.3 +Saturday,9,6.4 +Sunday,19,2.5 +Tuesday,16,6.1 +Saturday,17,4.5 +Friday,4,4.4 +Sunday,17,10.8 +Monday,8,28.3 +Monday,13,4.1 +Thursday,14,6.3 +Monday,8,17.6 +Saturday,9,6.0 +Wednesday,14,8.4 +Wednesday,8,20.3 +Wednesday,11,6.3 +Sunday,13,21.2 +Friday,19,2.6 +Monday,14,3.3 +Thursday,5,14.2 +Friday,18,13.6 +Friday,8,10.1 +Sunday,22,19.3 +Tuesday,14,15.7 +Thursday,17,2.7 +Saturday,17,6.7 +Friday,10,8.0 +Monday,12,17.6 +Friday,8,27.0 +Wednesday,5,13.5 +Thursday,18,10.4 +Sunday,19,15.6 +Thursday,18,4.1 +Saturday,11,40.7 +Wednesday,6,12.5 +Sunday,10,10.8 +Friday,14,27.8 +Tuesday,10,40.3 +Saturday,15,22.0 +Monday,16,32.6 +Wednesday,15,12.7 +Thursday,10,7.4 +Friday,13,28.3 +Saturday,15,15.6 +Thursday,12,29.4 +Sunday,11,11.3 +Monday,19,5.1 +Wednesday,15,5.2 +Tuesday,19,5.8 +Monday,13,10.8 +Wednesday,15,9.0 +Wednesday,8,13.2 +Saturday,13,6.3 +Thursday,17,2.1 +Thursday,1,2.7 +Tuesday,15,34.1 +Wednesday,7,6.2 +Friday,1,24.8 +Friday,5,7.7 +Thursday,11,25.2 +Thursday,4,9.0 +Friday,15,17.0 +Saturday,11,8.9 +Monday,16,16.5 +Sunday,15,4.5 +Friday,23,46.6 +Wednesday,18,21.8 +Thursday,12,13.4 +Friday,15,5.2 +Tuesday,13,7.4 +Monday,8,7.9 +Wednesday,16,9.7 +Friday,12,26.4 +Thursday,7,8.7 +Tuesday,20,1.2 +Saturday,16,5.8 +Saturday,15,11.8 +Wednesday,14,12.5 +Tuesday,17,6.4 +Thursday,7,7.1 +Sunday,16,11.5 +Tuesday,13,14.5 +Thursday,17,9.8 +Wednesday,20,8.2 +Friday,14,15.1 +Friday,18,8.4 +Sunday,10,5.9 +Friday,11,3.4 +Thursday,19,5.8 +Saturday,16,2.6 +Saturday,8,7.5 +Tuesday,15,4.8 +Friday,14,24.5 +Sunday,0,11.9 +Saturday,9,8.1 +Tuesday,19,9.2 +Wednesday,10,16.8 +Monday,20,9.2 +Friday,7,5.3 +Saturday,15,3.4 +Monday,6,21.9 +Saturday,12,4.3 +Saturday,18,1.7 +Sunday,13,7.0 +Sunday,15,3.8 +Saturday,11,7.6 +Monday,21,18.8 +Saturday,20,4.0 +Wednesday,9,15.0 +Sunday,12,7.3 +Thursday,3,11.6 +Thursday,7,5.8 +Tuesday,1,9.5 +Wednesday,10,18.7 +Tuesday,11,19.2 +Saturday,12,1.3 +Friday,16,15.2 +Monday,2,15.3 +Saturday,15,5.1 +Wednesday,20,9.8 +Wednesday,21,7.4 +Monday,8,10.1 +Monday,14,1.7 +Saturday,20,8.0 +Sunday,9,7.1 +Friday,8,7.9 +Wednesday,10,17.3 +Thursday,14,7.8 +Thursday,1,3.4 +Wednesday,20,9.1 +Sunday,20,3.7 +Monday,19,8.7 +Sunday,10,1.2 +Wednesday,14,12.8 +Friday,15,21.2 +Thursday,15,8.1 +Sunday,9,17.5 +Sunday,10,37.2 +Tuesday,9,6.6 +Monday,6,14.4 +Sunday,18,2.9 +Wednesday,14,9.8 +Saturday,4,3.9 +Thursday,15,33.7 +Sunday,9,2.0 +Monday,9,9.4 +Saturday,9,2.8 +Friday,13,22.9 +Tuesday,18,5.7 +Saturday,17,3.3 +Wednesday,12,21.6 +Thursday,13,9.0 +Wednesday,17,16.9 +Wednesday,14,8.9 +Wednesday,18,8.2 +Saturday,1,23.9 +Wednesday,15,8.2 +Tuesday,16,13.4 +Wednesday,11,3.7 +Tuesday,19,12.8 +Monday,20,4.5 +Monday,19,9.9 +Tuesday,15,17.7 +Thursday,12,6.9 +Saturday,8,6.2 +Tuesday,22,25.1 +Wednesday,20,6.8 +Monday,17,7.6 +Wednesday,11,6.1 +Thursday,2,8.8 +Wednesday,22,2.5 +Saturday,13,26.1 +Wednesday,14,6.5 +Tuesday,11,39.9 +Sunday,11,7.2 +Friday,18,6.9 +Monday,10,2.6 +Thursday,13,7.9 +Tuesday,7,10.1 +Monday,15,2.7 +Sunday,7,3.4 +Thursday,11,29.7 +Thursday,18,3.0 +Saturday,10,16.3 +Saturday,18,5.5 +Friday,19,1.8 +Monday,12,1.3 +Tuesday,15,2.0 +Wednesday,16,16.0 +Sunday,11,18.4 +Friday,19,2.7 +Thursday,16,16.3 +Saturday,0,26.8 +Sunday,13,6.8 +Friday,8,2.1 +Friday,14,11.3 +Saturday,10,25.2 +Friday,19,3.3 +Sunday,20,1.4 +Tuesday,14,3.7 +Sunday,8,9.4 +Saturday,13,13.1 +Monday,12,6.9 +Saturday,9,17.7 +Thursday,9,8.6 +Sunday,17,10.5 +Sunday,13,13.7 +Monday,8,7.0 +Thursday,12,6.2 +Tuesday,18,8.6 +Saturday,18,1.8 +Thursday,8,7.1 +Friday,9,11.8 +Saturday,19,5.6 +Saturday,17,1.9 +Tuesday,17,12.5 +Wednesday,14,6.6 +Sunday,18,4.1 +Saturday,9,24.6 +Sunday,1,21.4 +Saturday,17,8.1 +Tuesday,13,11.2 +Friday,13,2.7 +Tuesday,18,13.7 +Tuesday,15,18.4 +Sunday,17,8.9 +Sunday,17,1.0 +Wednesday,23,7.9 +Saturday,19,4.5 +Sunday,20,1.8 +Wednesday,15,1.8 +Saturday,13,16.7 +Tuesday,16,10.4 +Saturday,13,6.8 +Tuesday,16,13.3 +Wednesday,9,19.5 +Thursday,13,9.0 +Friday,10,8.3 +Monday,19,0.7 +Tuesday,11,12.1 +Monday,15,5.0 +Thursday,18,9.6 +Friday,12,7.4 +Sunday,19,4.1 +Wednesday,14,13.4 +Monday,18,3.7 +Thursday,19,12.2 +Thursday,5,20.8 +Thursday,19,8.6 +Monday,20,4.6 +Wednesday,10,10.5 +Thursday,14,5.5 +Tuesday,10,4.8 +Monday,16,10.9 +Saturday,18,16.0 +Wednesday,13,1.2 +Wednesday,19,3.7 +Monday,8,7.5 +Friday,10,29.9 +Tuesday,17,18.7 +Saturday,13,21.9 +Thursday,18,7.4 +Thursday,11,41.8 +Thursday,7,5.4 +Saturday,18,2.3 +Saturday,16,21.0 +Saturday,14,8.7 +Saturday,17,6.0 +Sunday,9,18.3 +Thursday,12,15.1 +Wednesday,15,5.1 +Wednesday,9,11.0 +Tuesday,21,9.5 +Saturday,15,7.6 +Monday,8,5.2 +Sunday,21,9.7 +Tuesday,10,10.5 +Thursday,17,1.4 +Thursday,1,6.8 +Wednesday,13,14.3 +Friday,4,25.7 +Monday,19,10.6 +Sunday,17,15.1 +Wednesday,7,14.9 +Monday,15,17.0 +Sunday,16,6.7 +Friday,17,9.3 +Tuesday,17,3.7 +Thursday,8,2.4 +Sunday,20,3.6 +Thursday,0,10.7 +Wednesday,18,7.6 +Saturday,10,22.5 +Tuesday,11,8.0 +Sunday,12,4.4 +Wednesday,16,7.7 +Tuesday,18,4.7 +Monday,10,7.3 +Monday,19,6.3 +Sunday,13,8.1 +Tuesday,17,3.0 +Wednesday,10,19.2 +Wednesday,16,4.5 +Wednesday,22,46.9 +Saturday,7,4.4 +Sunday,20,2.3 +Wednesday,11,3.1 +Sunday,11,12.0 +Saturday,15,11.6 +Tuesday,11,37.7 +Monday,15,15.4 +Thursday,7,4.4 +Wednesday,12,20.9 +Sunday,10,12.0 +Wednesday,10,34.9 +Friday,19,2.8 +Thursday,14,15.9 +Tuesday,11,18.9 +Wednesday,8,9.8 +Sunday,9,2.5 +Tuesday,11,15.4 +Friday,18,1.9 +Monday,7,16.9 +Monday,9,10.5 +Tuesday,12,29.7 +Friday,13,42.3 +Friday,6,2.9 +Thursday,2,12.4 +Sunday,11,17.9 +Saturday,17,7.8 +Wednesday,8,9.9 +Friday,17,13.8 +Monday,16,22.9 +Sunday,11,8.6 +Sunday,15,13.8 +Thursday,20,2.6 +Monday,10,7.0 +Monday,9,13.4 +Tuesday,17,16.5 +Monday,7,1.5 +Friday,8,10.8 +Friday,15,35.2 +Monday,12,15.1 +Wednesday,10,27.6 +Saturday,14,8.1 +Monday,15,5.7 +Monday,10,28.0 +Sunday,13,33.5 +Saturday,9,2.5 +Thursday,14,1.0 +Saturday,19,8.2 +Tuesday,10,10.5 +Wednesday,13,12.8 +Saturday,19,1.7 +Monday,12,26.6 +Tuesday,20,19.0 +Friday,15,10.0 +Wednesday,18,4.5 +Saturday,10,2.1 +Saturday,16,7.8 +Wednesday,14,10.4 +Monday,19,14.8 +Wednesday,20,5.1 +Friday,14,11.6 +Wednesday,7,2.0 +Friday,11,7.5 +Friday,5,15.2 +Thursday,7,9.3 +Saturday,17,4.3 +Saturday,22,29.3 +Saturday,10,2.1 +Monday,17,26.6 +Saturday,8,9.8 +Sunday,20,5.0 +Monday,14,6.4 +Saturday,7,11.9 +Sunday,6,15.0 +Saturday,10,10.6 +Thursday,20,5.5 +Wednesday,23,28.2 +Thursday,14,6.4 +Thursday,13,9.9 +Sunday,9,4.5 +Sunday,5,11.8 +Thursday,17,19.1 +Monday,19,11.7 +Monday,15,12.8 +Saturday,20,3.7 +Wednesday,19,13.1 +Monday,17,1.7 +Thursday,13,29.7 +Wednesday,13,17.4 +Tuesday,18,2.8 +Monday,15,13.2 +Monday,9,16.4 +Monday,10,17.3 +Wednesday,8,3.2 +Sunday,17,2.1 +Tuesday,9,24.1 +Friday,17,3.9 +Thursday,7,11.4 +Tuesday,19,2.8 +Thursday,13,11.9 +Monday,19,10.6 +Wednesday,8,5.9 +Thursday,20,1.2 +Sunday,17,5.5 +Thursday,2,14.0 +Friday,8,11.5 +Friday,7,5.2 +Wednesday,5,10.4 +Saturday,3,6.5 +Saturday,3,12.7 +Thursday,8,9.2 +Thursday,15,3.0 +Tuesday,12,16.0 +Saturday,19,3.8 +Monday,12,38.3 +Thursday,12,23.9 +Wednesday,18,5.6 +Tuesday,14,6.1 +Friday,11,30.2 +Sunday,18,18.9 +Thursday,7,3.6 +Friday,9,2.4 +Wednesday,2,5.5 +Sunday,14,9.7 +Saturday,9,7.0 +Thursday,19,11.2 +Thursday,9,5.5 +Monday,19,5.2 +Wednesday,12,10.5 +Saturday,14,13.1 +Monday,12,10.8 +Sunday,9,15.0 +Thursday,10,8.9 +Saturday,9,16.3 +Saturday,0,31.0 +Friday,12,23.9 +Thursday,11,18.4 +Tuesday,14,7.0 +Saturday,0,17.0 +Monday,5,14.8 +Wednesday,18,11.2 +Sunday,19,19.9 +Wednesday,19,14.6 +Saturday,16,6.9 +Monday,7,3.3 +Sunday,9,14.1 +Monday,21,14.3 +Wednesday,15,21.1 +Tuesday,15,21.8 +Wednesday,14,30.1 +Saturday,11,2.0 +Friday,14,2.2 +Tuesday,18,9.2 +Saturday,9,13.3 +Sunday,20,1.8 +Monday,15,9.1 +Wednesday,8,3.7 +Saturday,7,5.8 +Sunday,10,4.7 +Friday,10,11.3 +Sunday,12,10.6 +Wednesday,14,15.8 +Monday,15,13.1 +Tuesday,11,4.0 +Tuesday,15,10.4 +Thursday,13,11.6 +Thursday,22,14.2 +Thursday,13,6.5 +Wednesday,11,11.2 +Sunday,17,9.4 +Saturday,14,0.8 +Thursday,19,1.8 +Friday,17,4.3 +Thursday,12,19.9 +Thursday,15,10.2 +Monday,10,13.6 +Friday,9,21.0 +Monday,16,19.9 +Friday,14,4.5 +Wednesday,15,29.4 +Monday,16,10.9 +Wednesday,17,7.2 +Saturday,9,17.5 +Thursday,21,9.7 +Sunday,10,10.8 +Thursday,20,5.1 +Sunday,10,19.6 +Tuesday,9,6.5 +Tuesday,16,19.3 +Wednesday,9,7.4 +Sunday,12,5.3 +Saturday,0,11.3 +Monday,1,1.1 +Friday,14,9.3 +Tuesday,8,19.4 +Saturday,10,10.7 +Friday,19,10.6 +Sunday,10,16.9 +Friday,11,17.1 +Friday,0,8.2 +Friday,13,7.3 +Wednesday,14,0.8 +Monday,10,4.2 +Sunday,16,6.2 +Saturday,7,2.5 +Friday,14,32.8 +Friday,8,5.1 +Friday,22,16.1 +Wednesday,18,7.8 +Thursday,20,8.6 +Thursday,17,13.9 +Thursday,11,1.6 +Monday,20,5.3 +Monday,17,4.3 +Wednesday,19,5.9 +Saturday,12,5.1 +Monday,11,23.4 +Monday,4,11.6 +Wednesday,10,6.9 +Tuesday,14,15.1 +Tuesday,17,5.3 +Saturday,8,7.9 +Tuesday,10,28.6 +Friday,8,0.9 +Thursday,7,21.0 +Monday,10,6.2 +Friday,9,8.4 +Monday,20,11.1 +Wednesday,18,7.5 +Tuesday,10,37.0 +Tuesday,17,29.4 +Saturday,14,7.8 +Monday,14,10.1 +Sunday,7,2.7 +Monday,20,1.5 +Thursday,13,9.4 +Friday,20,6.1 +Monday,20,5.8 +Monday,16,37.4 +Thursday,12,20.9 +Tuesday,19,6.3 +Thursday,14,11.3 +Thursday,7,21.5 +Friday,13,8.0 +Wednesday,9,4.5 +Tuesday,12,22.8 +Monday,14,17.4 +Sunday,10,9.9 +Tuesday,20,5.5 +Tuesday,5,6.2 +Wednesday,17,16.5 +Monday,8,8.0 +Tuesday,14,8.8 +Wednesday,7,3.2 +Friday,12,15.8 +Thursday,9,8.3 +Sunday,15,23.1 +Sunday,20,14.8 +Tuesday,9,4.8 +Monday,7,10.9 +Sunday,13,32.7 +Monday,12,13.2 +Monday,13,20.2 +Sunday,15,11.8 +Sunday,10,8.4 +Saturday,19,5.5 +Sunday,12,6.9 +Monday,16,19.3 +Friday,11,5.2 +Thursday,8,11.3 +Sunday,14,3.6 +Wednesday,20,5.3 +Saturday,13,11.3 +Wednesday,14,16.6 +Friday,12,14.4 +Tuesday,18,6.9 +Saturday,16,13.2 +Friday,16,10.9 +Wednesday,17,0.7 +Saturday,17,8.4 +Wednesday,17,5.5 +Tuesday,17,12.9 +Monday,14,19.1 +Tuesday,15,16.4 +Friday,12,30.0 +Saturday,20,8.0 +Friday,10,3.0 +Monday,13,10.4 +Saturday,17,5.4 +Friday,14,6.7 +Tuesday,13,31.7 +Wednesday,0,3.9 +Sunday,18,13.2 +Friday,10,11.8 +Wednesday,9,8.7 +Friday,11,15.4 +Friday,12,0.9 +Thursday,10,4.9 +Sunday,15,13.4 +Saturday,7,5.9 +Saturday,8,9.5 +Tuesday,20,1.9 +Wednesday,11,38.0 +Thursday,20,2.7 +Monday,11,6.2 +Saturday,19,3.3 +Wednesday,1,38.8 +Saturday,9,11.5 +Tuesday,3,14.5 +Saturday,11,4.7 +Thursday,16,16.2 +Monday,15,18.8 +Sunday,13,2.1 +Friday,2,5.0 +Monday,18,4.6 +Friday,22,17.4 +Tuesday,20,3.2 +Friday,0,29.5 +Saturday,15,15.5 +Wednesday,13,23.2 +Sunday,0,16.3 +Thursday,15,9.0 +Saturday,1,13.3 +Saturday,9,11.4 +Wednesday,10,23.8 +Wednesday,0,14.2 +Friday,14,3.9 +Wednesday,16,12.6 +Thursday,12,6.6 +Monday,7,6.3 +Friday,12,35.8 +Monday,14,16.0 +Wednesday,12,19.7 +Sunday,15,20.9 +Sunday,8,12.1 +Wednesday,3,12.1 +Monday,20,6.8 +Friday,12,14.4 +Monday,18,7.1 +Saturday,17,1.4 +Wednesday,19,1.7 +Friday,8,4.4 +Tuesday,20,3.9 +Tuesday,19,5.5 +Saturday,11,7.8 +Monday,18,4.8 +Friday,17,14.5 +Saturday,8,5.4 +Friday,1,10.6 +Saturday,9,9.9 +Saturday,15,16.8 +Friday,16,2.7 +Sunday,14,6.2 +Tuesday,20,5.1 +Sunday,9,32.1 +Thursday,14,8.3 +Saturday,17,4.8 +Saturday,13,6.5 +Saturday,21,1.0 +Friday,13,7.7 +Sunday,10,2.8 +Sunday,10,6.1 +Friday,22,10.4 +Tuesday,7,7.5 +Saturday,19,5.3 +Monday,7,14.6 +Tuesday,18,5.8 +Tuesday,14,3.7 +Wednesday,19,1.4 +Monday,9,40.7 +Thursday,16,16.4 +Sunday,18,2.4 +Wednesday,20,6.0 +Wednesday,19,1.2 +Friday,18,1.0 +Friday,15,14.3 +Friday,10,15.8 +Saturday,10,18.2 +Saturday,19,19.1 +Thursday,12,9.0 +Monday,22,14.1 +Tuesday,12,7.1 +Saturday,7,0.5 +Monday,2,22.3 +Wednesday,20,1.6 +Tuesday,22,9.2 +Monday,21,7.9 +Wednesday,17,10.9 +Wednesday,12,17.9 +Wednesday,12,12.3 +Monday,13,24.4 +Sunday,18,2.3 +Tuesday,6,0.7 +Sunday,20,12.2 +Wednesday,9,15.1 +Monday,1,7.8 +Friday,12,3.8 +Thursday,15,0.8 +Sunday,8,12.8 +Thursday,14,12.1 +Thursday,17,6.2 +Wednesday,12,14.8 +Monday,12,10.7 +Tuesday,13,18.3 +Friday,10,1.5 +Tuesday,22,8.7 +Sunday,20,2.6 +Tuesday,18,11.3 +Friday,19,1.2 +Sunday,9,9.2 +Tuesday,11,12.3 +Saturday,16,1.2 +Monday,15,11.4 +Thursday,11,31.7 +Saturday,14,1.3 +Saturday,18,2.4 +Thursday,13,21.6 +Monday,12,6.4 +Sunday,18,10.8 +Thursday,8,5.7 +Sunday,10,5.6 +Tuesday,20,6.1 +Thursday,15,9.6 +Friday,20,5.1 +Wednesday,19,9.6 +Saturday,19,2.8 +Friday,4,20.6 +Wednesday,7,11.2 +Saturday,19,12.6 +Sunday,20,5.7 +Thursday,10,5.3 +Wednesday,15,9.7 +Saturday,15,9.9 +Wednesday,19,6.0 +Thursday,20,1.7 +Saturday,8,1.0 +Monday,18,9.7 +Tuesday,5,4.0 +Tuesday,10,2.8 +Saturday,7,6.0 +Friday,11,14.7 +Tuesday,8,7.7 +Saturday,17,3.6 +Wednesday,12,16.4 +Friday,11,18.0 +Thursday,7,7.0 +Monday,6,18.7 +Monday,11,1.7 +Friday,9,4.4 +Saturday,19,8.3 +Sunday,17,17.1 +Wednesday,10,10.6 +Saturday,3,15.5 +Tuesday,17,9.7 +Wednesday,6,25.7 +Wednesday,7,5.0 +Tuesday,22,1.2 +Saturday,7,11.2 +Monday,20,1.0 +Wednesday,8,14.3 +Sunday,14,6.9 +Thursday,15,9.3 +Thursday,4,25.1 +Sunday,19,9.2 +Wednesday,14,16.3 +Sunday,15,16.7 +Saturday,12,7.4 +Wednesday,21,18.9 +Thursday,13,14.7 +Sunday,12,11.5 +Sunday,11,16.4 +Wednesday,13,22.0 +Thursday,17,11.0 +Saturday,14,24.5 +Tuesday,21,17.3 +Tuesday,6,12.3 +Tuesday,12,16.7 +Tuesday,7,7.3 +Wednesday,15,16.8 +Saturday,9,24.5 +Saturday,10,13.9 +Wednesday,20,3.2 +Saturday,4,23.2 +Sunday,19,6.2 +Wednesday,5,17.4 +Friday,20,5.6 +Monday,11,22.9 +Friday,15,8.5 +Wednesday,10,10.1 +Thursday,15,5.2 +Sunday,13,8.4 +Monday,19,10.2 +Monday,13,16.7 +Saturday,19,7.4 +Monday,17,5.6 +Tuesday,20,1.9 +Saturday,15,15.5 +Friday,14,57.3 +Saturday,2,4.8 +Thursday,1,11.7 +Monday,20,14.5 +Tuesday,1,7.5 +Wednesday,17,5.0 +Wednesday,8,3.7 +Saturday,15,21.9 +Tuesday,6,7.3 +Saturday,17,1.7 +Sunday,18,4.3 +Saturday,9,11.7 +Wednesday,20,8.0 +Monday,19,5.3 +Thursday,19,2.7 +Friday,17,8.3 +Saturday,18,2.6 +Thursday,16,9.8 +Thursday,14,22.4 +Sunday,9,2.7 +Sunday,6,5.8 +Thursday,2,9.0 +Wednesday,1,5.4 +Monday,14,16.3 +Wednesday,17,14.4 +Tuesday,8,15.1 +Monday,9,13.5 +Friday,1,5.3 +Sunday,11,14.7 +Thursday,17,5.9 +Sunday,10,7.8 +Monday,3,8.0 +Thursday,20,0.9 +Saturday,9,8.6 +Sunday,7,13.8 +Friday,3,6.1 +Friday,18,15.8 +Wednesday,14,39.5 +Tuesday,14,16.0 +Sunday,11,17.5 +Tuesday,10,9.5 +Sunday,10,16.6 +Thursday,10,5.6 +Tuesday,10,4.8 +Sunday,12,19.8 +Monday,20,5.7 +Thursday,5,3.6 +Friday,20,6.5 +Saturday,10,22.7 +Sunday,18,8.2 +Wednesday,13,31.6 +Wednesday,22,6.9 +Monday,9,10.3 +Tuesday,22,11.9 +Friday,9,9.9 +Wednesday,6,9.6 +Monday,7,2.1 +Sunday,9,2.7 +Sunday,12,3.7 +Thursday,13,43.7 +Sunday,11,6.4 +Sunday,14,5.9 +Saturday,13,21.8 +Monday,0,26.8 +Wednesday,14,16.7 +Monday,14,10.9 +Sunday,16,2.7 +Wednesday,11,27.1 +Monday,12,2.5 +Thursday,8,7.6 +Tuesday,15,4.9 +Sunday,14,30.5 +Tuesday,9,11.4 +Wednesday,18,4.8 +Monday,19,12.8 +Sunday,14,11.8 +Wednesday,20,4.9 +Friday,13,4.3 +Friday,7,8.4 +Tuesday,8,3.7 +Sunday,18,3.5 +Friday,8,15.9 +Wednesday,13,27.9 +Monday,10,2.5 +Saturday,20,2.5 +Thursday,20,2.3 +Sunday,4,25.8 +Saturday,0,13.8 +Thursday,17,5.5 +Friday,13,16.4 +Thursday,11,4.8 +Wednesday,19,7.2 +Monday,9,29.0 +Friday,8,10.9 +Wednesday,9,11.9 +Wednesday,18,6.2 +Monday,20,4.7 +Wednesday,16,10.5 +Saturday,21,2.2 +Saturday,10,5.2 +Wednesday,13,2.5 +Sunday,8,3.9 +Saturday,20,4.2 +Wednesday,15,2.6 +Saturday,14,31.1 +Sunday,18,0.9 +Sunday,14,5.9 +Wednesday,21,1.9 +Saturday,9,4.1 +Monday,11,49.4 +Monday,20,8.6 +Wednesday,9,19.7 +Wednesday,19,6.7 +Friday,17,10.1 +Monday,19,5.3 +Saturday,15,18.3 +Friday,20,12.2 +Wednesday,19,8.5 +Thursday,17,5.6 +Thursday,10,24.1 +Wednesday,22,10.8 +Monday,20,7.8 +Monday,10,7.4 +Friday,10,10.2 +Sunday,13,7.1 +Saturday,2,10.9 +Saturday,9,11.0 +Sunday,0,5.9 +Friday,19,4.5 +Tuesday,21,5.5 +Wednesday,12,12.0 +Thursday,18,8.7 +Wednesday,19,7.0 +Wednesday,22,16.9 +Monday,19,1.8 +Sunday,15,4.4 +Thursday,4,5.4 +Tuesday,17,7.9 +Tuesday,17,4.9 +Sunday,18,16.6 +Wednesday,7,6.2 +Tuesday,12,2.2 +Thursday,19,0.6 +Wednesday,8,7.2 +Wednesday,12,15.5 +Saturday,18,5.4 +Saturday,2,11.6 +Sunday,12,24.2 +Sunday,11,8.4 +Wednesday,20,1.7 +Tuesday,10,11.2 +Thursday,20,4.6 +Wednesday,19,20.2 +Monday,17,8.1 +Monday,7,11.2 +Tuesday,14,8.2 +Wednesday,11,8.7 +Tuesday,16,20.0 +Wednesday,12,10.5 +Saturday,2,15.2 +Friday,10,8.7 +Friday,20,1.8 +Monday,9,11.8 +Tuesday,12,8.2 +Tuesday,13,9.8 +Monday,11,11.9 +Thursday,15,12.0 +Tuesday,10,4.6 +Saturday,7,2.8 +Saturday,15,9.8 +Thursday,2,24.6 +Thursday,20,5.2 +Saturday,19,3.1 +Wednesday,3,5.1 +Saturday,19,1.4 +Sunday,2,9.4 +Thursday,3,12.6 +Friday,11,24.3 +Saturday,9,3.0 +Sunday,9,5.9 +Monday,7,0.3 +Sunday,10,12.9 +Wednesday,9,9.6 +Saturday,10,14.7 +Thursday,9,2.7 +Monday,13,58.2 +Monday,16,20.9 +Thursday,8,16.8 +Tuesday,14,15.3 +Saturday,15,11.7 +Monday,18,5.5 +Monday,23,20.4 +Monday,5,12.0 +Wednesday,4,24.2 +Wednesday,13,4.6 +Sunday,7,7.3 +Friday,11,48.7 +Sunday,17,4.8 +Thursday,13,12.7 +Saturday,9,8.9 +Monday,8,16.5 +Thursday,14,7.8 +Tuesday,13,6.4 +Thursday,15,10.1 +Sunday,14,5.6 +Wednesday,15,18.0 +Saturday,8,5.6 +Thursday,17,20.4 +Friday,9,4.6 +Saturday,23,5.6 +Wednesday,20,15.2 +Monday,13,6.6 +Monday,16,0.6 +Tuesday,16,14.7 +Friday,9,2.1 +Tuesday,15,13.8 +Sunday,18,16.5 +Thursday,3,3.9 +Tuesday,14,5.3 +Tuesday,19,6.3 +Sunday,20,12.1 +Monday,14,17.6 +Tuesday,7,12.9 +Monday,8,5.6 +Monday,20,8.2 +Tuesday,5,26.6 +Friday,9,12.8 +Monday,20,0.8 +Saturday,8,11.6 +Thursday,0,19.4 +Saturday,18,10.4 +Tuesday,8,3.4 +Saturday,19,2.6 +Monday,10,6.7 +Friday,11,5.1 +Monday,20,6.2 +Tuesday,14,23.8 +Wednesday,4,25.6 +Thursday,18,8.0 +Monday,20,15.0 +Tuesday,8,6.9 +Sunday,13,37.4 +Friday,6,24.9 +Monday,19,23.7 +Sunday,16,5.8 +Sunday,21,26.6 +Sunday,18,6.9 +Saturday,8,18.5 +Friday,7,7.2 +Sunday,7,11.1 +Saturday,8,12.1 +Monday,20,8.6 +Wednesday,10,11.9 +Friday,20,1.2 +Tuesday,19,4.8 +Friday,5,19.2 +Thursday,19,2.9 +Tuesday,1,17.4 +Friday,6,3.8 +Thursday,18,8.4 +Monday,7,14.0 +Saturday,9,9.6 +Tuesday,19,3.4 +Friday,15,5.5 +Monday,7,13.9 +Friday,10,29.1 +Wednesday,9,16.7 +Sunday,17,10.6 +Friday,13,7.3 +Sunday,11,31.3 +Tuesday,20,8.7 +Monday,7,7.0 +Sunday,8,11.7 +Thursday,22,2.5 +Monday,18,7.0 +Friday,16,24.3 +Monday,17,11.3 +Monday,20,8.0 +Thursday,0,14.2 +Thursday,19,7.2 +Friday,12,9.6 +Tuesday,3,3.8 +Friday,20,15.4 +Thursday,19,8.3 +Thursday,12,14.4 +Sunday,11,12.8 +Monday,16,7.5 +Friday,10,13.2 +Thursday,6,3.4 +Friday,5,23.3 +Sunday,20,3.1 +Friday,13,14.2 +Wednesday,10,32.8 +Thursday,14,7.9 +Friday,14,6.5 +Thursday,10,3.1 +Thursday,13,4.8 +Sunday,16,8.7 +Thursday,19,12.0 +Friday,7,6.5 +Friday,11,10.9 +Friday,12,1.7 +Sunday,8,4.4 +Thursday,12,11.4 +Friday,20,12.8 +Wednesday,22,29.2 +Sunday,7,7.5 +Friday,15,1.6 +Wednesday,12,9.4 +Sunday,8,9.8 +Thursday,21,8.7 +Saturday,8,13.4 +Thursday,0,8.7 +Saturday,10,10.8 +Thursday,11,34.4 +Monday,8,8.2 +Sunday,13,6.1 +Saturday,13,6.1 +Tuesday,17,0.8 +Monday,22,13.0 +Sunday,19,8.8 +Tuesday,14,14.0 +Tuesday,14,10.7 +Tuesday,18,2.7 +Sunday,0,9.5 +Friday,4,4.4 +Thursday,14,26.6 +Wednesday,14,6.1 +Wednesday,19,17.0 +Friday,11,32.1 +Thursday,11,17.7 +Wednesday,1,26.3 +Thursday,20,3.4 +Friday,9,4.0 +Thursday,15,12.0 +Tuesday,17,12.8 +Saturday,7,7.6 +Saturday,18,4.2 +Friday,14,12.3 +Thursday,6,4.6 +Sunday,11,19.7 +Wednesday,8,6.8 +Friday,17,8.5 +Wednesday,8,21.0 +Tuesday,13,20.6 +Saturday,7,8.2 +Friday,20,3.1 +Thursday,15,4.2 +Monday,18,5.7 +Wednesday,13,12.4 +Monday,15,4.1 +Saturday,7,2.9 +Thursday,8,10.2 +Tuesday,15,9.3 +Tuesday,11,14.6 +Monday,18,0.7 +Friday,18,10.7 +Monday,4,16.1 +Tuesday,11,11.2 +Friday,17,10.5 +Friday,11,25.0 +Sunday,11,11.4 +Sunday,14,19.6 +Friday,4,21.8 +Saturday,12,17.4 +Sunday,23,3.3 +Thursday,16,3.2 +Tuesday,12,34.5 +Friday,19,14.7 +Saturday,1,16.8 +Friday,20,7.0 +Thursday,20,3.9 +Saturday,9,31.5 +Sunday,20,4.7 +Monday,9,19.0 +Saturday,20,4.7 +Friday,23,12.0 +Wednesday,20,6.5 +Monday,8,24.0 +Saturday,17,9.0 +Wednesday,12,31.1 +Monday,8,15.1 +Wednesday,6,14.2 +Wednesday,12,29.6 +Tuesday,9,8.1 +Sunday,9,9.4 +Wednesday,15,2.1 +Tuesday,8,1.5 +Tuesday,14,31.3 +Friday,15,32.2 +Sunday,18,2.3 +Wednesday,10,40.3 +Friday,2,17.0 +Thursday,11,16.9 +Friday,9,29.5 +Wednesday,10,6.5 +Saturday,16,3.8 +Monday,18,5.8 +Tuesday,18,6.5 +Tuesday,19,7.5 +Friday,18,4.6 +Wednesday,20,1.2 +Saturday,9,8.5 +Sunday,17,1.7 +Thursday,20,2.4 +Wednesday,9,26.5 +Wednesday,15,21.9 +Tuesday,13,2.9 +Thursday,18,3.8 +Monday,19,0.9 +Monday,15,11.6 +Tuesday,7,11.0 +Saturday,10,12.6 +Tuesday,9,3.8 +Sunday,18,5.9 +Monday,8,6.5 +Sunday,8,8.5 +Monday,20,18.4 +Saturday,23,9.1 +Thursday,15,12.8 +Friday,9,12.4 +Wednesday,20,8.2 +Saturday,7,9.5 +Friday,15,1.8 +Monday,11,11.5 +Tuesday,14,15.4 +Tuesday,17,2.9 +Wednesday,18,10.4 +Monday,9,4.3 +Friday,12,1.2 +Wednesday,12,12.0 +Sunday,7,16.5 +Friday,14,8.2 +Tuesday,19,3.8 +Monday,4,19.0 +Wednesday,15,8.8 +Wednesday,23,1.7 +Saturday,4,9.0 +Monday,8,2.0 +Friday,23,1.7 +Sunday,4,11.1 +Wednesday,14,38.7 +Sunday,15,15.2 +Sunday,3,6.5 +Saturday,19,16.8 +Tuesday,4,22.6 +Tuesday,11,2.4 +Tuesday,18,6.5 +Friday,3,5.8 +Tuesday,18,6.7 +Saturday,18,13.4 +Friday,17,19.0 +Tuesday,12,8.9 +Monday,2,24.2 +Wednesday,9,6.8 +Friday,11,9.2 +Saturday,16,0.7 +Friday,10,39.9 +Thursday,15,2.0 +Monday,3,22.8 +Tuesday,10,2.7 +Tuesday,18,6.0 +Monday,17,1.5 +Thursday,8,4.6 +Thursday,9,6.4 +Wednesday,16,4.3 +Saturday,13,22.0 +Tuesday,19,9.6 +Wednesday,17,3.5 +Wednesday,7,1.3 +Wednesday,17,6.0 +Friday,8,4.8 +Monday,13,12.0 +Thursday,19,11.0 +Saturday,17,0.9 +Tuesday,8,10.9 +Tuesday,20,1.5 +Tuesday,20,5.8 +Monday,14,13.3 +Saturday,4,18.4 +Monday,17,6.3 +Saturday,8,6.0 +Thursday,15,10.8 +Wednesday,17,17.9 +Thursday,12,6.5 +Friday,10,28.7 +Saturday,13,9.5 +Monday,9,0.9 +Thursday,7,1.3 +Thursday,4,3.7 +Friday,8,4.6 +Monday,14,12.0 +Monday,15,5.0 +Monday,4,12.2 +Friday,17,30.5 +Monday,11,19.2 +Sunday,10,3.0 +Sunday,11,6.8 +Sunday,15,8.0 +Saturday,9,13.5 +Friday,0,16.3 +Friday,19,3.0 +Wednesday,10,20.9 +Tuesday,10,17.0 +Wednesday,8,19.8 +Monday,10,0.8 +Friday,17,8.2 +Friday,7,13.3 +Wednesday,17,16.0 +Friday,7,1.1 +Saturday,11,6.5 +Saturday,13,11.4 +Friday,18,1.6 +Tuesday,8,8.8 +Saturday,10,5.3 +Sunday,16,0.7 +Friday,19,13.7 +Friday,19,0.2 +Monday,7,10.1 +Saturday,18,0.9 +Saturday,17,9.8 +Thursday,14,12.5 +Sunday,11,24.6 +Saturday,18,8.5 +Friday,18,9.7 +Wednesday,15,8.0 +Tuesday,10,12.6 +Tuesday,0,10.6 +Wednesday,5,9.1 +Sunday,18,5.7 +Friday,10,8.8 +Sunday,8,10.2 +Friday,6,4.0 +Thursday,22,17.6 +Tuesday,12,6.4 +Thursday,14,5.1 +Friday,7,8.2 +Monday,12,14.8 +Sunday,10,3.1 +Saturday,10,30.2 +Sunday,15,14.3 +Thursday,14,10.2 +Wednesday,2,24.7 +Monday,18,13.5 +Monday,4,16.1 +Thursday,11,26.3 +Tuesday,16,9.1 +Thursday,16,4.4 +Wednesday,12,11.2 +Friday,12,0.5 +Wednesday,12,6.4 +Sunday,15,7.9 +Thursday,22,20.2 +Friday,17,3.4 +Thursday,11,14.4 +Sunday,17,6.5 +Thursday,14,12.9 +Wednesday,11,30.9 +Wednesday,12,23.1 +Saturday,14,9.1 +Wednesday,15,17.7 +Friday,22,11.4 +Friday,20,6.3 +Wednesday,3,2.5 +Friday,13,13.3 +Tuesday,9,15.4 +Monday,1,15.9 +Wednesday,8,5.3 +Tuesday,12,52.5 +Monday,8,4.1 +Thursday,19,3.4 +Tuesday,10,10.6 +Friday,9,7.1 +Saturday,7,4.6 +Wednesday,19,2.2 +Saturday,10,16.6 +Sunday,15,4.9 +Wednesday,7,10.8 +Friday,6,12.4 +Friday,15,18.4 +Monday,11,33.3 +Wednesday,19,4.9 +Sunday,14,30.1 +Thursday,16,9.7 +Saturday,14,34.1 +Sunday,18,11.9 +Wednesday,10,31.2 +Monday,14,16.2 +Friday,14,19.6 +Friday,14,6.7 +Friday,16,9.5 +Thursday,16,17.7 +Monday,18,8.0 +Thursday,10,26.2 +Saturday,23,2.1 +Wednesday,20,5.6 +Monday,12,5.8 +Wednesday,11,11.6 +Monday,16,8.4 +Tuesday,11,10.2 +Tuesday,9,26.0 +Wednesday,8,10.8 +Saturday,21,14.9 +Sunday,5,13.3 +Friday,8,8.5 +Monday,9,39.8 +Thursday,20,2.6 +Thursday,14,11.1 +Friday,1,34.5 +Tuesday,0,28.3 +Friday,20,17.2 +Monday,15,10.9 +Saturday,19,6.3 +Monday,9,8.5 +Saturday,8,4.4 +Saturday,20,8.1 +Thursday,20,4.5 +Monday,1,17.0 +Saturday,4,11.9 +Wednesday,7,12.9 +Tuesday,11,7.1 +Thursday,9,10.2 +Saturday,13,4.7 +Friday,16,7.9 +Friday,13,4.3 +Wednesday,20,7.2 +Saturday,4,13.0 +Friday,12,8.2 +Wednesday,13,11.2 +Thursday,15,15.0 +Wednesday,10,20.1 +Sunday,8,10.1 +Friday,9,8.1 +Friday,17,3.8 +Wednesday,12,20.0 +Sunday,10,6.3 +Thursday,9,3.9 +Saturday,12,10.9 +Monday,18,4.3 +Tuesday,7,9.3 +Saturday,16,9.7 +Thursday,16,1.7 +Sunday,15,8.8 +Friday,19,7.3 +Tuesday,11,5.1 +Monday,18,7.1 +Sunday,20,1.2 +Sunday,8,14.0 +Tuesday,9,31.0 +Saturday,14,25.8 +Sunday,20,15.8 +Tuesday,13,20.0 +Saturday,4,10.5 +Wednesday,16,2.5 +Friday,20,5.2 +Monday,19,7.6 +Monday,19,8.4 +Sunday,2,7.1 +Wednesday,7,1.4 +Monday,17,3.1 +Friday,11,19.2 +Tuesday,5,33.4 +Saturday,3,4.8 +Friday,18,6.8 +Monday,7,21.4 +Wednesday,13,5.7 +Thursday,15,18.1 +Sunday,16,4.8 +Friday,8,13.4 +Saturday,11,5.1 +Tuesday,8,7.8 +Wednesday,6,11.1 +Thursday,0,2.1 +Sunday,12,13.6 +Friday,23,2.0 +Tuesday,17,3.7 +Monday,18,4.8 +Wednesday,0,16.2 +Tuesday,10,4.8 +Tuesday,20,7.3 +Sunday,18,2.7 +Tuesday,23,5.7 +Saturday,14,0.7 +Thursday,8,13.6 +Sunday,19,12.0 +Saturday,12,6.5 +Wednesday,23,3.3 +Monday,20,0.3 +Monday,8,3.9 +Sunday,11,16.2 +Monday,19,2.6 +Thursday,17,8.3 +Wednesday,8,33.0 +Tuesday,15,8.6 +Wednesday,8,3.2 +Tuesday,11,3.4 +Tuesday,11,5.4 +Tuesday,13,6.9 +Sunday,8,2.2 +Sunday,17,4.0 +Monday,8,6.7 +Sunday,16,8.4 +Monday,11,30.7 +Friday,7,7.7 +Friday,11,4.8 +Sunday,17,2.1 +Tuesday,12,27.1 +Sunday,3,8.8 +Monday,23,15.1 +Tuesday,13,13.3 +Wednesday,1,5.5 +Tuesday,9,9.2 +Saturday,11,15.2 +Tuesday,7,4.5 +Wednesday,12,3.7 +Tuesday,12,13.4 +Monday,16,11.3 +Saturday,11,30.3 +Monday,20,17.8 +Monday,18,5.7 +Monday,7,5.9 +Saturday,12,15.1 +Thursday,9,10.2 diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-renamed/case.json b/agents/evals/fixtures/cases/heatmap-basic-pygal-renamed/case.json new file mode 100644 index 00000000000..a87d0e61f78 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-renamed/case.json @@ -0,0 +1,29 @@ +{ + "spec_id": "heatmap-basic", + "library": "pygal", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "y", + "column": "Wochentag" + }, + { + "role": "x", + "column": "Stunde" + }, + { + "role": "value", + "column": "Antwortzeit Ø (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "renamed", + "synthetic", + "renamed-headers", + "non-ascii-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, renamed)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-renamed/data.csv b/agents/evals/fixtures/cases/heatmap-basic-pygal-renamed/data.csv new file mode 100644 index 00000000000..9ecbdd0a6d9 --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-renamed/data.csv @@ -0,0 +1,169 @@ +Wochentag,Stunde,Antwortzeit Ø (min) +Monday,0,14.2 +Monday,1,15.3 +Monday,2,14.3 +Monday,3,14.8 +Monday,4,14.6 +Monday,5,14.8 +Monday,6,13.5 +Monday,7,8.7 +Monday,8,10.2 +Monday,9,11.4 +Monday,10,14.5 +Monday,11,16.2 +Monday,12,17.9 +Monday,13,16.8 +Monday,14,14.7 +Monday,15,13.2 +Monday,16,10.9 +Monday,17,8.6 +Monday,18,6.9 +Monday,19,6.0 +Monday,20,6.5 +Monday,21,13.8 +Monday,22,13.1 +Monday,23,14.4 +Tuesday,0,14.2 +Tuesday,1,13.3 +Tuesday,2,13.6 +Tuesday,3,14.8 +Tuesday,4,14.2 +Tuesday,5,14.2 +Tuesday,6,14.2 +Tuesday,7,6.7 +Tuesday,8,9.5 +Tuesday,9,13.2 +Tuesday,10,15.7 +Tuesday,11,17.4 +Tuesday,12,18.2 +Tuesday,13,16.1 +Tuesday,14,15.4 +Tuesday,15,13.5 +Tuesday,16,12.0 +Tuesday,17,9.8 +Tuesday,18,7.0 +Tuesday,19,7.1 +Tuesday,20,5.8 +Tuesday,21,14.1 +Tuesday,22,13.7 +Tuesday,23,14.3 +Wednesday,0,15.4 +Wednesday,1,14.5 +Wednesday,2,14.1 +Wednesday,3,12.6 +Wednesday,4,14.3 +Wednesday,5,13.4 +Wednesday,6,16.0 +Wednesday,7,7.4 +Wednesday,8,8.7 +Wednesday,9,11.8 +Wednesday,10,15.3 +Wednesday,11,14.9 +Wednesday,12,16.2 +Wednesday,13,15.9 +Wednesday,14,15.3 +Wednesday,15,13.4 +Wednesday,16,10.9 +Wednesday,17,10.1 +Wednesday,18,7.9 +Wednesday,19,6.0 +Wednesday,20,6.2 +Wednesday,21,13.9 +Wednesday,22,14.5 +Wednesday,23,13.2 +Thursday,0,13.0 +Thursday,1,14.3 +Thursday,2,14.4 +Thursday,3,13.6 +Thursday,4,13.9 +Thursday,5,12.9 +Thursday,6,13.6 +Thursday,7,7.7 +Thursday,8,9.5 +Thursday,9,12.8 +Thursday,10,14.7 +Thursday,11,17.0 +Thursday,12,15.3 +Thursday,13,15.7 +Thursday,14,14.7 +Thursday,15,13.1 +Thursday,16,12.0 +Thursday,17,9.4 +Thursday,18,6.7 +Thursday,19,7.3 +Thursday,20,7.8 +Thursday,21,13.4 +Thursday,22,13.8 +Thursday,23,14.0 +Friday,0,14.6 +Friday,1,14.6 +Friday,2,14.3 +Friday,3,14.8 +Friday,4,13.7 +Friday,5,13.9 +Friday,6,15.0 +Friday,7,7.6 +Friday,8,9.2 +Friday,9,12.3 +Friday,10,15.0 +Friday,11,14.7 +Friday,12,15.5 +Friday,13,15.7 +Friday,14,15.4 +Friday,15,14.0 +Friday,16,12.4 +Friday,17,9.2 +Friday,18,5.9 +Friday,19,6.6 +Friday,20,5.9 +Friday,21,14.4 +Friday,22,14.4 +Friday,23,13.5 +Saturday,0,14.3 +Saturday,1,14.4 +Saturday,2,13.4 +Saturday,3,14.3 +Saturday,4,13.3 +Saturday,5,14.2 +Saturday,6,14.0 +Saturday,7,5.2 +Saturday,8,8.2 +Saturday,9,9.4 +Saturday,10,10.2 +Saturday,11,12.1 +Saturday,12,11.9 +Saturday,13,12.1 +Saturday,14,11.1 +Saturday,15,9.6 +Saturday,16,8.6 +Saturday,17,8.3 +Saturday,18,6.6 +Saturday,19,5.6 +Saturday,20,4.0 +Saturday,21,12.9 +Saturday,22,14.1 +Saturday,23,14.2 +Sunday,0,14.9 +Sunday,1,13.9 +Sunday,2,11.5 +Sunday,3,13.8 +Sunday,4,14.2 +Sunday,5,14.9 +Sunday,6,13.6 +Sunday,7,6.7 +Sunday,8,8.8 +Sunday,9,8.8 +Sunday,10,11.1 +Sunday,11,12.1 +Sunday,12,11.0 +Sunday,13,10.3 +Sunday,14,10.7 +Sunday,15,9.7 +Sunday,16,9.2 +Sunday,17,8.9 +Sunday,18,6.4 +Sunday,19,6.9 +Sunday,20,6.0 +Sunday,21,12.8 +Sunday,22,12.7 +Sunday,23,12.4 diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-x10/case.json b/agents/evals/fixtures/cases/heatmap-basic-pygal-x10/case.json new file mode 100644 index 00000000000..ac614f11b0c --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-x10/case.json @@ -0,0 +1,28 @@ +{ + "spec_id": "heatmap-basic", + "library": "pygal", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "y", + "column": "Weekday" + }, + { + "role": "x", + "column": "Hour" + }, + { + "role": "value", + "column": "Response Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "heatmap", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 606, x10)" +} diff --git a/agents/evals/fixtures/cases/heatmap-basic-pygal-x10/data.csv b/agents/evals/fixtures/cases/heatmap-basic-pygal-x10/data.csv new file mode 100644 index 00000000000..0acbde41bff --- /dev/null +++ b/agents/evals/fixtures/cases/heatmap-basic-pygal-x10/data.csv @@ -0,0 +1,169 @@ +Weekday,Hour,Response Time (min) +Monday,0,142.1 +Monday,1,153.0 +Monday,2,142.9 +Monday,3,147.9 +Monday,4,146.3 +Monday,5,147.8 +Monday,6,134.9 +Monday,7,86.6 +Monday,8,101.7 +Monday,9,113.6 +Monday,10,145.0 +Monday,11,161.6 +Monday,12,178.7 +Monday,13,167.8 +Monday,14,147.1 +Monday,15,131.8 +Monday,16,109.1 +Monday,17,85.7 +Monday,18,69.1 +Monday,19,60.2 +Monday,20,65.4 +Monday,21,138.5 +Monday,22,131.0 +Monday,23,144.0 +Tuesday,0,141.8 +Tuesday,1,132.7 +Tuesday,2,136.2 +Tuesday,3,148.4 +Tuesday,4,142.0 +Tuesday,5,142.4 +Tuesday,6,142.2 +Tuesday,7,67.3 +Tuesday,8,94.6 +Tuesday,9,131.5 +Tuesday,10,157.5 +Tuesday,11,174.2 +Tuesday,12,181.8 +Tuesday,13,161.2 +Tuesday,14,154.4 +Tuesday,15,134.8 +Tuesday,16,120.1 +Tuesday,17,98.2 +Tuesday,18,70.2 +Tuesday,19,70.7 +Tuesday,20,57.5 +Tuesday,21,141.1 +Tuesday,22,136.7 +Tuesday,23,142.7 +Wednesday,0,153.6 +Wednesday,1,145.3 +Wednesday,2,141.1 +Wednesday,3,125.5 +Wednesday,4,142.9 +Wednesday,5,134.1 +Wednesday,6,160.3 +Wednesday,7,74.2 +Wednesday,8,87.0 +Wednesday,9,117.6 +Wednesday,10,153.1 +Wednesday,11,148.8 +Wednesday,12,162.2 +Wednesday,13,158.8 +Wednesday,14,152.9 +Wednesday,15,133.9 +Wednesday,16,109.1 +Wednesday,17,101.2 +Wednesday,18,78.6 +Wednesday,19,59.6 +Wednesday,20,62.4 +Wednesday,21,138.5 +Wednesday,22,145.5 +Wednesday,23,132.3 +Thursday,0,129.6 +Thursday,1,142.6 +Thursday,2,144.2 +Thursday,3,136.2 +Thursday,4,139.3 +Thursday,5,129.1 +Thursday,6,135.7 +Thursday,7,77.0 +Thursday,8,94.6 +Thursday,9,128.4 +Thursday,10,147.4 +Thursday,11,169.8 +Thursday,12,153.4 +Thursday,13,156.7 +Thursday,14,146.6 +Thursday,15,131.2 +Thursday,16,120.1 +Thursday,17,94.3 +Thursday,18,66.6 +Thursday,19,72.7 +Thursday,20,78.0 +Thursday,21,134.2 +Thursday,22,137.9 +Thursday,23,139.9 +Friday,0,145.6 +Friday,1,145.8 +Friday,2,143.1 +Friday,3,148.2 +Friday,4,136.9 +Friday,5,139.1 +Friday,6,150.2 +Friday,7,75.7 +Friday,8,91.6 +Friday,9,122.6 +Friday,10,150.2 +Friday,11,147.5 +Friday,12,154.8 +Friday,13,156.9 +Friday,14,154.4 +Friday,15,139.7 +Friday,16,123.6 +Friday,17,91.7 +Friday,18,59.3 +Friday,19,65.5 +Friday,20,58.6 +Friday,21,143.7 +Friday,22,143.7 +Friday,23,135.4 +Saturday,0,142.9 +Saturday,1,143.9 +Saturday,2,133.6 +Saturday,3,142.8 +Saturday,4,132.7 +Saturday,5,142.3 +Saturday,6,139.6 +Saturday,7,52.0 +Saturday,8,81.9 +Saturday,9,93.8 +Saturday,10,102.2 +Saturday,11,121.3 +Saturday,12,119.1 +Saturday,13,121.1 +Saturday,14,110.7 +Saturday,15,96.3 +Saturday,16,86.3 +Saturday,17,83.2 +Saturday,18,66.4 +Saturday,19,55.6 +Saturday,20,40.1 +Saturday,21,128.9 +Saturday,22,141.5 +Saturday,23,142.4 +Sunday,0,148.8 +Sunday,1,139.5 +Sunday,2,114.9 +Sunday,3,138.4 +Sunday,4,142.3 +Sunday,5,148.6 +Sunday,6,136.0 +Sunday,7,67.1 +Sunday,8,88.3 +Sunday,9,88.3 +Sunday,10,110.8 +Sunday,11,121.3 +Sunday,12,110.4 +Sunday,13,102.6 +Sunday,14,107.0 +Sunday,15,97.3 +Sunday,16,91.8 +Sunday,17,89.3 +Sunday,18,63.5 +Sunday,19,69.3 +Sunday,20,59.7 +Sunday,21,128.1 +Sunday,22,127.1 +Sunday,23,124.0 diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-date/case.json b/agents/evals/fixtures/cases/histogram-basic-letsplot-date/case.json new file mode 100644 index 00000000000..f401fb0ec9a --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-date/case.json @@ -0,0 +1,22 @@ +{ + "spec_id": "histogram-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "values", + "column": "Delivery Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, date)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-date/data.csv b/agents/evals/fixtures/cases/histogram-basic-letsplot-date/data.csv new file mode 100644 index 00000000000..c4a83ef4428 --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-date/data.csv @@ -0,0 +1,401 @@ +Order ID,Delivery Time (min),Order Date,Delivered On +O-10001,38.3,03.05.2026,2026-05-06 +O-10002,39.4,18.01.2026,2026-01-22 +O-10003,36.7,09.04.2026,2026-04-11 +O-10004,36.6,03.06.2026,2026-06-03 +O-10005,16.3,24.01.2026,2026-01-24 +O-10006,25.4,21.05.2026,2026-05-22 +O-10007,25.4,29.03.2026,2026-03-29 +O-10008,28.7,28.02.2026,2026-03-03 +O-10009,38.1,17.01.2026,2026-01-18 +O-10010,29.6,24.02.2026,2026-02-26 +O-10011,19.5,24.04.2026,2026-04-28 +O-10012,36.0,12.01.2026,2026-01-12 +O-10013,53.0,25.02.2026,2026-02-27 +O-10014,30.1,14.03.2026,2026-03-17 +O-10015,21.3,10.06.2026,2026-06-11 +O-10016,47.9,29.03.2026,2026-04-01 +O-10017,41.8,10.06.2026,2026-06-13 +O-10018,26.4,01.07.2026,2026-07-05 +O-10019,32.4,18.02.2026,2026-02-18 +O-10020,22.9,10.02.2026,2026-02-14 +O-10021,52.4,17.05.2026,2026-05-17 +O-10022,31.4,09.04.2026,2026-04-09 +O-10023,19.7,09.03.2026,2026-03-12 +O-10024,31.1,26.05.2026,2026-05-26 +O-10025,38.2,19.01.2026,2026-01-19 +O-10026,52.7,06.04.2026,2026-04-06 +O-10027,23.9,01.04.2026,2026-04-02 +O-10028,39.3,26.03.2026,2026-03-27 +O-10029,46.8,09.03.2026,2026-03-12 +O-10030,38.3,14.06.2026,2026-06-14 +O-10031,24.2,25.03.2026,2026-03-28 +O-10032,57.8,08.04.2026,2026-04-09 +O-10033,44.9,19.05.2026,2026-05-22 +O-10034,67.6,22.02.2026,2026-02-26 +O-10035,22.3,16.04.2026,2026-04-18 +O-10036,27.3,21.03.2026,2026-03-22 +O-10037,17.8,01.03.2026,2026-03-02 +O-10038,34.3,01.03.2026,2026-03-05 +O-10039,36.7,13.06.2026,2026-06-16 +O-10040,25.1,26.02.2026,2026-02-26 +O-10041,31.6,13.05.2026,2026-05-14 +O-10042,52.9,24.04.2026,2026-04-24 +O-10043,29.7,29.04.2026,2026-05-02 +O-10044,30.9,28.03.2026,2026-03-30 +O-10045,52.3,16.03.2026,2026-03-20 +O-10046,32.4,16.05.2026,2026-05-20 +O-10047,47.4,02.04.2026,2026-04-03 +O-10048,62.4,08.06.2026,2026-06-11 +O-10049,22.5,15.02.2026,2026-02-19 +O-10050,14.7,18.04.2026,2026-04-22 +O-10051,34.6,13.02.2026,2026-02-16 +O-10052,19.6,27.02.2026,2026-02-28 +O-10053,34.0,13.06.2026,2026-06-13 +O-10054,29.6,15.04.2026,2026-04-15 +O-10055,27.2,10.02.2026,2026-02-12 +O-10056,53.7,27.02.2026,2026-02-28 +O-10057,66.8,01.04.2026,2026-04-03 +O-10058,34.1,13.05.2026,2026-05-14 +O-10059,39.1,26.06.2026,2026-06-28 +O-10060,32.1,09.04.2026,2026-04-11 +O-10061,50.4,03.02.2026,2026-02-07 +O-10062,18.7,04.03.2026,2026-03-05 +O-10063,32.2,10.04.2026,2026-04-14 +O-10064,66.0,07.05.2026,2026-05-09 +O-10065,40.7,07.04.2026,2026-04-10 +O-10066,76.3,27.02.2026,2026-03-01 +O-10067,15.7,26.02.2026,2026-03-01 +O-10068,18.2,10.02.2026,2026-02-10 +O-10069,18.4,18.01.2026,2026-01-19 +O-10070,23.2,08.05.2026,2026-05-08 +O-10071,34.8,12.01.2026,2026-01-15 +O-10072,30.9,15.03.2026,2026-03-15 +O-10073,39.8,06.06.2026,2026-06-08 +O-10074,27.5,04.06.2026,2026-06-04 +O-10075,17.7,26.03.2026,2026-03-30 +O-10076,84.2,21.01.2026,2026-01-21 +O-10077,27.9,05.01.2026,2026-01-08 +O-10078,22.2,16.01.2026,2026-01-17 +O-10079,92.0,05.03.2026,2026-03-08 +O-10080,31.1,06.05.2026,2026-05-06 +O-10081,30.6,13.03.2026,2026-03-15 +O-10082,55.0,01.05.2026,2026-05-02 +O-10083,35.7,04.04.2026,2026-04-04 +O-10084,22.3,21.05.2026,2026-05-22 +O-10085,11.9,29.05.2026,2026-05-30 +O-10086,14.1,12.04.2026,2026-04-15 +O-10087,24.0,06.01.2026,2026-01-10 +O-10088,29.3,13.03.2026,2026-03-17 +O-10089,46.9,20.02.2026,2026-02-23 +O-10090,26.2,29.05.2026,2026-06-01 +O-10091,20.2,18.01.2026,2026-01-18 +O-10092,18.5,07.06.2026,2026-06-09 +O-10093,16.2,28.03.2026,2026-04-01 +O-10094,26.1,12.02.2026,2026-02-15 +O-10095,31.2,22.05.2026,2026-05-22 +O-10096,57.1,11.01.2026,2026-01-11 +O-10097,15.0,17.02.2026,2026-02-20 +O-10098,33.6,21.01.2026,2026-01-21 +O-10099,24.4,24.02.2026,2026-02-27 +O-10100,44.1,24.03.2026,2026-03-26 +O-10101,51.7,18.06.2026,2026-06-18 +O-10102,35.6,26.03.2026,2026-03-29 +O-10103,18.6,08.03.2026,2026-03-08 +O-10104,41.6,22.03.2026,2026-03-22 +O-10105,47.3,05.04.2026,2026-04-08 +O-10106,27.6,10.01.2026,2026-01-12 +O-10107,45.3,28.01.2026,2026-01-28 +O-10108,43.6,26.04.2026,2026-04-26 +O-10109,19.1,20.05.2026,2026-05-24 +O-10110,26.2,12.06.2026,2026-06-16 +O-10111,20.6,22.05.2026,2026-05-26 +O-10112,29.6,29.05.2026,2026-05-31 +O-10113,61.9,22.02.2026,2026-02-22 +O-10114,58.8,11.04.2026,2026-04-12 +O-10115,20.6,11.04.2026,2026-04-14 +O-10116,13.7,25.06.2026,2026-06-25 +O-10117,14.8,24.03.2026,2026-03-27 +O-10118,36.3,18.06.2026,2026-06-22 +O-10119,116.4,14.02.2026,2026-02-18 +O-10120,51.6,12.04.2026,2026-04-12 +O-10121,19.3,21.02.2026,2026-02-23 +O-10122,48.0,15.04.2026,2026-04-17 +O-10123,106.1,12.04.2026,2026-04-12 +O-10124,42.9,26.03.2026,2026-03-28 +O-10125,17.9,09.06.2026,2026-06-13 +O-10126,27.9,28.06.2026,2026-06-30 +O-10127,18.3,19.02.2026,2026-02-23 +O-10128,88.9,21.05.2026,2026-05-25 +O-10129,51.3,09.01.2026,2026-01-09 +O-10130,22.7,24.06.2026,2026-06-28 +O-10131,39.0,11.03.2026,2026-03-11 +O-10132,31.8,30.01.2026,2026-02-03 +O-10133,43.4,01.05.2026,2026-05-04 +O-10134,27.5,14.02.2026,2026-02-15 +O-10135,21.1,10.04.2026,2026-04-10 +O-10136,26.0,02.03.2026,2026-03-05 +O-10137,32.5,12.02.2026,2026-02-13 +O-10138,23.8,13.06.2026,2026-06-14 +O-10139,28.4,21.02.2026,2026-02-21 +O-10140,16.3,10.02.2026,2026-02-10 +O-10141,18.4,25.02.2026,2026-03-01 +O-10142,29.0,24.01.2026,2026-01-28 +O-10143,40.9,07.02.2026,2026-02-10 +O-10144,30.8,05.01.2026,2026-01-08 +O-10145,39.6,14.05.2026,2026-05-17 +O-10146,32.4,27.02.2026,2026-03-03 +O-10147,25.0,23.06.2026,2026-06-25 +O-10148,35.2,20.06.2026,2026-06-21 +O-10149,18.7,01.06.2026,2026-06-03 +O-10150,30.7,19.04.2026,2026-04-23 +O-10151,31.5,01.02.2026,2026-02-01 +O-10152,22.7,06.01.2026,2026-01-06 +O-10153,20.7,17.06.2026,2026-06-17 +O-10154,27.3,18.02.2026,2026-02-18 +O-10155,43.8,25.02.2026,2026-02-25 +O-10156,33.0,26.04.2026,2026-04-28 +O-10157,42.1,03.04.2026,2026-04-07 +O-10158,20.7,15.04.2026,2026-04-15 +O-10159,14.8,19.04.2026,2026-04-20 +O-10160,16.0,16.05.2026,2026-05-18 +O-10161,25.2,06.01.2026,2026-01-06 +O-10162,38.5,04.02.2026,2026-02-05 +O-10163,39.5,03.04.2026,2026-04-06 +O-10164,43.0,01.07.2026,2026-07-02 +O-10165,37.5,28.05.2026,2026-05-30 +O-10166,23.2,01.04.2026,2026-04-05 +O-10167,62.0,18.06.2026,2026-06-19 +O-10168,9.8,08.06.2026,2026-06-08 +O-10169,41.2,08.01.2026,2026-01-08 +O-10170,33.8,18.02.2026,2026-02-22 +O-10171,21.5,19.03.2026,2026-03-23 +O-10172,57.7,20.02.2026,2026-02-22 +O-10173,34.0,01.07.2026,2026-07-01 +O-10174,16.2,11.03.2026,2026-03-15 +O-10175,27.2,19.05.2026,2026-05-21 +O-10176,16.4,15.02.2026,2026-02-17 +O-10177,29.6,18.04.2026,2026-04-20 +O-10178,22.8,09.06.2026,2026-06-13 +O-10179,23.1,25.01.2026,2026-01-29 +O-10180,36.4,03.04.2026,2026-04-03 +O-10181,61.6,12.06.2026,2026-06-16 +O-10182,23.9,25.06.2026,2026-06-26 +O-10183,25.1,24.02.2026,2026-02-26 +O-10184,23.6,30.03.2026,2026-04-02 +O-10185,23.1,01.05.2026,2026-05-01 +O-10186,32.4,08.01.2026,2026-01-12 +O-10187,86.5,08.04.2026,2026-04-12 +O-10188,26.8,24.05.2026,2026-05-26 +O-10189,40.1,28.06.2026,2026-07-01 +O-10190,22.4,22.06.2026,2026-06-23 +O-10191,32.4,25.03.2026,2026-03-28 +O-10192,25.6,26.02.2026,2026-02-27 +O-10193,30.6,22.06.2026,2026-06-23 +O-10194,68.7,13.05.2026,2026-05-16 +O-10195,37.1,06.02.2026,2026-02-06 +O-10196,29.5,16.03.2026,2026-03-19 +O-10197,61.1,05.06.2026,2026-06-06 +O-10198,50.7,02.07.2026,2026-07-02 +O-10199,35.4,03.06.2026,2026-06-07 +O-10200,36.6,19.06.2026,2026-06-21 +O-10201,37.5,03.04.2026,2026-04-07 +O-10202,37.9,14.01.2026,2026-01-16 +O-10203,18.0,22.05.2026,2026-05-26 +O-10204,41.9,08.02.2026,2026-02-08 +O-10205,53.1,09.06.2026,2026-06-13 +O-10206,19.9,19.02.2026,2026-02-19 +O-10207,16.4,10.02.2026,2026-02-13 +O-10208,39.5,27.06.2026,2026-06-30 +O-10209,32.8,20.04.2026,2026-04-20 +O-10210,37.9,07.01.2026,2026-01-10 +O-10211,39.5,19.06.2026,2026-06-22 +O-10212,39.4,11.03.2026,2026-03-13 +O-10213,24.6,05.04.2026,2026-04-06 +O-10214,40.7,28.03.2026,2026-04-01 +O-10215,27.6,29.04.2026,2026-05-01 +O-10216,21.4,04.06.2026,2026-06-06 +O-10217,44.1,20.02.2026,2026-02-20 +O-10218,22.6,19.05.2026,2026-05-22 +O-10219,30.9,22.01.2026,2026-01-22 +O-10220,26.5,12.06.2026,2026-06-12 +O-10221,20.7,04.02.2026,2026-02-06 +O-10222,21.7,03.02.2026,2026-02-03 +O-10223,31.1,16.01.2026,2026-01-19 +O-10224,31.1,17.05.2026,2026-05-20 +O-10225,39.7,12.05.2026,2026-05-16 +O-10226,30.2,16.03.2026,2026-03-17 +O-10227,22.8,18.06.2026,2026-06-22 +O-10228,36.3,15.01.2026,2026-01-15 +O-10229,32.5,30.05.2026,2026-06-03 +O-10230,49.4,21.02.2026,2026-02-23 +O-10231,39.2,10.01.2026,2026-01-12 +O-10232,21.6,01.06.2026,2026-06-01 +O-10233,13.8,22.01.2026,2026-01-24 +O-10234,31.1,16.02.2026,2026-02-19 +O-10235,21.9,30.05.2026,2026-05-30 +O-10236,49.0,07.04.2026,2026-04-10 +O-10237,20.4,29.03.2026,2026-04-01 +O-10238,21.4,04.02.2026,2026-02-04 +O-10239,48.5,19.06.2026,2026-06-23 +O-10240,17.1,10.06.2026,2026-06-11 +O-10241,29.3,02.02.2026,2026-02-03 +O-10242,69.6,14.02.2026,2026-02-14 +O-10243,31.2,05.05.2026,2026-05-09 +O-10244,43.1,04.04.2026,2026-04-04 +O-10245,46.7,08.05.2026,2026-05-09 +O-10246,28.7,08.04.2026,2026-04-10 +O-10247,31.7,07.02.2026,2026-02-11 +O-10248,30.0,02.02.2026,2026-02-04 +O-10249,38.1,15.04.2026,2026-04-19 +O-10250,14.8,25.01.2026,2026-01-26 +O-10251,27.2,13.04.2026,2026-04-14 +O-10252,55.8,28.02.2026,2026-03-01 +O-10253,38.9,15.03.2026,2026-03-17 +O-10254,23.8,03.06.2026,2026-06-07 +O-10255,31.8,04.05.2026,2026-05-05 +O-10256,13.2,24.02.2026,2026-02-26 +O-10257,72.2,04.05.2026,2026-05-04 +O-10258,36.3,20.04.2026,2026-04-23 +O-10259,15.7,30.03.2026,2026-03-30 +O-10260,26.3,16.04.2026,2026-04-18 +O-10261,24.5,30.05.2026,2026-06-01 +O-10262,67.5,30.04.2026,2026-05-02 +O-10263,20.5,25.06.2026,2026-06-28 +O-10264,23.4,23.01.2026,2026-01-24 +O-10265,62.8,06.05.2026,2026-05-10 +O-10266,34.5,22.02.2026,2026-02-23 +O-10267,25.2,05.03.2026,2026-03-08 +O-10268,21.3,22.01.2026,2026-01-24 +O-10269,49.0,10.02.2026,2026-02-13 +O-10270,48.8,10.03.2026,2026-03-13 +O-10271,50.0,23.01.2026,2026-01-25 +O-10272,23.1,15.03.2026,2026-03-18 +O-10273,62.7,24.04.2026,2026-04-24 +O-10274,85.7,02.02.2026,2026-02-02 +O-10275,29.5,20.04.2026,2026-04-22 +O-10276,14.9,02.05.2026,2026-05-05 +O-10277,39.7,22.05.2026,2026-05-25 +O-10278,48.3,01.07.2026,2026-07-05 +O-10279,26.7,22.02.2026,2026-02-26 +O-10280,26.6,23.05.2026,2026-05-23 +O-10281,52.4,06.02.2026,2026-02-07 +O-10282,40.5,12.06.2026,2026-06-15 +O-10283,14.9,05.06.2026,2026-06-09 +O-10284,42.9,14.01.2026,2026-01-18 +O-10285,26.4,09.04.2026,2026-04-12 +O-10286,10.6,04.05.2026,2026-05-08 +O-10287,21.9,26.06.2026,2026-06-28 +O-10288,40.1,21.02.2026,2026-02-22 +O-10289,57.9,18.01.2026,2026-01-20 +O-10290,42.6,17.04.2026,2026-04-21 +O-10291,43.6,31.01.2026,2026-02-03 +O-10292,41.3,28.02.2026,2026-03-04 +O-10293,66.9,21.03.2026,2026-03-24 +O-10294,18.6,23.04.2026,2026-04-24 +O-10295,40.7,01.05.2026,2026-05-05 +O-10296,88.6,04.05.2026,2026-05-04 +O-10297,39.5,22.02.2026,2026-02-26 +O-10298,15.6,30.01.2026,2026-01-30 +O-10299,17.3,18.02.2026,2026-02-19 +O-10300,27.3,14.06.2026,2026-06-17 +O-10301,56.9,02.04.2026,2026-04-05 +O-10302,38.8,16.03.2026,2026-03-19 +O-10303,19.9,22.06.2026,2026-06-23 +O-10304,26.8,26.06.2026,2026-06-30 +O-10305,25.9,10.04.2026,2026-04-12 +O-10306,32.8,07.03.2026,2026-03-08 +O-10307,46.9,08.06.2026,2026-06-08 +O-10308,16.6,10.02.2026,2026-02-10 +O-10309,26.9,01.06.2026,2026-06-04 +O-10310,40.7,10.01.2026,2026-01-12 +O-10311,40.1,22.05.2026,2026-05-25 +O-10312,42.5,19.06.2026,2026-06-21 +O-10313,67.6,02.05.2026,2026-05-05 +O-10314,15.9,09.04.2026,2026-04-13 +O-10315,26.1,12.03.2026,2026-03-13 +O-10316,24.4,12.03.2026,2026-03-15 +O-10317,16.6,18.06.2026,2026-06-22 +O-10318,23.2,09.04.2026,2026-04-11 +O-10319,15.1,28.06.2026,2026-06-28 +O-10320,15.3,29.06.2026,2026-06-30 +O-10321,29.7,13.03.2026,2026-03-14 +O-10322,38.9,22.05.2026,2026-05-23 +O-10323,26.6,04.02.2026,2026-02-06 +O-10324,36.1,08.06.2026,2026-06-12 +O-10325,21.0,09.06.2026,2026-06-11 +O-10326,25.5,15.05.2026,2026-05-15 +O-10327,42.8,17.01.2026,2026-01-20 +O-10328,37.0,04.03.2026,2026-03-07 +O-10329,40.5,30.01.2026,2026-01-31 +O-10330,17.7,09.05.2026,2026-05-13 +O-10331,31.3,18.05.2026,2026-05-22 +O-10332,56.8,15.06.2026,2026-06-16 +O-10333,73.4,18.01.2026,2026-01-21 +O-10334,19.2,23.01.2026,2026-01-23 +O-10335,17.4,23.01.2026,2026-01-25 +O-10336,24.3,21.01.2026,2026-01-23 +O-10337,30.6,17.04.2026,2026-04-21 +O-10338,37.8,07.03.2026,2026-03-11 +O-10339,16.0,24.04.2026,2026-04-27 +O-10340,44.5,23.04.2026,2026-04-23 +O-10341,12.7,26.04.2026,2026-04-29 +O-10342,10.7,07.02.2026,2026-02-11 +O-10343,52.5,26.04.2026,2026-04-27 +O-10344,14.2,06.03.2026,2026-03-09 +O-10345,21.0,07.02.2026,2026-02-10 +O-10346,28.3,19.04.2026,2026-04-22 +O-10347,21.6,16.01.2026,2026-01-16 +O-10348,23.8,03.03.2026,2026-03-03 +O-10349,44.5,10.01.2026,2026-01-13 +O-10350,40.3,05.04.2026,2026-04-06 +O-10351,40.1,22.05.2026,2026-05-22 +O-10352,39.4,22.02.2026,2026-02-25 +O-10353,29.2,27.01.2026,2026-01-31 +O-10354,30.6,18.06.2026,2026-06-18 +O-10355,38.7,31.01.2026,2026-02-01 +O-10356,23.7,17.03.2026,2026-03-19 +O-10357,75.8,20.01.2026,2026-01-20 +O-10358,43.2,29.01.2026,2026-02-01 +O-10359,44.5,11.06.2026,2026-06-13 +O-10360,44.3,08.06.2026,2026-06-10 +O-10361,37.8,09.05.2026,2026-05-13 +O-10362,38.7,17.04.2026,2026-04-17 +O-10363,44.0,15.02.2026,2026-02-17 +O-10364,18.1,02.03.2026,2026-03-06 +O-10365,55.9,12.04.2026,2026-04-14 +O-10366,22.3,27.02.2026,2026-03-01 +O-10367,16.8,24.03.2026,2026-03-27 +O-10368,33.6,23.01.2026,2026-01-23 +O-10369,39.3,15.04.2026,2026-04-15 +O-10370,31.9,05.04.2026,2026-04-07 +O-10371,53.9,27.03.2026,2026-03-28 +O-10372,26.0,03.03.2026,2026-03-04 +O-10373,49.6,23.02.2026,2026-02-25 +O-10374,23.6,03.05.2026,2026-05-06 +O-10375,52.4,21.04.2026,2026-04-25 +O-10376,20.0,04.02.2026,2026-02-07 +O-10377,40.3,22.01.2026,2026-01-24 +O-10378,21.0,30.04.2026,2026-05-03 +O-10379,15.1,26.06.2026,2026-06-27 +O-10380,17.3,18.04.2026,2026-04-22 +O-10381,45.4,21.06.2026,2026-06-21 +O-10382,62.7,12.05.2026,2026-05-15 +O-10383,60.9,03.04.2026,2026-04-05 +O-10384,27.5,03.03.2026,2026-03-04 +O-10385,29.3,28.06.2026,2026-06-29 +O-10386,29.9,13.06.2026,2026-06-13 +O-10387,24.6,25.05.2026,2026-05-27 +O-10388,13.3,06.01.2026,2026-01-07 +O-10389,34.8,20.06.2026,2026-06-20 +O-10390,23.5,24.05.2026,2026-05-28 +O-10391,18.0,11.02.2026,2026-02-12 +O-10392,22.6,25.01.2026,2026-01-26 +O-10393,45.3,24.05.2026,2026-05-28 +O-10394,99.4,22.03.2026,2026-03-22 +O-10395,44.2,18.06.2026,2026-06-19 +O-10396,43.3,25.05.2026,2026-05-28 +O-10397,38.5,21.05.2026,2026-05-22 +O-10398,18.6,08.06.2026,2026-06-08 +O-10399,45.8,20.02.2026,2026-02-22 +O-10400,36.7,22.04.2026,2026-04-22 diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-decimal-comma/case.json b/agents/evals/fixtures/cases/histogram-basic-letsplot-decimal-comma/case.json new file mode 100644 index 00000000000..5f5e22fee32 --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-decimal-comma/case.json @@ -0,0 +1,20 @@ +{ + "spec_id": "histogram-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "values", + "column": "Delivery Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-decimal-comma/data.csv b/agents/evals/fixtures/cases/histogram-basic-letsplot-decimal-comma/data.csv new file mode 100644 index 00000000000..c0b5c27d0cc --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-decimal-comma/data.csv @@ -0,0 +1,401 @@ +Order ID;Delivery Time (min) +O-10001;38,3 +O-10002;39,4 +O-10003;36,7 +O-10004;36,6 +O-10005;16,3 +O-10006;25,4 +O-10007;25,4 +O-10008;28,7 +O-10009;38,1 +O-10010;29,6 +O-10011;19,5 +O-10012;36,0 +O-10013;53,0 +O-10014;30,1 +O-10015;21,3 +O-10016;47,9 +O-10017;41,8 +O-10018;26,4 +O-10019;32,4 +O-10020;22,9 +O-10021;52,4 +O-10022;31,4 +O-10023;19,7 +O-10024;31,1 +O-10025;38,2 +O-10026;52,7 +O-10027;23,9 +O-10028;39,3 +O-10029;46,8 +O-10030;38,3 +O-10031;24,2 +O-10032;57,8 +O-10033;44,9 +O-10034;67,6 +O-10035;22,3 +O-10036;27,3 +O-10037;17,8 +O-10038;34,3 +O-10039;36,7 +O-10040;25,1 +O-10041;31,6 +O-10042;52,9 +O-10043;29,7 +O-10044;30,9 +O-10045;52,3 +O-10046;32,4 +O-10047;47,4 +O-10048;62,4 +O-10049;22,5 +O-10050;14,7 +O-10051;34,6 +O-10052;19,6 +O-10053;34,0 +O-10054;29,6 +O-10055;27,2 +O-10056;53,7 +O-10057;66,8 +O-10058;34,1 +O-10059;39,1 +O-10060;32,1 +O-10061;50,4 +O-10062;18,7 +O-10063;32,2 +O-10064;66,0 +O-10065;40,7 +O-10066;76,3 +O-10067;15,7 +O-10068;18,2 +O-10069;18,4 +O-10070;23,2 +O-10071;34,8 +O-10072;30,9 +O-10073;39,8 +O-10074;27,5 +O-10075;17,7 +O-10076;84,2 +O-10077;27,9 +O-10078;22,2 +O-10079;92,0 +O-10080;31,1 +O-10081;30,6 +O-10082;55,0 +O-10083;35,7 +O-10084;22,3 +O-10085;11,9 +O-10086;14,1 +O-10087;24,0 +O-10088;29,3 +O-10089;46,9 +O-10090;26,2 +O-10091;20,2 +O-10092;18,5 +O-10093;16,2 +O-10094;26,1 +O-10095;31,2 +O-10096;57,1 +O-10097;15,0 +O-10098;33,6 +O-10099;24,4 +O-10100;44,1 +O-10101;51,7 +O-10102;35,6 +O-10103;18,6 +O-10104;41,6 +O-10105;47,3 +O-10106;27,6 +O-10107;45,3 +O-10108;43,6 +O-10109;19,1 +O-10110;26,2 +O-10111;20,6 +O-10112;29,6 +O-10113;61,9 +O-10114;58,8 +O-10115;20,6 +O-10116;13,7 +O-10117;14,8 +O-10118;36,3 +O-10119;116,4 +O-10120;51,6 +O-10121;19,3 +O-10122;48,0 +O-10123;106,1 +O-10124;42,9 +O-10125;17,9 +O-10126;27,9 +O-10127;18,3 +O-10128;88,9 +O-10129;51,3 +O-10130;22,7 +O-10131;39,0 +O-10132;31,8 +O-10133;43,4 +O-10134;27,5 +O-10135;21,1 +O-10136;26,0 +O-10137;32,5 +O-10138;23,8 +O-10139;28,4 +O-10140;16,3 +O-10141;18,4 +O-10142;29,0 +O-10143;40,9 +O-10144;30,8 +O-10145;39,6 +O-10146;32,4 +O-10147;25,0 +O-10148;35,2 +O-10149;18,7 +O-10150;30,7 +O-10151;31,5 +O-10152;22,7 +O-10153;20,7 +O-10154;27,3 +O-10155;43,8 +O-10156;33,0 +O-10157;42,1 +O-10158;20,7 +O-10159;14,8 +O-10160;16,0 +O-10161;25,2 +O-10162;38,5 +O-10163;39,5 +O-10164;43,0 +O-10165;37,5 +O-10166;23,2 +O-10167;62,0 +O-10168;9,8 +O-10169;41,2 +O-10170;33,8 +O-10171;21,5 +O-10172;57,7 +O-10173;34,0 +O-10174;16,2 +O-10175;27,2 +O-10176;16,4 +O-10177;29,6 +O-10178;22,8 +O-10179;23,1 +O-10180;36,4 +O-10181;61,6 +O-10182;23,9 +O-10183;25,1 +O-10184;23,6 +O-10185;23,1 +O-10186;32,4 +O-10187;86,5 +O-10188;26,8 +O-10189;40,1 +O-10190;22,4 +O-10191;32,4 +O-10192;25,6 +O-10193;30,6 +O-10194;68,7 +O-10195;37,1 +O-10196;29,5 +O-10197;61,1 +O-10198;50,7 +O-10199;35,4 +O-10200;36,6 +O-10201;37,5 +O-10202;37,9 +O-10203;18,0 +O-10204;41,9 +O-10205;53,1 +O-10206;19,9 +O-10207;16,4 +O-10208;39,5 +O-10209;32,8 +O-10210;37,9 +O-10211;39,5 +O-10212;39,4 +O-10213;24,6 +O-10214;40,7 +O-10215;27,6 +O-10216;21,4 +O-10217;44,1 +O-10218;22,6 +O-10219;30,9 +O-10220;26,5 +O-10221;20,7 +O-10222;21,7 +O-10223;31,1 +O-10224;31,1 +O-10225;39,7 +O-10226;30,2 +O-10227;22,8 +O-10228;36,3 +O-10229;32,5 +O-10230;49,4 +O-10231;39,2 +O-10232;21,6 +O-10233;13,8 +O-10234;31,1 +O-10235;21,9 +O-10236;49,0 +O-10237;20,4 +O-10238;21,4 +O-10239;48,5 +O-10240;17,1 +O-10241;29,3 +O-10242;69,6 +O-10243;31,2 +O-10244;43,1 +O-10245;46,7 +O-10246;28,7 +O-10247;31,7 +O-10248;30,0 +O-10249;38,1 +O-10250;14,8 +O-10251;27,2 +O-10252;55,8 +O-10253;38,9 +O-10254;23,8 +O-10255;31,8 +O-10256;13,2 +O-10257;72,2 +O-10258;36,3 +O-10259;15,7 +O-10260;26,3 +O-10261;24,5 +O-10262;67,5 +O-10263;20,5 +O-10264;23,4 +O-10265;62,8 +O-10266;34,5 +O-10267;25,2 +O-10268;21,3 +O-10269;49,0 +O-10270;48,8 +O-10271;50,0 +O-10272;23,1 +O-10273;62,7 +O-10274;85,7 +O-10275;29,5 +O-10276;14,9 +O-10277;39,7 +O-10278;48,3 +O-10279;26,7 +O-10280;26,6 +O-10281;52,4 +O-10282;40,5 +O-10283;14,9 +O-10284;42,9 +O-10285;26,4 +O-10286;10,6 +O-10287;21,9 +O-10288;40,1 +O-10289;57,9 +O-10290;42,6 +O-10291;43,6 +O-10292;41,3 +O-10293;66,9 +O-10294;18,6 +O-10295;40,7 +O-10296;88,6 +O-10297;39,5 +O-10298;15,6 +O-10299;17,3 +O-10300;27,3 +O-10301;56,9 +O-10302;38,8 +O-10303;19,9 +O-10304;26,8 +O-10305;25,9 +O-10306;32,8 +O-10307;46,9 +O-10308;16,6 +O-10309;26,9 +O-10310;40,7 +O-10311;40,1 +O-10312;42,5 +O-10313;67,6 +O-10314;15,9 +O-10315;26,1 +O-10316;24,4 +O-10317;16,6 +O-10318;23,2 +O-10319;15,1 +O-10320;15,3 +O-10321;29,7 +O-10322;38,9 +O-10323;26,6 +O-10324;36,1 +O-10325;21,0 +O-10326;25,5 +O-10327;42,8 +O-10328;37,0 +O-10329;40,5 +O-10330;17,7 +O-10331;31,3 +O-10332;56,8 +O-10333;73,4 +O-10334;19,2 +O-10335;17,4 +O-10336;24,3 +O-10337;30,6 +O-10338;37,8 +O-10339;16,0 +O-10340;44,5 +O-10341;12,7 +O-10342;10,7 +O-10343;52,5 +O-10344;14,2 +O-10345;21,0 +O-10346;28,3 +O-10347;21,6 +O-10348;23,8 +O-10349;44,5 +O-10350;40,3 +O-10351;40,1 +O-10352;39,4 +O-10353;29,2 +O-10354;30,6 +O-10355;38,7 +O-10356;23,7 +O-10357;75,8 +O-10358;43,2 +O-10359;44,5 +O-10360;44,3 +O-10361;37,8 +O-10362;38,7 +O-10363;44,0 +O-10364;18,1 +O-10365;55,9 +O-10366;22,3 +O-10367;16,8 +O-10368;33,6 +O-10369;39,3 +O-10370;31,9 +O-10371;53,9 +O-10372;26,0 +O-10373;49,6 +O-10374;23,6 +O-10375;52,4 +O-10376;20,0 +O-10377;40,3 +O-10378;21,0 +O-10379;15,1 +O-10380;17,3 +O-10381;45,4 +O-10382;62,7 +O-10383;60,9 +O-10384;27,5 +O-10385;29,3 +O-10386;29,9 +O-10387;24,6 +O-10388;13,3 +O-10389;34,8 +O-10390;23,5 +O-10391;18,0 +O-10392;22,6 +O-10393;45,3 +O-10394;99,4 +O-10395;44,2 +O-10396;43,3 +O-10397;38,5 +O-10398;18,6 +O-10399;45,8 +O-10400;36,7 diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-n12/case.json b/agents/evals/fixtures/cases/histogram-basic-letsplot-n12/case.json new file mode 100644 index 00000000000..7fa1ae42415 --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-n12/case.json @@ -0,0 +1,20 @@ +{ + "spec_id": "histogram-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "values", + "column": "Delivery Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, n12)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-n12/data.csv b/agents/evals/fixtures/cases/histogram-basic-letsplot-n12/data.csv new file mode 100644 index 00000000000..3e32daaa5e4 --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-n12/data.csv @@ -0,0 +1,13 @@ +Order ID,Delivery Time (min) +O-10001,27.8 +O-10002,106.1 +O-10003,29.2 +O-10004,27.9 +O-10005,61.7 +O-10006,15.9 +O-10007,12.2 +O-10008,26.6 +O-10009,46.5 +O-10010,37.3 +O-10011,30.4 +O-10012,24.3 diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-n5000/case.json b/agents/evals/fixtures/cases/histogram-basic-letsplot-n5000/case.json new file mode 100644 index 00000000000..02ec06d603d --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-n5000/case.json @@ -0,0 +1,20 @@ +{ + "spec_id": "histogram-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "values", + "column": "Delivery Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, n5000)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-n5000/data.csv b/agents/evals/fixtures/cases/histogram-basic-letsplot-n5000/data.csv new file mode 100644 index 00000000000..00869fbb7ca --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-n5000/data.csv @@ -0,0 +1,5001 @@ +Order ID,Delivery Time (min) +O-10001,25.6 +O-10002,82.2 +O-10003,38.7 +O-10004,32.3 +O-10005,17.4 +O-10006,42.3 +O-10007,43.8 +O-10008,20.3 +O-10009,18.6 +O-10010,47.7 +O-10011,25.5 +O-10012,64.4 +O-10013,42.7 +O-10014,29.0 +O-10015,30.8 +O-10016,12.7 +O-10017,15.3 +O-10018,24.0 +O-10019,40.3 +O-10020,44.6 +O-10021,58.3 +O-10022,43.5 +O-10023,66.2 +O-10024,39.3 +O-10025,55.7 +O-10026,30.3 +O-10027,40.7 +O-10028,21.3 +O-10029,63.1 +O-10030,11.6 +O-10031,19.6 +O-10032,45.5 +O-10033,40.3 +O-10034,50.2 +O-10035,40.7 +O-10036,47.7 +O-10037,30.1 +O-10038,20.3 +O-10039,35.2 +O-10040,14.4 +O-10041,24.8 +O-10042,32.9 +O-10043,27.9 +O-10044,29.0 +O-10045,55.3 +O-10046,24.3 +O-10047,14.4 +O-10048,36.2 +O-10049,38.5 +O-10050,17.4 +O-10051,24.5 +O-10052,34.7 +O-10053,35.8 +O-10054,32.8 +O-10055,82.6 +O-10056,26.4 +O-10057,17.1 +O-10058,18.0 +O-10059,19.5 +O-10060,44.5 +O-10061,24.3 +O-10062,30.8 +O-10063,75.1 +O-10064,19.1 +O-10065,41.1 +O-10066,12.4 +O-10067,55.0 +O-10068,28.2 +O-10069,21.1 +O-10070,19.9 +O-10071,42.4 +O-10072,23.2 +O-10073,28.2 +O-10074,24.7 +O-10075,33.7 +O-10076,67.3 +O-10077,28.4 +O-10078,23.1 +O-10079,29.3 +O-10080,17.0 +O-10081,41.6 +O-10082,74.9 +O-10083,34.6 +O-10084,18.8 +O-10085,19.5 +O-10086,19.7 +O-10087,28.5 +O-10088,59.4 +O-10089,30.6 +O-10090,66.7 +O-10091,28.4 +O-10092,32.9 +O-10093,23.9 +O-10094,35.5 +O-10095,44.8 +O-10096,52.9 +O-10097,75.5 +O-10098,69.4 +O-10099,18.0 +O-10100,18.7 +O-10101,16.4 +O-10102,29.7 +O-10103,22.2 +O-10104,20.8 +O-10105,42.3 +O-10106,69.5 +O-10107,37.3 +O-10108,38.8 +O-10109,71.0 +O-10110,37.7 +O-10111,36.9 +O-10112,41.7 +O-10113,33.8 +O-10114,25.9 +O-10115,40.7 +O-10116,13.0 +O-10117,15.4 +O-10118,35.5 +O-10119,28.3 +O-10120,66.5 +O-10121,36.2 +O-10122,14.5 +O-10123,51.8 +O-10124,52.6 +O-10125,69.5 +O-10126,24.0 +O-10127,25.7 +O-10128,35.5 +O-10129,25.4 +O-10130,38.6 +O-10131,25.6 +O-10132,24.3 +O-10133,19.5 +O-10134,27.6 +O-10135,21.1 +O-10136,45.3 +O-10137,69.9 +O-10138,29.1 +O-10139,13.2 +O-10140,17.9 +O-10141,22.0 +O-10142,22.9 +O-10143,32.5 +O-10144,52.7 +O-10145,35.0 +O-10146,42.6 +O-10147,34.9 +O-10148,15.2 +O-10149,25.9 +O-10150,32.1 +O-10151,32.1 +O-10152,32.5 +O-10153,66.0 +O-10154,52.3 +O-10155,64.0 +O-10156,13.0 +O-10157,63.0 +O-10158,18.9 +O-10159,15.0 +O-10160,30.5 +O-10161,49.3 +O-10162,27.7 +O-10163,30.2 +O-10164,47.1 +O-10165,26.7 +O-10166,37.5 +O-10167,45.3 +O-10168,37.8 +O-10169,23.9 +O-10170,64.6 +O-10171,45.6 +O-10172,42.9 +O-10173,57.1 +O-10174,18.8 +O-10175,13.0 +O-10176,15.7 +O-10177,27.9 +O-10178,35.7 +O-10179,19.0 +O-10180,19.2 +O-10181,37.7 +O-10182,72.0 +O-10183,52.1 +O-10184,15.5 +O-10185,22.3 +O-10186,26.1 +O-10187,20.8 +O-10188,20.9 +O-10189,55.4 +O-10190,47.6 +O-10191,21.0 +O-10192,15.4 +O-10193,31.9 +O-10194,35.3 +O-10195,31.7 +O-10196,18.7 +O-10197,68.8 +O-10198,59.2 +O-10199,42.4 +O-10200,21.9 +O-10201,14.7 +O-10202,43.8 +O-10203,34.5 +O-10204,23.1 +O-10205,30.2 +O-10206,37.4 +O-10207,42.8 +O-10208,42.1 +O-10209,29.4 +O-10210,16.2 +O-10211,32.2 +O-10212,56.1 +O-10213,41.9 +O-10214,41.5 +O-10215,29.8 +O-10216,41.8 +O-10217,17.2 +O-10218,55.7 +O-10219,27.4 +O-10220,59.2 +O-10221,31.5 +O-10222,25.6 +O-10223,26.1 +O-10224,47.6 +O-10225,19.3 +O-10226,13.3 +O-10227,27.5 +O-10228,28.7 +O-10229,26.0 +O-10230,24.4 +O-10231,33.4 +O-10232,30.4 +O-10233,21.2 +O-10234,27.6 +O-10235,31.2 +O-10236,72.6 +O-10237,32.2 +O-10238,56.3 +O-10239,15.8 +O-10240,18.9 +O-10241,27.4 +O-10242,83.2 +O-10243,24.6 +O-10244,29.9 +O-10245,27.9 +O-10246,37.5 +O-10247,19.7 +O-10248,12.9 +O-10249,42.3 +O-10250,30.3 +O-10251,15.1 +O-10252,23.8 +O-10253,22.2 +O-10254,36.6 +O-10255,31.0 +O-10256,21.9 +O-10257,28.7 +O-10258,31.4 +O-10259,47.0 +O-10260,28.9 +O-10261,25.1 +O-10262,49.6 +O-10263,61.1 +O-10264,34.4 +O-10265,55.0 +O-10266,42.9 +O-10267,39.7 +O-10268,30.5 +O-10269,29.9 +O-10270,27.2 +O-10271,28.2 +O-10272,62.8 +O-10273,31.9 +O-10274,28.6 +O-10275,49.5 +O-10276,36.7 +O-10277,48.8 +O-10278,49.0 +O-10279,37.1 +O-10280,12.9 +O-10281,22.4 +O-10282,53.7 +O-10283,33.7 +O-10284,88.9 +O-10285,73.2 +O-10286,28.1 +O-10287,24.7 +O-10288,33.3 +O-10289,28.5 +O-10290,18.1 +O-10291,45.4 +O-10292,20.5 +O-10293,27.0 +O-10294,35.5 +O-10295,29.0 +O-10296,24.1 +O-10297,53.0 +O-10298,21.9 +O-10299,60.7 +O-10300,40.1 +O-10301,30.4 +O-10302,13.3 +O-10303,11.7 +O-10304,17.6 +O-10305,30.4 +O-10306,25.5 +O-10307,53.4 +O-10308,53.9 +O-10309,32.0 +O-10310,44.1 +O-10311,36.8 +O-10312,27.2 +O-10313,26.5 +O-10314,35.7 +O-10315,27.8 +O-10316,52.4 +O-10317,21.8 +O-10318,56.6 +O-10319,32.3 +O-10320,21.9 +O-10321,23.3 +O-10322,55.0 +O-10323,33.9 +O-10324,45.2 +O-10325,49.5 +O-10326,56.0 +O-10327,28.0 +O-10328,19.8 +O-10329,26.9 +O-10330,70.3 +O-10331,37.6 +O-10332,40.4 +O-10333,28.6 +O-10334,37.5 +O-10335,36.4 +O-10336,61.3 +O-10337,67.6 +O-10338,26.6 +O-10339,33.3 +O-10340,31.6 +O-10341,24.8 +O-10342,44.0 +O-10343,20.4 +O-10344,19.2 +O-10345,33.8 +O-10346,38.1 +O-10347,47.9 +O-10348,25.9 +O-10349,52.5 +O-10350,32.5 +O-10351,21.1 +O-10352,28.1 +O-10353,33.4 +O-10354,50.6 +O-10355,62.1 +O-10356,32.7 +O-10357,30.2 +O-10358,42.7 +O-10359,19.8 +O-10360,30.0 +O-10361,44.5 +O-10362,65.6 +O-10363,12.6 +O-10364,36.4 +O-10365,40.8 +O-10366,31.0 +O-10367,26.1 +O-10368,28.8 +O-10369,49.7 +O-10370,44.7 +O-10371,44.3 +O-10372,14.8 +O-10373,36.4 +O-10374,26.4 +O-10375,37.9 +O-10376,43.6 +O-10377,24.6 +O-10378,15.5 +O-10379,23.8 +O-10380,57.3 +O-10381,42.6 +O-10382,12.8 +O-10383,56.0 +O-10384,70.0 +O-10385,38.9 +O-10386,75.4 +O-10387,21.5 +O-10388,17.7 +O-10389,46.7 +O-10390,25.9 +O-10391,39.1 +O-10392,42.2 +O-10393,17.6 +O-10394,65.6 +O-10395,41.7 +O-10396,30.7 +O-10397,18.7 +O-10398,20.1 +O-10399,20.2 +O-10400,12.9 +O-10401,25.9 +O-10402,50.2 +O-10403,45.6 +O-10404,65.1 +O-10405,12.5 +O-10406,52.2 +O-10407,76.6 +O-10408,37.1 +O-10409,40.3 +O-10410,35.2 +O-10411,52.9 +O-10412,12.2 +O-10413,18.6 +O-10414,32.1 +O-10415,42.7 +O-10416,37.8 +O-10417,16.8 +O-10418,38.2 +O-10419,31.0 +O-10420,19.7 +O-10421,27.2 +O-10422,41.1 +O-10423,32.7 +O-10424,21.0 +O-10425,38.6 +O-10426,15.0 +O-10427,14.9 +O-10428,29.0 +O-10429,84.2 +O-10430,32.9 +O-10431,11.7 +O-10432,27.3 +O-10433,34.4 +O-10434,51.7 +O-10435,46.0 +O-10436,35.1 +O-10437,29.7 +O-10438,30.8 +O-10439,33.5 +O-10440,30.0 +O-10441,58.2 +O-10442,47.7 +O-10443,22.4 +O-10444,27.8 +O-10445,39.6 +O-10446,18.4 +O-10447,50.5 +O-10448,18.6 +O-10449,23.2 +O-10450,22.1 +O-10451,42.4 +O-10452,22.1 +O-10453,22.4 +O-10454,11.1 +O-10455,56.4 +O-10456,83.1 +O-10457,55.1 +O-10458,61.8 +O-10459,46.0 +O-10460,40.5 +O-10461,28.0 +O-10462,45.9 +O-10463,30.2 +O-10464,35.6 +O-10465,32.4 +O-10466,22.5 +O-10467,44.4 +O-10468,14.1 +O-10469,50.7 +O-10470,16.3 +O-10471,72.8 +O-10472,28.0 +O-10473,20.9 +O-10474,34.8 +O-10475,56.6 +O-10476,24.3 +O-10477,41.8 +O-10478,39.4 +O-10479,40.4 +O-10480,61.5 +O-10481,46.7 +O-10482,43.4 +O-10483,63.3 +O-10484,26.9 +O-10485,22.5 +O-10486,21.1 +O-10487,17.2 +O-10488,36.6 +O-10489,49.0 +O-10490,43.5 +O-10491,37.8 +O-10492,34.4 +O-10493,20.5 +O-10494,17.3 +O-10495,38.1 +O-10496,52.4 +O-10497,48.2 +O-10498,53.5 +O-10499,13.5 +O-10500,21.6 +O-10501,38.0 +O-10502,28.5 +O-10503,14.4 +O-10504,61.6 +O-10505,29.1 +O-10506,32.0 +O-10507,40.2 +O-10508,43.2 +O-10509,23.4 +O-10510,77.5 +O-10511,20.6 +O-10512,30.6 +O-10513,28.8 +O-10514,33.6 +O-10515,23.2 +O-10516,39.8 +O-10517,24.0 +O-10518,27.3 +O-10519,38.8 +O-10520,33.3 +O-10521,46.8 +O-10522,31.9 +O-10523,38.1 +O-10524,35.3 +O-10525,19.0 +O-10526,25.9 +O-10527,18.8 +O-10528,62.2 +O-10529,35.2 +O-10530,30.6 +O-10531,26.5 +O-10532,31.4 +O-10533,25.7 +O-10534,35.5 +O-10535,42.9 +O-10536,38.8 +O-10537,85.3 +O-10538,30.9 +O-10539,16.4 +O-10540,25.0 +O-10541,15.7 +O-10542,18.4 +O-10543,15.2 +O-10544,31.9 +O-10545,52.5 +O-10546,40.0 +O-10547,19.2 +O-10548,31.2 +O-10549,42.4 +O-10550,17.8 +O-10551,22.1 +O-10552,18.3 +O-10553,42.6 +O-10554,42.3 +O-10555,58.3 +O-10556,28.6 +O-10557,33.6 +O-10558,29.7 +O-10559,35.3 +O-10560,29.7 +O-10561,25.3 +O-10562,36.7 +O-10563,37.2 +O-10564,20.8 +O-10565,59.8 +O-10566,33.8 +O-10567,18.7 +O-10568,51.2 +O-10569,52.9 +O-10570,27.5 +O-10571,26.8 +O-10572,35.7 +O-10573,34.0 +O-10574,36.9 +O-10575,62.8 +O-10576,25.1 +O-10577,18.0 +O-10578,46.9 +O-10579,21.2 +O-10580,30.2 +O-10581,22.4 +O-10582,52.9 +O-10583,31.6 +O-10584,26.8 +O-10585,14.2 +O-10586,14.3 +O-10587,17.6 +O-10588,37.2 +O-10589,39.4 +O-10590,43.7 +O-10591,34.5 +O-10592,23.6 +O-10593,50.6 +O-10594,23.8 +O-10595,44.2 +O-10596,23.3 +O-10597,21.9 +O-10598,36.7 +O-10599,50.0 +O-10600,41.8 +O-10601,89.6 +O-10602,36.9 +O-10603,31.6 +O-10604,63.6 +O-10605,24.2 +O-10606,25.9 +O-10607,23.8 +O-10608,37.2 +O-10609,37.8 +O-10610,18.6 +O-10611,34.6 +O-10612,20.9 +O-10613,50.2 +O-10614,31.4 +O-10615,56.9 +O-10616,46.7 +O-10617,35.9 +O-10618,17.0 +O-10619,47.8 +O-10620,37.4 +O-10621,30.8 +O-10622,18.5 +O-10623,40.8 +O-10624,34.2 +O-10625,49.1 +O-10626,20.0 +O-10627,51.6 +O-10628,69.9 +O-10629,25.7 +O-10630,32.2 +O-10631,38.3 +O-10632,42.3 +O-10633,23.9 +O-10634,32.7 +O-10635,74.7 +O-10636,64.2 +O-10637,83.2 +O-10638,23.2 +O-10639,31.8 +O-10640,29.0 +O-10641,42.9 +O-10642,23.2 +O-10643,50.5 +O-10644,41.5 +O-10645,21.6 +O-10646,30.7 +O-10647,15.1 +O-10648,44.2 +O-10649,39.8 +O-10650,51.6 +O-10651,29.8 +O-10652,30.1 +O-10653,29.5 +O-10654,56.0 +O-10655,31.0 +O-10656,19.9 +O-10657,44.3 +O-10658,26.6 +O-10659,30.4 +O-10660,23.2 +O-10661,33.2 +O-10662,27.6 +O-10663,28.9 +O-10664,50.0 +O-10665,16.6 +O-10666,39.0 +O-10667,35.3 +O-10668,21.0 +O-10669,25.4 +O-10670,49.9 +O-10671,24.3 +O-10672,38.1 +O-10673,26.9 +O-10674,46.4 +O-10675,28.1 +O-10676,48.2 +O-10677,18.4 +O-10678,44.3 +O-10679,34.2 +O-10680,71.3 +O-10681,12.7 +O-10682,46.6 +O-10683,83.3 +O-10684,64.9 +O-10685,23.5 +O-10686,78.4 +O-10687,55.9 +O-10688,24.6 +O-10689,18.5 +O-10690,19.1 +O-10691,38.5 +O-10692,13.7 +O-10693,47.7 +O-10694,28.5 +O-10695,48.9 +O-10696,26.2 +O-10697,28.4 +O-10698,36.5 +O-10699,32.2 +O-10700,37.6 +O-10701,40.7 +O-10702,28.9 +O-10703,33.1 +O-10704,38.6 +O-10705,35.5 +O-10706,34.0 +O-10707,23.2 +O-10708,62.9 +O-10709,39.0 +O-10710,22.9 +O-10711,54.9 +O-10712,36.1 +O-10713,69.2 +O-10714,50.3 +O-10715,24.2 +O-10716,70.0 +O-10717,25.4 +O-10718,19.0 +O-10719,53.3 +O-10720,33.6 +O-10721,58.2 +O-10722,14.6 +O-10723,44.0 +O-10724,28.4 +O-10725,17.5 +O-10726,15.4 +O-10727,20.5 +O-10728,17.3 +O-10729,25.6 +O-10730,40.4 +O-10731,25.6 +O-10732,23.7 +O-10733,31.0 +O-10734,24.1 +O-10735,21.2 +O-10736,31.9 +O-10737,25.6 +O-10738,31.3 +O-10739,38.1 +O-10740,40.7 +O-10741,44.3 +O-10742,28.1 +O-10743,13.3 +O-10744,23.3 +O-10745,26.0 +O-10746,38.2 +O-10747,28.0 +O-10748,29.6 +O-10749,22.8 +O-10750,92.8 +O-10751,29.9 +O-10752,31.2 +O-10753,54.2 +O-10754,38.2 +O-10755,43.6 +O-10756,27.1 +O-10757,25.9 +O-10758,44.9 +O-10759,34.4 +O-10760,45.4 +O-10761,51.9 +O-10762,25.8 +O-10763,30.1 +O-10764,28.1 +O-10765,24.9 +O-10766,42.7 +O-10767,80.7 +O-10768,35.1 +O-10769,45.8 +O-10770,30.1 +O-10771,19.8 +O-10772,29.9 +O-10773,27.2 +O-10774,30.6 +O-10775,46.2 +O-10776,36.7 +O-10777,15.2 +O-10778,31.4 +O-10779,39.0 +O-10780,46.3 +O-10781,30.4 +O-10782,57.5 +O-10783,15.6 +O-10784,51.0 +O-10785,29.9 +O-10786,58.8 +O-10787,55.3 +O-10788,20.5 +O-10789,24.0 +O-10790,21.4 +O-10791,30.1 +O-10792,37.0 +O-10793,40.2 +O-10794,24.3 +O-10795,44.5 +O-10796,17.9 +O-10797,41.5 +O-10798,21.8 +O-10799,37.6 +O-10800,53.1 +O-10801,17.3 +O-10802,25.2 +O-10803,24.0 +O-10804,25.3 +O-10805,51.2 +O-10806,39.4 +O-10807,25.1 +O-10808,27.2 +O-10809,37.4 +O-10810,28.8 +O-10811,71.8 +O-10812,37.7 +O-10813,33.6 +O-10814,29.1 +O-10815,61.0 +O-10816,20.7 +O-10817,22.3 +O-10818,16.0 +O-10819,41.9 +O-10820,25.2 +O-10821,43.9 +O-10822,23.4 +O-10823,13.0 +O-10824,59.3 +O-10825,29.8 +O-10826,79.3 +O-10827,39.3 +O-10828,16.1 +O-10829,59.8 +O-10830,21.9 +O-10831,24.5 +O-10832,17.0 +O-10833,13.5 +O-10834,14.6 +O-10835,27.6 +O-10836,22.2 +O-10837,36.8 +O-10838,45.8 +O-10839,26.1 +O-10840,24.1 +O-10841,27.1 +O-10842,45.8 +O-10843,14.1 +O-10844,23.3 +O-10845,77.8 +O-10846,73.6 +O-10847,84.1 +O-10848,20.3 +O-10849,52.2 +O-10850,31.9 +O-10851,39.9 +O-10852,62.6 +O-10853,14.7 +O-10854,12.7 +O-10855,23.2 +O-10856,44.0 +O-10857,28.4 +O-10858,68.0 +O-10859,35.7 +O-10860,22.7 +O-10861,32.7 +O-10862,23.6 +O-10863,18.4 +O-10864,39.3 +O-10865,24.9 +O-10866,36.8 +O-10867,45.0 +O-10868,39.4 +O-10869,34.3 +O-10870,17.2 +O-10871,20.7 +O-10872,38.1 +O-10873,12.4 +O-10874,41.3 +O-10875,25.4 +O-10876,30.3 +O-10877,28.4 +O-10878,30.5 +O-10879,28.4 +O-10880,32.2 +O-10881,53.0 +O-10882,27.8 +O-10883,21.3 +O-10884,64.1 +O-10885,20.4 +O-10886,49.1 +O-10887,51.5 +O-10888,44.7 +O-10889,34.0 +O-10890,30.6 +O-10891,23.4 +O-10892,16.8 +O-10893,22.4 +O-10894,11.6 +O-10895,30.9 +O-10896,23.8 +O-10897,50.9 +O-10898,40.1 +O-10899,32.9 +O-10900,50.1 +O-10901,15.1 +O-10902,23.1 +O-10903,26.6 +O-10904,73.5 +O-10905,53.8 +O-10906,12.2 +O-10907,22.1 +O-10908,53.9 +O-10909,54.1 +O-10910,34.6 +O-10911,13.9 +O-10912,19.2 +O-10913,24.0 +O-10914,49.7 +O-10915,30.9 +O-10916,42.4 +O-10917,37.3 +O-10918,18.0 +O-10919,34.3 +O-10920,20.8 +O-10921,60.0 +O-10922,36.8 +O-10923,40.5 +O-10924,66.7 +O-10925,64.5 +O-10926,17.1 +O-10927,56.0 +O-10928,14.3 +O-10929,29.1 +O-10930,40.6 +O-10931,39.6 +O-10932,50.6 +O-10933,44.8 +O-10934,49.4 +O-10935,40.6 +O-10936,23.2 +O-10937,61.7 +O-10938,36.0 +O-10939,15.5 +O-10940,25.8 +O-10941,18.5 +O-10942,27.5 +O-10943,62.9 +O-10944,19.5 +O-10945,40.3 +O-10946,40.0 +O-10947,26.0 +O-10948,16.6 +O-10949,32.9 +O-10950,29.7 +O-10951,14.6 +O-10952,47.5 +O-10953,31.7 +O-10954,48.7 +O-10955,20.1 +O-10956,15.2 +O-10957,22.8 +O-10958,14.2 +O-10959,28.8 +O-10960,27.4 +O-10961,64.3 +O-10962,29.1 +O-10963,22.0 +O-10964,18.0 +O-10965,119.3 +O-10966,30.6 +O-10967,17.2 +O-10968,35.2 +O-10969,31.7 +O-10970,49.6 +O-10971,59.6 +O-10972,32.3 +O-10973,43.3 +O-10974,30.2 +O-10975,44.1 +O-10976,57.5 +O-10977,31.5 +O-10978,25.9 +O-10979,41.4 +O-10980,25.3 +O-10981,26.9 +O-10982,26.2 +O-10983,21.5 +O-10984,26.4 +O-10985,25.9 +O-10986,36.2 +O-10987,29.1 +O-10988,23.6 +O-10989,14.2 +O-10990,57.3 +O-10991,30.1 +O-10992,23.4 +O-10993,28.0 +O-10994,44.1 +O-10995,23.5 +O-10996,46.3 +O-10997,15.9 +O-10998,43.9 +O-10999,36.6 +O-11000,42.4 +O-11001,69.7 +O-11002,15.5 +O-11003,24.2 +O-11004,58.4 +O-11005,27.3 +O-11006,22.8 +O-11007,35.9 +O-11008,32.7 +O-11009,37.3 +O-11010,50.8 +O-11011,23.5 +O-11012,19.8 +O-11013,28.0 +O-11014,28.1 +O-11015,22.6 +O-11016,17.6 +O-11017,33.3 +O-11018,25.4 +O-11019,20.7 +O-11020,26.4 +O-11021,20.1 +O-11022,19.8 +O-11023,44.7 +O-11024,69.0 +O-11025,27.1 +O-11026,39.0 +O-11027,42.6 +O-11028,56.9 +O-11029,13.1 +O-11030,18.2 +O-11031,68.0 +O-11032,29.5 +O-11033,23.0 +O-11034,36.7 +O-11035,38.8 +O-11036,29.6 +O-11037,42.3 +O-11038,38.3 +O-11039,39.5 +O-11040,37.7 +O-11041,13.4 +O-11042,26.2 +O-11043,55.5 +O-11044,40.9 +O-11045,27.7 +O-11046,64.2 +O-11047,21.9 +O-11048,47.1 +O-11049,23.7 +O-11050,33.8 +O-11051,28.3 +O-11052,49.5 +O-11053,33.0 +O-11054,21.5 +O-11055,21.1 +O-11056,31.8 +O-11057,21.7 +O-11058,47.5 +O-11059,33.7 +O-11060,27.6 +O-11061,71.2 +O-11062,18.3 +O-11063,48.4 +O-11064,14.5 +O-11065,22.0 +O-11066,31.3 +O-11067,17.2 +O-11068,19.8 +O-11069,48.5 +O-11070,31.9 +O-11071,32.6 +O-11072,23.0 +O-11073,31.3 +O-11074,44.4 +O-11075,30.8 +O-11076,47.1 +O-11077,55.0 +O-11078,36.2 +O-11079,16.0 +O-11080,17.6 +O-11081,39.6 +O-11082,22.8 +O-11083,31.8 +O-11084,42.4 +O-11085,38.3 +O-11086,24.7 +O-11087,19.3 +O-11088,38.1 +O-11089,26.9 +O-11090,62.7 +O-11091,22.5 +O-11092,17.2 +O-11093,21.7 +O-11094,54.5 +O-11095,66.2 +O-11096,35.8 +O-11097,78.1 +O-11098,26.2 +O-11099,39.1 +O-11100,63.2 +O-11101,22.5 +O-11102,37.8 +O-11103,35.5 +O-11104,19.5 +O-11105,29.0 +O-11106,30.4 +O-11107,31.8 +O-11108,33.9 +O-11109,35.2 +O-11110,25.7 +O-11111,29.1 +O-11112,23.6 +O-11113,28.7 +O-11114,33.7 +O-11115,17.4 +O-11116,29.2 +O-11117,33.7 +O-11118,39.2 +O-11119,25.1 +O-11120,71.6 +O-11121,15.7 +O-11122,33.6 +O-11123,31.3 +O-11124,73.2 +O-11125,42.5 +O-11126,24.4 +O-11127,35.4 +O-11128,40.2 +O-11129,56.7 +O-11130,29.5 +O-11131,40.7 +O-11132,36.7 +O-11133,43.5 +O-11134,26.3 +O-11135,51.5 +O-11136,23.8 +O-11137,40.1 +O-11138,17.5 +O-11139,62.1 +O-11140,19.8 +O-11141,24.2 +O-11142,18.5 +O-11143,37.2 +O-11144,15.2 +O-11145,30.6 +O-11146,29.2 +O-11147,30.2 +O-11148,55.8 +O-11149,29.9 +O-11150,80.1 +O-11151,45.5 +O-11152,49.1 +O-11153,55.6 +O-11154,24.0 +O-11155,22.0 +O-11156,33.0 +O-11157,11.7 +O-11158,22.3 +O-11159,23.4 +O-11160,51.4 +O-11161,34.2 +O-11162,14.9 +O-11163,25.0 +O-11164,15.2 +O-11165,9.9 +O-11166,19.1 +O-11167,37.0 +O-11168,48.5 +O-11169,34.2 +O-11170,23.0 +O-11171,25.9 +O-11172,86.4 +O-11173,35.0 +O-11174,25.5 +O-11175,18.8 +O-11176,61.4 +O-11177,39.1 +O-11178,28.3 +O-11179,37.2 +O-11180,48.0 +O-11181,27.8 +O-11182,23.2 +O-11183,76.2 +O-11184,8.7 +O-11185,39.3 +O-11186,18.1 +O-11187,80.4 +O-11188,14.8 +O-11189,27.0 +O-11190,13.7 +O-11191,38.2 +O-11192,33.9 +O-11193,38.9 +O-11194,39.8 +O-11195,46.1 +O-11196,27.1 +O-11197,34.3 +O-11198,42.0 +O-11199,32.3 +O-11200,51.9 +O-11201,32.8 +O-11202,39.9 +O-11203,22.1 +O-11204,42.4 +O-11205,28.3 +O-11206,65.2 +O-11207,48.5 +O-11208,50.1 +O-11209,28.9 +O-11210,22.1 +O-11211,38.3 +O-11212,31.5 +O-11213,61.8 +O-11214,37.9 +O-11215,35.5 +O-11216,146.2 +O-11217,48.6 +O-11218,30.8 +O-11219,39.8 +O-11220,26.7 +O-11221,42.3 +O-11222,32.3 +O-11223,13.2 +O-11224,9.7 +O-11225,42.1 +O-11226,36.9 +O-11227,31.6 +O-11228,70.6 +O-11229,24.4 +O-11230,23.1 +O-11231,35.4 +O-11232,17.0 +O-11233,57.5 +O-11234,48.7 +O-11235,52.7 +O-11236,34.6 +O-11237,15.4 +O-11238,39.0 +O-11239,39.0 +O-11240,56.0 +O-11241,24.8 +O-11242,49.9 +O-11243,15.6 +O-11244,40.1 +O-11245,24.4 +O-11246,39.8 +O-11247,24.8 +O-11248,45.3 +O-11249,80.4 +O-11250,59.1 +O-11251,59.6 +O-11252,59.0 +O-11253,43.9 +O-11254,76.5 +O-11255,11.0 +O-11256,13.3 +O-11257,18.0 +O-11258,17.4 +O-11259,14.0 +O-11260,30.1 +O-11261,17.0 +O-11262,51.8 +O-11263,29.7 +O-11264,33.0 +O-11265,14.5 +O-11266,33.7 +O-11267,65.4 +O-11268,43.4 +O-11269,18.6 +O-11270,37.7 +O-11271,45.2 +O-11272,39.9 +O-11273,36.7 +O-11274,36.4 +O-11275,27.1 +O-11276,42.1 +O-11277,28.0 +O-11278,41.7 +O-11279,21.5 +O-11280,28.4 +O-11281,27.7 +O-11282,17.6 +O-11283,59.3 +O-11284,36.3 +O-11285,44.3 +O-11286,29.1 +O-11287,23.1 +O-11288,29.4 +O-11289,33.0 +O-11290,49.1 +O-11291,48.1 +O-11292,15.9 +O-11293,12.0 +O-11294,35.8 +O-11295,39.7 +O-11296,41.9 +O-11297,18.7 +O-11298,46.6 +O-11299,32.7 +O-11300,34.0 +O-11301,36.5 +O-11302,12.8 +O-11303,42.4 +O-11304,56.2 +O-11305,84.8 +O-11306,34.2 +O-11307,28.6 +O-11308,41.4 +O-11309,55.5 +O-11310,45.7 +O-11311,18.5 +O-11312,36.1 +O-11313,30.5 +O-11314,47.0 +O-11315,39.4 +O-11316,55.3 +O-11317,45.3 +O-11318,45.7 +O-11319,48.5 +O-11320,30.0 +O-11321,43.5 +O-11322,13.9 +O-11323,32.2 +O-11324,37.7 +O-11325,23.4 +O-11326,14.3 +O-11327,40.5 +O-11328,26.4 +O-11329,30.1 +O-11330,23.4 +O-11331,69.7 +O-11332,39.3 +O-11333,31.2 +O-11334,41.0 +O-11335,41.7 +O-11336,25.2 +O-11337,17.2 +O-11338,32.1 +O-11339,29.0 +O-11340,41.9 +O-11341,52.2 +O-11342,14.6 +O-11343,52.0 +O-11344,16.2 +O-11345,28.6 +O-11346,47.7 +O-11347,21.9 +O-11348,36.6 +O-11349,44.7 +O-11350,62.4 +O-11351,10.2 +O-11352,34.5 +O-11353,67.5 +O-11354,19.2 +O-11355,34.3 +O-11356,35.8 +O-11357,55.2 +O-11358,27.9 +O-11359,49.0 +O-11360,31.5 +O-11361,42.6 +O-11362,25.0 +O-11363,51.2 +O-11364,13.8 +O-11365,45.8 +O-11366,44.5 +O-11367,64.6 +O-11368,16.2 +O-11369,77.0 +O-11370,16.4 +O-11371,16.8 +O-11372,35.7 +O-11373,36.4 +O-11374,100.1 +O-11375,15.9 +O-11376,30.3 +O-11377,21.8 +O-11378,44.2 +O-11379,22.5 +O-11380,22.0 +O-11381,22.7 +O-11382,36.3 +O-11383,30.1 +O-11384,15.9 +O-11385,45.4 +O-11386,15.5 +O-11387,31.6 +O-11388,22.0 +O-11389,40.5 +O-11390,69.5 +O-11391,15.4 +O-11392,17.4 +O-11393,41.2 +O-11394,27.6 +O-11395,28.1 +O-11396,57.0 +O-11397,24.1 +O-11398,79.3 +O-11399,58.0 +O-11400,22.9 +O-11401,28.3 +O-11402,32.4 +O-11403,37.0 +O-11404,35.2 +O-11405,26.5 +O-11406,21.4 +O-11407,24.4 +O-11408,28.3 +O-11409,21.2 +O-11410,26.5 +O-11411,16.5 +O-11412,31.4 +O-11413,32.5 +O-11414,49.6 +O-11415,26.5 +O-11416,55.9 +O-11417,40.2 +O-11418,25.4 +O-11419,52.1 +O-11420,34.7 +O-11421,62.9 +O-11422,42.3 +O-11423,55.3 +O-11424,50.4 +O-11425,47.7 +O-11426,12.4 +O-11427,22.1 +O-11428,22.6 +O-11429,21.1 +O-11430,19.9 +O-11431,50.0 +O-11432,20.3 +O-11433,33.7 +O-11434,32.7 +O-11435,45.5 +O-11436,23.8 +O-11437,28.0 +O-11438,15.4 +O-11439,20.0 +O-11440,23.8 +O-11441,51.1 +O-11442,34.7 +O-11443,25.1 +O-11444,54.6 +O-11445,30.9 +O-11446,17.0 +O-11447,25.5 +O-11448,20.0 +O-11449,37.3 +O-11450,66.2 +O-11451,19.4 +O-11452,24.5 +O-11453,31.1 +O-11454,61.1 +O-11455,18.1 +O-11456,56.2 +O-11457,25.3 +O-11458,31.9 +O-11459,20.3 +O-11460,49.3 +O-11461,45.0 +O-11462,62.0 +O-11463,32.1 +O-11464,77.8 +O-11465,52.9 +O-11466,28.7 +O-11467,62.2 +O-11468,18.4 +O-11469,32.6 +O-11470,26.4 +O-11471,22.5 +O-11472,21.1 +O-11473,49.5 +O-11474,61.2 +O-11475,28.7 +O-11476,18.1 +O-11477,15.4 +O-11478,22.7 +O-11479,69.5 +O-11480,16.4 +O-11481,22.8 +O-11482,15.8 +O-11483,13.5 +O-11484,53.7 +O-11485,55.2 +O-11486,18.4 +O-11487,19.5 +O-11488,26.7 +O-11489,33.2 +O-11490,33.0 +O-11491,50.8 +O-11492,31.2 +O-11493,28.4 +O-11494,58.1 +O-11495,18.3 +O-11496,33.2 +O-11497,85.3 +O-11498,23.9 +O-11499,33.8 +O-11500,27.0 +O-11501,46.2 +O-11502,32.8 +O-11503,25.4 +O-11504,19.8 +O-11505,27.3 +O-11506,40.5 +O-11507,48.6 +O-11508,49.5 +O-11509,16.5 +O-11510,38.6 +O-11511,28.1 +O-11512,12.3 +O-11513,52.6 +O-11514,52.1 +O-11515,18.0 +O-11516,24.0 +O-11517,14.5 +O-11518,23.8 +O-11519,37.2 +O-11520,37.1 +O-11521,25.9 +O-11522,21.7 +O-11523,29.9 +O-11524,25.2 +O-11525,24.2 +O-11526,34.3 +O-11527,33.9 +O-11528,31.7 +O-11529,37.7 +O-11530,37.2 +O-11531,25.6 +O-11532,33.5 +O-11533,22.6 +O-11534,25.3 +O-11535,43.8 +O-11536,40.3 +O-11537,24.6 +O-11538,36.0 +O-11539,44.1 +O-11540,17.7 +O-11541,28.7 +O-11542,23.2 +O-11543,19.7 +O-11544,34.9 +O-11545,22.6 +O-11546,38.2 +O-11547,30.3 +O-11548,82.2 +O-11549,18.8 +O-11550,46.9 +O-11551,53.9 +O-11552,49.0 +O-11553,24.6 +O-11554,29.4 +O-11555,17.6 +O-11556,27.5 +O-11557,15.3 +O-11558,22.5 +O-11559,40.4 +O-11560,61.1 +O-11561,28.4 +O-11562,31.1 +O-11563,21.0 +O-11564,13.9 +O-11565,16.0 +O-11566,61.7 +O-11567,23.8 +O-11568,23.3 +O-11569,39.9 +O-11570,31.7 +O-11571,43.1 +O-11572,11.7 +O-11573,21.0 +O-11574,21.5 +O-11575,18.9 +O-11576,29.7 +O-11577,18.2 +O-11578,22.7 +O-11579,38.7 +O-11580,39.6 +O-11581,21.4 +O-11582,13.1 +O-11583,19.3 +O-11584,28.6 +O-11585,39.4 +O-11586,40.7 +O-11587,37.4 +O-11588,17.0 +O-11589,42.1 +O-11590,25.8 +O-11591,24.7 +O-11592,31.7 +O-11593,36.7 +O-11594,37.3 +O-11595,32.0 +O-11596,45.8 +O-11597,22.2 +O-11598,66.5 +O-11599,18.4 +O-11600,14.1 +O-11601,35.9 +O-11602,28.9 +O-11603,24.1 +O-11604,37.6 +O-11605,33.2 +O-11606,23.1 +O-11607,37.3 +O-11608,23.9 +O-11609,18.8 +O-11610,31.6 +O-11611,13.9 +O-11612,16.2 +O-11613,28.6 +O-11614,29.6 +O-11615,36.0 +O-11616,28.5 +O-11617,15.0 +O-11618,20.8 +O-11619,14.9 +O-11620,31.6 +O-11621,43.1 +O-11622,18.3 +O-11623,19.4 +O-11624,61.9 +O-11625,24.0 +O-11626,21.8 +O-11627,20.1 +O-11628,15.7 +O-11629,15.7 +O-11630,27.1 +O-11631,44.1 +O-11632,12.8 +O-11633,32.4 +O-11634,22.6 +O-11635,24.8 +O-11636,48.5 +O-11637,67.4 +O-11638,22.2 +O-11639,27.9 +O-11640,12.1 +O-11641,26.4 +O-11642,15.6 +O-11643,50.3 +O-11644,18.4 +O-11645,41.0 +O-11646,14.8 +O-11647,44.0 +O-11648,33.1 +O-11649,39.7 +O-11650,40.3 +O-11651,28.2 +O-11652,17.7 +O-11653,26.3 +O-11654,41.7 +O-11655,23.3 +O-11656,28.6 +O-11657,70.8 +O-11658,28.5 +O-11659,35.9 +O-11660,20.9 +O-11661,41.0 +O-11662,42.0 +O-11663,41.1 +O-11664,40.8 +O-11665,45.2 +O-11666,32.1 +O-11667,21.6 +O-11668,21.2 +O-11669,36.0 +O-11670,38.0 +O-11671,47.0 +O-11672,34.6 +O-11673,65.9 +O-11674,51.2 +O-11675,19.5 +O-11676,29.6 +O-11677,50.4 +O-11678,64.2 +O-11679,43.8 +O-11680,20.5 +O-11681,31.3 +O-11682,15.0 +O-11683,37.4 +O-11684,25.4 +O-11685,30.0 +O-11686,69.4 +O-11687,14.0 +O-11688,61.5 +O-11689,27.2 +O-11690,28.8 +O-11691,45.9 +O-11692,16.0 +O-11693,38.5 +O-11694,26.4 +O-11695,14.4 +O-11696,23.7 +O-11697,31.1 +O-11698,35.6 +O-11699,20.8 +O-11700,50.5 +O-11701,66.2 +O-11702,28.1 +O-11703,61.5 +O-11704,21.3 +O-11705,53.6 +O-11706,17.9 +O-11707,56.6 +O-11708,54.0 +O-11709,21.2 +O-11710,35.1 +O-11711,56.3 +O-11712,42.9 +O-11713,15.6 +O-11714,29.2 +O-11715,37.0 +O-11716,22.3 +O-11717,70.1 +O-11718,75.7 +O-11719,35.6 +O-11720,21.1 +O-11721,27.0 +O-11722,34.1 +O-11723,17.6 +O-11724,31.7 +O-11725,29.7 +O-11726,36.5 +O-11727,15.0 +O-11728,28.1 +O-11729,16.9 +O-11730,40.3 +O-11731,67.7 +O-11732,32.0 +O-11733,20.5 +O-11734,44.0 +O-11735,33.5 +O-11736,25.7 +O-11737,17.1 +O-11738,39.0 +O-11739,42.7 +O-11740,52.5 +O-11741,35.8 +O-11742,15.7 +O-11743,24.6 +O-11744,40.2 +O-11745,16.7 +O-11746,18.3 +O-11747,24.2 +O-11748,44.4 +O-11749,10.8 +O-11750,35.1 +O-11751,30.3 +O-11752,20.7 +O-11753,60.0 +O-11754,29.4 +O-11755,18.9 +O-11756,30.4 +O-11757,78.3 +O-11758,42.6 +O-11759,27.9 +O-11760,42.1 +O-11761,18.8 +O-11762,34.5 +O-11763,20.5 +O-11764,44.6 +O-11765,29.3 +O-11766,74.2 +O-11767,51.2 +O-11768,34.7 +O-11769,52.7 +O-11770,52.0 +O-11771,58.0 +O-11772,60.7 +O-11773,19.9 +O-11774,52.9 +O-11775,30.8 +O-11776,30.1 +O-11777,31.0 +O-11778,23.0 +O-11779,28.7 +O-11780,17.1 +O-11781,38.0 +O-11782,34.4 +O-11783,30.9 +O-11784,18.7 +O-11785,68.9 +O-11786,41.6 +O-11787,24.0 +O-11788,24.7 +O-11789,53.2 +O-11790,25.0 +O-11791,60.5 +O-11792,44.1 +O-11793,31.0 +O-11794,29.4 +O-11795,46.1 +O-11796,55.4 +O-11797,18.7 +O-11798,41.3 +O-11799,34.1 +O-11800,31.8 +O-11801,14.8 +O-11802,37.6 +O-11803,23.5 +O-11804,15.2 +O-11805,25.3 +O-11806,36.9 +O-11807,36.7 +O-11808,34.1 +O-11809,17.6 +O-11810,37.6 +O-11811,73.9 +O-11812,28.5 +O-11813,34.2 +O-11814,53.0 +O-11815,23.4 +O-11816,25.0 +O-11817,21.2 +O-11818,53.8 +O-11819,46.3 +O-11820,22.9 +O-11821,44.7 +O-11822,43.4 +O-11823,15.1 +O-11824,39.6 +O-11825,46.6 +O-11826,82.3 +O-11827,50.4 +O-11828,13.2 +O-11829,27.7 +O-11830,31.2 +O-11831,19.7 +O-11832,48.3 +O-11833,28.6 +O-11834,34.2 +O-11835,31.7 +O-11836,55.5 +O-11837,30.1 +O-11838,25.6 +O-11839,35.8 +O-11840,23.0 +O-11841,47.2 +O-11842,30.8 +O-11843,10.1 +O-11844,22.6 +O-11845,35.6 +O-11846,40.5 +O-11847,17.6 +O-11848,20.8 +O-11849,29.1 +O-11850,11.0 +O-11851,30.2 +O-11852,25.9 +O-11853,38.1 +O-11854,35.7 +O-11855,20.0 +O-11856,28.9 +O-11857,49.7 +O-11858,57.5 +O-11859,41.5 +O-11860,44.3 +O-11861,51.2 +O-11862,31.9 +O-11863,20.1 +O-11864,31.5 +O-11865,45.4 +O-11866,16.7 +O-11867,36.6 +O-11868,46.4 +O-11869,16.1 +O-11870,21.3 +O-11871,31.8 +O-11872,44.3 +O-11873,42.6 +O-11874,31.1 +O-11875,34.6 +O-11876,16.3 +O-11877,34.2 +O-11878,27.0 +O-11879,26.2 +O-11880,18.6 +O-11881,43.2 +O-11882,30.3 +O-11883,32.1 +O-11884,41.0 +O-11885,44.6 +O-11886,24.0 +O-11887,49.6 +O-11888,33.0 +O-11889,47.3 +O-11890,21.9 +O-11891,22.3 +O-11892,13.7 +O-11893,61.8 +O-11894,27.2 +O-11895,26.9 +O-11896,29.7 +O-11897,51.6 +O-11898,32.9 +O-11899,26.5 +O-11900,40.6 +O-11901,18.2 +O-11902,25.8 +O-11903,28.2 +O-11904,24.3 +O-11905,32.8 +O-11906,57.8 +O-11907,19.8 +O-11908,28.7 +O-11909,26.5 +O-11910,40.4 +O-11911,47.1 +O-11912,57.9 +O-11913,30.0 +O-11914,13.3 +O-11915,26.7 +O-11916,57.4 +O-11917,38.1 +O-11918,15.8 +O-11919,28.3 +O-11920,27.2 +O-11921,25.3 +O-11922,22.8 +O-11923,36.5 +O-11924,26.1 +O-11925,27.8 +O-11926,24.8 +O-11927,70.0 +O-11928,37.3 +O-11929,26.4 +O-11930,38.3 +O-11931,38.4 +O-11932,58.0 +O-11933,19.1 +O-11934,21.6 +O-11935,26.3 +O-11936,27.9 +O-11937,15.7 +O-11938,46.1 +O-11939,43.0 +O-11940,42.2 +O-11941,59.7 +O-11942,23.2 +O-11943,18.1 +O-11944,26.0 +O-11945,46.9 +O-11946,33.4 +O-11947,20.2 +O-11948,45.6 +O-11949,32.7 +O-11950,16.3 +O-11951,50.0 +O-11952,20.4 +O-11953,31.0 +O-11954,17.3 +O-11955,40.9 +O-11956,36.2 +O-11957,46.6 +O-11958,55.7 +O-11959,35.5 +O-11960,17.2 +O-11961,19.8 +O-11962,26.1 +O-11963,43.9 +O-11964,62.4 +O-11965,16.8 +O-11966,68.1 +O-11967,45.9 +O-11968,35.5 +O-11969,13.3 +O-11970,53.5 +O-11971,63.1 +O-11972,36.0 +O-11973,24.9 +O-11974,52.6 +O-11975,41.4 +O-11976,16.1 +O-11977,42.1 +O-11978,31.7 +O-11979,21.1 +O-11980,36.3 +O-11981,39.5 +O-11982,16.0 +O-11983,29.8 +O-11984,32.6 +O-11985,82.7 +O-11986,33.5 +O-11987,36.1 +O-11988,41.0 +O-11989,32.1 +O-11990,43.3 +O-11991,18.0 +O-11992,11.9 +O-11993,39.3 +O-11994,96.0 +O-11995,46.3 +O-11996,55.2 +O-11997,22.2 +O-11998,15.1 +O-11999,60.7 +O-12000,17.7 +O-12001,29.4 +O-12002,31.7 +O-12003,27.0 +O-12004,25.1 +O-12005,26.3 +O-12006,21.6 +O-12007,61.1 +O-12008,48.4 +O-12009,21.4 +O-12010,40.0 +O-12011,33.3 +O-12012,44.9 +O-12013,26.6 +O-12014,71.7 +O-12015,31.5 +O-12016,36.4 +O-12017,18.4 +O-12018,33.0 +O-12019,36.5 +O-12020,27.1 +O-12021,29.8 +O-12022,50.1 +O-12023,30.6 +O-12024,34.4 +O-12025,33.2 +O-12026,22.8 +O-12027,22.3 +O-12028,42.0 +O-12029,52.4 +O-12030,55.9 +O-12031,25.9 +O-12032,42.1 +O-12033,42.7 +O-12034,18.9 +O-12035,40.3 +O-12036,37.0 +O-12037,58.1 +O-12038,95.9 +O-12039,32.2 +O-12040,16.4 +O-12041,22.4 +O-12042,26.8 +O-12043,53.6 +O-12044,32.2 +O-12045,65.4 +O-12046,28.2 +O-12047,56.6 +O-12048,36.5 +O-12049,15.6 +O-12050,19.1 +O-12051,26.9 +O-12052,51.0 +O-12053,54.3 +O-12054,39.2 +O-12055,59.2 +O-12056,49.1 +O-12057,54.3 +O-12058,42.2 +O-12059,23.9 +O-12060,22.4 +O-12061,37.7 +O-12062,31.9 +O-12063,15.9 +O-12064,26.4 +O-12065,38.2 +O-12066,43.9 +O-12067,17.1 +O-12068,29.7 +O-12069,27.3 +O-12070,31.3 +O-12071,20.9 +O-12072,31.0 +O-12073,19.2 +O-12074,37.3 +O-12075,23.3 +O-12076,53.5 +O-12077,34.5 +O-12078,37.4 +O-12079,47.5 +O-12080,28.0 +O-12081,17.8 +O-12082,19.4 +O-12083,41.1 +O-12084,53.0 +O-12085,31.8 +O-12086,30.9 +O-12087,18.5 +O-12088,28.6 +O-12089,61.2 +O-12090,27.4 +O-12091,22.9 +O-12092,38.0 +O-12093,18.4 +O-12094,61.2 +O-12095,29.9 +O-12096,33.9 +O-12097,44.6 +O-12098,32.4 +O-12099,53.0 +O-12100,29.2 +O-12101,33.0 +O-12102,49.3 +O-12103,21.7 +O-12104,43.9 +O-12105,77.0 +O-12106,31.9 +O-12107,31.7 +O-12108,14.4 +O-12109,20.2 +O-12110,24.4 +O-12111,19.6 +O-12112,12.3 +O-12113,42.5 +O-12114,25.7 +O-12115,25.2 +O-12116,23.0 +O-12117,42.5 +O-12118,50.6 +O-12119,51.5 +O-12120,10.0 +O-12121,24.6 +O-12122,34.8 +O-12123,26.7 +O-12124,49.0 +O-12125,27.2 +O-12126,36.5 +O-12127,25.0 +O-12128,85.8 +O-12129,84.4 +O-12130,37.2 +O-12131,23.7 +O-12132,34.7 +O-12133,34.0 +O-12134,24.4 +O-12135,42.9 +O-12136,12.6 +O-12137,49.9 +O-12138,34.1 +O-12139,34.1 +O-12140,31.7 +O-12141,33.1 +O-12142,33.1 +O-12143,18.4 +O-12144,48.5 +O-12145,26.4 +O-12146,20.9 +O-12147,42.3 +O-12148,54.7 +O-12149,25.6 +O-12150,21.6 +O-12151,49.9 +O-12152,35.0 +O-12153,22.0 +O-12154,29.6 +O-12155,23.6 +O-12156,17.1 +O-12157,33.9 +O-12158,35.1 +O-12159,31.8 +O-12160,73.8 +O-12161,24.0 +O-12162,23.2 +O-12163,29.9 +O-12164,26.4 +O-12165,24.6 +O-12166,40.1 +O-12167,27.3 +O-12168,22.3 +O-12169,58.3 +O-12170,37.9 +O-12171,27.8 +O-12172,15.9 +O-12173,73.6 +O-12174,41.9 +O-12175,43.4 +O-12176,30.9 +O-12177,18.6 +O-12178,27.5 +O-12179,10.3 +O-12180,20.4 +O-12181,34.8 +O-12182,17.7 +O-12183,27.2 +O-12184,78.4 +O-12185,14.1 +O-12186,32.0 +O-12187,28.1 +O-12188,30.6 +O-12189,30.4 +O-12190,35.8 +O-12191,10.1 +O-12192,57.0 +O-12193,22.0 +O-12194,26.9 +O-12195,24.5 +O-12196,38.5 +O-12197,32.6 +O-12198,34.6 +O-12199,26.9 +O-12200,72.0 +O-12201,15.0 +O-12202,28.6 +O-12203,38.3 +O-12204,34.0 +O-12205,19.1 +O-12206,32.5 +O-12207,25.5 +O-12208,23.4 +O-12209,76.5 +O-12210,19.2 +O-12211,44.4 +O-12212,17.9 +O-12213,112.7 +O-12214,34.4 +O-12215,35.9 +O-12216,21.3 +O-12217,25.9 +O-12218,26.6 +O-12219,13.8 +O-12220,20.7 +O-12221,42.8 +O-12222,81.2 +O-12223,18.9 +O-12224,55.4 +O-12225,36.2 +O-12226,19.9 +O-12227,11.2 +O-12228,15.8 +O-12229,38.4 +O-12230,38.1 +O-12231,33.7 +O-12232,30.7 +O-12233,31.3 +O-12234,41.1 +O-12235,21.3 +O-12236,40.3 +O-12237,103.9 +O-12238,55.8 +O-12239,63.1 +O-12240,24.2 +O-12241,26.6 +O-12242,20.2 +O-12243,21.9 +O-12244,29.9 +O-12245,58.6 +O-12246,52.8 +O-12247,14.6 +O-12248,56.1 +O-12249,34.1 +O-12250,56.7 +O-12251,38.0 +O-12252,38.7 +O-12253,16.5 +O-12254,21.9 +O-12255,36.4 +O-12256,69.6 +O-12257,20.2 +O-12258,38.1 +O-12259,14.8 +O-12260,36.9 +O-12261,15.7 +O-12262,23.8 +O-12263,37.2 +O-12264,27.1 +O-12265,17.9 +O-12266,35.6 +O-12267,22.9 +O-12268,44.0 +O-12269,29.8 +O-12270,43.0 +O-12271,14.9 +O-12272,21.7 +O-12273,16.6 +O-12274,35.4 +O-12275,26.9 +O-12276,28.8 +O-12277,65.6 +O-12278,19.1 +O-12279,63.9 +O-12280,31.0 +O-12281,47.5 +O-12282,32.2 +O-12283,43.3 +O-12284,41.3 +O-12285,44.5 +O-12286,21.8 +O-12287,28.1 +O-12288,19.7 +O-12289,28.7 +O-12290,35.5 +O-12291,23.7 +O-12292,32.4 +O-12293,27.6 +O-12294,47.9 +O-12295,35.1 +O-12296,41.6 +O-12297,27.4 +O-12298,42.9 +O-12299,21.9 +O-12300,17.7 +O-12301,18.2 +O-12302,38.1 +O-12303,38.9 +O-12304,41.3 +O-12305,31.2 +O-12306,23.8 +O-12307,19.1 +O-12308,30.9 +O-12309,38.6 +O-12310,22.0 +O-12311,20.8 +O-12312,22.3 +O-12313,15.1 +O-12314,20.8 +O-12315,20.8 +O-12316,39.1 +O-12317,23.4 +O-12318,12.7 +O-12319,77.6 +O-12320,35.4 +O-12321,14.4 +O-12322,33.8 +O-12323,34.4 +O-12324,17.3 +O-12325,62.0 +O-12326,26.3 +O-12327,30.3 +O-12328,75.1 +O-12329,20.9 +O-12330,46.1 +O-12331,32.5 +O-12332,69.9 +O-12333,54.1 +O-12334,45.2 +O-12335,13.3 +O-12336,25.7 +O-12337,44.5 +O-12338,35.7 +O-12339,30.3 +O-12340,32.5 +O-12341,34.0 +O-12342,14.1 +O-12343,72.3 +O-12344,27.3 +O-12345,40.2 +O-12346,41.7 +O-12347,30.2 +O-12348,33.9 +O-12349,60.6 +O-12350,51.7 +O-12351,30.1 +O-12352,17.5 +O-12353,33.6 +O-12354,41.2 +O-12355,32.5 +O-12356,20.4 +O-12357,41.4 +O-12358,21.9 +O-12359,18.1 +O-12360,40.3 +O-12361,16.5 +O-12362,21.8 +O-12363,33.5 +O-12364,42.5 +O-12365,38.6 +O-12366,21.3 +O-12367,24.6 +O-12368,48.6 +O-12369,29.7 +O-12370,26.3 +O-12371,53.9 +O-12372,24.9 +O-12373,27.4 +O-12374,56.2 +O-12375,61.2 +O-12376,11.9 +O-12377,20.0 +O-12378,67.3 +O-12379,24.9 +O-12380,50.1 +O-12381,19.6 +O-12382,36.9 +O-12383,23.2 +O-12384,25.0 +O-12385,70.2 +O-12386,20.3 +O-12387,47.1 +O-12388,42.1 +O-12389,31.4 +O-12390,46.8 +O-12391,51.4 +O-12392,25.1 +O-12393,46.8 +O-12394,34.0 +O-12395,38.4 +O-12396,22.0 +O-12397,49.7 +O-12398,27.5 +O-12399,46.0 +O-12400,26.5 +O-12401,35.4 +O-12402,61.2 +O-12403,13.2 +O-12404,52.6 +O-12405,29.1 +O-12406,71.3 +O-12407,19.7 +O-12408,17.8 +O-12409,37.5 +O-12410,52.8 +O-12411,29.6 +O-12412,45.1 +O-12413,34.2 +O-12414,35.0 +O-12415,41.0 +O-12416,50.6 +O-12417,18.4 +O-12418,31.1 +O-12419,47.4 +O-12420,25.9 +O-12421,63.3 +O-12422,26.6 +O-12423,14.3 +O-12424,18.0 +O-12425,18.5 +O-12426,27.9 +O-12427,15.5 +O-12428,47.5 +O-12429,47.1 +O-12430,52.4 +O-12431,57.2 +O-12432,41.8 +O-12433,24.5 +O-12434,19.6 +O-12435,48.8 +O-12436,33.4 +O-12437,58.8 +O-12438,18.2 +O-12439,22.6 +O-12440,34.0 +O-12441,62.1 +O-12442,25.2 +O-12443,43.2 +O-12444,18.8 +O-12445,18.8 +O-12446,23.2 +O-12447,34.7 +O-12448,27.5 +O-12449,32.4 +O-12450,75.5 +O-12451,39.1 +O-12452,30.8 +O-12453,30.4 +O-12454,66.5 +O-12455,55.1 +O-12456,20.4 +O-12457,31.1 +O-12458,16.0 +O-12459,33.7 +O-12460,25.9 +O-12461,24.4 +O-12462,37.1 +O-12463,46.6 +O-12464,46.5 +O-12465,27.2 +O-12466,34.9 +O-12467,36.9 +O-12468,19.3 +O-12469,27.3 +O-12470,99.6 +O-12471,15.4 +O-12472,18.4 +O-12473,33.6 +O-12474,32.8 +O-12475,24.0 +O-12476,69.6 +O-12477,36.8 +O-12478,27.4 +O-12479,41.4 +O-12480,52.0 +O-12481,44.7 +O-12482,44.5 +O-12483,25.4 +O-12484,45.2 +O-12485,28.9 +O-12486,24.7 +O-12487,54.8 +O-12488,19.8 +O-12489,34.6 +O-12490,54.2 +O-12491,39.3 +O-12492,23.9 +O-12493,59.6 +O-12494,44.2 +O-12495,54.1 +O-12496,24.6 +O-12497,37.5 +O-12498,36.2 +O-12499,66.4 +O-12500,28.2 +O-12501,61.6 +O-12502,21.2 +O-12503,11.7 +O-12504,36.8 +O-12505,36.8 +O-12506,67.1 +O-12507,37.4 +O-12508,17.5 +O-12509,74.6 +O-12510,13.2 +O-12511,36.9 +O-12512,42.2 +O-12513,22.1 +O-12514,24.4 +O-12515,15.2 +O-12516,19.1 +O-12517,19.0 +O-12518,34.9 +O-12519,20.7 +O-12520,28.0 +O-12521,20.5 +O-12522,43.4 +O-12523,22.2 +O-12524,38.8 +O-12525,15.5 +O-12526,38.4 +O-12527,94.9 +O-12528,25.3 +O-12529,35.3 +O-12530,71.2 +O-12531,15.4 +O-12532,25.0 +O-12533,47.4 +O-12534,40.6 +O-12535,21.3 +O-12536,19.5 +O-12537,59.7 +O-12538,28.0 +O-12539,17.9 +O-12540,41.7 +O-12541,53.7 +O-12542,34.1 +O-12543,30.0 +O-12544,27.4 +O-12545,59.6 +O-12546,38.2 +O-12547,24.9 +O-12548,49.0 +O-12549,43.9 +O-12550,71.9 +O-12551,14.1 +O-12552,14.9 +O-12553,22.3 +O-12554,31.1 +O-12555,35.0 +O-12556,23.1 +O-12557,55.9 +O-12558,44.8 +O-12559,36.5 +O-12560,19.9 +O-12561,14.2 +O-12562,28.1 +O-12563,27.7 +O-12564,19.8 +O-12565,25.5 +O-12566,35.0 +O-12567,41.4 +O-12568,44.0 +O-12569,17.6 +O-12570,51.4 +O-12571,43.8 +O-12572,33.3 +O-12573,80.1 +O-12574,22.9 +O-12575,16.7 +O-12576,45.6 +O-12577,25.5 +O-12578,64.7 +O-12579,51.0 +O-12580,52.1 +O-12581,36.2 +O-12582,30.7 +O-12583,55.5 +O-12584,19.6 +O-12585,31.9 +O-12586,38.3 +O-12587,47.4 +O-12588,33.4 +O-12589,30.7 +O-12590,69.0 +O-12591,31.1 +O-12592,28.3 +O-12593,71.7 +O-12594,25.3 +O-12595,74.1 +O-12596,83.4 +O-12597,21.2 +O-12598,36.0 +O-12599,36.5 +O-12600,21.7 +O-12601,56.4 +O-12602,19.7 +O-12603,49.4 +O-12604,22.0 +O-12605,33.7 +O-12606,48.6 +O-12607,39.8 +O-12608,41.1 +O-12609,26.9 +O-12610,16.7 +O-12611,55.4 +O-12612,33.5 +O-12613,36.4 +O-12614,54.9 +O-12615,49.3 +O-12616,24.0 +O-12617,20.9 +O-12618,33.7 +O-12619,43.5 +O-12620,29.6 +O-12621,20.3 +O-12622,71.7 +O-12623,39.0 +O-12624,27.0 +O-12625,45.1 +O-12626,30.5 +O-12627,27.0 +O-12628,19.2 +O-12629,51.9 +O-12630,50.0 +O-12631,14.6 +O-12632,45.7 +O-12633,30.7 +O-12634,36.7 +O-12635,19.3 +O-12636,27.8 +O-12637,24.9 +O-12638,20.0 +O-12639,41.9 +O-12640,24.3 +O-12641,49.4 +O-12642,33.2 +O-12643,37.0 +O-12644,37.0 +O-12645,27.6 +O-12646,87.5 +O-12647,50.0 +O-12648,17.7 +O-12649,27.4 +O-12650,15.2 +O-12651,54.5 +O-12652,31.2 +O-12653,64.3 +O-12654,24.3 +O-12655,20.5 +O-12656,32.5 +O-12657,30.4 +O-12658,35.4 +O-12659,39.0 +O-12660,52.7 +O-12661,40.4 +O-12662,20.1 +O-12663,35.2 +O-12664,36.8 +O-12665,35.2 +O-12666,38.8 +O-12667,47.7 +O-12668,44.6 +O-12669,40.0 +O-12670,19.4 +O-12671,56.9 +O-12672,48.4 +O-12673,30.1 +O-12674,55.3 +O-12675,31.9 +O-12676,32.0 +O-12677,45.6 +O-12678,31.3 +O-12679,46.5 +O-12680,55.3 +O-12681,23.4 +O-12682,69.6 +O-12683,44.2 +O-12684,39.4 +O-12685,33.9 +O-12686,29.3 +O-12687,22.8 +O-12688,42.2 +O-12689,28.1 +O-12690,31.5 +O-12691,45.0 +O-12692,35.5 +O-12693,28.6 +O-12694,21.8 +O-12695,19.8 +O-12696,24.5 +O-12697,15.8 +O-12698,54.1 +O-12699,60.8 +O-12700,14.1 +O-12701,27.4 +O-12702,27.4 +O-12703,20.4 +O-12704,26.8 +O-12705,24.4 +O-12706,51.0 +O-12707,30.5 +O-12708,35.5 +O-12709,39.1 +O-12710,40.6 +O-12711,20.4 +O-12712,41.1 +O-12713,19.5 +O-12714,47.0 +O-12715,20.4 +O-12716,22.2 +O-12717,58.4 +O-12718,42.9 +O-12719,21.3 +O-12720,19.0 +O-12721,32.1 +O-12722,40.4 +O-12723,21.7 +O-12724,22.9 +O-12725,33.3 +O-12726,34.3 +O-12727,31.2 +O-12728,43.0 +O-12729,41.3 +O-12730,41.7 +O-12731,56.5 +O-12732,30.4 +O-12733,57.2 +O-12734,49.0 +O-12735,32.0 +O-12736,35.1 +O-12737,21.7 +O-12738,23.6 +O-12739,34.8 +O-12740,30.4 +O-12741,43.9 +O-12742,51.3 +O-12743,23.5 +O-12744,18.8 +O-12745,11.1 +O-12746,19.7 +O-12747,24.6 +O-12748,45.2 +O-12749,38.3 +O-12750,39.0 +O-12751,14.8 +O-12752,32.8 +O-12753,32.8 +O-12754,18.2 +O-12755,32.5 +O-12756,16.2 +O-12757,19.0 +O-12758,18.3 +O-12759,27.3 +O-12760,58.3 +O-12761,39.2 +O-12762,29.0 +O-12763,35.1 +O-12764,21.6 +O-12765,37.4 +O-12766,35.5 +O-12767,31.7 +O-12768,12.8 +O-12769,49.2 +O-12770,25.3 +O-12771,25.1 +O-12772,69.9 +O-12773,28.1 +O-12774,52.0 +O-12775,19.0 +O-12776,32.4 +O-12777,44.5 +O-12778,23.4 +O-12779,51.0 +O-12780,32.2 +O-12781,20.7 +O-12782,22.3 +O-12783,38.5 +O-12784,20.2 +O-12785,63.0 +O-12786,52.5 +O-12787,33.8 +O-12788,42.3 +O-12789,56.6 +O-12790,32.7 +O-12791,16.2 +O-12792,41.3 +O-12793,46.2 +O-12794,20.9 +O-12795,36.8 +O-12796,18.8 +O-12797,41.1 +O-12798,17.7 +O-12799,17.3 +O-12800,38.5 +O-12801,21.3 +O-12802,36.4 +O-12803,57.2 +O-12804,25.1 +O-12805,70.1 +O-12806,28.2 +O-12807,38.9 +O-12808,30.6 +O-12809,19.4 +O-12810,32.6 +O-12811,16.3 +O-12812,25.6 +O-12813,41.6 +O-12814,23.3 +O-12815,11.1 +O-12816,28.6 +O-12817,14.4 +O-12818,23.0 +O-12819,55.9 +O-12820,52.7 +O-12821,26.3 +O-12822,41.8 +O-12823,38.2 +O-12824,35.9 +O-12825,30.9 +O-12826,31.3 +O-12827,21.5 +O-12828,76.5 +O-12829,71.7 +O-12830,24.5 +O-12831,29.6 +O-12832,19.4 +O-12833,97.1 +O-12834,30.7 +O-12835,23.2 +O-12836,34.9 +O-12837,102.3 +O-12838,52.7 +O-12839,16.8 +O-12840,65.1 +O-12841,52.0 +O-12842,74.0 +O-12843,18.5 +O-12844,16.3 +O-12845,46.7 +O-12846,21.4 +O-12847,77.8 +O-12848,22.3 +O-12849,22.7 +O-12850,29.6 +O-12851,22.3 +O-12852,51.8 +O-12853,51.0 +O-12854,41.0 +O-12855,12.5 +O-12856,44.8 +O-12857,37.2 +O-12858,20.6 +O-12859,67.3 +O-12860,48.3 +O-12861,23.7 +O-12862,16.3 +O-12863,29.9 +O-12864,23.0 +O-12865,45.1 +O-12866,28.0 +O-12867,49.0 +O-12868,42.0 +O-12869,28.7 +O-12870,22.8 +O-12871,28.2 +O-12872,74.8 +O-12873,38.5 +O-12874,50.7 +O-12875,22.8 +O-12876,26.8 +O-12877,32.3 +O-12878,19.1 +O-12879,49.2 +O-12880,59.2 +O-12881,26.0 +O-12882,23.9 +O-12883,67.9 +O-12884,80.7 +O-12885,17.2 +O-12886,15.3 +O-12887,14.4 +O-12888,52.5 +O-12889,28.0 +O-12890,26.4 +O-12891,31.4 +O-12892,19.0 +O-12893,45.5 +O-12894,36.6 +O-12895,39.9 +O-12896,33.0 +O-12897,18.4 +O-12898,53.1 +O-12899,26.2 +O-12900,28.9 +O-12901,61.1 +O-12902,25.7 +O-12903,24.4 +O-12904,59.1 +O-12905,16.2 +O-12906,51.9 +O-12907,42.6 +O-12908,22.3 +O-12909,41.2 +O-12910,17.6 +O-12911,26.2 +O-12912,50.0 +O-12913,24.7 +O-12914,14.5 +O-12915,18.3 +O-12916,41.8 +O-12917,42.9 +O-12918,38.2 +O-12919,26.4 +O-12920,30.5 +O-12921,33.0 +O-12922,35.5 +O-12923,15.2 +O-12924,37.2 +O-12925,27.4 +O-12926,44.3 +O-12927,29.9 +O-12928,26.5 +O-12929,51.5 +O-12930,53.4 +O-12931,29.3 +O-12932,13.4 +O-12933,20.1 +O-12934,95.0 +O-12935,33.9 +O-12936,43.4 +O-12937,55.2 +O-12938,32.5 +O-12939,34.2 +O-12940,25.4 +O-12941,21.5 +O-12942,94.2 +O-12943,15.4 +O-12944,46.5 +O-12945,31.8 +O-12946,18.0 +O-12947,20.9 +O-12948,79.5 +O-12949,35.9 +O-12950,74.2 +O-12951,78.0 +O-12952,18.5 +O-12953,31.0 +O-12954,13.2 +O-12955,54.8 +O-12956,35.0 +O-12957,29.7 +O-12958,25.8 +O-12959,63.8 +O-12960,18.0 +O-12961,34.2 +O-12962,29.9 +O-12963,30.8 +O-12964,28.5 +O-12965,57.4 +O-12966,28.5 +O-12967,19.5 +O-12968,38.7 +O-12969,18.1 +O-12970,51.1 +O-12971,24.9 +O-12972,34.6 +O-12973,20.3 +O-12974,37.5 +O-12975,42.1 +O-12976,35.8 +O-12977,35.8 +O-12978,27.8 +O-12979,22.4 +O-12980,51.8 +O-12981,21.7 +O-12982,26.4 +O-12983,22.0 +O-12984,48.8 +O-12985,23.8 +O-12986,29.2 +O-12987,25.7 +O-12988,28.0 +O-12989,37.8 +O-12990,30.1 +O-12991,37.7 +O-12992,81.6 +O-12993,20.3 +O-12994,37.2 +O-12995,29.7 +O-12996,22.7 +O-12997,44.9 +O-12998,28.1 +O-12999,40.5 +O-13000,50.8 +O-13001,30.7 +O-13002,21.0 +O-13003,48.3 +O-13004,42.3 +O-13005,24.7 +O-13006,31.0 +O-13007,59.3 +O-13008,19.8 +O-13009,43.2 +O-13010,35.6 +O-13011,25.3 +O-13012,42.4 +O-13013,34.2 +O-13014,30.5 +O-13015,19.5 +O-13016,30.0 +O-13017,56.5 +O-13018,17.0 +O-13019,30.3 +O-13020,40.5 +O-13021,26.3 +O-13022,51.5 +O-13023,21.6 +O-13024,71.6 +O-13025,20.4 +O-13026,49.4 +O-13027,25.4 +O-13028,45.7 +O-13029,16.6 +O-13030,21.5 +O-13031,36.0 +O-13032,33.7 +O-13033,39.0 +O-13034,37.3 +O-13035,40.6 +O-13036,54.4 +O-13037,79.1 +O-13038,21.9 +O-13039,65.5 +O-13040,44.3 +O-13041,42.0 +O-13042,29.9 +O-13043,47.4 +O-13044,14.6 +O-13045,23.8 +O-13046,42.9 +O-13047,21.7 +O-13048,19.6 +O-13049,43.4 +O-13050,48.1 +O-13051,49.4 +O-13052,22.7 +O-13053,27.3 +O-13054,52.7 +O-13055,55.9 +O-13056,33.8 +O-13057,15.3 +O-13058,50.1 +O-13059,19.7 +O-13060,48.5 +O-13061,30.0 +O-13062,27.3 +O-13063,73.6 +O-13064,57.3 +O-13065,49.0 +O-13066,49.7 +O-13067,48.2 +O-13068,22.0 +O-13069,16.9 +O-13070,68.9 +O-13071,27.7 +O-13072,15.3 +O-13073,59.9 +O-13074,16.1 +O-13075,14.8 +O-13076,46.6 +O-13077,30.1 +O-13078,51.9 +O-13079,39.0 +O-13080,26.6 +O-13081,21.6 +O-13082,47.5 +O-13083,31.5 +O-13084,14.7 +O-13085,35.6 +O-13086,49.5 +O-13087,15.4 +O-13088,17.2 +O-13089,57.0 +O-13090,28.1 +O-13091,28.0 +O-13092,69.9 +O-13093,57.4 +O-13094,40.6 +O-13095,29.5 +O-13096,14.4 +O-13097,45.8 +O-13098,51.2 +O-13099,33.5 +O-13100,27.7 +O-13101,15.8 +O-13102,40.7 +O-13103,45.9 +O-13104,76.6 +O-13105,47.3 +O-13106,52.7 +O-13107,37.3 +O-13108,39.5 +O-13109,62.6 +O-13110,71.8 +O-13111,40.0 +O-13112,26.8 +O-13113,31.5 +O-13114,65.5 +O-13115,49.9 +O-13116,55.8 +O-13117,37.2 +O-13118,36.5 +O-13119,20.9 +O-13120,20.8 +O-13121,27.4 +O-13122,19.7 +O-13123,41.7 +O-13124,56.9 +O-13125,35.0 +O-13126,20.5 +O-13127,31.1 +O-13128,32.6 +O-13129,81.7 +O-13130,38.4 +O-13131,30.4 +O-13132,39.2 +O-13133,36.7 +O-13134,21.9 +O-13135,27.2 +O-13136,38.6 +O-13137,44.5 +O-13138,14.9 +O-13139,65.1 +O-13140,23.0 +O-13141,58.8 +O-13142,46.7 +O-13143,72.3 +O-13144,31.4 +O-13145,55.2 +O-13146,69.5 +O-13147,20.5 +O-13148,18.9 +O-13149,46.8 +O-13150,26.7 +O-13151,21.0 +O-13152,34.8 +O-13153,32.6 +O-13154,23.1 +O-13155,43.5 +O-13156,49.1 +O-13157,35.1 +O-13158,39.7 +O-13159,23.3 +O-13160,32.3 +O-13161,46.0 +O-13162,33.7 +O-13163,27.2 +O-13164,48.6 +O-13165,17.4 +O-13166,34.7 +O-13167,44.6 +O-13168,23.6 +O-13169,36.3 +O-13170,12.7 +O-13171,37.3 +O-13172,24.4 +O-13173,26.1 +O-13174,75.2 +O-13175,16.2 +O-13176,48.5 +O-13177,59.4 +O-13178,51.5 +O-13179,37.5 +O-13180,22.8 +O-13181,26.3 +O-13182,31.9 +O-13183,41.8 +O-13184,41.7 +O-13185,34.7 +O-13186,59.9 +O-13187,21.2 +O-13188,24.2 +O-13189,30.1 +O-13190,26.4 +O-13191,30.7 +O-13192,22.7 +O-13193,19.8 +O-13194,21.3 +O-13195,18.8 +O-13196,43.4 +O-13197,26.7 +O-13198,24.6 +O-13199,43.1 +O-13200,15.9 +O-13201,55.8 +O-13202,94.3 +O-13203,12.9 +O-13204,17.4 +O-13205,25.9 +O-13206,22.9 +O-13207,24.7 +O-13208,34.2 +O-13209,10.4 +O-13210,18.4 +O-13211,32.1 +O-13212,16.0 +O-13213,30.4 +O-13214,24.0 +O-13215,30.0 +O-13216,51.2 +O-13217,35.0 +O-13218,16.8 +O-13219,53.2 +O-13220,36.5 +O-13221,20.4 +O-13222,28.5 +O-13223,20.4 +O-13224,17.8 +O-13225,40.5 +O-13226,10.0 +O-13227,60.9 +O-13228,23.5 +O-13229,35.8 +O-13230,60.9 +O-13231,39.4 +O-13232,15.5 +O-13233,23.7 +O-13234,24.7 +O-13235,32.5 +O-13236,41.0 +O-13237,31.4 +O-13238,26.8 +O-13239,45.4 +O-13240,26.1 +O-13241,37.0 +O-13242,31.6 +O-13243,30.5 +O-13244,34.1 +O-13245,33.0 +O-13246,54.1 +O-13247,57.0 +O-13248,27.2 +O-13249,32.9 +O-13250,23.4 +O-13251,28.6 +O-13252,26.1 +O-13253,34.9 +O-13254,20.5 +O-13255,30.0 +O-13256,28.0 +O-13257,21.3 +O-13258,33.0 +O-13259,10.7 +O-13260,24.2 +O-13261,41.5 +O-13262,53.4 +O-13263,30.3 +O-13264,25.0 +O-13265,23.3 +O-13266,37.3 +O-13267,50.6 +O-13268,33.7 +O-13269,31.4 +O-13270,46.8 +O-13271,12.3 +O-13272,23.2 +O-13273,38.4 +O-13274,57.1 +O-13275,18.9 +O-13276,28.3 +O-13277,50.4 +O-13278,32.8 +O-13279,37.5 +O-13280,16.2 +O-13281,15.5 +O-13282,78.2 +O-13283,41.0 +O-13284,52.1 +O-13285,20.2 +O-13286,45.6 +O-13287,35.5 +O-13288,23.4 +O-13289,30.1 +O-13290,29.9 +O-13291,40.7 +O-13292,23.1 +O-13293,50.2 +O-13294,24.6 +O-13295,31.6 +O-13296,21.7 +O-13297,40.2 +O-13298,18.5 +O-13299,19.3 +O-13300,67.9 +O-13301,42.8 +O-13302,62.0 +O-13303,62.4 +O-13304,62.5 +O-13305,39.8 +O-13306,37.0 +O-13307,14.4 +O-13308,54.7 +O-13309,38.1 +O-13310,73.1 +O-13311,18.9 +O-13312,29.6 +O-13313,36.1 +O-13314,37.9 +O-13315,35.4 +O-13316,52.7 +O-13317,42.3 +O-13318,65.5 +O-13319,42.4 +O-13320,29.9 +O-13321,58.8 +O-13322,31.6 +O-13323,12.4 +O-13324,54.5 +O-13325,29.6 +O-13326,29.3 +O-13327,24.0 +O-13328,17.9 +O-13329,41.6 +O-13330,23.8 +O-13331,17.3 +O-13332,35.7 +O-13333,62.7 +O-13334,73.4 +O-13335,21.1 +O-13336,44.7 +O-13337,21.6 +O-13338,59.0 +O-13339,23.7 +O-13340,85.0 +O-13341,42.5 +O-13342,22.3 +O-13343,68.2 +O-13344,31.8 +O-13345,31.8 +O-13346,28.4 +O-13347,24.2 +O-13348,26.8 +O-13349,37.3 +O-13350,30.9 +O-13351,39.7 +O-13352,25.1 +O-13353,30.5 +O-13354,61.8 +O-13355,28.4 +O-13356,48.3 +O-13357,22.5 +O-13358,24.6 +O-13359,38.1 +O-13360,35.9 +O-13361,50.0 +O-13362,50.0 +O-13363,25.5 +O-13364,38.5 +O-13365,27.8 +O-13366,31.1 +O-13367,59.1 +O-13368,21.4 +O-13369,37.7 +O-13370,23.7 +O-13371,30.1 +O-13372,33.3 +O-13373,41.7 +O-13374,37.8 +O-13375,32.6 +O-13376,30.6 +O-13377,40.8 +O-13378,27.9 +O-13379,38.7 +O-13380,28.9 +O-13381,39.0 +O-13382,25.7 +O-13383,21.3 +O-13384,33.1 +O-13385,46.0 +O-13386,56.9 +O-13387,53.7 +O-13388,28.6 +O-13389,20.8 +O-13390,15.9 +O-13391,38.3 +O-13392,28.3 +O-13393,17.3 +O-13394,27.7 +O-13395,21.9 +O-13396,33.3 +O-13397,34.9 +O-13398,36.1 +O-13399,42.3 +O-13400,25.6 +O-13401,48.0 +O-13402,23.5 +O-13403,56.6 +O-13404,25.3 +O-13405,27.9 +O-13406,37.4 +O-13407,30.8 +O-13408,12.9 +O-13409,75.2 +O-13410,57.8 +O-13411,83.6 +O-13412,26.9 +O-13413,23.3 +O-13414,31.0 +O-13415,18.8 +O-13416,28.5 +O-13417,14.3 +O-13418,57.1 +O-13419,52.1 +O-13420,41.9 +O-13421,16.8 +O-13422,17.2 +O-13423,52.5 +O-13424,50.0 +O-13425,35.7 +O-13426,42.8 +O-13427,21.4 +O-13428,34.2 +O-13429,18.0 +O-13430,13.7 +O-13431,40.1 +O-13432,37.9 +O-13433,75.7 +O-13434,36.5 +O-13435,24.8 +O-13436,41.1 +O-13437,56.7 +O-13438,20.3 +O-13439,49.1 +O-13440,22.9 +O-13441,13.9 +O-13442,61.6 +O-13443,17.6 +O-13444,34.0 +O-13445,44.7 +O-13446,35.7 +O-13447,26.0 +O-13448,57.8 +O-13449,88.4 +O-13450,47.2 +O-13451,69.5 +O-13452,30.7 +O-13453,26.1 +O-13454,28.8 +O-13455,23.1 +O-13456,25.9 +O-13457,26.1 +O-13458,25.7 +O-13459,60.5 +O-13460,29.1 +O-13461,20.0 +O-13462,35.2 +O-13463,13.9 +O-13464,44.6 +O-13465,30.1 +O-13466,20.2 +O-13467,38.4 +O-13468,21.8 +O-13469,62.7 +O-13470,39.5 +O-13471,20.7 +O-13472,33.1 +O-13473,28.7 +O-13474,37.1 +O-13475,55.5 +O-13476,71.5 +O-13477,33.1 +O-13478,28.6 +O-13479,20.5 +O-13480,30.2 +O-13481,60.3 +O-13482,30.8 +O-13483,85.9 +O-13484,34.4 +O-13485,43.0 +O-13486,22.0 +O-13487,29.1 +O-13488,35.2 +O-13489,72.1 +O-13490,58.9 +O-13491,21.3 +O-13492,26.3 +O-13493,36.0 +O-13494,18.0 +O-13495,17.6 +O-13496,17.9 +O-13497,45.6 +O-13498,37.2 +O-13499,12.5 +O-13500,27.4 +O-13501,25.4 +O-13502,40.8 +O-13503,30.3 +O-13504,20.4 +O-13505,15.6 +O-13506,56.4 +O-13507,39.3 +O-13508,36.8 +O-13509,12.5 +O-13510,21.5 +O-13511,18.4 +O-13512,33.3 +O-13513,25.2 +O-13514,15.3 +O-13515,38.4 +O-13516,27.8 +O-13517,49.3 +O-13518,19.3 +O-13519,27.8 +O-13520,18.2 +O-13521,18.4 +O-13522,38.1 +O-13523,42.4 +O-13524,61.1 +O-13525,50.4 +O-13526,33.5 +O-13527,59.6 +O-13528,33.1 +O-13529,35.4 +O-13530,19.4 +O-13531,19.1 +O-13532,42.7 +O-13533,37.7 +O-13534,27.6 +O-13535,66.2 +O-13536,24.7 +O-13537,48.5 +O-13538,35.1 +O-13539,44.4 +O-13540,24.3 +O-13541,43.0 +O-13542,66.8 +O-13543,22.0 +O-13544,44.9 +O-13545,26.2 +O-13546,18.0 +O-13547,19.1 +O-13548,11.5 +O-13549,17.8 +O-13550,61.5 +O-13551,34.7 +O-13552,30.6 +O-13553,13.6 +O-13554,39.0 +O-13555,38.6 +O-13556,56.4 +O-13557,42.1 +O-13558,38.9 +O-13559,23.0 +O-13560,57.5 +O-13561,55.9 +O-13562,34.3 +O-13563,81.8 +O-13564,23.0 +O-13565,46.3 +O-13566,32.7 +O-13567,22.8 +O-13568,25.3 +O-13569,13.9 +O-13570,29.9 +O-13571,26.9 +O-13572,29.8 +O-13573,23.2 +O-13574,22.9 +O-13575,9.9 +O-13576,33.8 +O-13577,53.1 +O-13578,26.3 +O-13579,45.7 +O-13580,47.0 +O-13581,42.4 +O-13582,34.6 +O-13583,39.1 +O-13584,43.7 +O-13585,17.2 +O-13586,9.2 +O-13587,42.2 +O-13588,32.9 +O-13589,19.1 +O-13590,30.7 +O-13591,12.5 +O-13592,31.3 +O-13593,42.1 +O-13594,37.9 +O-13595,15.0 +O-13596,27.2 +O-13597,20.1 +O-13598,31.0 +O-13599,34.8 +O-13600,53.8 +O-13601,21.5 +O-13602,31.3 +O-13603,29.0 +O-13604,25.5 +O-13605,33.5 +O-13606,34.4 +O-13607,25.5 +O-13608,21.1 +O-13609,68.6 +O-13610,16.0 +O-13611,30.3 +O-13612,10.8 +O-13613,12.3 +O-13614,27.1 +O-13615,22.5 +O-13616,20.0 +O-13617,48.8 +O-13618,23.4 +O-13619,38.0 +O-13620,25.2 +O-13621,32.6 +O-13622,37.5 +O-13623,23.4 +O-13624,21.7 +O-13625,19.1 +O-13626,53.5 +O-13627,23.9 +O-13628,69.4 +O-13629,38.5 +O-13630,51.1 +O-13631,18.1 +O-13632,50.6 +O-13633,24.4 +O-13634,42.0 +O-13635,32.7 +O-13636,40.5 +O-13637,47.0 +O-13638,23.8 +O-13639,39.1 +O-13640,17.9 +O-13641,35.5 +O-13642,15.5 +O-13643,63.1 +O-13644,60.6 +O-13645,72.4 +O-13646,53.0 +O-13647,62.2 +O-13648,32.4 +O-13649,48.0 +O-13650,28.5 +O-13651,33.0 +O-13652,18.1 +O-13653,25.3 +O-13654,57.3 +O-13655,51.4 +O-13656,32.3 +O-13657,51.0 +O-13658,42.2 +O-13659,52.2 +O-13660,11.5 +O-13661,22.6 +O-13662,33.2 +O-13663,40.2 +O-13664,30.5 +O-13665,23.0 +O-13666,26.9 +O-13667,53.2 +O-13668,65.5 +O-13669,14.5 +O-13670,30.5 +O-13671,21.4 +O-13672,32.3 +O-13673,38.8 +O-13674,67.9 +O-13675,28.5 +O-13676,41.5 +O-13677,52.4 +O-13678,13.5 +O-13679,23.8 +O-13680,62.0 +O-13681,20.8 +O-13682,11.7 +O-13683,23.8 +O-13684,19.0 +O-13685,17.7 +O-13686,47.3 +O-13687,38.2 +O-13688,35.0 +O-13689,18.5 +O-13690,44.4 +O-13691,35.0 +O-13692,44.1 +O-13693,33.6 +O-13694,20.1 +O-13695,28.2 +O-13696,33.4 +O-13697,46.6 +O-13698,12.9 +O-13699,33.0 +O-13700,19.7 +O-13701,16.2 +O-13702,51.8 +O-13703,32.5 +O-13704,25.1 +O-13705,46.4 +O-13706,26.5 +O-13707,35.8 +O-13708,14.1 +O-13709,44.4 +O-13710,53.5 +O-13711,29.1 +O-13712,20.7 +O-13713,45.7 +O-13714,23.2 +O-13715,23.4 +O-13716,64.6 +O-13717,40.0 +O-13718,71.8 +O-13719,16.7 +O-13720,19.3 +O-13721,16.1 +O-13722,22.6 +O-13723,28.2 +O-13724,30.0 +O-13725,27.6 +O-13726,29.8 +O-13727,31.0 +O-13728,40.7 +O-13729,45.2 +O-13730,41.3 +O-13731,23.9 +O-13732,35.0 +O-13733,21.3 +O-13734,17.6 +O-13735,14.8 +O-13736,18.6 +O-13737,27.4 +O-13738,11.9 +O-13739,40.8 +O-13740,14.0 +O-13741,49.3 +O-13742,37.6 +O-13743,29.7 +O-13744,27.8 +O-13745,16.9 +O-13746,30.7 +O-13747,47.2 +O-13748,15.2 +O-13749,48.1 +O-13750,31.4 +O-13751,30.7 +O-13752,41.4 +O-13753,22.4 +O-13754,25.2 +O-13755,45.2 +O-13756,29.4 +O-13757,40.1 +O-13758,38.9 +O-13759,27.4 +O-13760,42.7 +O-13761,26.8 +O-13762,35.1 +O-13763,29.1 +O-13764,62.0 +O-13765,19.1 +O-13766,40.9 +O-13767,21.9 +O-13768,57.1 +O-13769,21.2 +O-13770,22.2 +O-13771,28.5 +O-13772,40.9 +O-13773,17.2 +O-13774,58.4 +O-13775,39.4 +O-13776,31.8 +O-13777,47.5 +O-13778,75.3 +O-13779,30.2 +O-13780,46.6 +O-13781,35.6 +O-13782,24.7 +O-13783,22.3 +O-13784,50.3 +O-13785,25.0 +O-13786,39.6 +O-13787,34.1 +O-13788,49.7 +O-13789,27.4 +O-13790,27.9 +O-13791,19.5 +O-13792,23.7 +O-13793,13.5 +O-13794,29.6 +O-13795,81.0 +O-13796,14.6 +O-13797,36.1 +O-13798,35.8 +O-13799,43.6 +O-13800,55.1 +O-13801,36.8 +O-13802,31.0 +O-13803,22.4 +O-13804,33.8 +O-13805,21.1 +O-13806,33.5 +O-13807,23.9 +O-13808,44.4 +O-13809,29.9 +O-13810,33.5 +O-13811,41.8 +O-13812,11.8 +O-13813,39.3 +O-13814,19.1 +O-13815,19.2 +O-13816,17.0 +O-13817,40.0 +O-13818,27.3 +O-13819,40.6 +O-13820,78.4 +O-13821,48.8 +O-13822,27.2 +O-13823,17.8 +O-13824,18.0 +O-13825,51.6 +O-13826,38.6 +O-13827,34.5 +O-13828,33.4 +O-13829,23.3 +O-13830,86.5 +O-13831,71.6 +O-13832,27.1 +O-13833,25.6 +O-13834,24.4 +O-13835,42.2 +O-13836,21.5 +O-13837,20.5 +O-13838,23.4 +O-13839,29.7 +O-13840,41.5 +O-13841,43.2 +O-13842,73.7 +O-13843,16.6 +O-13844,27.5 +O-13845,35.0 +O-13846,18.7 +O-13847,31.2 +O-13848,13.7 +O-13849,25.2 +O-13850,19.4 +O-13851,25.4 +O-13852,28.8 +O-13853,25.1 +O-13854,13.5 +O-13855,33.1 +O-13856,56.4 +O-13857,14.2 +O-13858,41.8 +O-13859,24.1 +O-13860,20.1 +O-13861,27.0 +O-13862,24.4 +O-13863,38.4 +O-13864,38.7 +O-13865,55.9 +O-13866,24.7 +O-13867,31.8 +O-13868,60.0 +O-13869,38.1 +O-13870,22.8 +O-13871,20.2 +O-13872,57.1 +O-13873,42.1 +O-13874,36.2 +O-13875,35.0 +O-13876,19.8 +O-13877,40.3 +O-13878,31.6 +O-13879,56.0 +O-13880,11.2 +O-13881,25.8 +O-13882,11.9 +O-13883,27.0 +O-13884,38.3 +O-13885,27.6 +O-13886,17.4 +O-13887,23.5 +O-13888,58.1 +O-13889,32.2 +O-13890,34.3 +O-13891,46.1 +O-13892,50.6 +O-13893,33.0 +O-13894,31.8 +O-13895,50.5 +O-13896,33.7 +O-13897,35.3 +O-13898,42.6 +O-13899,14.4 +O-13900,24.2 +O-13901,29.3 +O-13902,27.3 +O-13903,45.6 +O-13904,30.5 +O-13905,30.8 +O-13906,28.8 +O-13907,47.1 +O-13908,21.3 +O-13909,39.3 +O-13910,18.9 +O-13911,40.4 +O-13912,40.1 +O-13913,25.0 +O-13914,41.6 +O-13915,30.5 +O-13916,43.7 +O-13917,26.7 +O-13918,15.4 +O-13919,25.1 +O-13920,19.2 +O-13921,21.5 +O-13922,57.3 +O-13923,26.1 +O-13924,20.3 +O-13925,45.1 +O-13926,31.2 +O-13927,21.8 +O-13928,29.2 +O-13929,53.7 +O-13930,43.7 +O-13931,35.9 +O-13932,35.0 +O-13933,30.8 +O-13934,42.0 +O-13935,16.3 +O-13936,32.6 +O-13937,51.5 +O-13938,32.9 +O-13939,38.1 +O-13940,57.6 +O-13941,48.4 +O-13942,25.3 +O-13943,48.5 +O-13944,19.1 +O-13945,72.3 +O-13946,15.1 +O-13947,58.6 +O-13948,27.9 +O-13949,35.4 +O-13950,28.2 +O-13951,124.0 +O-13952,59.0 +O-13953,21.9 +O-13954,57.4 +O-13955,23.5 +O-13956,29.7 +O-13957,32.5 +O-13958,27.8 +O-13959,50.0 +O-13960,48.3 +O-13961,44.4 +O-13962,52.1 +O-13963,13.4 +O-13964,23.4 +O-13965,37.5 +O-13966,19.6 +O-13967,45.5 +O-13968,38.0 +O-13969,12.8 +O-13970,41.2 +O-13971,27.9 +O-13972,31.9 +O-13973,32.4 +O-13974,58.0 +O-13975,13.7 +O-13976,12.9 +O-13977,52.6 +O-13978,16.3 +O-13979,16.3 +O-13980,21.0 +O-13981,34.2 +O-13982,19.8 +O-13983,45.1 +O-13984,36.0 +O-13985,31.6 +O-13986,15.9 +O-13987,47.1 +O-13988,105.9 +O-13989,16.5 +O-13990,26.0 +O-13991,26.4 +O-13992,35.6 +O-13993,40.1 +O-13994,31.0 +O-13995,42.6 +O-13996,25.2 +O-13997,45.6 +O-13998,36.8 +O-13999,14.9 +O-14000,51.2 +O-14001,29.1 +O-14002,47.6 +O-14003,25.9 +O-14004,48.1 +O-14005,51.7 +O-14006,25.9 +O-14007,22.8 +O-14008,35.5 +O-14009,59.9 +O-14010,13.8 +O-14011,38.7 +O-14012,14.7 +O-14013,23.9 +O-14014,37.7 +O-14015,45.0 +O-14016,38.8 +O-14017,50.0 +O-14018,13.3 +O-14019,55.4 +O-14020,10.2 +O-14021,33.6 +O-14022,63.3 +O-14023,22.1 +O-14024,24.0 +O-14025,26.1 +O-14026,68.1 +O-14027,63.0 +O-14028,25.6 +O-14029,40.1 +O-14030,24.0 +O-14031,26.2 +O-14032,47.2 +O-14033,27.7 +O-14034,51.9 +O-14035,28.0 +O-14036,23.7 +O-14037,30.1 +O-14038,57.7 +O-14039,15.5 +O-14040,46.6 +O-14041,64.9 +O-14042,32.8 +O-14043,47.3 +O-14044,27.8 +O-14045,18.5 +O-14046,40.6 +O-14047,49.3 +O-14048,21.0 +O-14049,46.9 +O-14050,23.7 +O-14051,15.4 +O-14052,29.0 +O-14053,18.8 +O-14054,21.1 +O-14055,12.6 +O-14056,47.8 +O-14057,38.0 +O-14058,53.4 +O-14059,34.3 +O-14060,36.1 +O-14061,31.8 +O-14062,23.3 +O-14063,18.8 +O-14064,9.8 +O-14065,42.7 +O-14066,23.6 +O-14067,15.7 +O-14068,25.4 +O-14069,53.9 +O-14070,28.5 +O-14071,27.4 +O-14072,40.4 +O-14073,33.7 +O-14074,49.2 +O-14075,49.7 +O-14076,58.1 +O-14077,61.1 +O-14078,24.2 +O-14079,42.8 +O-14080,62.9 +O-14081,49.7 +O-14082,22.8 +O-14083,22.5 +O-14084,35.5 +O-14085,26.8 +O-14086,37.3 +O-14087,16.9 +O-14088,27.8 +O-14089,16.2 +O-14090,62.6 +O-14091,24.2 +O-14092,37.6 +O-14093,24.0 +O-14094,48.9 +O-14095,52.8 +O-14096,19.0 +O-14097,50.0 +O-14098,21.7 +O-14099,58.9 +O-14100,45.0 +O-14101,19.9 +O-14102,17.2 +O-14103,43.1 +O-14104,18.6 +O-14105,49.5 +O-14106,42.7 +O-14107,66.3 +O-14108,50.4 +O-14109,23.1 +O-14110,13.9 +O-14111,28.2 +O-14112,32.4 +O-14113,18.0 +O-14114,63.9 +O-14115,35.2 +O-14116,27.2 +O-14117,41.3 +O-14118,48.8 +O-14119,31.1 +O-14120,31.6 +O-14121,65.8 +O-14122,35.3 +O-14123,15.1 +O-14124,18.9 +O-14125,34.7 +O-14126,67.7 +O-14127,35.5 +O-14128,22.6 +O-14129,58.5 +O-14130,43.2 +O-14131,42.0 +O-14132,53.1 +O-14133,19.4 +O-14134,29.8 +O-14135,34.0 +O-14136,21.2 +O-14137,46.6 +O-14138,18.3 +O-14139,62.8 +O-14140,40.0 +O-14141,34.3 +O-14142,58.2 +O-14143,19.7 +O-14144,24.0 +O-14145,37.8 +O-14146,15.1 +O-14147,48.4 +O-14148,54.2 +O-14149,16.4 +O-14150,36.9 +O-14151,37.2 +O-14152,23.3 +O-14153,25.9 +O-14154,28.7 +O-14155,42.2 +O-14156,23.9 +O-14157,54.1 +O-14158,35.7 +O-14159,62.2 +O-14160,37.3 +O-14161,18.4 +O-14162,51.9 +O-14163,18.8 +O-14164,33.3 +O-14165,31.5 +O-14166,19.8 +O-14167,37.5 +O-14168,24.4 +O-14169,37.9 +O-14170,33.2 +O-14171,23.3 +O-14172,19.0 +O-14173,32.4 +O-14174,25.9 +O-14175,26.7 +O-14176,37.9 +O-14177,26.5 +O-14178,24.0 +O-14179,18.7 +O-14180,40.1 +O-14181,20.4 +O-14182,15.6 +O-14183,37.0 +O-14184,19.9 +O-14185,18.2 +O-14186,20.0 +O-14187,55.7 +O-14188,31.5 +O-14189,37.7 +O-14190,23.5 +O-14191,16.2 +O-14192,37.0 +O-14193,39.0 +O-14194,15.1 +O-14195,23.0 +O-14196,50.9 +O-14197,50.1 +O-14198,37.8 +O-14199,55.6 +O-14200,17.3 +O-14201,31.1 +O-14202,22.9 +O-14203,39.6 +O-14204,30.7 +O-14205,39.6 +O-14206,33.7 +O-14207,26.2 +O-14208,25.1 +O-14209,34.1 +O-14210,55.3 +O-14211,32.7 +O-14212,24.8 +O-14213,55.0 +O-14214,39.9 +O-14215,28.8 +O-14216,59.0 +O-14217,34.5 +O-14218,35.8 +O-14219,32.8 +O-14220,16.0 +O-14221,29.1 +O-14222,28.7 +O-14223,18.5 +O-14224,19.0 +O-14225,52.6 +O-14226,36.3 +O-14227,44.5 +O-14228,31.2 +O-14229,24.4 +O-14230,38.5 +O-14231,45.2 +O-14232,17.0 +O-14233,34.9 +O-14234,18.9 +O-14235,40.0 +O-14236,50.5 +O-14237,50.3 +O-14238,46.7 +O-14239,36.8 +O-14240,16.2 +O-14241,66.6 +O-14242,34.0 +O-14243,23.2 +O-14244,20.4 +O-14245,53.8 +O-14246,76.0 +O-14247,30.6 +O-14248,44.6 +O-14249,16.7 +O-14250,23.3 +O-14251,32.1 +O-14252,32.7 +O-14253,14.4 +O-14254,77.5 +O-14255,41.9 +O-14256,15.7 +O-14257,41.5 +O-14258,40.6 +O-14259,46.7 +O-14260,34.0 +O-14261,54.3 +O-14262,34.9 +O-14263,29.9 +O-14264,65.5 +O-14265,34.1 +O-14266,33.8 +O-14267,36.1 +O-14268,45.5 +O-14269,25.1 +O-14270,13.8 +O-14271,39.2 +O-14272,45.4 +O-14273,16.4 +O-14274,36.2 +O-14275,22.1 +O-14276,82.3 +O-14277,52.1 +O-14278,25.8 +O-14279,41.8 +O-14280,64.4 +O-14281,15.1 +O-14282,51.3 +O-14283,20.7 +O-14284,56.7 +O-14285,49.3 +O-14286,75.6 +O-14287,22.4 +O-14288,24.2 +O-14289,53.4 +O-14290,30.8 +O-14291,51.6 +O-14292,31.5 +O-14293,20.8 +O-14294,61.1 +O-14295,64.9 +O-14296,55.0 +O-14297,31.6 +O-14298,21.4 +O-14299,46.8 +O-14300,21.1 +O-14301,22.6 +O-14302,16.5 +O-14303,17.7 +O-14304,54.6 +O-14305,40.9 +O-14306,22.8 +O-14307,43.7 +O-14308,22.7 +O-14309,38.2 +O-14310,43.6 +O-14311,38.4 +O-14312,29.3 +O-14313,51.6 +O-14314,33.6 +O-14315,49.1 +O-14316,16.3 +O-14317,46.8 +O-14318,24.1 +O-14319,44.8 +O-14320,41.9 +O-14321,38.0 +O-14322,33.4 +O-14323,30.3 +O-14324,60.9 +O-14325,37.4 +O-14326,24.1 +O-14327,24.7 +O-14328,20.0 +O-14329,14.7 +O-14330,33.8 +O-14331,30.6 +O-14332,26.4 +O-14333,13.2 +O-14334,40.0 +O-14335,88.8 +O-14336,44.5 +O-14337,33.1 +O-14338,25.8 +O-14339,18.7 +O-14340,31.4 +O-14341,25.2 +O-14342,17.0 +O-14343,42.6 +O-14344,36.5 +O-14345,23.3 +O-14346,55.5 +O-14347,29.8 +O-14348,34.2 +O-14349,11.2 +O-14350,52.7 +O-14351,23.2 +O-14352,23.8 +O-14353,29.3 +O-14354,25.3 +O-14355,24.2 +O-14356,66.0 +O-14357,41.7 +O-14358,37.9 +O-14359,34.6 +O-14360,21.6 +O-14361,31.7 +O-14362,45.6 +O-14363,58.2 +O-14364,24.0 +O-14365,31.5 +O-14366,30.2 +O-14367,41.7 +O-14368,20.3 +O-14369,26.2 +O-14370,21.6 +O-14371,22.2 +O-14372,25.4 +O-14373,49.9 +O-14374,43.0 +O-14375,34.6 +O-14376,56.0 +O-14377,56.5 +O-14378,27.9 +O-14379,13.0 +O-14380,27.4 +O-14381,67.1 +O-14382,38.3 +O-14383,35.5 +O-14384,34.1 +O-14385,29.5 +O-14386,35.8 +O-14387,17.3 +O-14388,39.4 +O-14389,46.2 +O-14390,23.8 +O-14391,52.6 +O-14392,64.9 +O-14393,29.1 +O-14394,72.9 +O-14395,39.9 +O-14396,20.7 +O-14397,38.7 +O-14398,72.5 +O-14399,40.2 +O-14400,16.0 +O-14401,41.8 +O-14402,30.1 +O-14403,54.6 +O-14404,54.9 +O-14405,25.4 +O-14406,33.7 +O-14407,38.6 +O-14408,39.8 +O-14409,9.8 +O-14410,43.0 +O-14411,18.6 +O-14412,15.4 +O-14413,19.1 +O-14414,25.6 +O-14415,22.5 +O-14416,61.0 +O-14417,23.3 +O-14418,35.2 +O-14419,57.3 +O-14420,42.4 +O-14421,46.9 +O-14422,24.0 +O-14423,34.2 +O-14424,32.7 +O-14425,27.9 +O-14426,13.9 +O-14427,53.9 +O-14428,20.8 +O-14429,16.0 +O-14430,17.7 +O-14431,17.6 +O-14432,10.5 +O-14433,24.0 +O-14434,29.4 +O-14435,54.6 +O-14436,21.8 +O-14437,64.8 +O-14438,35.5 +O-14439,31.2 +O-14440,34.8 +O-14441,21.4 +O-14442,9.9 +O-14443,11.8 +O-14444,27.7 +O-14445,42.0 +O-14446,86.7 +O-14447,49.5 +O-14448,36.0 +O-14449,18.8 +O-14450,26.4 +O-14451,16.5 +O-14452,13.8 +O-14453,11.5 +O-14454,36.1 +O-14455,28.0 +O-14456,18.3 +O-14457,26.0 +O-14458,24.4 +O-14459,15.2 +O-14460,21.0 +O-14461,38.8 +O-14462,70.2 +O-14463,32.2 +O-14464,29.8 +O-14465,51.5 +O-14466,93.7 +O-14467,41.0 +O-14468,41.6 +O-14469,41.5 +O-14470,46.0 +O-14471,25.2 +O-14472,38.9 +O-14473,34.9 +O-14474,34.9 +O-14475,15.0 +O-14476,49.9 +O-14477,30.5 +O-14478,32.4 +O-14479,54.0 +O-14480,33.4 +O-14481,58.5 +O-14482,19.7 +O-14483,58.8 +O-14484,47.4 +O-14485,32.7 +O-14486,60.2 +O-14487,36.5 +O-14488,47.4 +O-14489,22.1 +O-14490,25.3 +O-14491,28.7 +O-14492,27.0 +O-14493,36.7 +O-14494,51.4 +O-14495,30.3 +O-14496,38.4 +O-14497,66.1 +O-14498,15.7 +O-14499,24.1 +O-14500,30.0 +O-14501,34.4 +O-14502,18.0 +O-14503,51.1 +O-14504,25.5 +O-14505,36.3 +O-14506,33.9 +O-14507,26.3 +O-14508,23.2 +O-14509,58.3 +O-14510,22.1 +O-14511,66.5 +O-14512,26.7 +O-14513,54.0 +O-14514,16.7 +O-14515,32.0 +O-14516,32.7 +O-14517,41.5 +O-14518,17.2 +O-14519,28.7 +O-14520,30.4 +O-14521,23.2 +O-14522,31.1 +O-14523,24.3 +O-14524,20.1 +O-14525,23.2 +O-14526,44.3 +O-14527,36.8 +O-14528,24.5 +O-14529,17.3 +O-14530,32.5 +O-14531,34.1 +O-14532,22.5 +O-14533,53.2 +O-14534,38.3 +O-14535,39.9 +O-14536,20.7 +O-14537,32.8 +O-14538,60.3 +O-14539,31.3 +O-14540,31.6 +O-14541,41.5 +O-14542,22.9 +O-14543,71.6 +O-14544,39.0 +O-14545,35.1 +O-14546,42.6 +O-14547,31.2 +O-14548,33.0 +O-14549,30.0 +O-14550,25.3 +O-14551,72.3 +O-14552,26.8 +O-14553,35.8 +O-14554,54.5 +O-14555,26.9 +O-14556,85.4 +O-14557,32.5 +O-14558,46.4 +O-14559,32.1 +O-14560,14.2 +O-14561,45.4 +O-14562,63.1 +O-14563,22.3 +O-14564,36.2 +O-14565,29.1 +O-14566,54.6 +O-14567,21.1 +O-14568,58.5 +O-14569,41.3 +O-14570,19.4 +O-14571,22.6 +O-14572,18.3 +O-14573,43.5 +O-14574,33.0 +O-14575,35.6 +O-14576,37.6 +O-14577,47.2 +O-14578,19.4 +O-14579,41.1 +O-14580,46.7 +O-14581,73.3 +O-14582,26.8 +O-14583,20.6 +O-14584,35.3 +O-14585,35.6 +O-14586,54.6 +O-14587,59.1 +O-14588,36.4 +O-14589,57.6 +O-14590,30.1 +O-14591,31.6 +O-14592,37.6 +O-14593,19.4 +O-14594,18.7 +O-14595,46.3 +O-14596,19.4 +O-14597,30.7 +O-14598,25.9 +O-14599,24.9 +O-14600,19.9 +O-14601,42.0 +O-14602,21.2 +O-14603,33.5 +O-14604,33.3 +O-14605,76.6 +O-14606,40.6 +O-14607,28.6 +O-14608,19.2 +O-14609,46.1 +O-14610,92.2 +O-14611,48.2 +O-14612,36.1 +O-14613,35.7 +O-14614,28.4 +O-14615,35.5 +O-14616,47.5 +O-14617,36.8 +O-14618,23.9 +O-14619,22.4 +O-14620,19.5 +O-14621,21.4 +O-14622,43.1 +O-14623,45.1 +O-14624,22.0 +O-14625,41.5 +O-14626,27.5 +O-14627,33.6 +O-14628,55.8 +O-14629,39.4 +O-14630,26.0 +O-14631,83.8 +O-14632,35.0 +O-14633,34.4 +O-14634,38.6 +O-14635,26.1 +O-14636,24.1 +O-14637,32.9 +O-14638,17.6 +O-14639,38.6 +O-14640,40.9 +O-14641,38.6 +O-14642,22.9 +O-14643,23.2 +O-14644,21.4 +O-14645,30.0 +O-14646,62.0 +O-14647,21.5 +O-14648,75.8 +O-14649,22.0 +O-14650,51.0 +O-14651,19.4 +O-14652,29.9 +O-14653,64.6 +O-14654,41.9 +O-14655,34.9 +O-14656,36.6 +O-14657,15.5 +O-14658,32.6 +O-14659,25.9 +O-14660,68.7 +O-14661,15.3 +O-14662,38.1 +O-14663,27.7 +O-14664,28.2 +O-14665,31.2 +O-14666,32.5 +O-14667,32.6 +O-14668,24.3 +O-14669,50.3 +O-14670,24.9 +O-14671,27.8 +O-14672,39.3 +O-14673,19.3 +O-14674,57.3 +O-14675,48.1 +O-14676,42.2 +O-14677,41.9 +O-14678,18.9 +O-14679,45.1 +O-14680,23.8 +O-14681,56.6 +O-14682,46.3 +O-14683,13.8 +O-14684,30.8 +O-14685,38.7 +O-14686,48.5 +O-14687,30.3 +O-14688,17.0 +O-14689,29.8 +O-14690,15.1 +O-14691,28.7 +O-14692,22.8 +O-14693,32.9 +O-14694,29.1 +O-14695,25.3 +O-14696,30.7 +O-14697,18.4 +O-14698,17.2 +O-14699,26.5 +O-14700,28.2 +O-14701,9.9 +O-14702,59.9 +O-14703,21.1 +O-14704,20.5 +O-14705,28.0 +O-14706,28.5 +O-14707,16.0 +O-14708,23.7 +O-14709,25.5 +O-14710,42.6 +O-14711,62.6 +O-14712,45.9 +O-14713,24.1 +O-14714,55.2 +O-14715,14.9 +O-14716,17.5 +O-14717,27.0 +O-14718,33.4 +O-14719,35.6 +O-14720,23.3 +O-14721,66.9 +O-14722,20.4 +O-14723,35.9 +O-14724,24.5 +O-14725,13.5 +O-14726,35.2 +O-14727,45.3 +O-14728,42.7 +O-14729,50.6 +O-14730,35.3 +O-14731,23.1 +O-14732,30.5 +O-14733,20.9 +O-14734,29.7 +O-14735,27.9 +O-14736,42.6 +O-14737,26.2 +O-14738,20.4 +O-14739,48.4 +O-14740,26.3 +O-14741,41.6 +O-14742,26.0 +O-14743,14.7 +O-14744,42.4 +O-14745,72.6 +O-14746,59.3 +O-14747,40.1 +O-14748,27.0 +O-14749,13.7 +O-14750,26.1 +O-14751,19.3 +O-14752,46.4 +O-14753,26.0 +O-14754,42.5 +O-14755,43.3 +O-14756,69.1 +O-14757,56.9 +O-14758,17.3 +O-14759,43.9 +O-14760,37.5 +O-14761,24.6 +O-14762,34.0 +O-14763,35.4 +O-14764,77.9 +O-14765,21.3 +O-14766,27.6 +O-14767,29.3 +O-14768,57.9 +O-14769,42.8 +O-14770,61.9 +O-14771,47.2 +O-14772,22.6 +O-14773,41.5 +O-14774,17.3 +O-14775,19.1 +O-14776,38.8 +O-14777,20.1 +O-14778,38.9 +O-14779,36.3 +O-14780,30.4 +O-14781,17.0 +O-14782,28.9 +O-14783,33.4 +O-14784,66.2 +O-14785,25.8 +O-14786,18.1 +O-14787,38.5 +O-14788,37.0 +O-14789,66.4 +O-14790,37.6 +O-14791,25.9 +O-14792,31.6 +O-14793,45.9 +O-14794,12.3 +O-14795,85.6 +O-14796,59.0 +O-14797,22.2 +O-14798,22.3 +O-14799,38.5 +O-14800,28.2 +O-14801,61.7 +O-14802,28.0 +O-14803,50.3 +O-14804,38.8 +O-14805,21.3 +O-14806,29.6 +O-14807,23.5 +O-14808,30.8 +O-14809,24.6 +O-14810,87.6 +O-14811,17.8 +O-14812,57.3 +O-14813,47.2 +O-14814,24.8 +O-14815,66.4 +O-14816,49.4 +O-14817,63.8 +O-14818,16.5 +O-14819,31.2 +O-14820,27.6 +O-14821,18.3 +O-14822,19.7 +O-14823,43.5 +O-14824,22.4 +O-14825,20.7 +O-14826,24.1 +O-14827,19.3 +O-14828,29.8 +O-14829,35.4 +O-14830,38.9 +O-14831,32.7 +O-14832,22.7 +O-14833,35.9 +O-14834,43.2 +O-14835,23.9 +O-14836,43.0 +O-14837,35.5 +O-14838,45.1 +O-14839,29.3 +O-14840,62.0 +O-14841,38.6 +O-14842,77.5 +O-14843,57.4 +O-14844,30.0 +O-14845,35.0 +O-14846,40.9 +O-14847,58.9 +O-14848,17.1 +O-14849,37.2 +O-14850,56.6 +O-14851,38.9 +O-14852,82.2 +O-14853,37.4 +O-14854,29.0 +O-14855,40.3 +O-14856,88.4 +O-14857,45.1 +O-14858,22.2 +O-14859,20.5 +O-14860,23.8 +O-14861,94.9 +O-14862,25.0 +O-14863,25.9 +O-14864,37.5 +O-14865,36.5 +O-14866,21.3 +O-14867,40.5 +O-14868,40.9 +O-14869,55.5 +O-14870,44.0 +O-14871,50.3 +O-14872,15.5 +O-14873,32.2 +O-14874,76.2 +O-14875,33.3 +O-14876,24.7 +O-14877,41.6 +O-14878,18.1 +O-14879,45.6 +O-14880,55.5 +O-14881,31.5 +O-14882,72.5 +O-14883,29.3 +O-14884,52.8 +O-14885,15.9 +O-14886,14.5 +O-14887,46.2 +O-14888,19.1 +O-14889,63.9 +O-14890,24.1 +O-14891,34.7 +O-14892,37.2 +O-14893,26.0 +O-14894,26.9 +O-14895,25.4 +O-14896,36.2 +O-14897,35.2 +O-14898,30.6 +O-14899,11.1 +O-14900,29.5 +O-14901,42.2 +O-14902,70.2 +O-14903,10.3 +O-14904,49.1 +O-14905,27.3 +O-14906,23.8 +O-14907,29.8 +O-14908,33.2 +O-14909,39.1 +O-14910,15.1 +O-14911,61.6 +O-14912,41.4 +O-14913,17.6 +O-14914,44.0 +O-14915,60.7 +O-14916,16.7 +O-14917,18.0 +O-14918,38.2 +O-14919,53.1 +O-14920,53.8 +O-14921,15.7 +O-14922,33.0 +O-14923,70.2 +O-14924,23.5 +O-14925,39.0 +O-14926,27.5 +O-14927,17.4 +O-14928,45.8 +O-14929,18.3 +O-14930,34.3 +O-14931,23.1 +O-14932,35.6 +O-14933,47.0 +O-14934,33.3 +O-14935,32.4 +O-14936,51.9 +O-14937,52.6 +O-14938,38.6 +O-14939,12.6 +O-14940,21.2 +O-14941,27.2 +O-14942,28.8 +O-14943,62.8 +O-14944,18.4 +O-14945,28.5 +O-14946,41.4 +O-14947,57.0 +O-14948,16.9 +O-14949,35.8 +O-14950,37.4 +O-14951,33.8 +O-14952,55.3 +O-14953,41.5 +O-14954,29.5 +O-14955,49.1 +O-14956,46.7 +O-14957,43.9 +O-14958,23.8 +O-14959,32.8 +O-14960,31.5 +O-14961,26.6 +O-14962,16.6 +O-14963,38.0 +O-14964,36.9 +O-14965,37.4 +O-14966,36.9 +O-14967,32.8 +O-14968,30.6 +O-14969,37.8 +O-14970,17.3 +O-14971,17.7 +O-14972,25.4 +O-14973,37.3 +O-14974,44.8 +O-14975,45.0 +O-14976,34.9 +O-14977,29.8 +O-14978,11.7 +O-14979,37.2 +O-14980,59.0 +O-14981,12.8 +O-14982,25.8 +O-14983,25.9 +O-14984,20.2 +O-14985,35.8 +O-14986,30.1 +O-14987,40.7 +O-14988,29.3 +O-14989,55.0 +O-14990,55.0 +O-14991,24.4 +O-14992,37.6 +O-14993,60.7 +O-14994,31.2 +O-14995,56.7 +O-14996,26.5 +O-14997,23.6 +O-14998,38.9 +O-14999,45.5 +O-15000,17.1 diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-renamed/case.json b/agents/evals/fixtures/cases/histogram-basic-letsplot-renamed/case.json new file mode 100644 index 00000000000..a2908e68bc9 --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-renamed/case.json @@ -0,0 +1,20 @@ +{ + "spec_id": "histogram-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "values", + "column": "Lieferzeit / Minuten" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "renamed", + "synthetic", + "renamed-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, renamed)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-renamed/data.csv b/agents/evals/fixtures/cases/histogram-basic-letsplot-renamed/data.csv new file mode 100644 index 00000000000..0a8a710459b --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-renamed/data.csv @@ -0,0 +1,401 @@ +Bestellnummer,Lieferzeit / Minuten +O-10001,38.3 +O-10002,39.4 +O-10003,36.7 +O-10004,36.6 +O-10005,16.3 +O-10006,25.4 +O-10007,25.4 +O-10008,28.7 +O-10009,38.1 +O-10010,29.6 +O-10011,19.5 +O-10012,36.0 +O-10013,53.0 +O-10014,30.1 +O-10015,21.3 +O-10016,47.9 +O-10017,41.8 +O-10018,26.4 +O-10019,32.4 +O-10020,22.9 +O-10021,52.4 +O-10022,31.4 +O-10023,19.7 +O-10024,31.1 +O-10025,38.2 +O-10026,52.7 +O-10027,23.9 +O-10028,39.3 +O-10029,46.8 +O-10030,38.3 +O-10031,24.2 +O-10032,57.8 +O-10033,44.9 +O-10034,67.6 +O-10035,22.3 +O-10036,27.3 +O-10037,17.8 +O-10038,34.3 +O-10039,36.7 +O-10040,25.1 +O-10041,31.6 +O-10042,52.9 +O-10043,29.7 +O-10044,30.9 +O-10045,52.3 +O-10046,32.4 +O-10047,47.4 +O-10048,62.4 +O-10049,22.5 +O-10050,14.7 +O-10051,34.6 +O-10052,19.6 +O-10053,34.0 +O-10054,29.6 +O-10055,27.2 +O-10056,53.7 +O-10057,66.8 +O-10058,34.1 +O-10059,39.1 +O-10060,32.1 +O-10061,50.4 +O-10062,18.7 +O-10063,32.2 +O-10064,66.0 +O-10065,40.7 +O-10066,76.3 +O-10067,15.7 +O-10068,18.2 +O-10069,18.4 +O-10070,23.2 +O-10071,34.8 +O-10072,30.9 +O-10073,39.8 +O-10074,27.5 +O-10075,17.7 +O-10076,84.2 +O-10077,27.9 +O-10078,22.2 +O-10079,92.0 +O-10080,31.1 +O-10081,30.6 +O-10082,55.0 +O-10083,35.7 +O-10084,22.3 +O-10085,11.9 +O-10086,14.1 +O-10087,24.0 +O-10088,29.3 +O-10089,46.9 +O-10090,26.2 +O-10091,20.2 +O-10092,18.5 +O-10093,16.2 +O-10094,26.1 +O-10095,31.2 +O-10096,57.1 +O-10097,15.0 +O-10098,33.6 +O-10099,24.4 +O-10100,44.1 +O-10101,51.7 +O-10102,35.6 +O-10103,18.6 +O-10104,41.6 +O-10105,47.3 +O-10106,27.6 +O-10107,45.3 +O-10108,43.6 +O-10109,19.1 +O-10110,26.2 +O-10111,20.6 +O-10112,29.6 +O-10113,61.9 +O-10114,58.8 +O-10115,20.6 +O-10116,13.7 +O-10117,14.8 +O-10118,36.3 +O-10119,116.4 +O-10120,51.6 +O-10121,19.3 +O-10122,48.0 +O-10123,106.1 +O-10124,42.9 +O-10125,17.9 +O-10126,27.9 +O-10127,18.3 +O-10128,88.9 +O-10129,51.3 +O-10130,22.7 +O-10131,39.0 +O-10132,31.8 +O-10133,43.4 +O-10134,27.5 +O-10135,21.1 +O-10136,26.0 +O-10137,32.5 +O-10138,23.8 +O-10139,28.4 +O-10140,16.3 +O-10141,18.4 +O-10142,29.0 +O-10143,40.9 +O-10144,30.8 +O-10145,39.6 +O-10146,32.4 +O-10147,25.0 +O-10148,35.2 +O-10149,18.7 +O-10150,30.7 +O-10151,31.5 +O-10152,22.7 +O-10153,20.7 +O-10154,27.3 +O-10155,43.8 +O-10156,33.0 +O-10157,42.1 +O-10158,20.7 +O-10159,14.8 +O-10160,16.0 +O-10161,25.2 +O-10162,38.5 +O-10163,39.5 +O-10164,43.0 +O-10165,37.5 +O-10166,23.2 +O-10167,62.0 +O-10168,9.8 +O-10169,41.2 +O-10170,33.8 +O-10171,21.5 +O-10172,57.7 +O-10173,34.0 +O-10174,16.2 +O-10175,27.2 +O-10176,16.4 +O-10177,29.6 +O-10178,22.8 +O-10179,23.1 +O-10180,36.4 +O-10181,61.6 +O-10182,23.9 +O-10183,25.1 +O-10184,23.6 +O-10185,23.1 +O-10186,32.4 +O-10187,86.5 +O-10188,26.8 +O-10189,40.1 +O-10190,22.4 +O-10191,32.4 +O-10192,25.6 +O-10193,30.6 +O-10194,68.7 +O-10195,37.1 +O-10196,29.5 +O-10197,61.1 +O-10198,50.7 +O-10199,35.4 +O-10200,36.6 +O-10201,37.5 +O-10202,37.9 +O-10203,18.0 +O-10204,41.9 +O-10205,53.1 +O-10206,19.9 +O-10207,16.4 +O-10208,39.5 +O-10209,32.8 +O-10210,37.9 +O-10211,39.5 +O-10212,39.4 +O-10213,24.6 +O-10214,40.7 +O-10215,27.6 +O-10216,21.4 +O-10217,44.1 +O-10218,22.6 +O-10219,30.9 +O-10220,26.5 +O-10221,20.7 +O-10222,21.7 +O-10223,31.1 +O-10224,31.1 +O-10225,39.7 +O-10226,30.2 +O-10227,22.8 +O-10228,36.3 +O-10229,32.5 +O-10230,49.4 +O-10231,39.2 +O-10232,21.6 +O-10233,13.8 +O-10234,31.1 +O-10235,21.9 +O-10236,49.0 +O-10237,20.4 +O-10238,21.4 +O-10239,48.5 +O-10240,17.1 +O-10241,29.3 +O-10242,69.6 +O-10243,31.2 +O-10244,43.1 +O-10245,46.7 +O-10246,28.7 +O-10247,31.7 +O-10248,30.0 +O-10249,38.1 +O-10250,14.8 +O-10251,27.2 +O-10252,55.8 +O-10253,38.9 +O-10254,23.8 +O-10255,31.8 +O-10256,13.2 +O-10257,72.2 +O-10258,36.3 +O-10259,15.7 +O-10260,26.3 +O-10261,24.5 +O-10262,67.5 +O-10263,20.5 +O-10264,23.4 +O-10265,62.8 +O-10266,34.5 +O-10267,25.2 +O-10268,21.3 +O-10269,49.0 +O-10270,48.8 +O-10271,50.0 +O-10272,23.1 +O-10273,62.7 +O-10274,85.7 +O-10275,29.5 +O-10276,14.9 +O-10277,39.7 +O-10278,48.3 +O-10279,26.7 +O-10280,26.6 +O-10281,52.4 +O-10282,40.5 +O-10283,14.9 +O-10284,42.9 +O-10285,26.4 +O-10286,10.6 +O-10287,21.9 +O-10288,40.1 +O-10289,57.9 +O-10290,42.6 +O-10291,43.6 +O-10292,41.3 +O-10293,66.9 +O-10294,18.6 +O-10295,40.7 +O-10296,88.6 +O-10297,39.5 +O-10298,15.6 +O-10299,17.3 +O-10300,27.3 +O-10301,56.9 +O-10302,38.8 +O-10303,19.9 +O-10304,26.8 +O-10305,25.9 +O-10306,32.8 +O-10307,46.9 +O-10308,16.6 +O-10309,26.9 +O-10310,40.7 +O-10311,40.1 +O-10312,42.5 +O-10313,67.6 +O-10314,15.9 +O-10315,26.1 +O-10316,24.4 +O-10317,16.6 +O-10318,23.2 +O-10319,15.1 +O-10320,15.3 +O-10321,29.7 +O-10322,38.9 +O-10323,26.6 +O-10324,36.1 +O-10325,21.0 +O-10326,25.5 +O-10327,42.8 +O-10328,37.0 +O-10329,40.5 +O-10330,17.7 +O-10331,31.3 +O-10332,56.8 +O-10333,73.4 +O-10334,19.2 +O-10335,17.4 +O-10336,24.3 +O-10337,30.6 +O-10338,37.8 +O-10339,16.0 +O-10340,44.5 +O-10341,12.7 +O-10342,10.7 +O-10343,52.5 +O-10344,14.2 +O-10345,21.0 +O-10346,28.3 +O-10347,21.6 +O-10348,23.8 +O-10349,44.5 +O-10350,40.3 +O-10351,40.1 +O-10352,39.4 +O-10353,29.2 +O-10354,30.6 +O-10355,38.7 +O-10356,23.7 +O-10357,75.8 +O-10358,43.2 +O-10359,44.5 +O-10360,44.3 +O-10361,37.8 +O-10362,38.7 +O-10363,44.0 +O-10364,18.1 +O-10365,55.9 +O-10366,22.3 +O-10367,16.8 +O-10368,33.6 +O-10369,39.3 +O-10370,31.9 +O-10371,53.9 +O-10372,26.0 +O-10373,49.6 +O-10374,23.6 +O-10375,52.4 +O-10376,20.0 +O-10377,40.3 +O-10378,21.0 +O-10379,15.1 +O-10380,17.3 +O-10381,45.4 +O-10382,62.7 +O-10383,60.9 +O-10384,27.5 +O-10385,29.3 +O-10386,29.9 +O-10387,24.6 +O-10388,13.3 +O-10389,34.8 +O-10390,23.5 +O-10391,18.0 +O-10392,22.6 +O-10393,45.3 +O-10394,99.4 +O-10395,44.2 +O-10396,43.3 +O-10397,38.5 +O-10398,18.6 +O-10399,45.8 +O-10400,36.7 diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-x10/case.json b/agents/evals/fixtures/cases/histogram-basic-letsplot-x10/case.json new file mode 100644 index 00000000000..de72d3b81bc --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-x10/case.json @@ -0,0 +1,20 @@ +{ + "spec_id": "histogram-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "values", + "column": "Delivery Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, x10)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-letsplot-x10/data.csv b/agents/evals/fixtures/cases/histogram-basic-letsplot-x10/data.csv new file mode 100644 index 00000000000..733d61def1d --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-letsplot-x10/data.csv @@ -0,0 +1,401 @@ +Order ID,Delivery Time (min) +O-10001,383.1 +O-10002,393.6 +O-10003,366.8 +O-10004,366.3 +O-10005,163.0 +O-10006,253.5 +O-10007,253.9 +O-10008,286.6 +O-10009,381.0 +O-10010,296.2 +O-10011,195.2 +O-10012,360.2 +O-10013,530.2 +O-10014,300.6 +O-10015,212.6 +O-10016,479.4 +O-10017,418.4 +O-10018,264.2 +O-10019,324.4 +O-10020,228.7 +O-10021,524.3 +O-10022,314.3 +O-10023,197.5 +O-10024,310.6 +O-10025,381.5 +O-10026,526.9 +O-10027,239.1 +O-10028,392.9 +O-10029,468.4 +O-10030,383.1 +O-10031,242.2 +O-10032,577.5 +O-10033,449.1 +O-10034,676.5 +O-10035,223.0 +O-10036,273.5 +O-10037,177.9 +O-10038,342.6 +O-10039,366.8 +O-10040,251.2 +O-10041,316.5 +O-10042,529.3 +O-10043,296.5 +O-10044,309.4 +O-10045,523.2 +O-10046,324.4 +O-10047,474.3 +O-10048,624.4 +O-10049,225.0 +O-10050,146.7 +O-10051,346.2 +O-10052,196.3 +O-10053,339.6 +O-10054,296.1 +O-10055,272.2 +O-10056,537.0 +O-10057,668.0 +O-10058,341.3 +O-10059,391.4 +O-10060,321.0 +O-10061,503.9 +O-10062,186.8 +O-10063,322.0 +O-10064,659.6 +O-10065,406.9 +O-10066,762.6 +O-10067,157.1 +O-10068,182.2 +O-10069,183.7 +O-10070,232.3 +O-10071,348.1 +O-10072,309.1 +O-10073,397.6 +O-10074,275.3 +O-10075,176.5 +O-10076,842.4 +O-10077,279.0 +O-10078,222.2 +O-10079,920.2 +O-10080,310.8 +O-10081,305.7 +O-10082,550.3 +O-10083,356.7 +O-10084,222.8 +O-10085,119.4 +O-10086,140.6 +O-10087,240.3 +O-10088,293.0 +O-10089,468.6 +O-10090,262.3 +O-10091,202.4 +O-10092,184.9 +O-10093,162.5 +O-10094,261.1 +O-10095,311.7 +O-10096,570.6 +O-10097,150.1 +O-10098,336.4 +O-10099,243.5 +O-10100,441.0 +O-10101,516.9 +O-10102,355.9 +O-10103,186.0 +O-10104,416.2 +O-10105,473.4 +O-10106,276.3 +O-10107,452.6 +O-10108,435.9 +O-10109,190.6 +O-10110,262.2 +O-10111,206.4 +O-10112,296.5 +O-10113,618.8 +O-10114,588.3 +O-10115,206.1 +O-10116,137.1 +O-10117,148.4 +O-10118,362.9 +O-10119,1164.0 +O-10120,516.3 +O-10121,192.8 +O-10122,480.3 +O-10123,1060.6 +O-10124,429.0 +O-10125,179.1 +O-10126,279.2 +O-10127,183.2 +O-10128,889.5 +O-10129,512.6 +O-10130,227.0 +O-10131,390.2 +O-10132,317.8 +O-10133,434.1 +O-10134,274.6 +O-10135,211.2 +O-10136,260.2 +O-10137,325.4 +O-10138,238.2 +O-10139,283.6 +O-10140,162.5 +O-10141,183.8 +O-10142,290.4 +O-10143,409.1 +O-10144,308.0 +O-10145,395.7 +O-10146,324.1 +O-10147,249.6 +O-10148,352.2 +O-10149,187.4 +O-10150,306.5 +O-10151,314.9 +O-10152,227.1 +O-10153,206.5 +O-10154,273.4 +O-10155,437.9 +O-10156,329.5 +O-10157,421.2 +O-10158,207.1 +O-10159,147.5 +O-10160,160.0 +O-10161,251.9 +O-10162,384.8 +O-10163,394.8 +O-10164,430.4 +O-10165,374.6 +O-10166,231.7 +O-10167,620.5 +O-10168,98.4 +O-10169,412.2 +O-10170,337.6 +O-10171,215.4 +O-10172,576.6 +O-10173,340.3 +O-10174,162.2 +O-10175,272.2 +O-10176,163.5 +O-10177,296.3 +O-10178,227.8 +O-10179,230.9 +O-10180,364.1 +O-10181,615.6 +O-10182,238.6 +O-10183,250.7 +O-10184,236.4 +O-10185,230.9 +O-10186,324.4 +O-10187,865.4 +O-10188,267.5 +O-10189,400.8 +O-10190,223.9 +O-10191,323.9 +O-10192,255.7 +O-10193,305.5 +O-10194,687.4 +O-10195,370.7 +O-10196,295.3 +O-10197,610.7 +O-10198,507.2 +O-10199,353.8 +O-10200,365.6 +O-10201,375.0 +O-10202,378.7 +O-10203,180.4 +O-10204,419.2 +O-10205,531.1 +O-10206,198.6 +O-10207,164.4 +O-10208,395.4 +O-10209,327.8 +O-10210,379.5 +O-10211,394.6 +O-10212,393.9 +O-10213,245.6 +O-10214,407.4 +O-10215,275.9 +O-10216,214.2 +O-10217,440.5 +O-10218,225.9 +O-10219,308.9 +O-10220,265.1 +O-10221,206.8 +O-10222,217.0 +O-10223,311.4 +O-10224,311.2 +O-10225,397.0 +O-10226,301.7 +O-10227,227.6 +O-10228,362.7 +O-10229,324.5 +O-10230,493.8 +O-10231,391.5 +O-10232,215.6 +O-10233,138.4 +O-10234,311.2 +O-10235,219.3 +O-10236,490.1 +O-10237,204.4 +O-10238,214.4 +O-10239,484.9 +O-10240,170.9 +O-10241,292.7 +O-10242,695.8 +O-10243,312.5 +O-10244,430.6 +O-10245,467.1 +O-10246,286.8 +O-10247,317.3 +O-10248,299.8 +O-10249,380.7 +O-10250,147.6 +O-10251,272.3 +O-10252,558.1 +O-10253,389.1 +O-10254,238.0 +O-10255,318.4 +O-10256,131.7 +O-10257,721.7 +O-10258,363.0 +O-10259,157.0 +O-10260,262.8 +O-10261,244.9 +O-10262,675.3 +O-10263,204.8 +O-10264,233.6 +O-10265,628.2 +O-10266,345.1 +O-10267,252.3 +O-10268,213.3 +O-10269,490.2 +O-10270,488.2 +O-10271,499.9 +O-10272,230.8 +O-10273,627.0 +O-10274,856.6 +O-10275,295.3 +O-10276,149.1 +O-10277,397.5 +O-10278,482.9 +O-10279,267.1 +O-10280,266.3 +O-10281,523.8 +O-10282,405.4 +O-10283,149.2 +O-10284,429.4 +O-10285,263.9 +O-10286,106.3 +O-10287,219.1 +O-10288,401.3 +O-10289,578.6 +O-10290,425.8 +O-10291,436.4 +O-10292,413.3 +O-10293,669.3 +O-10294,185.5 +O-10295,407.2 +O-10296,886.2 +O-10297,394.8 +O-10298,155.9 +O-10299,172.7 +O-10300,273.1 +O-10301,569.0 +O-10302,388.2 +O-10303,198.9 +O-10304,268.0 +O-10305,259.1 +O-10306,327.9 +O-10307,469.4 +O-10308,166.0 +O-10309,268.9 +O-10310,407.2 +O-10311,400.9 +O-10312,425.5 +O-10313,675.5 +O-10314,159.2 +O-10315,261.2 +O-10316,244.2 +O-10317,165.5 +O-10318,232.5 +O-10319,150.9 +O-10320,153.5 +O-10321,296.8 +O-10322,389.3 +O-10323,266.5 +O-10324,361.5 +O-10325,210.2 +O-10326,254.7 +O-10327,427.7 +O-10328,370.0 +O-10329,405.3 +O-10330,176.7 +O-10331,312.5 +O-10332,568.2 +O-10333,734.2 +O-10334,191.7 +O-10335,174.1 +O-10336,243.2 +O-10337,306.4 +O-10338,378.2 +O-10339,160.4 +O-10340,444.9 +O-10341,127.2 +O-10342,107.4 +O-10343,524.9 +O-10344,141.7 +O-10345,210.4 +O-10346,282.5 +O-10347,216.0 +O-10348,237.6 +O-10349,445.4 +O-10350,402.9 +O-10351,400.9 +O-10352,394.1 +O-10353,292.5 +O-10354,306.5 +O-10355,387.3 +O-10356,236.9 +O-10357,757.9 +O-10358,431.8 +O-10359,445.1 +O-10360,443.2 +O-10361,378.3 +O-10362,387.3 +O-10363,439.7 +O-10364,181.3 +O-10365,559.1 +O-10366,222.9 +O-10367,167.6 +O-10368,336.2 +O-10369,392.9 +O-10370,318.6 +O-10371,538.6 +O-10372,260.2 +O-10373,495.9 +O-10374,236.0 +O-10375,524.1 +O-10376,200.3 +O-10377,403.0 +O-10378,210.2 +O-10379,151.2 +O-10380,172.6 +O-10381,454.4 +O-10382,627.4 +O-10383,608.8 +O-10384,275.3 +O-10385,293.3 +O-10386,299.0 +O-10387,246.3 +O-10388,133.2 +O-10389,347.9 +O-10390,235.3 +O-10391,179.7 +O-10392,225.9 +O-10393,452.7 +O-10394,994.0 +O-10395,442.2 +O-10396,432.7 +O-10397,384.7 +O-10398,186.2 +O-10399,457.6 +O-10400,367.4 diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-date/case.json b/agents/evals/fixtures/cases/histogram-basic-pygal-date/case.json new file mode 100644 index 00000000000..fc7ef8d0cb5 --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-date/case.json @@ -0,0 +1,22 @@ +{ + "spec_id": "histogram-basic", + "library": "pygal", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "values", + "column": "Delivery Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, date)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-date/data.csv b/agents/evals/fixtures/cases/histogram-basic-pygal-date/data.csv new file mode 100644 index 00000000000..c4a83ef4428 --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-date/data.csv @@ -0,0 +1,401 @@ +Order ID,Delivery Time (min),Order Date,Delivered On +O-10001,38.3,03.05.2026,2026-05-06 +O-10002,39.4,18.01.2026,2026-01-22 +O-10003,36.7,09.04.2026,2026-04-11 +O-10004,36.6,03.06.2026,2026-06-03 +O-10005,16.3,24.01.2026,2026-01-24 +O-10006,25.4,21.05.2026,2026-05-22 +O-10007,25.4,29.03.2026,2026-03-29 +O-10008,28.7,28.02.2026,2026-03-03 +O-10009,38.1,17.01.2026,2026-01-18 +O-10010,29.6,24.02.2026,2026-02-26 +O-10011,19.5,24.04.2026,2026-04-28 +O-10012,36.0,12.01.2026,2026-01-12 +O-10013,53.0,25.02.2026,2026-02-27 +O-10014,30.1,14.03.2026,2026-03-17 +O-10015,21.3,10.06.2026,2026-06-11 +O-10016,47.9,29.03.2026,2026-04-01 +O-10017,41.8,10.06.2026,2026-06-13 +O-10018,26.4,01.07.2026,2026-07-05 +O-10019,32.4,18.02.2026,2026-02-18 +O-10020,22.9,10.02.2026,2026-02-14 +O-10021,52.4,17.05.2026,2026-05-17 +O-10022,31.4,09.04.2026,2026-04-09 +O-10023,19.7,09.03.2026,2026-03-12 +O-10024,31.1,26.05.2026,2026-05-26 +O-10025,38.2,19.01.2026,2026-01-19 +O-10026,52.7,06.04.2026,2026-04-06 +O-10027,23.9,01.04.2026,2026-04-02 +O-10028,39.3,26.03.2026,2026-03-27 +O-10029,46.8,09.03.2026,2026-03-12 +O-10030,38.3,14.06.2026,2026-06-14 +O-10031,24.2,25.03.2026,2026-03-28 +O-10032,57.8,08.04.2026,2026-04-09 +O-10033,44.9,19.05.2026,2026-05-22 +O-10034,67.6,22.02.2026,2026-02-26 +O-10035,22.3,16.04.2026,2026-04-18 +O-10036,27.3,21.03.2026,2026-03-22 +O-10037,17.8,01.03.2026,2026-03-02 +O-10038,34.3,01.03.2026,2026-03-05 +O-10039,36.7,13.06.2026,2026-06-16 +O-10040,25.1,26.02.2026,2026-02-26 +O-10041,31.6,13.05.2026,2026-05-14 +O-10042,52.9,24.04.2026,2026-04-24 +O-10043,29.7,29.04.2026,2026-05-02 +O-10044,30.9,28.03.2026,2026-03-30 +O-10045,52.3,16.03.2026,2026-03-20 +O-10046,32.4,16.05.2026,2026-05-20 +O-10047,47.4,02.04.2026,2026-04-03 +O-10048,62.4,08.06.2026,2026-06-11 +O-10049,22.5,15.02.2026,2026-02-19 +O-10050,14.7,18.04.2026,2026-04-22 +O-10051,34.6,13.02.2026,2026-02-16 +O-10052,19.6,27.02.2026,2026-02-28 +O-10053,34.0,13.06.2026,2026-06-13 +O-10054,29.6,15.04.2026,2026-04-15 +O-10055,27.2,10.02.2026,2026-02-12 +O-10056,53.7,27.02.2026,2026-02-28 +O-10057,66.8,01.04.2026,2026-04-03 +O-10058,34.1,13.05.2026,2026-05-14 +O-10059,39.1,26.06.2026,2026-06-28 +O-10060,32.1,09.04.2026,2026-04-11 +O-10061,50.4,03.02.2026,2026-02-07 +O-10062,18.7,04.03.2026,2026-03-05 +O-10063,32.2,10.04.2026,2026-04-14 +O-10064,66.0,07.05.2026,2026-05-09 +O-10065,40.7,07.04.2026,2026-04-10 +O-10066,76.3,27.02.2026,2026-03-01 +O-10067,15.7,26.02.2026,2026-03-01 +O-10068,18.2,10.02.2026,2026-02-10 +O-10069,18.4,18.01.2026,2026-01-19 +O-10070,23.2,08.05.2026,2026-05-08 +O-10071,34.8,12.01.2026,2026-01-15 +O-10072,30.9,15.03.2026,2026-03-15 +O-10073,39.8,06.06.2026,2026-06-08 +O-10074,27.5,04.06.2026,2026-06-04 +O-10075,17.7,26.03.2026,2026-03-30 +O-10076,84.2,21.01.2026,2026-01-21 +O-10077,27.9,05.01.2026,2026-01-08 +O-10078,22.2,16.01.2026,2026-01-17 +O-10079,92.0,05.03.2026,2026-03-08 +O-10080,31.1,06.05.2026,2026-05-06 +O-10081,30.6,13.03.2026,2026-03-15 +O-10082,55.0,01.05.2026,2026-05-02 +O-10083,35.7,04.04.2026,2026-04-04 +O-10084,22.3,21.05.2026,2026-05-22 +O-10085,11.9,29.05.2026,2026-05-30 +O-10086,14.1,12.04.2026,2026-04-15 +O-10087,24.0,06.01.2026,2026-01-10 +O-10088,29.3,13.03.2026,2026-03-17 +O-10089,46.9,20.02.2026,2026-02-23 +O-10090,26.2,29.05.2026,2026-06-01 +O-10091,20.2,18.01.2026,2026-01-18 +O-10092,18.5,07.06.2026,2026-06-09 +O-10093,16.2,28.03.2026,2026-04-01 +O-10094,26.1,12.02.2026,2026-02-15 +O-10095,31.2,22.05.2026,2026-05-22 +O-10096,57.1,11.01.2026,2026-01-11 +O-10097,15.0,17.02.2026,2026-02-20 +O-10098,33.6,21.01.2026,2026-01-21 +O-10099,24.4,24.02.2026,2026-02-27 +O-10100,44.1,24.03.2026,2026-03-26 +O-10101,51.7,18.06.2026,2026-06-18 +O-10102,35.6,26.03.2026,2026-03-29 +O-10103,18.6,08.03.2026,2026-03-08 +O-10104,41.6,22.03.2026,2026-03-22 +O-10105,47.3,05.04.2026,2026-04-08 +O-10106,27.6,10.01.2026,2026-01-12 +O-10107,45.3,28.01.2026,2026-01-28 +O-10108,43.6,26.04.2026,2026-04-26 +O-10109,19.1,20.05.2026,2026-05-24 +O-10110,26.2,12.06.2026,2026-06-16 +O-10111,20.6,22.05.2026,2026-05-26 +O-10112,29.6,29.05.2026,2026-05-31 +O-10113,61.9,22.02.2026,2026-02-22 +O-10114,58.8,11.04.2026,2026-04-12 +O-10115,20.6,11.04.2026,2026-04-14 +O-10116,13.7,25.06.2026,2026-06-25 +O-10117,14.8,24.03.2026,2026-03-27 +O-10118,36.3,18.06.2026,2026-06-22 +O-10119,116.4,14.02.2026,2026-02-18 +O-10120,51.6,12.04.2026,2026-04-12 +O-10121,19.3,21.02.2026,2026-02-23 +O-10122,48.0,15.04.2026,2026-04-17 +O-10123,106.1,12.04.2026,2026-04-12 +O-10124,42.9,26.03.2026,2026-03-28 +O-10125,17.9,09.06.2026,2026-06-13 +O-10126,27.9,28.06.2026,2026-06-30 +O-10127,18.3,19.02.2026,2026-02-23 +O-10128,88.9,21.05.2026,2026-05-25 +O-10129,51.3,09.01.2026,2026-01-09 +O-10130,22.7,24.06.2026,2026-06-28 +O-10131,39.0,11.03.2026,2026-03-11 +O-10132,31.8,30.01.2026,2026-02-03 +O-10133,43.4,01.05.2026,2026-05-04 +O-10134,27.5,14.02.2026,2026-02-15 +O-10135,21.1,10.04.2026,2026-04-10 +O-10136,26.0,02.03.2026,2026-03-05 +O-10137,32.5,12.02.2026,2026-02-13 +O-10138,23.8,13.06.2026,2026-06-14 +O-10139,28.4,21.02.2026,2026-02-21 +O-10140,16.3,10.02.2026,2026-02-10 +O-10141,18.4,25.02.2026,2026-03-01 +O-10142,29.0,24.01.2026,2026-01-28 +O-10143,40.9,07.02.2026,2026-02-10 +O-10144,30.8,05.01.2026,2026-01-08 +O-10145,39.6,14.05.2026,2026-05-17 +O-10146,32.4,27.02.2026,2026-03-03 +O-10147,25.0,23.06.2026,2026-06-25 +O-10148,35.2,20.06.2026,2026-06-21 +O-10149,18.7,01.06.2026,2026-06-03 +O-10150,30.7,19.04.2026,2026-04-23 +O-10151,31.5,01.02.2026,2026-02-01 +O-10152,22.7,06.01.2026,2026-01-06 +O-10153,20.7,17.06.2026,2026-06-17 +O-10154,27.3,18.02.2026,2026-02-18 +O-10155,43.8,25.02.2026,2026-02-25 +O-10156,33.0,26.04.2026,2026-04-28 +O-10157,42.1,03.04.2026,2026-04-07 +O-10158,20.7,15.04.2026,2026-04-15 +O-10159,14.8,19.04.2026,2026-04-20 +O-10160,16.0,16.05.2026,2026-05-18 +O-10161,25.2,06.01.2026,2026-01-06 +O-10162,38.5,04.02.2026,2026-02-05 +O-10163,39.5,03.04.2026,2026-04-06 +O-10164,43.0,01.07.2026,2026-07-02 +O-10165,37.5,28.05.2026,2026-05-30 +O-10166,23.2,01.04.2026,2026-04-05 +O-10167,62.0,18.06.2026,2026-06-19 +O-10168,9.8,08.06.2026,2026-06-08 +O-10169,41.2,08.01.2026,2026-01-08 +O-10170,33.8,18.02.2026,2026-02-22 +O-10171,21.5,19.03.2026,2026-03-23 +O-10172,57.7,20.02.2026,2026-02-22 +O-10173,34.0,01.07.2026,2026-07-01 +O-10174,16.2,11.03.2026,2026-03-15 +O-10175,27.2,19.05.2026,2026-05-21 +O-10176,16.4,15.02.2026,2026-02-17 +O-10177,29.6,18.04.2026,2026-04-20 +O-10178,22.8,09.06.2026,2026-06-13 +O-10179,23.1,25.01.2026,2026-01-29 +O-10180,36.4,03.04.2026,2026-04-03 +O-10181,61.6,12.06.2026,2026-06-16 +O-10182,23.9,25.06.2026,2026-06-26 +O-10183,25.1,24.02.2026,2026-02-26 +O-10184,23.6,30.03.2026,2026-04-02 +O-10185,23.1,01.05.2026,2026-05-01 +O-10186,32.4,08.01.2026,2026-01-12 +O-10187,86.5,08.04.2026,2026-04-12 +O-10188,26.8,24.05.2026,2026-05-26 +O-10189,40.1,28.06.2026,2026-07-01 +O-10190,22.4,22.06.2026,2026-06-23 +O-10191,32.4,25.03.2026,2026-03-28 +O-10192,25.6,26.02.2026,2026-02-27 +O-10193,30.6,22.06.2026,2026-06-23 +O-10194,68.7,13.05.2026,2026-05-16 +O-10195,37.1,06.02.2026,2026-02-06 +O-10196,29.5,16.03.2026,2026-03-19 +O-10197,61.1,05.06.2026,2026-06-06 +O-10198,50.7,02.07.2026,2026-07-02 +O-10199,35.4,03.06.2026,2026-06-07 +O-10200,36.6,19.06.2026,2026-06-21 +O-10201,37.5,03.04.2026,2026-04-07 +O-10202,37.9,14.01.2026,2026-01-16 +O-10203,18.0,22.05.2026,2026-05-26 +O-10204,41.9,08.02.2026,2026-02-08 +O-10205,53.1,09.06.2026,2026-06-13 +O-10206,19.9,19.02.2026,2026-02-19 +O-10207,16.4,10.02.2026,2026-02-13 +O-10208,39.5,27.06.2026,2026-06-30 +O-10209,32.8,20.04.2026,2026-04-20 +O-10210,37.9,07.01.2026,2026-01-10 +O-10211,39.5,19.06.2026,2026-06-22 +O-10212,39.4,11.03.2026,2026-03-13 +O-10213,24.6,05.04.2026,2026-04-06 +O-10214,40.7,28.03.2026,2026-04-01 +O-10215,27.6,29.04.2026,2026-05-01 +O-10216,21.4,04.06.2026,2026-06-06 +O-10217,44.1,20.02.2026,2026-02-20 +O-10218,22.6,19.05.2026,2026-05-22 +O-10219,30.9,22.01.2026,2026-01-22 +O-10220,26.5,12.06.2026,2026-06-12 +O-10221,20.7,04.02.2026,2026-02-06 +O-10222,21.7,03.02.2026,2026-02-03 +O-10223,31.1,16.01.2026,2026-01-19 +O-10224,31.1,17.05.2026,2026-05-20 +O-10225,39.7,12.05.2026,2026-05-16 +O-10226,30.2,16.03.2026,2026-03-17 +O-10227,22.8,18.06.2026,2026-06-22 +O-10228,36.3,15.01.2026,2026-01-15 +O-10229,32.5,30.05.2026,2026-06-03 +O-10230,49.4,21.02.2026,2026-02-23 +O-10231,39.2,10.01.2026,2026-01-12 +O-10232,21.6,01.06.2026,2026-06-01 +O-10233,13.8,22.01.2026,2026-01-24 +O-10234,31.1,16.02.2026,2026-02-19 +O-10235,21.9,30.05.2026,2026-05-30 +O-10236,49.0,07.04.2026,2026-04-10 +O-10237,20.4,29.03.2026,2026-04-01 +O-10238,21.4,04.02.2026,2026-02-04 +O-10239,48.5,19.06.2026,2026-06-23 +O-10240,17.1,10.06.2026,2026-06-11 +O-10241,29.3,02.02.2026,2026-02-03 +O-10242,69.6,14.02.2026,2026-02-14 +O-10243,31.2,05.05.2026,2026-05-09 +O-10244,43.1,04.04.2026,2026-04-04 +O-10245,46.7,08.05.2026,2026-05-09 +O-10246,28.7,08.04.2026,2026-04-10 +O-10247,31.7,07.02.2026,2026-02-11 +O-10248,30.0,02.02.2026,2026-02-04 +O-10249,38.1,15.04.2026,2026-04-19 +O-10250,14.8,25.01.2026,2026-01-26 +O-10251,27.2,13.04.2026,2026-04-14 +O-10252,55.8,28.02.2026,2026-03-01 +O-10253,38.9,15.03.2026,2026-03-17 +O-10254,23.8,03.06.2026,2026-06-07 +O-10255,31.8,04.05.2026,2026-05-05 +O-10256,13.2,24.02.2026,2026-02-26 +O-10257,72.2,04.05.2026,2026-05-04 +O-10258,36.3,20.04.2026,2026-04-23 +O-10259,15.7,30.03.2026,2026-03-30 +O-10260,26.3,16.04.2026,2026-04-18 +O-10261,24.5,30.05.2026,2026-06-01 +O-10262,67.5,30.04.2026,2026-05-02 +O-10263,20.5,25.06.2026,2026-06-28 +O-10264,23.4,23.01.2026,2026-01-24 +O-10265,62.8,06.05.2026,2026-05-10 +O-10266,34.5,22.02.2026,2026-02-23 +O-10267,25.2,05.03.2026,2026-03-08 +O-10268,21.3,22.01.2026,2026-01-24 +O-10269,49.0,10.02.2026,2026-02-13 +O-10270,48.8,10.03.2026,2026-03-13 +O-10271,50.0,23.01.2026,2026-01-25 +O-10272,23.1,15.03.2026,2026-03-18 +O-10273,62.7,24.04.2026,2026-04-24 +O-10274,85.7,02.02.2026,2026-02-02 +O-10275,29.5,20.04.2026,2026-04-22 +O-10276,14.9,02.05.2026,2026-05-05 +O-10277,39.7,22.05.2026,2026-05-25 +O-10278,48.3,01.07.2026,2026-07-05 +O-10279,26.7,22.02.2026,2026-02-26 +O-10280,26.6,23.05.2026,2026-05-23 +O-10281,52.4,06.02.2026,2026-02-07 +O-10282,40.5,12.06.2026,2026-06-15 +O-10283,14.9,05.06.2026,2026-06-09 +O-10284,42.9,14.01.2026,2026-01-18 +O-10285,26.4,09.04.2026,2026-04-12 +O-10286,10.6,04.05.2026,2026-05-08 +O-10287,21.9,26.06.2026,2026-06-28 +O-10288,40.1,21.02.2026,2026-02-22 +O-10289,57.9,18.01.2026,2026-01-20 +O-10290,42.6,17.04.2026,2026-04-21 +O-10291,43.6,31.01.2026,2026-02-03 +O-10292,41.3,28.02.2026,2026-03-04 +O-10293,66.9,21.03.2026,2026-03-24 +O-10294,18.6,23.04.2026,2026-04-24 +O-10295,40.7,01.05.2026,2026-05-05 +O-10296,88.6,04.05.2026,2026-05-04 +O-10297,39.5,22.02.2026,2026-02-26 +O-10298,15.6,30.01.2026,2026-01-30 +O-10299,17.3,18.02.2026,2026-02-19 +O-10300,27.3,14.06.2026,2026-06-17 +O-10301,56.9,02.04.2026,2026-04-05 +O-10302,38.8,16.03.2026,2026-03-19 +O-10303,19.9,22.06.2026,2026-06-23 +O-10304,26.8,26.06.2026,2026-06-30 +O-10305,25.9,10.04.2026,2026-04-12 +O-10306,32.8,07.03.2026,2026-03-08 +O-10307,46.9,08.06.2026,2026-06-08 +O-10308,16.6,10.02.2026,2026-02-10 +O-10309,26.9,01.06.2026,2026-06-04 +O-10310,40.7,10.01.2026,2026-01-12 +O-10311,40.1,22.05.2026,2026-05-25 +O-10312,42.5,19.06.2026,2026-06-21 +O-10313,67.6,02.05.2026,2026-05-05 +O-10314,15.9,09.04.2026,2026-04-13 +O-10315,26.1,12.03.2026,2026-03-13 +O-10316,24.4,12.03.2026,2026-03-15 +O-10317,16.6,18.06.2026,2026-06-22 +O-10318,23.2,09.04.2026,2026-04-11 +O-10319,15.1,28.06.2026,2026-06-28 +O-10320,15.3,29.06.2026,2026-06-30 +O-10321,29.7,13.03.2026,2026-03-14 +O-10322,38.9,22.05.2026,2026-05-23 +O-10323,26.6,04.02.2026,2026-02-06 +O-10324,36.1,08.06.2026,2026-06-12 +O-10325,21.0,09.06.2026,2026-06-11 +O-10326,25.5,15.05.2026,2026-05-15 +O-10327,42.8,17.01.2026,2026-01-20 +O-10328,37.0,04.03.2026,2026-03-07 +O-10329,40.5,30.01.2026,2026-01-31 +O-10330,17.7,09.05.2026,2026-05-13 +O-10331,31.3,18.05.2026,2026-05-22 +O-10332,56.8,15.06.2026,2026-06-16 +O-10333,73.4,18.01.2026,2026-01-21 +O-10334,19.2,23.01.2026,2026-01-23 +O-10335,17.4,23.01.2026,2026-01-25 +O-10336,24.3,21.01.2026,2026-01-23 +O-10337,30.6,17.04.2026,2026-04-21 +O-10338,37.8,07.03.2026,2026-03-11 +O-10339,16.0,24.04.2026,2026-04-27 +O-10340,44.5,23.04.2026,2026-04-23 +O-10341,12.7,26.04.2026,2026-04-29 +O-10342,10.7,07.02.2026,2026-02-11 +O-10343,52.5,26.04.2026,2026-04-27 +O-10344,14.2,06.03.2026,2026-03-09 +O-10345,21.0,07.02.2026,2026-02-10 +O-10346,28.3,19.04.2026,2026-04-22 +O-10347,21.6,16.01.2026,2026-01-16 +O-10348,23.8,03.03.2026,2026-03-03 +O-10349,44.5,10.01.2026,2026-01-13 +O-10350,40.3,05.04.2026,2026-04-06 +O-10351,40.1,22.05.2026,2026-05-22 +O-10352,39.4,22.02.2026,2026-02-25 +O-10353,29.2,27.01.2026,2026-01-31 +O-10354,30.6,18.06.2026,2026-06-18 +O-10355,38.7,31.01.2026,2026-02-01 +O-10356,23.7,17.03.2026,2026-03-19 +O-10357,75.8,20.01.2026,2026-01-20 +O-10358,43.2,29.01.2026,2026-02-01 +O-10359,44.5,11.06.2026,2026-06-13 +O-10360,44.3,08.06.2026,2026-06-10 +O-10361,37.8,09.05.2026,2026-05-13 +O-10362,38.7,17.04.2026,2026-04-17 +O-10363,44.0,15.02.2026,2026-02-17 +O-10364,18.1,02.03.2026,2026-03-06 +O-10365,55.9,12.04.2026,2026-04-14 +O-10366,22.3,27.02.2026,2026-03-01 +O-10367,16.8,24.03.2026,2026-03-27 +O-10368,33.6,23.01.2026,2026-01-23 +O-10369,39.3,15.04.2026,2026-04-15 +O-10370,31.9,05.04.2026,2026-04-07 +O-10371,53.9,27.03.2026,2026-03-28 +O-10372,26.0,03.03.2026,2026-03-04 +O-10373,49.6,23.02.2026,2026-02-25 +O-10374,23.6,03.05.2026,2026-05-06 +O-10375,52.4,21.04.2026,2026-04-25 +O-10376,20.0,04.02.2026,2026-02-07 +O-10377,40.3,22.01.2026,2026-01-24 +O-10378,21.0,30.04.2026,2026-05-03 +O-10379,15.1,26.06.2026,2026-06-27 +O-10380,17.3,18.04.2026,2026-04-22 +O-10381,45.4,21.06.2026,2026-06-21 +O-10382,62.7,12.05.2026,2026-05-15 +O-10383,60.9,03.04.2026,2026-04-05 +O-10384,27.5,03.03.2026,2026-03-04 +O-10385,29.3,28.06.2026,2026-06-29 +O-10386,29.9,13.06.2026,2026-06-13 +O-10387,24.6,25.05.2026,2026-05-27 +O-10388,13.3,06.01.2026,2026-01-07 +O-10389,34.8,20.06.2026,2026-06-20 +O-10390,23.5,24.05.2026,2026-05-28 +O-10391,18.0,11.02.2026,2026-02-12 +O-10392,22.6,25.01.2026,2026-01-26 +O-10393,45.3,24.05.2026,2026-05-28 +O-10394,99.4,22.03.2026,2026-03-22 +O-10395,44.2,18.06.2026,2026-06-19 +O-10396,43.3,25.05.2026,2026-05-28 +O-10397,38.5,21.05.2026,2026-05-22 +O-10398,18.6,08.06.2026,2026-06-08 +O-10399,45.8,20.02.2026,2026-02-22 +O-10400,36.7,22.04.2026,2026-04-22 diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-decimal-comma/case.json b/agents/evals/fixtures/cases/histogram-basic-pygal-decimal-comma/case.json new file mode 100644 index 00000000000..89b5020a81e --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-decimal-comma/case.json @@ -0,0 +1,20 @@ +{ + "spec_id": "histogram-basic", + "library": "pygal", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "values", + "column": "Delivery Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-decimal-comma/data.csv b/agents/evals/fixtures/cases/histogram-basic-pygal-decimal-comma/data.csv new file mode 100644 index 00000000000..c0b5c27d0cc --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-decimal-comma/data.csv @@ -0,0 +1,401 @@ +Order ID;Delivery Time (min) +O-10001;38,3 +O-10002;39,4 +O-10003;36,7 +O-10004;36,6 +O-10005;16,3 +O-10006;25,4 +O-10007;25,4 +O-10008;28,7 +O-10009;38,1 +O-10010;29,6 +O-10011;19,5 +O-10012;36,0 +O-10013;53,0 +O-10014;30,1 +O-10015;21,3 +O-10016;47,9 +O-10017;41,8 +O-10018;26,4 +O-10019;32,4 +O-10020;22,9 +O-10021;52,4 +O-10022;31,4 +O-10023;19,7 +O-10024;31,1 +O-10025;38,2 +O-10026;52,7 +O-10027;23,9 +O-10028;39,3 +O-10029;46,8 +O-10030;38,3 +O-10031;24,2 +O-10032;57,8 +O-10033;44,9 +O-10034;67,6 +O-10035;22,3 +O-10036;27,3 +O-10037;17,8 +O-10038;34,3 +O-10039;36,7 +O-10040;25,1 +O-10041;31,6 +O-10042;52,9 +O-10043;29,7 +O-10044;30,9 +O-10045;52,3 +O-10046;32,4 +O-10047;47,4 +O-10048;62,4 +O-10049;22,5 +O-10050;14,7 +O-10051;34,6 +O-10052;19,6 +O-10053;34,0 +O-10054;29,6 +O-10055;27,2 +O-10056;53,7 +O-10057;66,8 +O-10058;34,1 +O-10059;39,1 +O-10060;32,1 +O-10061;50,4 +O-10062;18,7 +O-10063;32,2 +O-10064;66,0 +O-10065;40,7 +O-10066;76,3 +O-10067;15,7 +O-10068;18,2 +O-10069;18,4 +O-10070;23,2 +O-10071;34,8 +O-10072;30,9 +O-10073;39,8 +O-10074;27,5 +O-10075;17,7 +O-10076;84,2 +O-10077;27,9 +O-10078;22,2 +O-10079;92,0 +O-10080;31,1 +O-10081;30,6 +O-10082;55,0 +O-10083;35,7 +O-10084;22,3 +O-10085;11,9 +O-10086;14,1 +O-10087;24,0 +O-10088;29,3 +O-10089;46,9 +O-10090;26,2 +O-10091;20,2 +O-10092;18,5 +O-10093;16,2 +O-10094;26,1 +O-10095;31,2 +O-10096;57,1 +O-10097;15,0 +O-10098;33,6 +O-10099;24,4 +O-10100;44,1 +O-10101;51,7 +O-10102;35,6 +O-10103;18,6 +O-10104;41,6 +O-10105;47,3 +O-10106;27,6 +O-10107;45,3 +O-10108;43,6 +O-10109;19,1 +O-10110;26,2 +O-10111;20,6 +O-10112;29,6 +O-10113;61,9 +O-10114;58,8 +O-10115;20,6 +O-10116;13,7 +O-10117;14,8 +O-10118;36,3 +O-10119;116,4 +O-10120;51,6 +O-10121;19,3 +O-10122;48,0 +O-10123;106,1 +O-10124;42,9 +O-10125;17,9 +O-10126;27,9 +O-10127;18,3 +O-10128;88,9 +O-10129;51,3 +O-10130;22,7 +O-10131;39,0 +O-10132;31,8 +O-10133;43,4 +O-10134;27,5 +O-10135;21,1 +O-10136;26,0 +O-10137;32,5 +O-10138;23,8 +O-10139;28,4 +O-10140;16,3 +O-10141;18,4 +O-10142;29,0 +O-10143;40,9 +O-10144;30,8 +O-10145;39,6 +O-10146;32,4 +O-10147;25,0 +O-10148;35,2 +O-10149;18,7 +O-10150;30,7 +O-10151;31,5 +O-10152;22,7 +O-10153;20,7 +O-10154;27,3 +O-10155;43,8 +O-10156;33,0 +O-10157;42,1 +O-10158;20,7 +O-10159;14,8 +O-10160;16,0 +O-10161;25,2 +O-10162;38,5 +O-10163;39,5 +O-10164;43,0 +O-10165;37,5 +O-10166;23,2 +O-10167;62,0 +O-10168;9,8 +O-10169;41,2 +O-10170;33,8 +O-10171;21,5 +O-10172;57,7 +O-10173;34,0 +O-10174;16,2 +O-10175;27,2 +O-10176;16,4 +O-10177;29,6 +O-10178;22,8 +O-10179;23,1 +O-10180;36,4 +O-10181;61,6 +O-10182;23,9 +O-10183;25,1 +O-10184;23,6 +O-10185;23,1 +O-10186;32,4 +O-10187;86,5 +O-10188;26,8 +O-10189;40,1 +O-10190;22,4 +O-10191;32,4 +O-10192;25,6 +O-10193;30,6 +O-10194;68,7 +O-10195;37,1 +O-10196;29,5 +O-10197;61,1 +O-10198;50,7 +O-10199;35,4 +O-10200;36,6 +O-10201;37,5 +O-10202;37,9 +O-10203;18,0 +O-10204;41,9 +O-10205;53,1 +O-10206;19,9 +O-10207;16,4 +O-10208;39,5 +O-10209;32,8 +O-10210;37,9 +O-10211;39,5 +O-10212;39,4 +O-10213;24,6 +O-10214;40,7 +O-10215;27,6 +O-10216;21,4 +O-10217;44,1 +O-10218;22,6 +O-10219;30,9 +O-10220;26,5 +O-10221;20,7 +O-10222;21,7 +O-10223;31,1 +O-10224;31,1 +O-10225;39,7 +O-10226;30,2 +O-10227;22,8 +O-10228;36,3 +O-10229;32,5 +O-10230;49,4 +O-10231;39,2 +O-10232;21,6 +O-10233;13,8 +O-10234;31,1 +O-10235;21,9 +O-10236;49,0 +O-10237;20,4 +O-10238;21,4 +O-10239;48,5 +O-10240;17,1 +O-10241;29,3 +O-10242;69,6 +O-10243;31,2 +O-10244;43,1 +O-10245;46,7 +O-10246;28,7 +O-10247;31,7 +O-10248;30,0 +O-10249;38,1 +O-10250;14,8 +O-10251;27,2 +O-10252;55,8 +O-10253;38,9 +O-10254;23,8 +O-10255;31,8 +O-10256;13,2 +O-10257;72,2 +O-10258;36,3 +O-10259;15,7 +O-10260;26,3 +O-10261;24,5 +O-10262;67,5 +O-10263;20,5 +O-10264;23,4 +O-10265;62,8 +O-10266;34,5 +O-10267;25,2 +O-10268;21,3 +O-10269;49,0 +O-10270;48,8 +O-10271;50,0 +O-10272;23,1 +O-10273;62,7 +O-10274;85,7 +O-10275;29,5 +O-10276;14,9 +O-10277;39,7 +O-10278;48,3 +O-10279;26,7 +O-10280;26,6 +O-10281;52,4 +O-10282;40,5 +O-10283;14,9 +O-10284;42,9 +O-10285;26,4 +O-10286;10,6 +O-10287;21,9 +O-10288;40,1 +O-10289;57,9 +O-10290;42,6 +O-10291;43,6 +O-10292;41,3 +O-10293;66,9 +O-10294;18,6 +O-10295;40,7 +O-10296;88,6 +O-10297;39,5 +O-10298;15,6 +O-10299;17,3 +O-10300;27,3 +O-10301;56,9 +O-10302;38,8 +O-10303;19,9 +O-10304;26,8 +O-10305;25,9 +O-10306;32,8 +O-10307;46,9 +O-10308;16,6 +O-10309;26,9 +O-10310;40,7 +O-10311;40,1 +O-10312;42,5 +O-10313;67,6 +O-10314;15,9 +O-10315;26,1 +O-10316;24,4 +O-10317;16,6 +O-10318;23,2 +O-10319;15,1 +O-10320;15,3 +O-10321;29,7 +O-10322;38,9 +O-10323;26,6 +O-10324;36,1 +O-10325;21,0 +O-10326;25,5 +O-10327;42,8 +O-10328;37,0 +O-10329;40,5 +O-10330;17,7 +O-10331;31,3 +O-10332;56,8 +O-10333;73,4 +O-10334;19,2 +O-10335;17,4 +O-10336;24,3 +O-10337;30,6 +O-10338;37,8 +O-10339;16,0 +O-10340;44,5 +O-10341;12,7 +O-10342;10,7 +O-10343;52,5 +O-10344;14,2 +O-10345;21,0 +O-10346;28,3 +O-10347;21,6 +O-10348;23,8 +O-10349;44,5 +O-10350;40,3 +O-10351;40,1 +O-10352;39,4 +O-10353;29,2 +O-10354;30,6 +O-10355;38,7 +O-10356;23,7 +O-10357;75,8 +O-10358;43,2 +O-10359;44,5 +O-10360;44,3 +O-10361;37,8 +O-10362;38,7 +O-10363;44,0 +O-10364;18,1 +O-10365;55,9 +O-10366;22,3 +O-10367;16,8 +O-10368;33,6 +O-10369;39,3 +O-10370;31,9 +O-10371;53,9 +O-10372;26,0 +O-10373;49,6 +O-10374;23,6 +O-10375;52,4 +O-10376;20,0 +O-10377;40,3 +O-10378;21,0 +O-10379;15,1 +O-10380;17,3 +O-10381;45,4 +O-10382;62,7 +O-10383;60,9 +O-10384;27,5 +O-10385;29,3 +O-10386;29,9 +O-10387;24,6 +O-10388;13,3 +O-10389;34,8 +O-10390;23,5 +O-10391;18,0 +O-10392;22,6 +O-10393;45,3 +O-10394;99,4 +O-10395;44,2 +O-10396;43,3 +O-10397;38,5 +O-10398;18,6 +O-10399;45,8 +O-10400;36,7 diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-n12/case.json b/agents/evals/fixtures/cases/histogram-basic-pygal-n12/case.json new file mode 100644 index 00000000000..932dd834b0a --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-n12/case.json @@ -0,0 +1,20 @@ +{ + "spec_id": "histogram-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "values", + "column": "Delivery Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, n12)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-n12/data.csv b/agents/evals/fixtures/cases/histogram-basic-pygal-n12/data.csv new file mode 100644 index 00000000000..3e32daaa5e4 --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-n12/data.csv @@ -0,0 +1,13 @@ +Order ID,Delivery Time (min) +O-10001,27.8 +O-10002,106.1 +O-10003,29.2 +O-10004,27.9 +O-10005,61.7 +O-10006,15.9 +O-10007,12.2 +O-10008,26.6 +O-10009,46.5 +O-10010,37.3 +O-10011,30.4 +O-10012,24.3 diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-n5000/case.json b/agents/evals/fixtures/cases/histogram-basic-pygal-n5000/case.json new file mode 100644 index 00000000000..0c93f1aa552 --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-n5000/case.json @@ -0,0 +1,20 @@ +{ + "spec_id": "histogram-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "values", + "column": "Delivery Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, n5000)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-n5000/data.csv b/agents/evals/fixtures/cases/histogram-basic-pygal-n5000/data.csv new file mode 100644 index 00000000000..00869fbb7ca --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-n5000/data.csv @@ -0,0 +1,5001 @@ +Order ID,Delivery Time (min) +O-10001,25.6 +O-10002,82.2 +O-10003,38.7 +O-10004,32.3 +O-10005,17.4 +O-10006,42.3 +O-10007,43.8 +O-10008,20.3 +O-10009,18.6 +O-10010,47.7 +O-10011,25.5 +O-10012,64.4 +O-10013,42.7 +O-10014,29.0 +O-10015,30.8 +O-10016,12.7 +O-10017,15.3 +O-10018,24.0 +O-10019,40.3 +O-10020,44.6 +O-10021,58.3 +O-10022,43.5 +O-10023,66.2 +O-10024,39.3 +O-10025,55.7 +O-10026,30.3 +O-10027,40.7 +O-10028,21.3 +O-10029,63.1 +O-10030,11.6 +O-10031,19.6 +O-10032,45.5 +O-10033,40.3 +O-10034,50.2 +O-10035,40.7 +O-10036,47.7 +O-10037,30.1 +O-10038,20.3 +O-10039,35.2 +O-10040,14.4 +O-10041,24.8 +O-10042,32.9 +O-10043,27.9 +O-10044,29.0 +O-10045,55.3 +O-10046,24.3 +O-10047,14.4 +O-10048,36.2 +O-10049,38.5 +O-10050,17.4 +O-10051,24.5 +O-10052,34.7 +O-10053,35.8 +O-10054,32.8 +O-10055,82.6 +O-10056,26.4 +O-10057,17.1 +O-10058,18.0 +O-10059,19.5 +O-10060,44.5 +O-10061,24.3 +O-10062,30.8 +O-10063,75.1 +O-10064,19.1 +O-10065,41.1 +O-10066,12.4 +O-10067,55.0 +O-10068,28.2 +O-10069,21.1 +O-10070,19.9 +O-10071,42.4 +O-10072,23.2 +O-10073,28.2 +O-10074,24.7 +O-10075,33.7 +O-10076,67.3 +O-10077,28.4 +O-10078,23.1 +O-10079,29.3 +O-10080,17.0 +O-10081,41.6 +O-10082,74.9 +O-10083,34.6 +O-10084,18.8 +O-10085,19.5 +O-10086,19.7 +O-10087,28.5 +O-10088,59.4 +O-10089,30.6 +O-10090,66.7 +O-10091,28.4 +O-10092,32.9 +O-10093,23.9 +O-10094,35.5 +O-10095,44.8 +O-10096,52.9 +O-10097,75.5 +O-10098,69.4 +O-10099,18.0 +O-10100,18.7 +O-10101,16.4 +O-10102,29.7 +O-10103,22.2 +O-10104,20.8 +O-10105,42.3 +O-10106,69.5 +O-10107,37.3 +O-10108,38.8 +O-10109,71.0 +O-10110,37.7 +O-10111,36.9 +O-10112,41.7 +O-10113,33.8 +O-10114,25.9 +O-10115,40.7 +O-10116,13.0 +O-10117,15.4 +O-10118,35.5 +O-10119,28.3 +O-10120,66.5 +O-10121,36.2 +O-10122,14.5 +O-10123,51.8 +O-10124,52.6 +O-10125,69.5 +O-10126,24.0 +O-10127,25.7 +O-10128,35.5 +O-10129,25.4 +O-10130,38.6 +O-10131,25.6 +O-10132,24.3 +O-10133,19.5 +O-10134,27.6 +O-10135,21.1 +O-10136,45.3 +O-10137,69.9 +O-10138,29.1 +O-10139,13.2 +O-10140,17.9 +O-10141,22.0 +O-10142,22.9 +O-10143,32.5 +O-10144,52.7 +O-10145,35.0 +O-10146,42.6 +O-10147,34.9 +O-10148,15.2 +O-10149,25.9 +O-10150,32.1 +O-10151,32.1 +O-10152,32.5 +O-10153,66.0 +O-10154,52.3 +O-10155,64.0 +O-10156,13.0 +O-10157,63.0 +O-10158,18.9 +O-10159,15.0 +O-10160,30.5 +O-10161,49.3 +O-10162,27.7 +O-10163,30.2 +O-10164,47.1 +O-10165,26.7 +O-10166,37.5 +O-10167,45.3 +O-10168,37.8 +O-10169,23.9 +O-10170,64.6 +O-10171,45.6 +O-10172,42.9 +O-10173,57.1 +O-10174,18.8 +O-10175,13.0 +O-10176,15.7 +O-10177,27.9 +O-10178,35.7 +O-10179,19.0 +O-10180,19.2 +O-10181,37.7 +O-10182,72.0 +O-10183,52.1 +O-10184,15.5 +O-10185,22.3 +O-10186,26.1 +O-10187,20.8 +O-10188,20.9 +O-10189,55.4 +O-10190,47.6 +O-10191,21.0 +O-10192,15.4 +O-10193,31.9 +O-10194,35.3 +O-10195,31.7 +O-10196,18.7 +O-10197,68.8 +O-10198,59.2 +O-10199,42.4 +O-10200,21.9 +O-10201,14.7 +O-10202,43.8 +O-10203,34.5 +O-10204,23.1 +O-10205,30.2 +O-10206,37.4 +O-10207,42.8 +O-10208,42.1 +O-10209,29.4 +O-10210,16.2 +O-10211,32.2 +O-10212,56.1 +O-10213,41.9 +O-10214,41.5 +O-10215,29.8 +O-10216,41.8 +O-10217,17.2 +O-10218,55.7 +O-10219,27.4 +O-10220,59.2 +O-10221,31.5 +O-10222,25.6 +O-10223,26.1 +O-10224,47.6 +O-10225,19.3 +O-10226,13.3 +O-10227,27.5 +O-10228,28.7 +O-10229,26.0 +O-10230,24.4 +O-10231,33.4 +O-10232,30.4 +O-10233,21.2 +O-10234,27.6 +O-10235,31.2 +O-10236,72.6 +O-10237,32.2 +O-10238,56.3 +O-10239,15.8 +O-10240,18.9 +O-10241,27.4 +O-10242,83.2 +O-10243,24.6 +O-10244,29.9 +O-10245,27.9 +O-10246,37.5 +O-10247,19.7 +O-10248,12.9 +O-10249,42.3 +O-10250,30.3 +O-10251,15.1 +O-10252,23.8 +O-10253,22.2 +O-10254,36.6 +O-10255,31.0 +O-10256,21.9 +O-10257,28.7 +O-10258,31.4 +O-10259,47.0 +O-10260,28.9 +O-10261,25.1 +O-10262,49.6 +O-10263,61.1 +O-10264,34.4 +O-10265,55.0 +O-10266,42.9 +O-10267,39.7 +O-10268,30.5 +O-10269,29.9 +O-10270,27.2 +O-10271,28.2 +O-10272,62.8 +O-10273,31.9 +O-10274,28.6 +O-10275,49.5 +O-10276,36.7 +O-10277,48.8 +O-10278,49.0 +O-10279,37.1 +O-10280,12.9 +O-10281,22.4 +O-10282,53.7 +O-10283,33.7 +O-10284,88.9 +O-10285,73.2 +O-10286,28.1 +O-10287,24.7 +O-10288,33.3 +O-10289,28.5 +O-10290,18.1 +O-10291,45.4 +O-10292,20.5 +O-10293,27.0 +O-10294,35.5 +O-10295,29.0 +O-10296,24.1 +O-10297,53.0 +O-10298,21.9 +O-10299,60.7 +O-10300,40.1 +O-10301,30.4 +O-10302,13.3 +O-10303,11.7 +O-10304,17.6 +O-10305,30.4 +O-10306,25.5 +O-10307,53.4 +O-10308,53.9 +O-10309,32.0 +O-10310,44.1 +O-10311,36.8 +O-10312,27.2 +O-10313,26.5 +O-10314,35.7 +O-10315,27.8 +O-10316,52.4 +O-10317,21.8 +O-10318,56.6 +O-10319,32.3 +O-10320,21.9 +O-10321,23.3 +O-10322,55.0 +O-10323,33.9 +O-10324,45.2 +O-10325,49.5 +O-10326,56.0 +O-10327,28.0 +O-10328,19.8 +O-10329,26.9 +O-10330,70.3 +O-10331,37.6 +O-10332,40.4 +O-10333,28.6 +O-10334,37.5 +O-10335,36.4 +O-10336,61.3 +O-10337,67.6 +O-10338,26.6 +O-10339,33.3 +O-10340,31.6 +O-10341,24.8 +O-10342,44.0 +O-10343,20.4 +O-10344,19.2 +O-10345,33.8 +O-10346,38.1 +O-10347,47.9 +O-10348,25.9 +O-10349,52.5 +O-10350,32.5 +O-10351,21.1 +O-10352,28.1 +O-10353,33.4 +O-10354,50.6 +O-10355,62.1 +O-10356,32.7 +O-10357,30.2 +O-10358,42.7 +O-10359,19.8 +O-10360,30.0 +O-10361,44.5 +O-10362,65.6 +O-10363,12.6 +O-10364,36.4 +O-10365,40.8 +O-10366,31.0 +O-10367,26.1 +O-10368,28.8 +O-10369,49.7 +O-10370,44.7 +O-10371,44.3 +O-10372,14.8 +O-10373,36.4 +O-10374,26.4 +O-10375,37.9 +O-10376,43.6 +O-10377,24.6 +O-10378,15.5 +O-10379,23.8 +O-10380,57.3 +O-10381,42.6 +O-10382,12.8 +O-10383,56.0 +O-10384,70.0 +O-10385,38.9 +O-10386,75.4 +O-10387,21.5 +O-10388,17.7 +O-10389,46.7 +O-10390,25.9 +O-10391,39.1 +O-10392,42.2 +O-10393,17.6 +O-10394,65.6 +O-10395,41.7 +O-10396,30.7 +O-10397,18.7 +O-10398,20.1 +O-10399,20.2 +O-10400,12.9 +O-10401,25.9 +O-10402,50.2 +O-10403,45.6 +O-10404,65.1 +O-10405,12.5 +O-10406,52.2 +O-10407,76.6 +O-10408,37.1 +O-10409,40.3 +O-10410,35.2 +O-10411,52.9 +O-10412,12.2 +O-10413,18.6 +O-10414,32.1 +O-10415,42.7 +O-10416,37.8 +O-10417,16.8 +O-10418,38.2 +O-10419,31.0 +O-10420,19.7 +O-10421,27.2 +O-10422,41.1 +O-10423,32.7 +O-10424,21.0 +O-10425,38.6 +O-10426,15.0 +O-10427,14.9 +O-10428,29.0 +O-10429,84.2 +O-10430,32.9 +O-10431,11.7 +O-10432,27.3 +O-10433,34.4 +O-10434,51.7 +O-10435,46.0 +O-10436,35.1 +O-10437,29.7 +O-10438,30.8 +O-10439,33.5 +O-10440,30.0 +O-10441,58.2 +O-10442,47.7 +O-10443,22.4 +O-10444,27.8 +O-10445,39.6 +O-10446,18.4 +O-10447,50.5 +O-10448,18.6 +O-10449,23.2 +O-10450,22.1 +O-10451,42.4 +O-10452,22.1 +O-10453,22.4 +O-10454,11.1 +O-10455,56.4 +O-10456,83.1 +O-10457,55.1 +O-10458,61.8 +O-10459,46.0 +O-10460,40.5 +O-10461,28.0 +O-10462,45.9 +O-10463,30.2 +O-10464,35.6 +O-10465,32.4 +O-10466,22.5 +O-10467,44.4 +O-10468,14.1 +O-10469,50.7 +O-10470,16.3 +O-10471,72.8 +O-10472,28.0 +O-10473,20.9 +O-10474,34.8 +O-10475,56.6 +O-10476,24.3 +O-10477,41.8 +O-10478,39.4 +O-10479,40.4 +O-10480,61.5 +O-10481,46.7 +O-10482,43.4 +O-10483,63.3 +O-10484,26.9 +O-10485,22.5 +O-10486,21.1 +O-10487,17.2 +O-10488,36.6 +O-10489,49.0 +O-10490,43.5 +O-10491,37.8 +O-10492,34.4 +O-10493,20.5 +O-10494,17.3 +O-10495,38.1 +O-10496,52.4 +O-10497,48.2 +O-10498,53.5 +O-10499,13.5 +O-10500,21.6 +O-10501,38.0 +O-10502,28.5 +O-10503,14.4 +O-10504,61.6 +O-10505,29.1 +O-10506,32.0 +O-10507,40.2 +O-10508,43.2 +O-10509,23.4 +O-10510,77.5 +O-10511,20.6 +O-10512,30.6 +O-10513,28.8 +O-10514,33.6 +O-10515,23.2 +O-10516,39.8 +O-10517,24.0 +O-10518,27.3 +O-10519,38.8 +O-10520,33.3 +O-10521,46.8 +O-10522,31.9 +O-10523,38.1 +O-10524,35.3 +O-10525,19.0 +O-10526,25.9 +O-10527,18.8 +O-10528,62.2 +O-10529,35.2 +O-10530,30.6 +O-10531,26.5 +O-10532,31.4 +O-10533,25.7 +O-10534,35.5 +O-10535,42.9 +O-10536,38.8 +O-10537,85.3 +O-10538,30.9 +O-10539,16.4 +O-10540,25.0 +O-10541,15.7 +O-10542,18.4 +O-10543,15.2 +O-10544,31.9 +O-10545,52.5 +O-10546,40.0 +O-10547,19.2 +O-10548,31.2 +O-10549,42.4 +O-10550,17.8 +O-10551,22.1 +O-10552,18.3 +O-10553,42.6 +O-10554,42.3 +O-10555,58.3 +O-10556,28.6 +O-10557,33.6 +O-10558,29.7 +O-10559,35.3 +O-10560,29.7 +O-10561,25.3 +O-10562,36.7 +O-10563,37.2 +O-10564,20.8 +O-10565,59.8 +O-10566,33.8 +O-10567,18.7 +O-10568,51.2 +O-10569,52.9 +O-10570,27.5 +O-10571,26.8 +O-10572,35.7 +O-10573,34.0 +O-10574,36.9 +O-10575,62.8 +O-10576,25.1 +O-10577,18.0 +O-10578,46.9 +O-10579,21.2 +O-10580,30.2 +O-10581,22.4 +O-10582,52.9 +O-10583,31.6 +O-10584,26.8 +O-10585,14.2 +O-10586,14.3 +O-10587,17.6 +O-10588,37.2 +O-10589,39.4 +O-10590,43.7 +O-10591,34.5 +O-10592,23.6 +O-10593,50.6 +O-10594,23.8 +O-10595,44.2 +O-10596,23.3 +O-10597,21.9 +O-10598,36.7 +O-10599,50.0 +O-10600,41.8 +O-10601,89.6 +O-10602,36.9 +O-10603,31.6 +O-10604,63.6 +O-10605,24.2 +O-10606,25.9 +O-10607,23.8 +O-10608,37.2 +O-10609,37.8 +O-10610,18.6 +O-10611,34.6 +O-10612,20.9 +O-10613,50.2 +O-10614,31.4 +O-10615,56.9 +O-10616,46.7 +O-10617,35.9 +O-10618,17.0 +O-10619,47.8 +O-10620,37.4 +O-10621,30.8 +O-10622,18.5 +O-10623,40.8 +O-10624,34.2 +O-10625,49.1 +O-10626,20.0 +O-10627,51.6 +O-10628,69.9 +O-10629,25.7 +O-10630,32.2 +O-10631,38.3 +O-10632,42.3 +O-10633,23.9 +O-10634,32.7 +O-10635,74.7 +O-10636,64.2 +O-10637,83.2 +O-10638,23.2 +O-10639,31.8 +O-10640,29.0 +O-10641,42.9 +O-10642,23.2 +O-10643,50.5 +O-10644,41.5 +O-10645,21.6 +O-10646,30.7 +O-10647,15.1 +O-10648,44.2 +O-10649,39.8 +O-10650,51.6 +O-10651,29.8 +O-10652,30.1 +O-10653,29.5 +O-10654,56.0 +O-10655,31.0 +O-10656,19.9 +O-10657,44.3 +O-10658,26.6 +O-10659,30.4 +O-10660,23.2 +O-10661,33.2 +O-10662,27.6 +O-10663,28.9 +O-10664,50.0 +O-10665,16.6 +O-10666,39.0 +O-10667,35.3 +O-10668,21.0 +O-10669,25.4 +O-10670,49.9 +O-10671,24.3 +O-10672,38.1 +O-10673,26.9 +O-10674,46.4 +O-10675,28.1 +O-10676,48.2 +O-10677,18.4 +O-10678,44.3 +O-10679,34.2 +O-10680,71.3 +O-10681,12.7 +O-10682,46.6 +O-10683,83.3 +O-10684,64.9 +O-10685,23.5 +O-10686,78.4 +O-10687,55.9 +O-10688,24.6 +O-10689,18.5 +O-10690,19.1 +O-10691,38.5 +O-10692,13.7 +O-10693,47.7 +O-10694,28.5 +O-10695,48.9 +O-10696,26.2 +O-10697,28.4 +O-10698,36.5 +O-10699,32.2 +O-10700,37.6 +O-10701,40.7 +O-10702,28.9 +O-10703,33.1 +O-10704,38.6 +O-10705,35.5 +O-10706,34.0 +O-10707,23.2 +O-10708,62.9 +O-10709,39.0 +O-10710,22.9 +O-10711,54.9 +O-10712,36.1 +O-10713,69.2 +O-10714,50.3 +O-10715,24.2 +O-10716,70.0 +O-10717,25.4 +O-10718,19.0 +O-10719,53.3 +O-10720,33.6 +O-10721,58.2 +O-10722,14.6 +O-10723,44.0 +O-10724,28.4 +O-10725,17.5 +O-10726,15.4 +O-10727,20.5 +O-10728,17.3 +O-10729,25.6 +O-10730,40.4 +O-10731,25.6 +O-10732,23.7 +O-10733,31.0 +O-10734,24.1 +O-10735,21.2 +O-10736,31.9 +O-10737,25.6 +O-10738,31.3 +O-10739,38.1 +O-10740,40.7 +O-10741,44.3 +O-10742,28.1 +O-10743,13.3 +O-10744,23.3 +O-10745,26.0 +O-10746,38.2 +O-10747,28.0 +O-10748,29.6 +O-10749,22.8 +O-10750,92.8 +O-10751,29.9 +O-10752,31.2 +O-10753,54.2 +O-10754,38.2 +O-10755,43.6 +O-10756,27.1 +O-10757,25.9 +O-10758,44.9 +O-10759,34.4 +O-10760,45.4 +O-10761,51.9 +O-10762,25.8 +O-10763,30.1 +O-10764,28.1 +O-10765,24.9 +O-10766,42.7 +O-10767,80.7 +O-10768,35.1 +O-10769,45.8 +O-10770,30.1 +O-10771,19.8 +O-10772,29.9 +O-10773,27.2 +O-10774,30.6 +O-10775,46.2 +O-10776,36.7 +O-10777,15.2 +O-10778,31.4 +O-10779,39.0 +O-10780,46.3 +O-10781,30.4 +O-10782,57.5 +O-10783,15.6 +O-10784,51.0 +O-10785,29.9 +O-10786,58.8 +O-10787,55.3 +O-10788,20.5 +O-10789,24.0 +O-10790,21.4 +O-10791,30.1 +O-10792,37.0 +O-10793,40.2 +O-10794,24.3 +O-10795,44.5 +O-10796,17.9 +O-10797,41.5 +O-10798,21.8 +O-10799,37.6 +O-10800,53.1 +O-10801,17.3 +O-10802,25.2 +O-10803,24.0 +O-10804,25.3 +O-10805,51.2 +O-10806,39.4 +O-10807,25.1 +O-10808,27.2 +O-10809,37.4 +O-10810,28.8 +O-10811,71.8 +O-10812,37.7 +O-10813,33.6 +O-10814,29.1 +O-10815,61.0 +O-10816,20.7 +O-10817,22.3 +O-10818,16.0 +O-10819,41.9 +O-10820,25.2 +O-10821,43.9 +O-10822,23.4 +O-10823,13.0 +O-10824,59.3 +O-10825,29.8 +O-10826,79.3 +O-10827,39.3 +O-10828,16.1 +O-10829,59.8 +O-10830,21.9 +O-10831,24.5 +O-10832,17.0 +O-10833,13.5 +O-10834,14.6 +O-10835,27.6 +O-10836,22.2 +O-10837,36.8 +O-10838,45.8 +O-10839,26.1 +O-10840,24.1 +O-10841,27.1 +O-10842,45.8 +O-10843,14.1 +O-10844,23.3 +O-10845,77.8 +O-10846,73.6 +O-10847,84.1 +O-10848,20.3 +O-10849,52.2 +O-10850,31.9 +O-10851,39.9 +O-10852,62.6 +O-10853,14.7 +O-10854,12.7 +O-10855,23.2 +O-10856,44.0 +O-10857,28.4 +O-10858,68.0 +O-10859,35.7 +O-10860,22.7 +O-10861,32.7 +O-10862,23.6 +O-10863,18.4 +O-10864,39.3 +O-10865,24.9 +O-10866,36.8 +O-10867,45.0 +O-10868,39.4 +O-10869,34.3 +O-10870,17.2 +O-10871,20.7 +O-10872,38.1 +O-10873,12.4 +O-10874,41.3 +O-10875,25.4 +O-10876,30.3 +O-10877,28.4 +O-10878,30.5 +O-10879,28.4 +O-10880,32.2 +O-10881,53.0 +O-10882,27.8 +O-10883,21.3 +O-10884,64.1 +O-10885,20.4 +O-10886,49.1 +O-10887,51.5 +O-10888,44.7 +O-10889,34.0 +O-10890,30.6 +O-10891,23.4 +O-10892,16.8 +O-10893,22.4 +O-10894,11.6 +O-10895,30.9 +O-10896,23.8 +O-10897,50.9 +O-10898,40.1 +O-10899,32.9 +O-10900,50.1 +O-10901,15.1 +O-10902,23.1 +O-10903,26.6 +O-10904,73.5 +O-10905,53.8 +O-10906,12.2 +O-10907,22.1 +O-10908,53.9 +O-10909,54.1 +O-10910,34.6 +O-10911,13.9 +O-10912,19.2 +O-10913,24.0 +O-10914,49.7 +O-10915,30.9 +O-10916,42.4 +O-10917,37.3 +O-10918,18.0 +O-10919,34.3 +O-10920,20.8 +O-10921,60.0 +O-10922,36.8 +O-10923,40.5 +O-10924,66.7 +O-10925,64.5 +O-10926,17.1 +O-10927,56.0 +O-10928,14.3 +O-10929,29.1 +O-10930,40.6 +O-10931,39.6 +O-10932,50.6 +O-10933,44.8 +O-10934,49.4 +O-10935,40.6 +O-10936,23.2 +O-10937,61.7 +O-10938,36.0 +O-10939,15.5 +O-10940,25.8 +O-10941,18.5 +O-10942,27.5 +O-10943,62.9 +O-10944,19.5 +O-10945,40.3 +O-10946,40.0 +O-10947,26.0 +O-10948,16.6 +O-10949,32.9 +O-10950,29.7 +O-10951,14.6 +O-10952,47.5 +O-10953,31.7 +O-10954,48.7 +O-10955,20.1 +O-10956,15.2 +O-10957,22.8 +O-10958,14.2 +O-10959,28.8 +O-10960,27.4 +O-10961,64.3 +O-10962,29.1 +O-10963,22.0 +O-10964,18.0 +O-10965,119.3 +O-10966,30.6 +O-10967,17.2 +O-10968,35.2 +O-10969,31.7 +O-10970,49.6 +O-10971,59.6 +O-10972,32.3 +O-10973,43.3 +O-10974,30.2 +O-10975,44.1 +O-10976,57.5 +O-10977,31.5 +O-10978,25.9 +O-10979,41.4 +O-10980,25.3 +O-10981,26.9 +O-10982,26.2 +O-10983,21.5 +O-10984,26.4 +O-10985,25.9 +O-10986,36.2 +O-10987,29.1 +O-10988,23.6 +O-10989,14.2 +O-10990,57.3 +O-10991,30.1 +O-10992,23.4 +O-10993,28.0 +O-10994,44.1 +O-10995,23.5 +O-10996,46.3 +O-10997,15.9 +O-10998,43.9 +O-10999,36.6 +O-11000,42.4 +O-11001,69.7 +O-11002,15.5 +O-11003,24.2 +O-11004,58.4 +O-11005,27.3 +O-11006,22.8 +O-11007,35.9 +O-11008,32.7 +O-11009,37.3 +O-11010,50.8 +O-11011,23.5 +O-11012,19.8 +O-11013,28.0 +O-11014,28.1 +O-11015,22.6 +O-11016,17.6 +O-11017,33.3 +O-11018,25.4 +O-11019,20.7 +O-11020,26.4 +O-11021,20.1 +O-11022,19.8 +O-11023,44.7 +O-11024,69.0 +O-11025,27.1 +O-11026,39.0 +O-11027,42.6 +O-11028,56.9 +O-11029,13.1 +O-11030,18.2 +O-11031,68.0 +O-11032,29.5 +O-11033,23.0 +O-11034,36.7 +O-11035,38.8 +O-11036,29.6 +O-11037,42.3 +O-11038,38.3 +O-11039,39.5 +O-11040,37.7 +O-11041,13.4 +O-11042,26.2 +O-11043,55.5 +O-11044,40.9 +O-11045,27.7 +O-11046,64.2 +O-11047,21.9 +O-11048,47.1 +O-11049,23.7 +O-11050,33.8 +O-11051,28.3 +O-11052,49.5 +O-11053,33.0 +O-11054,21.5 +O-11055,21.1 +O-11056,31.8 +O-11057,21.7 +O-11058,47.5 +O-11059,33.7 +O-11060,27.6 +O-11061,71.2 +O-11062,18.3 +O-11063,48.4 +O-11064,14.5 +O-11065,22.0 +O-11066,31.3 +O-11067,17.2 +O-11068,19.8 +O-11069,48.5 +O-11070,31.9 +O-11071,32.6 +O-11072,23.0 +O-11073,31.3 +O-11074,44.4 +O-11075,30.8 +O-11076,47.1 +O-11077,55.0 +O-11078,36.2 +O-11079,16.0 +O-11080,17.6 +O-11081,39.6 +O-11082,22.8 +O-11083,31.8 +O-11084,42.4 +O-11085,38.3 +O-11086,24.7 +O-11087,19.3 +O-11088,38.1 +O-11089,26.9 +O-11090,62.7 +O-11091,22.5 +O-11092,17.2 +O-11093,21.7 +O-11094,54.5 +O-11095,66.2 +O-11096,35.8 +O-11097,78.1 +O-11098,26.2 +O-11099,39.1 +O-11100,63.2 +O-11101,22.5 +O-11102,37.8 +O-11103,35.5 +O-11104,19.5 +O-11105,29.0 +O-11106,30.4 +O-11107,31.8 +O-11108,33.9 +O-11109,35.2 +O-11110,25.7 +O-11111,29.1 +O-11112,23.6 +O-11113,28.7 +O-11114,33.7 +O-11115,17.4 +O-11116,29.2 +O-11117,33.7 +O-11118,39.2 +O-11119,25.1 +O-11120,71.6 +O-11121,15.7 +O-11122,33.6 +O-11123,31.3 +O-11124,73.2 +O-11125,42.5 +O-11126,24.4 +O-11127,35.4 +O-11128,40.2 +O-11129,56.7 +O-11130,29.5 +O-11131,40.7 +O-11132,36.7 +O-11133,43.5 +O-11134,26.3 +O-11135,51.5 +O-11136,23.8 +O-11137,40.1 +O-11138,17.5 +O-11139,62.1 +O-11140,19.8 +O-11141,24.2 +O-11142,18.5 +O-11143,37.2 +O-11144,15.2 +O-11145,30.6 +O-11146,29.2 +O-11147,30.2 +O-11148,55.8 +O-11149,29.9 +O-11150,80.1 +O-11151,45.5 +O-11152,49.1 +O-11153,55.6 +O-11154,24.0 +O-11155,22.0 +O-11156,33.0 +O-11157,11.7 +O-11158,22.3 +O-11159,23.4 +O-11160,51.4 +O-11161,34.2 +O-11162,14.9 +O-11163,25.0 +O-11164,15.2 +O-11165,9.9 +O-11166,19.1 +O-11167,37.0 +O-11168,48.5 +O-11169,34.2 +O-11170,23.0 +O-11171,25.9 +O-11172,86.4 +O-11173,35.0 +O-11174,25.5 +O-11175,18.8 +O-11176,61.4 +O-11177,39.1 +O-11178,28.3 +O-11179,37.2 +O-11180,48.0 +O-11181,27.8 +O-11182,23.2 +O-11183,76.2 +O-11184,8.7 +O-11185,39.3 +O-11186,18.1 +O-11187,80.4 +O-11188,14.8 +O-11189,27.0 +O-11190,13.7 +O-11191,38.2 +O-11192,33.9 +O-11193,38.9 +O-11194,39.8 +O-11195,46.1 +O-11196,27.1 +O-11197,34.3 +O-11198,42.0 +O-11199,32.3 +O-11200,51.9 +O-11201,32.8 +O-11202,39.9 +O-11203,22.1 +O-11204,42.4 +O-11205,28.3 +O-11206,65.2 +O-11207,48.5 +O-11208,50.1 +O-11209,28.9 +O-11210,22.1 +O-11211,38.3 +O-11212,31.5 +O-11213,61.8 +O-11214,37.9 +O-11215,35.5 +O-11216,146.2 +O-11217,48.6 +O-11218,30.8 +O-11219,39.8 +O-11220,26.7 +O-11221,42.3 +O-11222,32.3 +O-11223,13.2 +O-11224,9.7 +O-11225,42.1 +O-11226,36.9 +O-11227,31.6 +O-11228,70.6 +O-11229,24.4 +O-11230,23.1 +O-11231,35.4 +O-11232,17.0 +O-11233,57.5 +O-11234,48.7 +O-11235,52.7 +O-11236,34.6 +O-11237,15.4 +O-11238,39.0 +O-11239,39.0 +O-11240,56.0 +O-11241,24.8 +O-11242,49.9 +O-11243,15.6 +O-11244,40.1 +O-11245,24.4 +O-11246,39.8 +O-11247,24.8 +O-11248,45.3 +O-11249,80.4 +O-11250,59.1 +O-11251,59.6 +O-11252,59.0 +O-11253,43.9 +O-11254,76.5 +O-11255,11.0 +O-11256,13.3 +O-11257,18.0 +O-11258,17.4 +O-11259,14.0 +O-11260,30.1 +O-11261,17.0 +O-11262,51.8 +O-11263,29.7 +O-11264,33.0 +O-11265,14.5 +O-11266,33.7 +O-11267,65.4 +O-11268,43.4 +O-11269,18.6 +O-11270,37.7 +O-11271,45.2 +O-11272,39.9 +O-11273,36.7 +O-11274,36.4 +O-11275,27.1 +O-11276,42.1 +O-11277,28.0 +O-11278,41.7 +O-11279,21.5 +O-11280,28.4 +O-11281,27.7 +O-11282,17.6 +O-11283,59.3 +O-11284,36.3 +O-11285,44.3 +O-11286,29.1 +O-11287,23.1 +O-11288,29.4 +O-11289,33.0 +O-11290,49.1 +O-11291,48.1 +O-11292,15.9 +O-11293,12.0 +O-11294,35.8 +O-11295,39.7 +O-11296,41.9 +O-11297,18.7 +O-11298,46.6 +O-11299,32.7 +O-11300,34.0 +O-11301,36.5 +O-11302,12.8 +O-11303,42.4 +O-11304,56.2 +O-11305,84.8 +O-11306,34.2 +O-11307,28.6 +O-11308,41.4 +O-11309,55.5 +O-11310,45.7 +O-11311,18.5 +O-11312,36.1 +O-11313,30.5 +O-11314,47.0 +O-11315,39.4 +O-11316,55.3 +O-11317,45.3 +O-11318,45.7 +O-11319,48.5 +O-11320,30.0 +O-11321,43.5 +O-11322,13.9 +O-11323,32.2 +O-11324,37.7 +O-11325,23.4 +O-11326,14.3 +O-11327,40.5 +O-11328,26.4 +O-11329,30.1 +O-11330,23.4 +O-11331,69.7 +O-11332,39.3 +O-11333,31.2 +O-11334,41.0 +O-11335,41.7 +O-11336,25.2 +O-11337,17.2 +O-11338,32.1 +O-11339,29.0 +O-11340,41.9 +O-11341,52.2 +O-11342,14.6 +O-11343,52.0 +O-11344,16.2 +O-11345,28.6 +O-11346,47.7 +O-11347,21.9 +O-11348,36.6 +O-11349,44.7 +O-11350,62.4 +O-11351,10.2 +O-11352,34.5 +O-11353,67.5 +O-11354,19.2 +O-11355,34.3 +O-11356,35.8 +O-11357,55.2 +O-11358,27.9 +O-11359,49.0 +O-11360,31.5 +O-11361,42.6 +O-11362,25.0 +O-11363,51.2 +O-11364,13.8 +O-11365,45.8 +O-11366,44.5 +O-11367,64.6 +O-11368,16.2 +O-11369,77.0 +O-11370,16.4 +O-11371,16.8 +O-11372,35.7 +O-11373,36.4 +O-11374,100.1 +O-11375,15.9 +O-11376,30.3 +O-11377,21.8 +O-11378,44.2 +O-11379,22.5 +O-11380,22.0 +O-11381,22.7 +O-11382,36.3 +O-11383,30.1 +O-11384,15.9 +O-11385,45.4 +O-11386,15.5 +O-11387,31.6 +O-11388,22.0 +O-11389,40.5 +O-11390,69.5 +O-11391,15.4 +O-11392,17.4 +O-11393,41.2 +O-11394,27.6 +O-11395,28.1 +O-11396,57.0 +O-11397,24.1 +O-11398,79.3 +O-11399,58.0 +O-11400,22.9 +O-11401,28.3 +O-11402,32.4 +O-11403,37.0 +O-11404,35.2 +O-11405,26.5 +O-11406,21.4 +O-11407,24.4 +O-11408,28.3 +O-11409,21.2 +O-11410,26.5 +O-11411,16.5 +O-11412,31.4 +O-11413,32.5 +O-11414,49.6 +O-11415,26.5 +O-11416,55.9 +O-11417,40.2 +O-11418,25.4 +O-11419,52.1 +O-11420,34.7 +O-11421,62.9 +O-11422,42.3 +O-11423,55.3 +O-11424,50.4 +O-11425,47.7 +O-11426,12.4 +O-11427,22.1 +O-11428,22.6 +O-11429,21.1 +O-11430,19.9 +O-11431,50.0 +O-11432,20.3 +O-11433,33.7 +O-11434,32.7 +O-11435,45.5 +O-11436,23.8 +O-11437,28.0 +O-11438,15.4 +O-11439,20.0 +O-11440,23.8 +O-11441,51.1 +O-11442,34.7 +O-11443,25.1 +O-11444,54.6 +O-11445,30.9 +O-11446,17.0 +O-11447,25.5 +O-11448,20.0 +O-11449,37.3 +O-11450,66.2 +O-11451,19.4 +O-11452,24.5 +O-11453,31.1 +O-11454,61.1 +O-11455,18.1 +O-11456,56.2 +O-11457,25.3 +O-11458,31.9 +O-11459,20.3 +O-11460,49.3 +O-11461,45.0 +O-11462,62.0 +O-11463,32.1 +O-11464,77.8 +O-11465,52.9 +O-11466,28.7 +O-11467,62.2 +O-11468,18.4 +O-11469,32.6 +O-11470,26.4 +O-11471,22.5 +O-11472,21.1 +O-11473,49.5 +O-11474,61.2 +O-11475,28.7 +O-11476,18.1 +O-11477,15.4 +O-11478,22.7 +O-11479,69.5 +O-11480,16.4 +O-11481,22.8 +O-11482,15.8 +O-11483,13.5 +O-11484,53.7 +O-11485,55.2 +O-11486,18.4 +O-11487,19.5 +O-11488,26.7 +O-11489,33.2 +O-11490,33.0 +O-11491,50.8 +O-11492,31.2 +O-11493,28.4 +O-11494,58.1 +O-11495,18.3 +O-11496,33.2 +O-11497,85.3 +O-11498,23.9 +O-11499,33.8 +O-11500,27.0 +O-11501,46.2 +O-11502,32.8 +O-11503,25.4 +O-11504,19.8 +O-11505,27.3 +O-11506,40.5 +O-11507,48.6 +O-11508,49.5 +O-11509,16.5 +O-11510,38.6 +O-11511,28.1 +O-11512,12.3 +O-11513,52.6 +O-11514,52.1 +O-11515,18.0 +O-11516,24.0 +O-11517,14.5 +O-11518,23.8 +O-11519,37.2 +O-11520,37.1 +O-11521,25.9 +O-11522,21.7 +O-11523,29.9 +O-11524,25.2 +O-11525,24.2 +O-11526,34.3 +O-11527,33.9 +O-11528,31.7 +O-11529,37.7 +O-11530,37.2 +O-11531,25.6 +O-11532,33.5 +O-11533,22.6 +O-11534,25.3 +O-11535,43.8 +O-11536,40.3 +O-11537,24.6 +O-11538,36.0 +O-11539,44.1 +O-11540,17.7 +O-11541,28.7 +O-11542,23.2 +O-11543,19.7 +O-11544,34.9 +O-11545,22.6 +O-11546,38.2 +O-11547,30.3 +O-11548,82.2 +O-11549,18.8 +O-11550,46.9 +O-11551,53.9 +O-11552,49.0 +O-11553,24.6 +O-11554,29.4 +O-11555,17.6 +O-11556,27.5 +O-11557,15.3 +O-11558,22.5 +O-11559,40.4 +O-11560,61.1 +O-11561,28.4 +O-11562,31.1 +O-11563,21.0 +O-11564,13.9 +O-11565,16.0 +O-11566,61.7 +O-11567,23.8 +O-11568,23.3 +O-11569,39.9 +O-11570,31.7 +O-11571,43.1 +O-11572,11.7 +O-11573,21.0 +O-11574,21.5 +O-11575,18.9 +O-11576,29.7 +O-11577,18.2 +O-11578,22.7 +O-11579,38.7 +O-11580,39.6 +O-11581,21.4 +O-11582,13.1 +O-11583,19.3 +O-11584,28.6 +O-11585,39.4 +O-11586,40.7 +O-11587,37.4 +O-11588,17.0 +O-11589,42.1 +O-11590,25.8 +O-11591,24.7 +O-11592,31.7 +O-11593,36.7 +O-11594,37.3 +O-11595,32.0 +O-11596,45.8 +O-11597,22.2 +O-11598,66.5 +O-11599,18.4 +O-11600,14.1 +O-11601,35.9 +O-11602,28.9 +O-11603,24.1 +O-11604,37.6 +O-11605,33.2 +O-11606,23.1 +O-11607,37.3 +O-11608,23.9 +O-11609,18.8 +O-11610,31.6 +O-11611,13.9 +O-11612,16.2 +O-11613,28.6 +O-11614,29.6 +O-11615,36.0 +O-11616,28.5 +O-11617,15.0 +O-11618,20.8 +O-11619,14.9 +O-11620,31.6 +O-11621,43.1 +O-11622,18.3 +O-11623,19.4 +O-11624,61.9 +O-11625,24.0 +O-11626,21.8 +O-11627,20.1 +O-11628,15.7 +O-11629,15.7 +O-11630,27.1 +O-11631,44.1 +O-11632,12.8 +O-11633,32.4 +O-11634,22.6 +O-11635,24.8 +O-11636,48.5 +O-11637,67.4 +O-11638,22.2 +O-11639,27.9 +O-11640,12.1 +O-11641,26.4 +O-11642,15.6 +O-11643,50.3 +O-11644,18.4 +O-11645,41.0 +O-11646,14.8 +O-11647,44.0 +O-11648,33.1 +O-11649,39.7 +O-11650,40.3 +O-11651,28.2 +O-11652,17.7 +O-11653,26.3 +O-11654,41.7 +O-11655,23.3 +O-11656,28.6 +O-11657,70.8 +O-11658,28.5 +O-11659,35.9 +O-11660,20.9 +O-11661,41.0 +O-11662,42.0 +O-11663,41.1 +O-11664,40.8 +O-11665,45.2 +O-11666,32.1 +O-11667,21.6 +O-11668,21.2 +O-11669,36.0 +O-11670,38.0 +O-11671,47.0 +O-11672,34.6 +O-11673,65.9 +O-11674,51.2 +O-11675,19.5 +O-11676,29.6 +O-11677,50.4 +O-11678,64.2 +O-11679,43.8 +O-11680,20.5 +O-11681,31.3 +O-11682,15.0 +O-11683,37.4 +O-11684,25.4 +O-11685,30.0 +O-11686,69.4 +O-11687,14.0 +O-11688,61.5 +O-11689,27.2 +O-11690,28.8 +O-11691,45.9 +O-11692,16.0 +O-11693,38.5 +O-11694,26.4 +O-11695,14.4 +O-11696,23.7 +O-11697,31.1 +O-11698,35.6 +O-11699,20.8 +O-11700,50.5 +O-11701,66.2 +O-11702,28.1 +O-11703,61.5 +O-11704,21.3 +O-11705,53.6 +O-11706,17.9 +O-11707,56.6 +O-11708,54.0 +O-11709,21.2 +O-11710,35.1 +O-11711,56.3 +O-11712,42.9 +O-11713,15.6 +O-11714,29.2 +O-11715,37.0 +O-11716,22.3 +O-11717,70.1 +O-11718,75.7 +O-11719,35.6 +O-11720,21.1 +O-11721,27.0 +O-11722,34.1 +O-11723,17.6 +O-11724,31.7 +O-11725,29.7 +O-11726,36.5 +O-11727,15.0 +O-11728,28.1 +O-11729,16.9 +O-11730,40.3 +O-11731,67.7 +O-11732,32.0 +O-11733,20.5 +O-11734,44.0 +O-11735,33.5 +O-11736,25.7 +O-11737,17.1 +O-11738,39.0 +O-11739,42.7 +O-11740,52.5 +O-11741,35.8 +O-11742,15.7 +O-11743,24.6 +O-11744,40.2 +O-11745,16.7 +O-11746,18.3 +O-11747,24.2 +O-11748,44.4 +O-11749,10.8 +O-11750,35.1 +O-11751,30.3 +O-11752,20.7 +O-11753,60.0 +O-11754,29.4 +O-11755,18.9 +O-11756,30.4 +O-11757,78.3 +O-11758,42.6 +O-11759,27.9 +O-11760,42.1 +O-11761,18.8 +O-11762,34.5 +O-11763,20.5 +O-11764,44.6 +O-11765,29.3 +O-11766,74.2 +O-11767,51.2 +O-11768,34.7 +O-11769,52.7 +O-11770,52.0 +O-11771,58.0 +O-11772,60.7 +O-11773,19.9 +O-11774,52.9 +O-11775,30.8 +O-11776,30.1 +O-11777,31.0 +O-11778,23.0 +O-11779,28.7 +O-11780,17.1 +O-11781,38.0 +O-11782,34.4 +O-11783,30.9 +O-11784,18.7 +O-11785,68.9 +O-11786,41.6 +O-11787,24.0 +O-11788,24.7 +O-11789,53.2 +O-11790,25.0 +O-11791,60.5 +O-11792,44.1 +O-11793,31.0 +O-11794,29.4 +O-11795,46.1 +O-11796,55.4 +O-11797,18.7 +O-11798,41.3 +O-11799,34.1 +O-11800,31.8 +O-11801,14.8 +O-11802,37.6 +O-11803,23.5 +O-11804,15.2 +O-11805,25.3 +O-11806,36.9 +O-11807,36.7 +O-11808,34.1 +O-11809,17.6 +O-11810,37.6 +O-11811,73.9 +O-11812,28.5 +O-11813,34.2 +O-11814,53.0 +O-11815,23.4 +O-11816,25.0 +O-11817,21.2 +O-11818,53.8 +O-11819,46.3 +O-11820,22.9 +O-11821,44.7 +O-11822,43.4 +O-11823,15.1 +O-11824,39.6 +O-11825,46.6 +O-11826,82.3 +O-11827,50.4 +O-11828,13.2 +O-11829,27.7 +O-11830,31.2 +O-11831,19.7 +O-11832,48.3 +O-11833,28.6 +O-11834,34.2 +O-11835,31.7 +O-11836,55.5 +O-11837,30.1 +O-11838,25.6 +O-11839,35.8 +O-11840,23.0 +O-11841,47.2 +O-11842,30.8 +O-11843,10.1 +O-11844,22.6 +O-11845,35.6 +O-11846,40.5 +O-11847,17.6 +O-11848,20.8 +O-11849,29.1 +O-11850,11.0 +O-11851,30.2 +O-11852,25.9 +O-11853,38.1 +O-11854,35.7 +O-11855,20.0 +O-11856,28.9 +O-11857,49.7 +O-11858,57.5 +O-11859,41.5 +O-11860,44.3 +O-11861,51.2 +O-11862,31.9 +O-11863,20.1 +O-11864,31.5 +O-11865,45.4 +O-11866,16.7 +O-11867,36.6 +O-11868,46.4 +O-11869,16.1 +O-11870,21.3 +O-11871,31.8 +O-11872,44.3 +O-11873,42.6 +O-11874,31.1 +O-11875,34.6 +O-11876,16.3 +O-11877,34.2 +O-11878,27.0 +O-11879,26.2 +O-11880,18.6 +O-11881,43.2 +O-11882,30.3 +O-11883,32.1 +O-11884,41.0 +O-11885,44.6 +O-11886,24.0 +O-11887,49.6 +O-11888,33.0 +O-11889,47.3 +O-11890,21.9 +O-11891,22.3 +O-11892,13.7 +O-11893,61.8 +O-11894,27.2 +O-11895,26.9 +O-11896,29.7 +O-11897,51.6 +O-11898,32.9 +O-11899,26.5 +O-11900,40.6 +O-11901,18.2 +O-11902,25.8 +O-11903,28.2 +O-11904,24.3 +O-11905,32.8 +O-11906,57.8 +O-11907,19.8 +O-11908,28.7 +O-11909,26.5 +O-11910,40.4 +O-11911,47.1 +O-11912,57.9 +O-11913,30.0 +O-11914,13.3 +O-11915,26.7 +O-11916,57.4 +O-11917,38.1 +O-11918,15.8 +O-11919,28.3 +O-11920,27.2 +O-11921,25.3 +O-11922,22.8 +O-11923,36.5 +O-11924,26.1 +O-11925,27.8 +O-11926,24.8 +O-11927,70.0 +O-11928,37.3 +O-11929,26.4 +O-11930,38.3 +O-11931,38.4 +O-11932,58.0 +O-11933,19.1 +O-11934,21.6 +O-11935,26.3 +O-11936,27.9 +O-11937,15.7 +O-11938,46.1 +O-11939,43.0 +O-11940,42.2 +O-11941,59.7 +O-11942,23.2 +O-11943,18.1 +O-11944,26.0 +O-11945,46.9 +O-11946,33.4 +O-11947,20.2 +O-11948,45.6 +O-11949,32.7 +O-11950,16.3 +O-11951,50.0 +O-11952,20.4 +O-11953,31.0 +O-11954,17.3 +O-11955,40.9 +O-11956,36.2 +O-11957,46.6 +O-11958,55.7 +O-11959,35.5 +O-11960,17.2 +O-11961,19.8 +O-11962,26.1 +O-11963,43.9 +O-11964,62.4 +O-11965,16.8 +O-11966,68.1 +O-11967,45.9 +O-11968,35.5 +O-11969,13.3 +O-11970,53.5 +O-11971,63.1 +O-11972,36.0 +O-11973,24.9 +O-11974,52.6 +O-11975,41.4 +O-11976,16.1 +O-11977,42.1 +O-11978,31.7 +O-11979,21.1 +O-11980,36.3 +O-11981,39.5 +O-11982,16.0 +O-11983,29.8 +O-11984,32.6 +O-11985,82.7 +O-11986,33.5 +O-11987,36.1 +O-11988,41.0 +O-11989,32.1 +O-11990,43.3 +O-11991,18.0 +O-11992,11.9 +O-11993,39.3 +O-11994,96.0 +O-11995,46.3 +O-11996,55.2 +O-11997,22.2 +O-11998,15.1 +O-11999,60.7 +O-12000,17.7 +O-12001,29.4 +O-12002,31.7 +O-12003,27.0 +O-12004,25.1 +O-12005,26.3 +O-12006,21.6 +O-12007,61.1 +O-12008,48.4 +O-12009,21.4 +O-12010,40.0 +O-12011,33.3 +O-12012,44.9 +O-12013,26.6 +O-12014,71.7 +O-12015,31.5 +O-12016,36.4 +O-12017,18.4 +O-12018,33.0 +O-12019,36.5 +O-12020,27.1 +O-12021,29.8 +O-12022,50.1 +O-12023,30.6 +O-12024,34.4 +O-12025,33.2 +O-12026,22.8 +O-12027,22.3 +O-12028,42.0 +O-12029,52.4 +O-12030,55.9 +O-12031,25.9 +O-12032,42.1 +O-12033,42.7 +O-12034,18.9 +O-12035,40.3 +O-12036,37.0 +O-12037,58.1 +O-12038,95.9 +O-12039,32.2 +O-12040,16.4 +O-12041,22.4 +O-12042,26.8 +O-12043,53.6 +O-12044,32.2 +O-12045,65.4 +O-12046,28.2 +O-12047,56.6 +O-12048,36.5 +O-12049,15.6 +O-12050,19.1 +O-12051,26.9 +O-12052,51.0 +O-12053,54.3 +O-12054,39.2 +O-12055,59.2 +O-12056,49.1 +O-12057,54.3 +O-12058,42.2 +O-12059,23.9 +O-12060,22.4 +O-12061,37.7 +O-12062,31.9 +O-12063,15.9 +O-12064,26.4 +O-12065,38.2 +O-12066,43.9 +O-12067,17.1 +O-12068,29.7 +O-12069,27.3 +O-12070,31.3 +O-12071,20.9 +O-12072,31.0 +O-12073,19.2 +O-12074,37.3 +O-12075,23.3 +O-12076,53.5 +O-12077,34.5 +O-12078,37.4 +O-12079,47.5 +O-12080,28.0 +O-12081,17.8 +O-12082,19.4 +O-12083,41.1 +O-12084,53.0 +O-12085,31.8 +O-12086,30.9 +O-12087,18.5 +O-12088,28.6 +O-12089,61.2 +O-12090,27.4 +O-12091,22.9 +O-12092,38.0 +O-12093,18.4 +O-12094,61.2 +O-12095,29.9 +O-12096,33.9 +O-12097,44.6 +O-12098,32.4 +O-12099,53.0 +O-12100,29.2 +O-12101,33.0 +O-12102,49.3 +O-12103,21.7 +O-12104,43.9 +O-12105,77.0 +O-12106,31.9 +O-12107,31.7 +O-12108,14.4 +O-12109,20.2 +O-12110,24.4 +O-12111,19.6 +O-12112,12.3 +O-12113,42.5 +O-12114,25.7 +O-12115,25.2 +O-12116,23.0 +O-12117,42.5 +O-12118,50.6 +O-12119,51.5 +O-12120,10.0 +O-12121,24.6 +O-12122,34.8 +O-12123,26.7 +O-12124,49.0 +O-12125,27.2 +O-12126,36.5 +O-12127,25.0 +O-12128,85.8 +O-12129,84.4 +O-12130,37.2 +O-12131,23.7 +O-12132,34.7 +O-12133,34.0 +O-12134,24.4 +O-12135,42.9 +O-12136,12.6 +O-12137,49.9 +O-12138,34.1 +O-12139,34.1 +O-12140,31.7 +O-12141,33.1 +O-12142,33.1 +O-12143,18.4 +O-12144,48.5 +O-12145,26.4 +O-12146,20.9 +O-12147,42.3 +O-12148,54.7 +O-12149,25.6 +O-12150,21.6 +O-12151,49.9 +O-12152,35.0 +O-12153,22.0 +O-12154,29.6 +O-12155,23.6 +O-12156,17.1 +O-12157,33.9 +O-12158,35.1 +O-12159,31.8 +O-12160,73.8 +O-12161,24.0 +O-12162,23.2 +O-12163,29.9 +O-12164,26.4 +O-12165,24.6 +O-12166,40.1 +O-12167,27.3 +O-12168,22.3 +O-12169,58.3 +O-12170,37.9 +O-12171,27.8 +O-12172,15.9 +O-12173,73.6 +O-12174,41.9 +O-12175,43.4 +O-12176,30.9 +O-12177,18.6 +O-12178,27.5 +O-12179,10.3 +O-12180,20.4 +O-12181,34.8 +O-12182,17.7 +O-12183,27.2 +O-12184,78.4 +O-12185,14.1 +O-12186,32.0 +O-12187,28.1 +O-12188,30.6 +O-12189,30.4 +O-12190,35.8 +O-12191,10.1 +O-12192,57.0 +O-12193,22.0 +O-12194,26.9 +O-12195,24.5 +O-12196,38.5 +O-12197,32.6 +O-12198,34.6 +O-12199,26.9 +O-12200,72.0 +O-12201,15.0 +O-12202,28.6 +O-12203,38.3 +O-12204,34.0 +O-12205,19.1 +O-12206,32.5 +O-12207,25.5 +O-12208,23.4 +O-12209,76.5 +O-12210,19.2 +O-12211,44.4 +O-12212,17.9 +O-12213,112.7 +O-12214,34.4 +O-12215,35.9 +O-12216,21.3 +O-12217,25.9 +O-12218,26.6 +O-12219,13.8 +O-12220,20.7 +O-12221,42.8 +O-12222,81.2 +O-12223,18.9 +O-12224,55.4 +O-12225,36.2 +O-12226,19.9 +O-12227,11.2 +O-12228,15.8 +O-12229,38.4 +O-12230,38.1 +O-12231,33.7 +O-12232,30.7 +O-12233,31.3 +O-12234,41.1 +O-12235,21.3 +O-12236,40.3 +O-12237,103.9 +O-12238,55.8 +O-12239,63.1 +O-12240,24.2 +O-12241,26.6 +O-12242,20.2 +O-12243,21.9 +O-12244,29.9 +O-12245,58.6 +O-12246,52.8 +O-12247,14.6 +O-12248,56.1 +O-12249,34.1 +O-12250,56.7 +O-12251,38.0 +O-12252,38.7 +O-12253,16.5 +O-12254,21.9 +O-12255,36.4 +O-12256,69.6 +O-12257,20.2 +O-12258,38.1 +O-12259,14.8 +O-12260,36.9 +O-12261,15.7 +O-12262,23.8 +O-12263,37.2 +O-12264,27.1 +O-12265,17.9 +O-12266,35.6 +O-12267,22.9 +O-12268,44.0 +O-12269,29.8 +O-12270,43.0 +O-12271,14.9 +O-12272,21.7 +O-12273,16.6 +O-12274,35.4 +O-12275,26.9 +O-12276,28.8 +O-12277,65.6 +O-12278,19.1 +O-12279,63.9 +O-12280,31.0 +O-12281,47.5 +O-12282,32.2 +O-12283,43.3 +O-12284,41.3 +O-12285,44.5 +O-12286,21.8 +O-12287,28.1 +O-12288,19.7 +O-12289,28.7 +O-12290,35.5 +O-12291,23.7 +O-12292,32.4 +O-12293,27.6 +O-12294,47.9 +O-12295,35.1 +O-12296,41.6 +O-12297,27.4 +O-12298,42.9 +O-12299,21.9 +O-12300,17.7 +O-12301,18.2 +O-12302,38.1 +O-12303,38.9 +O-12304,41.3 +O-12305,31.2 +O-12306,23.8 +O-12307,19.1 +O-12308,30.9 +O-12309,38.6 +O-12310,22.0 +O-12311,20.8 +O-12312,22.3 +O-12313,15.1 +O-12314,20.8 +O-12315,20.8 +O-12316,39.1 +O-12317,23.4 +O-12318,12.7 +O-12319,77.6 +O-12320,35.4 +O-12321,14.4 +O-12322,33.8 +O-12323,34.4 +O-12324,17.3 +O-12325,62.0 +O-12326,26.3 +O-12327,30.3 +O-12328,75.1 +O-12329,20.9 +O-12330,46.1 +O-12331,32.5 +O-12332,69.9 +O-12333,54.1 +O-12334,45.2 +O-12335,13.3 +O-12336,25.7 +O-12337,44.5 +O-12338,35.7 +O-12339,30.3 +O-12340,32.5 +O-12341,34.0 +O-12342,14.1 +O-12343,72.3 +O-12344,27.3 +O-12345,40.2 +O-12346,41.7 +O-12347,30.2 +O-12348,33.9 +O-12349,60.6 +O-12350,51.7 +O-12351,30.1 +O-12352,17.5 +O-12353,33.6 +O-12354,41.2 +O-12355,32.5 +O-12356,20.4 +O-12357,41.4 +O-12358,21.9 +O-12359,18.1 +O-12360,40.3 +O-12361,16.5 +O-12362,21.8 +O-12363,33.5 +O-12364,42.5 +O-12365,38.6 +O-12366,21.3 +O-12367,24.6 +O-12368,48.6 +O-12369,29.7 +O-12370,26.3 +O-12371,53.9 +O-12372,24.9 +O-12373,27.4 +O-12374,56.2 +O-12375,61.2 +O-12376,11.9 +O-12377,20.0 +O-12378,67.3 +O-12379,24.9 +O-12380,50.1 +O-12381,19.6 +O-12382,36.9 +O-12383,23.2 +O-12384,25.0 +O-12385,70.2 +O-12386,20.3 +O-12387,47.1 +O-12388,42.1 +O-12389,31.4 +O-12390,46.8 +O-12391,51.4 +O-12392,25.1 +O-12393,46.8 +O-12394,34.0 +O-12395,38.4 +O-12396,22.0 +O-12397,49.7 +O-12398,27.5 +O-12399,46.0 +O-12400,26.5 +O-12401,35.4 +O-12402,61.2 +O-12403,13.2 +O-12404,52.6 +O-12405,29.1 +O-12406,71.3 +O-12407,19.7 +O-12408,17.8 +O-12409,37.5 +O-12410,52.8 +O-12411,29.6 +O-12412,45.1 +O-12413,34.2 +O-12414,35.0 +O-12415,41.0 +O-12416,50.6 +O-12417,18.4 +O-12418,31.1 +O-12419,47.4 +O-12420,25.9 +O-12421,63.3 +O-12422,26.6 +O-12423,14.3 +O-12424,18.0 +O-12425,18.5 +O-12426,27.9 +O-12427,15.5 +O-12428,47.5 +O-12429,47.1 +O-12430,52.4 +O-12431,57.2 +O-12432,41.8 +O-12433,24.5 +O-12434,19.6 +O-12435,48.8 +O-12436,33.4 +O-12437,58.8 +O-12438,18.2 +O-12439,22.6 +O-12440,34.0 +O-12441,62.1 +O-12442,25.2 +O-12443,43.2 +O-12444,18.8 +O-12445,18.8 +O-12446,23.2 +O-12447,34.7 +O-12448,27.5 +O-12449,32.4 +O-12450,75.5 +O-12451,39.1 +O-12452,30.8 +O-12453,30.4 +O-12454,66.5 +O-12455,55.1 +O-12456,20.4 +O-12457,31.1 +O-12458,16.0 +O-12459,33.7 +O-12460,25.9 +O-12461,24.4 +O-12462,37.1 +O-12463,46.6 +O-12464,46.5 +O-12465,27.2 +O-12466,34.9 +O-12467,36.9 +O-12468,19.3 +O-12469,27.3 +O-12470,99.6 +O-12471,15.4 +O-12472,18.4 +O-12473,33.6 +O-12474,32.8 +O-12475,24.0 +O-12476,69.6 +O-12477,36.8 +O-12478,27.4 +O-12479,41.4 +O-12480,52.0 +O-12481,44.7 +O-12482,44.5 +O-12483,25.4 +O-12484,45.2 +O-12485,28.9 +O-12486,24.7 +O-12487,54.8 +O-12488,19.8 +O-12489,34.6 +O-12490,54.2 +O-12491,39.3 +O-12492,23.9 +O-12493,59.6 +O-12494,44.2 +O-12495,54.1 +O-12496,24.6 +O-12497,37.5 +O-12498,36.2 +O-12499,66.4 +O-12500,28.2 +O-12501,61.6 +O-12502,21.2 +O-12503,11.7 +O-12504,36.8 +O-12505,36.8 +O-12506,67.1 +O-12507,37.4 +O-12508,17.5 +O-12509,74.6 +O-12510,13.2 +O-12511,36.9 +O-12512,42.2 +O-12513,22.1 +O-12514,24.4 +O-12515,15.2 +O-12516,19.1 +O-12517,19.0 +O-12518,34.9 +O-12519,20.7 +O-12520,28.0 +O-12521,20.5 +O-12522,43.4 +O-12523,22.2 +O-12524,38.8 +O-12525,15.5 +O-12526,38.4 +O-12527,94.9 +O-12528,25.3 +O-12529,35.3 +O-12530,71.2 +O-12531,15.4 +O-12532,25.0 +O-12533,47.4 +O-12534,40.6 +O-12535,21.3 +O-12536,19.5 +O-12537,59.7 +O-12538,28.0 +O-12539,17.9 +O-12540,41.7 +O-12541,53.7 +O-12542,34.1 +O-12543,30.0 +O-12544,27.4 +O-12545,59.6 +O-12546,38.2 +O-12547,24.9 +O-12548,49.0 +O-12549,43.9 +O-12550,71.9 +O-12551,14.1 +O-12552,14.9 +O-12553,22.3 +O-12554,31.1 +O-12555,35.0 +O-12556,23.1 +O-12557,55.9 +O-12558,44.8 +O-12559,36.5 +O-12560,19.9 +O-12561,14.2 +O-12562,28.1 +O-12563,27.7 +O-12564,19.8 +O-12565,25.5 +O-12566,35.0 +O-12567,41.4 +O-12568,44.0 +O-12569,17.6 +O-12570,51.4 +O-12571,43.8 +O-12572,33.3 +O-12573,80.1 +O-12574,22.9 +O-12575,16.7 +O-12576,45.6 +O-12577,25.5 +O-12578,64.7 +O-12579,51.0 +O-12580,52.1 +O-12581,36.2 +O-12582,30.7 +O-12583,55.5 +O-12584,19.6 +O-12585,31.9 +O-12586,38.3 +O-12587,47.4 +O-12588,33.4 +O-12589,30.7 +O-12590,69.0 +O-12591,31.1 +O-12592,28.3 +O-12593,71.7 +O-12594,25.3 +O-12595,74.1 +O-12596,83.4 +O-12597,21.2 +O-12598,36.0 +O-12599,36.5 +O-12600,21.7 +O-12601,56.4 +O-12602,19.7 +O-12603,49.4 +O-12604,22.0 +O-12605,33.7 +O-12606,48.6 +O-12607,39.8 +O-12608,41.1 +O-12609,26.9 +O-12610,16.7 +O-12611,55.4 +O-12612,33.5 +O-12613,36.4 +O-12614,54.9 +O-12615,49.3 +O-12616,24.0 +O-12617,20.9 +O-12618,33.7 +O-12619,43.5 +O-12620,29.6 +O-12621,20.3 +O-12622,71.7 +O-12623,39.0 +O-12624,27.0 +O-12625,45.1 +O-12626,30.5 +O-12627,27.0 +O-12628,19.2 +O-12629,51.9 +O-12630,50.0 +O-12631,14.6 +O-12632,45.7 +O-12633,30.7 +O-12634,36.7 +O-12635,19.3 +O-12636,27.8 +O-12637,24.9 +O-12638,20.0 +O-12639,41.9 +O-12640,24.3 +O-12641,49.4 +O-12642,33.2 +O-12643,37.0 +O-12644,37.0 +O-12645,27.6 +O-12646,87.5 +O-12647,50.0 +O-12648,17.7 +O-12649,27.4 +O-12650,15.2 +O-12651,54.5 +O-12652,31.2 +O-12653,64.3 +O-12654,24.3 +O-12655,20.5 +O-12656,32.5 +O-12657,30.4 +O-12658,35.4 +O-12659,39.0 +O-12660,52.7 +O-12661,40.4 +O-12662,20.1 +O-12663,35.2 +O-12664,36.8 +O-12665,35.2 +O-12666,38.8 +O-12667,47.7 +O-12668,44.6 +O-12669,40.0 +O-12670,19.4 +O-12671,56.9 +O-12672,48.4 +O-12673,30.1 +O-12674,55.3 +O-12675,31.9 +O-12676,32.0 +O-12677,45.6 +O-12678,31.3 +O-12679,46.5 +O-12680,55.3 +O-12681,23.4 +O-12682,69.6 +O-12683,44.2 +O-12684,39.4 +O-12685,33.9 +O-12686,29.3 +O-12687,22.8 +O-12688,42.2 +O-12689,28.1 +O-12690,31.5 +O-12691,45.0 +O-12692,35.5 +O-12693,28.6 +O-12694,21.8 +O-12695,19.8 +O-12696,24.5 +O-12697,15.8 +O-12698,54.1 +O-12699,60.8 +O-12700,14.1 +O-12701,27.4 +O-12702,27.4 +O-12703,20.4 +O-12704,26.8 +O-12705,24.4 +O-12706,51.0 +O-12707,30.5 +O-12708,35.5 +O-12709,39.1 +O-12710,40.6 +O-12711,20.4 +O-12712,41.1 +O-12713,19.5 +O-12714,47.0 +O-12715,20.4 +O-12716,22.2 +O-12717,58.4 +O-12718,42.9 +O-12719,21.3 +O-12720,19.0 +O-12721,32.1 +O-12722,40.4 +O-12723,21.7 +O-12724,22.9 +O-12725,33.3 +O-12726,34.3 +O-12727,31.2 +O-12728,43.0 +O-12729,41.3 +O-12730,41.7 +O-12731,56.5 +O-12732,30.4 +O-12733,57.2 +O-12734,49.0 +O-12735,32.0 +O-12736,35.1 +O-12737,21.7 +O-12738,23.6 +O-12739,34.8 +O-12740,30.4 +O-12741,43.9 +O-12742,51.3 +O-12743,23.5 +O-12744,18.8 +O-12745,11.1 +O-12746,19.7 +O-12747,24.6 +O-12748,45.2 +O-12749,38.3 +O-12750,39.0 +O-12751,14.8 +O-12752,32.8 +O-12753,32.8 +O-12754,18.2 +O-12755,32.5 +O-12756,16.2 +O-12757,19.0 +O-12758,18.3 +O-12759,27.3 +O-12760,58.3 +O-12761,39.2 +O-12762,29.0 +O-12763,35.1 +O-12764,21.6 +O-12765,37.4 +O-12766,35.5 +O-12767,31.7 +O-12768,12.8 +O-12769,49.2 +O-12770,25.3 +O-12771,25.1 +O-12772,69.9 +O-12773,28.1 +O-12774,52.0 +O-12775,19.0 +O-12776,32.4 +O-12777,44.5 +O-12778,23.4 +O-12779,51.0 +O-12780,32.2 +O-12781,20.7 +O-12782,22.3 +O-12783,38.5 +O-12784,20.2 +O-12785,63.0 +O-12786,52.5 +O-12787,33.8 +O-12788,42.3 +O-12789,56.6 +O-12790,32.7 +O-12791,16.2 +O-12792,41.3 +O-12793,46.2 +O-12794,20.9 +O-12795,36.8 +O-12796,18.8 +O-12797,41.1 +O-12798,17.7 +O-12799,17.3 +O-12800,38.5 +O-12801,21.3 +O-12802,36.4 +O-12803,57.2 +O-12804,25.1 +O-12805,70.1 +O-12806,28.2 +O-12807,38.9 +O-12808,30.6 +O-12809,19.4 +O-12810,32.6 +O-12811,16.3 +O-12812,25.6 +O-12813,41.6 +O-12814,23.3 +O-12815,11.1 +O-12816,28.6 +O-12817,14.4 +O-12818,23.0 +O-12819,55.9 +O-12820,52.7 +O-12821,26.3 +O-12822,41.8 +O-12823,38.2 +O-12824,35.9 +O-12825,30.9 +O-12826,31.3 +O-12827,21.5 +O-12828,76.5 +O-12829,71.7 +O-12830,24.5 +O-12831,29.6 +O-12832,19.4 +O-12833,97.1 +O-12834,30.7 +O-12835,23.2 +O-12836,34.9 +O-12837,102.3 +O-12838,52.7 +O-12839,16.8 +O-12840,65.1 +O-12841,52.0 +O-12842,74.0 +O-12843,18.5 +O-12844,16.3 +O-12845,46.7 +O-12846,21.4 +O-12847,77.8 +O-12848,22.3 +O-12849,22.7 +O-12850,29.6 +O-12851,22.3 +O-12852,51.8 +O-12853,51.0 +O-12854,41.0 +O-12855,12.5 +O-12856,44.8 +O-12857,37.2 +O-12858,20.6 +O-12859,67.3 +O-12860,48.3 +O-12861,23.7 +O-12862,16.3 +O-12863,29.9 +O-12864,23.0 +O-12865,45.1 +O-12866,28.0 +O-12867,49.0 +O-12868,42.0 +O-12869,28.7 +O-12870,22.8 +O-12871,28.2 +O-12872,74.8 +O-12873,38.5 +O-12874,50.7 +O-12875,22.8 +O-12876,26.8 +O-12877,32.3 +O-12878,19.1 +O-12879,49.2 +O-12880,59.2 +O-12881,26.0 +O-12882,23.9 +O-12883,67.9 +O-12884,80.7 +O-12885,17.2 +O-12886,15.3 +O-12887,14.4 +O-12888,52.5 +O-12889,28.0 +O-12890,26.4 +O-12891,31.4 +O-12892,19.0 +O-12893,45.5 +O-12894,36.6 +O-12895,39.9 +O-12896,33.0 +O-12897,18.4 +O-12898,53.1 +O-12899,26.2 +O-12900,28.9 +O-12901,61.1 +O-12902,25.7 +O-12903,24.4 +O-12904,59.1 +O-12905,16.2 +O-12906,51.9 +O-12907,42.6 +O-12908,22.3 +O-12909,41.2 +O-12910,17.6 +O-12911,26.2 +O-12912,50.0 +O-12913,24.7 +O-12914,14.5 +O-12915,18.3 +O-12916,41.8 +O-12917,42.9 +O-12918,38.2 +O-12919,26.4 +O-12920,30.5 +O-12921,33.0 +O-12922,35.5 +O-12923,15.2 +O-12924,37.2 +O-12925,27.4 +O-12926,44.3 +O-12927,29.9 +O-12928,26.5 +O-12929,51.5 +O-12930,53.4 +O-12931,29.3 +O-12932,13.4 +O-12933,20.1 +O-12934,95.0 +O-12935,33.9 +O-12936,43.4 +O-12937,55.2 +O-12938,32.5 +O-12939,34.2 +O-12940,25.4 +O-12941,21.5 +O-12942,94.2 +O-12943,15.4 +O-12944,46.5 +O-12945,31.8 +O-12946,18.0 +O-12947,20.9 +O-12948,79.5 +O-12949,35.9 +O-12950,74.2 +O-12951,78.0 +O-12952,18.5 +O-12953,31.0 +O-12954,13.2 +O-12955,54.8 +O-12956,35.0 +O-12957,29.7 +O-12958,25.8 +O-12959,63.8 +O-12960,18.0 +O-12961,34.2 +O-12962,29.9 +O-12963,30.8 +O-12964,28.5 +O-12965,57.4 +O-12966,28.5 +O-12967,19.5 +O-12968,38.7 +O-12969,18.1 +O-12970,51.1 +O-12971,24.9 +O-12972,34.6 +O-12973,20.3 +O-12974,37.5 +O-12975,42.1 +O-12976,35.8 +O-12977,35.8 +O-12978,27.8 +O-12979,22.4 +O-12980,51.8 +O-12981,21.7 +O-12982,26.4 +O-12983,22.0 +O-12984,48.8 +O-12985,23.8 +O-12986,29.2 +O-12987,25.7 +O-12988,28.0 +O-12989,37.8 +O-12990,30.1 +O-12991,37.7 +O-12992,81.6 +O-12993,20.3 +O-12994,37.2 +O-12995,29.7 +O-12996,22.7 +O-12997,44.9 +O-12998,28.1 +O-12999,40.5 +O-13000,50.8 +O-13001,30.7 +O-13002,21.0 +O-13003,48.3 +O-13004,42.3 +O-13005,24.7 +O-13006,31.0 +O-13007,59.3 +O-13008,19.8 +O-13009,43.2 +O-13010,35.6 +O-13011,25.3 +O-13012,42.4 +O-13013,34.2 +O-13014,30.5 +O-13015,19.5 +O-13016,30.0 +O-13017,56.5 +O-13018,17.0 +O-13019,30.3 +O-13020,40.5 +O-13021,26.3 +O-13022,51.5 +O-13023,21.6 +O-13024,71.6 +O-13025,20.4 +O-13026,49.4 +O-13027,25.4 +O-13028,45.7 +O-13029,16.6 +O-13030,21.5 +O-13031,36.0 +O-13032,33.7 +O-13033,39.0 +O-13034,37.3 +O-13035,40.6 +O-13036,54.4 +O-13037,79.1 +O-13038,21.9 +O-13039,65.5 +O-13040,44.3 +O-13041,42.0 +O-13042,29.9 +O-13043,47.4 +O-13044,14.6 +O-13045,23.8 +O-13046,42.9 +O-13047,21.7 +O-13048,19.6 +O-13049,43.4 +O-13050,48.1 +O-13051,49.4 +O-13052,22.7 +O-13053,27.3 +O-13054,52.7 +O-13055,55.9 +O-13056,33.8 +O-13057,15.3 +O-13058,50.1 +O-13059,19.7 +O-13060,48.5 +O-13061,30.0 +O-13062,27.3 +O-13063,73.6 +O-13064,57.3 +O-13065,49.0 +O-13066,49.7 +O-13067,48.2 +O-13068,22.0 +O-13069,16.9 +O-13070,68.9 +O-13071,27.7 +O-13072,15.3 +O-13073,59.9 +O-13074,16.1 +O-13075,14.8 +O-13076,46.6 +O-13077,30.1 +O-13078,51.9 +O-13079,39.0 +O-13080,26.6 +O-13081,21.6 +O-13082,47.5 +O-13083,31.5 +O-13084,14.7 +O-13085,35.6 +O-13086,49.5 +O-13087,15.4 +O-13088,17.2 +O-13089,57.0 +O-13090,28.1 +O-13091,28.0 +O-13092,69.9 +O-13093,57.4 +O-13094,40.6 +O-13095,29.5 +O-13096,14.4 +O-13097,45.8 +O-13098,51.2 +O-13099,33.5 +O-13100,27.7 +O-13101,15.8 +O-13102,40.7 +O-13103,45.9 +O-13104,76.6 +O-13105,47.3 +O-13106,52.7 +O-13107,37.3 +O-13108,39.5 +O-13109,62.6 +O-13110,71.8 +O-13111,40.0 +O-13112,26.8 +O-13113,31.5 +O-13114,65.5 +O-13115,49.9 +O-13116,55.8 +O-13117,37.2 +O-13118,36.5 +O-13119,20.9 +O-13120,20.8 +O-13121,27.4 +O-13122,19.7 +O-13123,41.7 +O-13124,56.9 +O-13125,35.0 +O-13126,20.5 +O-13127,31.1 +O-13128,32.6 +O-13129,81.7 +O-13130,38.4 +O-13131,30.4 +O-13132,39.2 +O-13133,36.7 +O-13134,21.9 +O-13135,27.2 +O-13136,38.6 +O-13137,44.5 +O-13138,14.9 +O-13139,65.1 +O-13140,23.0 +O-13141,58.8 +O-13142,46.7 +O-13143,72.3 +O-13144,31.4 +O-13145,55.2 +O-13146,69.5 +O-13147,20.5 +O-13148,18.9 +O-13149,46.8 +O-13150,26.7 +O-13151,21.0 +O-13152,34.8 +O-13153,32.6 +O-13154,23.1 +O-13155,43.5 +O-13156,49.1 +O-13157,35.1 +O-13158,39.7 +O-13159,23.3 +O-13160,32.3 +O-13161,46.0 +O-13162,33.7 +O-13163,27.2 +O-13164,48.6 +O-13165,17.4 +O-13166,34.7 +O-13167,44.6 +O-13168,23.6 +O-13169,36.3 +O-13170,12.7 +O-13171,37.3 +O-13172,24.4 +O-13173,26.1 +O-13174,75.2 +O-13175,16.2 +O-13176,48.5 +O-13177,59.4 +O-13178,51.5 +O-13179,37.5 +O-13180,22.8 +O-13181,26.3 +O-13182,31.9 +O-13183,41.8 +O-13184,41.7 +O-13185,34.7 +O-13186,59.9 +O-13187,21.2 +O-13188,24.2 +O-13189,30.1 +O-13190,26.4 +O-13191,30.7 +O-13192,22.7 +O-13193,19.8 +O-13194,21.3 +O-13195,18.8 +O-13196,43.4 +O-13197,26.7 +O-13198,24.6 +O-13199,43.1 +O-13200,15.9 +O-13201,55.8 +O-13202,94.3 +O-13203,12.9 +O-13204,17.4 +O-13205,25.9 +O-13206,22.9 +O-13207,24.7 +O-13208,34.2 +O-13209,10.4 +O-13210,18.4 +O-13211,32.1 +O-13212,16.0 +O-13213,30.4 +O-13214,24.0 +O-13215,30.0 +O-13216,51.2 +O-13217,35.0 +O-13218,16.8 +O-13219,53.2 +O-13220,36.5 +O-13221,20.4 +O-13222,28.5 +O-13223,20.4 +O-13224,17.8 +O-13225,40.5 +O-13226,10.0 +O-13227,60.9 +O-13228,23.5 +O-13229,35.8 +O-13230,60.9 +O-13231,39.4 +O-13232,15.5 +O-13233,23.7 +O-13234,24.7 +O-13235,32.5 +O-13236,41.0 +O-13237,31.4 +O-13238,26.8 +O-13239,45.4 +O-13240,26.1 +O-13241,37.0 +O-13242,31.6 +O-13243,30.5 +O-13244,34.1 +O-13245,33.0 +O-13246,54.1 +O-13247,57.0 +O-13248,27.2 +O-13249,32.9 +O-13250,23.4 +O-13251,28.6 +O-13252,26.1 +O-13253,34.9 +O-13254,20.5 +O-13255,30.0 +O-13256,28.0 +O-13257,21.3 +O-13258,33.0 +O-13259,10.7 +O-13260,24.2 +O-13261,41.5 +O-13262,53.4 +O-13263,30.3 +O-13264,25.0 +O-13265,23.3 +O-13266,37.3 +O-13267,50.6 +O-13268,33.7 +O-13269,31.4 +O-13270,46.8 +O-13271,12.3 +O-13272,23.2 +O-13273,38.4 +O-13274,57.1 +O-13275,18.9 +O-13276,28.3 +O-13277,50.4 +O-13278,32.8 +O-13279,37.5 +O-13280,16.2 +O-13281,15.5 +O-13282,78.2 +O-13283,41.0 +O-13284,52.1 +O-13285,20.2 +O-13286,45.6 +O-13287,35.5 +O-13288,23.4 +O-13289,30.1 +O-13290,29.9 +O-13291,40.7 +O-13292,23.1 +O-13293,50.2 +O-13294,24.6 +O-13295,31.6 +O-13296,21.7 +O-13297,40.2 +O-13298,18.5 +O-13299,19.3 +O-13300,67.9 +O-13301,42.8 +O-13302,62.0 +O-13303,62.4 +O-13304,62.5 +O-13305,39.8 +O-13306,37.0 +O-13307,14.4 +O-13308,54.7 +O-13309,38.1 +O-13310,73.1 +O-13311,18.9 +O-13312,29.6 +O-13313,36.1 +O-13314,37.9 +O-13315,35.4 +O-13316,52.7 +O-13317,42.3 +O-13318,65.5 +O-13319,42.4 +O-13320,29.9 +O-13321,58.8 +O-13322,31.6 +O-13323,12.4 +O-13324,54.5 +O-13325,29.6 +O-13326,29.3 +O-13327,24.0 +O-13328,17.9 +O-13329,41.6 +O-13330,23.8 +O-13331,17.3 +O-13332,35.7 +O-13333,62.7 +O-13334,73.4 +O-13335,21.1 +O-13336,44.7 +O-13337,21.6 +O-13338,59.0 +O-13339,23.7 +O-13340,85.0 +O-13341,42.5 +O-13342,22.3 +O-13343,68.2 +O-13344,31.8 +O-13345,31.8 +O-13346,28.4 +O-13347,24.2 +O-13348,26.8 +O-13349,37.3 +O-13350,30.9 +O-13351,39.7 +O-13352,25.1 +O-13353,30.5 +O-13354,61.8 +O-13355,28.4 +O-13356,48.3 +O-13357,22.5 +O-13358,24.6 +O-13359,38.1 +O-13360,35.9 +O-13361,50.0 +O-13362,50.0 +O-13363,25.5 +O-13364,38.5 +O-13365,27.8 +O-13366,31.1 +O-13367,59.1 +O-13368,21.4 +O-13369,37.7 +O-13370,23.7 +O-13371,30.1 +O-13372,33.3 +O-13373,41.7 +O-13374,37.8 +O-13375,32.6 +O-13376,30.6 +O-13377,40.8 +O-13378,27.9 +O-13379,38.7 +O-13380,28.9 +O-13381,39.0 +O-13382,25.7 +O-13383,21.3 +O-13384,33.1 +O-13385,46.0 +O-13386,56.9 +O-13387,53.7 +O-13388,28.6 +O-13389,20.8 +O-13390,15.9 +O-13391,38.3 +O-13392,28.3 +O-13393,17.3 +O-13394,27.7 +O-13395,21.9 +O-13396,33.3 +O-13397,34.9 +O-13398,36.1 +O-13399,42.3 +O-13400,25.6 +O-13401,48.0 +O-13402,23.5 +O-13403,56.6 +O-13404,25.3 +O-13405,27.9 +O-13406,37.4 +O-13407,30.8 +O-13408,12.9 +O-13409,75.2 +O-13410,57.8 +O-13411,83.6 +O-13412,26.9 +O-13413,23.3 +O-13414,31.0 +O-13415,18.8 +O-13416,28.5 +O-13417,14.3 +O-13418,57.1 +O-13419,52.1 +O-13420,41.9 +O-13421,16.8 +O-13422,17.2 +O-13423,52.5 +O-13424,50.0 +O-13425,35.7 +O-13426,42.8 +O-13427,21.4 +O-13428,34.2 +O-13429,18.0 +O-13430,13.7 +O-13431,40.1 +O-13432,37.9 +O-13433,75.7 +O-13434,36.5 +O-13435,24.8 +O-13436,41.1 +O-13437,56.7 +O-13438,20.3 +O-13439,49.1 +O-13440,22.9 +O-13441,13.9 +O-13442,61.6 +O-13443,17.6 +O-13444,34.0 +O-13445,44.7 +O-13446,35.7 +O-13447,26.0 +O-13448,57.8 +O-13449,88.4 +O-13450,47.2 +O-13451,69.5 +O-13452,30.7 +O-13453,26.1 +O-13454,28.8 +O-13455,23.1 +O-13456,25.9 +O-13457,26.1 +O-13458,25.7 +O-13459,60.5 +O-13460,29.1 +O-13461,20.0 +O-13462,35.2 +O-13463,13.9 +O-13464,44.6 +O-13465,30.1 +O-13466,20.2 +O-13467,38.4 +O-13468,21.8 +O-13469,62.7 +O-13470,39.5 +O-13471,20.7 +O-13472,33.1 +O-13473,28.7 +O-13474,37.1 +O-13475,55.5 +O-13476,71.5 +O-13477,33.1 +O-13478,28.6 +O-13479,20.5 +O-13480,30.2 +O-13481,60.3 +O-13482,30.8 +O-13483,85.9 +O-13484,34.4 +O-13485,43.0 +O-13486,22.0 +O-13487,29.1 +O-13488,35.2 +O-13489,72.1 +O-13490,58.9 +O-13491,21.3 +O-13492,26.3 +O-13493,36.0 +O-13494,18.0 +O-13495,17.6 +O-13496,17.9 +O-13497,45.6 +O-13498,37.2 +O-13499,12.5 +O-13500,27.4 +O-13501,25.4 +O-13502,40.8 +O-13503,30.3 +O-13504,20.4 +O-13505,15.6 +O-13506,56.4 +O-13507,39.3 +O-13508,36.8 +O-13509,12.5 +O-13510,21.5 +O-13511,18.4 +O-13512,33.3 +O-13513,25.2 +O-13514,15.3 +O-13515,38.4 +O-13516,27.8 +O-13517,49.3 +O-13518,19.3 +O-13519,27.8 +O-13520,18.2 +O-13521,18.4 +O-13522,38.1 +O-13523,42.4 +O-13524,61.1 +O-13525,50.4 +O-13526,33.5 +O-13527,59.6 +O-13528,33.1 +O-13529,35.4 +O-13530,19.4 +O-13531,19.1 +O-13532,42.7 +O-13533,37.7 +O-13534,27.6 +O-13535,66.2 +O-13536,24.7 +O-13537,48.5 +O-13538,35.1 +O-13539,44.4 +O-13540,24.3 +O-13541,43.0 +O-13542,66.8 +O-13543,22.0 +O-13544,44.9 +O-13545,26.2 +O-13546,18.0 +O-13547,19.1 +O-13548,11.5 +O-13549,17.8 +O-13550,61.5 +O-13551,34.7 +O-13552,30.6 +O-13553,13.6 +O-13554,39.0 +O-13555,38.6 +O-13556,56.4 +O-13557,42.1 +O-13558,38.9 +O-13559,23.0 +O-13560,57.5 +O-13561,55.9 +O-13562,34.3 +O-13563,81.8 +O-13564,23.0 +O-13565,46.3 +O-13566,32.7 +O-13567,22.8 +O-13568,25.3 +O-13569,13.9 +O-13570,29.9 +O-13571,26.9 +O-13572,29.8 +O-13573,23.2 +O-13574,22.9 +O-13575,9.9 +O-13576,33.8 +O-13577,53.1 +O-13578,26.3 +O-13579,45.7 +O-13580,47.0 +O-13581,42.4 +O-13582,34.6 +O-13583,39.1 +O-13584,43.7 +O-13585,17.2 +O-13586,9.2 +O-13587,42.2 +O-13588,32.9 +O-13589,19.1 +O-13590,30.7 +O-13591,12.5 +O-13592,31.3 +O-13593,42.1 +O-13594,37.9 +O-13595,15.0 +O-13596,27.2 +O-13597,20.1 +O-13598,31.0 +O-13599,34.8 +O-13600,53.8 +O-13601,21.5 +O-13602,31.3 +O-13603,29.0 +O-13604,25.5 +O-13605,33.5 +O-13606,34.4 +O-13607,25.5 +O-13608,21.1 +O-13609,68.6 +O-13610,16.0 +O-13611,30.3 +O-13612,10.8 +O-13613,12.3 +O-13614,27.1 +O-13615,22.5 +O-13616,20.0 +O-13617,48.8 +O-13618,23.4 +O-13619,38.0 +O-13620,25.2 +O-13621,32.6 +O-13622,37.5 +O-13623,23.4 +O-13624,21.7 +O-13625,19.1 +O-13626,53.5 +O-13627,23.9 +O-13628,69.4 +O-13629,38.5 +O-13630,51.1 +O-13631,18.1 +O-13632,50.6 +O-13633,24.4 +O-13634,42.0 +O-13635,32.7 +O-13636,40.5 +O-13637,47.0 +O-13638,23.8 +O-13639,39.1 +O-13640,17.9 +O-13641,35.5 +O-13642,15.5 +O-13643,63.1 +O-13644,60.6 +O-13645,72.4 +O-13646,53.0 +O-13647,62.2 +O-13648,32.4 +O-13649,48.0 +O-13650,28.5 +O-13651,33.0 +O-13652,18.1 +O-13653,25.3 +O-13654,57.3 +O-13655,51.4 +O-13656,32.3 +O-13657,51.0 +O-13658,42.2 +O-13659,52.2 +O-13660,11.5 +O-13661,22.6 +O-13662,33.2 +O-13663,40.2 +O-13664,30.5 +O-13665,23.0 +O-13666,26.9 +O-13667,53.2 +O-13668,65.5 +O-13669,14.5 +O-13670,30.5 +O-13671,21.4 +O-13672,32.3 +O-13673,38.8 +O-13674,67.9 +O-13675,28.5 +O-13676,41.5 +O-13677,52.4 +O-13678,13.5 +O-13679,23.8 +O-13680,62.0 +O-13681,20.8 +O-13682,11.7 +O-13683,23.8 +O-13684,19.0 +O-13685,17.7 +O-13686,47.3 +O-13687,38.2 +O-13688,35.0 +O-13689,18.5 +O-13690,44.4 +O-13691,35.0 +O-13692,44.1 +O-13693,33.6 +O-13694,20.1 +O-13695,28.2 +O-13696,33.4 +O-13697,46.6 +O-13698,12.9 +O-13699,33.0 +O-13700,19.7 +O-13701,16.2 +O-13702,51.8 +O-13703,32.5 +O-13704,25.1 +O-13705,46.4 +O-13706,26.5 +O-13707,35.8 +O-13708,14.1 +O-13709,44.4 +O-13710,53.5 +O-13711,29.1 +O-13712,20.7 +O-13713,45.7 +O-13714,23.2 +O-13715,23.4 +O-13716,64.6 +O-13717,40.0 +O-13718,71.8 +O-13719,16.7 +O-13720,19.3 +O-13721,16.1 +O-13722,22.6 +O-13723,28.2 +O-13724,30.0 +O-13725,27.6 +O-13726,29.8 +O-13727,31.0 +O-13728,40.7 +O-13729,45.2 +O-13730,41.3 +O-13731,23.9 +O-13732,35.0 +O-13733,21.3 +O-13734,17.6 +O-13735,14.8 +O-13736,18.6 +O-13737,27.4 +O-13738,11.9 +O-13739,40.8 +O-13740,14.0 +O-13741,49.3 +O-13742,37.6 +O-13743,29.7 +O-13744,27.8 +O-13745,16.9 +O-13746,30.7 +O-13747,47.2 +O-13748,15.2 +O-13749,48.1 +O-13750,31.4 +O-13751,30.7 +O-13752,41.4 +O-13753,22.4 +O-13754,25.2 +O-13755,45.2 +O-13756,29.4 +O-13757,40.1 +O-13758,38.9 +O-13759,27.4 +O-13760,42.7 +O-13761,26.8 +O-13762,35.1 +O-13763,29.1 +O-13764,62.0 +O-13765,19.1 +O-13766,40.9 +O-13767,21.9 +O-13768,57.1 +O-13769,21.2 +O-13770,22.2 +O-13771,28.5 +O-13772,40.9 +O-13773,17.2 +O-13774,58.4 +O-13775,39.4 +O-13776,31.8 +O-13777,47.5 +O-13778,75.3 +O-13779,30.2 +O-13780,46.6 +O-13781,35.6 +O-13782,24.7 +O-13783,22.3 +O-13784,50.3 +O-13785,25.0 +O-13786,39.6 +O-13787,34.1 +O-13788,49.7 +O-13789,27.4 +O-13790,27.9 +O-13791,19.5 +O-13792,23.7 +O-13793,13.5 +O-13794,29.6 +O-13795,81.0 +O-13796,14.6 +O-13797,36.1 +O-13798,35.8 +O-13799,43.6 +O-13800,55.1 +O-13801,36.8 +O-13802,31.0 +O-13803,22.4 +O-13804,33.8 +O-13805,21.1 +O-13806,33.5 +O-13807,23.9 +O-13808,44.4 +O-13809,29.9 +O-13810,33.5 +O-13811,41.8 +O-13812,11.8 +O-13813,39.3 +O-13814,19.1 +O-13815,19.2 +O-13816,17.0 +O-13817,40.0 +O-13818,27.3 +O-13819,40.6 +O-13820,78.4 +O-13821,48.8 +O-13822,27.2 +O-13823,17.8 +O-13824,18.0 +O-13825,51.6 +O-13826,38.6 +O-13827,34.5 +O-13828,33.4 +O-13829,23.3 +O-13830,86.5 +O-13831,71.6 +O-13832,27.1 +O-13833,25.6 +O-13834,24.4 +O-13835,42.2 +O-13836,21.5 +O-13837,20.5 +O-13838,23.4 +O-13839,29.7 +O-13840,41.5 +O-13841,43.2 +O-13842,73.7 +O-13843,16.6 +O-13844,27.5 +O-13845,35.0 +O-13846,18.7 +O-13847,31.2 +O-13848,13.7 +O-13849,25.2 +O-13850,19.4 +O-13851,25.4 +O-13852,28.8 +O-13853,25.1 +O-13854,13.5 +O-13855,33.1 +O-13856,56.4 +O-13857,14.2 +O-13858,41.8 +O-13859,24.1 +O-13860,20.1 +O-13861,27.0 +O-13862,24.4 +O-13863,38.4 +O-13864,38.7 +O-13865,55.9 +O-13866,24.7 +O-13867,31.8 +O-13868,60.0 +O-13869,38.1 +O-13870,22.8 +O-13871,20.2 +O-13872,57.1 +O-13873,42.1 +O-13874,36.2 +O-13875,35.0 +O-13876,19.8 +O-13877,40.3 +O-13878,31.6 +O-13879,56.0 +O-13880,11.2 +O-13881,25.8 +O-13882,11.9 +O-13883,27.0 +O-13884,38.3 +O-13885,27.6 +O-13886,17.4 +O-13887,23.5 +O-13888,58.1 +O-13889,32.2 +O-13890,34.3 +O-13891,46.1 +O-13892,50.6 +O-13893,33.0 +O-13894,31.8 +O-13895,50.5 +O-13896,33.7 +O-13897,35.3 +O-13898,42.6 +O-13899,14.4 +O-13900,24.2 +O-13901,29.3 +O-13902,27.3 +O-13903,45.6 +O-13904,30.5 +O-13905,30.8 +O-13906,28.8 +O-13907,47.1 +O-13908,21.3 +O-13909,39.3 +O-13910,18.9 +O-13911,40.4 +O-13912,40.1 +O-13913,25.0 +O-13914,41.6 +O-13915,30.5 +O-13916,43.7 +O-13917,26.7 +O-13918,15.4 +O-13919,25.1 +O-13920,19.2 +O-13921,21.5 +O-13922,57.3 +O-13923,26.1 +O-13924,20.3 +O-13925,45.1 +O-13926,31.2 +O-13927,21.8 +O-13928,29.2 +O-13929,53.7 +O-13930,43.7 +O-13931,35.9 +O-13932,35.0 +O-13933,30.8 +O-13934,42.0 +O-13935,16.3 +O-13936,32.6 +O-13937,51.5 +O-13938,32.9 +O-13939,38.1 +O-13940,57.6 +O-13941,48.4 +O-13942,25.3 +O-13943,48.5 +O-13944,19.1 +O-13945,72.3 +O-13946,15.1 +O-13947,58.6 +O-13948,27.9 +O-13949,35.4 +O-13950,28.2 +O-13951,124.0 +O-13952,59.0 +O-13953,21.9 +O-13954,57.4 +O-13955,23.5 +O-13956,29.7 +O-13957,32.5 +O-13958,27.8 +O-13959,50.0 +O-13960,48.3 +O-13961,44.4 +O-13962,52.1 +O-13963,13.4 +O-13964,23.4 +O-13965,37.5 +O-13966,19.6 +O-13967,45.5 +O-13968,38.0 +O-13969,12.8 +O-13970,41.2 +O-13971,27.9 +O-13972,31.9 +O-13973,32.4 +O-13974,58.0 +O-13975,13.7 +O-13976,12.9 +O-13977,52.6 +O-13978,16.3 +O-13979,16.3 +O-13980,21.0 +O-13981,34.2 +O-13982,19.8 +O-13983,45.1 +O-13984,36.0 +O-13985,31.6 +O-13986,15.9 +O-13987,47.1 +O-13988,105.9 +O-13989,16.5 +O-13990,26.0 +O-13991,26.4 +O-13992,35.6 +O-13993,40.1 +O-13994,31.0 +O-13995,42.6 +O-13996,25.2 +O-13997,45.6 +O-13998,36.8 +O-13999,14.9 +O-14000,51.2 +O-14001,29.1 +O-14002,47.6 +O-14003,25.9 +O-14004,48.1 +O-14005,51.7 +O-14006,25.9 +O-14007,22.8 +O-14008,35.5 +O-14009,59.9 +O-14010,13.8 +O-14011,38.7 +O-14012,14.7 +O-14013,23.9 +O-14014,37.7 +O-14015,45.0 +O-14016,38.8 +O-14017,50.0 +O-14018,13.3 +O-14019,55.4 +O-14020,10.2 +O-14021,33.6 +O-14022,63.3 +O-14023,22.1 +O-14024,24.0 +O-14025,26.1 +O-14026,68.1 +O-14027,63.0 +O-14028,25.6 +O-14029,40.1 +O-14030,24.0 +O-14031,26.2 +O-14032,47.2 +O-14033,27.7 +O-14034,51.9 +O-14035,28.0 +O-14036,23.7 +O-14037,30.1 +O-14038,57.7 +O-14039,15.5 +O-14040,46.6 +O-14041,64.9 +O-14042,32.8 +O-14043,47.3 +O-14044,27.8 +O-14045,18.5 +O-14046,40.6 +O-14047,49.3 +O-14048,21.0 +O-14049,46.9 +O-14050,23.7 +O-14051,15.4 +O-14052,29.0 +O-14053,18.8 +O-14054,21.1 +O-14055,12.6 +O-14056,47.8 +O-14057,38.0 +O-14058,53.4 +O-14059,34.3 +O-14060,36.1 +O-14061,31.8 +O-14062,23.3 +O-14063,18.8 +O-14064,9.8 +O-14065,42.7 +O-14066,23.6 +O-14067,15.7 +O-14068,25.4 +O-14069,53.9 +O-14070,28.5 +O-14071,27.4 +O-14072,40.4 +O-14073,33.7 +O-14074,49.2 +O-14075,49.7 +O-14076,58.1 +O-14077,61.1 +O-14078,24.2 +O-14079,42.8 +O-14080,62.9 +O-14081,49.7 +O-14082,22.8 +O-14083,22.5 +O-14084,35.5 +O-14085,26.8 +O-14086,37.3 +O-14087,16.9 +O-14088,27.8 +O-14089,16.2 +O-14090,62.6 +O-14091,24.2 +O-14092,37.6 +O-14093,24.0 +O-14094,48.9 +O-14095,52.8 +O-14096,19.0 +O-14097,50.0 +O-14098,21.7 +O-14099,58.9 +O-14100,45.0 +O-14101,19.9 +O-14102,17.2 +O-14103,43.1 +O-14104,18.6 +O-14105,49.5 +O-14106,42.7 +O-14107,66.3 +O-14108,50.4 +O-14109,23.1 +O-14110,13.9 +O-14111,28.2 +O-14112,32.4 +O-14113,18.0 +O-14114,63.9 +O-14115,35.2 +O-14116,27.2 +O-14117,41.3 +O-14118,48.8 +O-14119,31.1 +O-14120,31.6 +O-14121,65.8 +O-14122,35.3 +O-14123,15.1 +O-14124,18.9 +O-14125,34.7 +O-14126,67.7 +O-14127,35.5 +O-14128,22.6 +O-14129,58.5 +O-14130,43.2 +O-14131,42.0 +O-14132,53.1 +O-14133,19.4 +O-14134,29.8 +O-14135,34.0 +O-14136,21.2 +O-14137,46.6 +O-14138,18.3 +O-14139,62.8 +O-14140,40.0 +O-14141,34.3 +O-14142,58.2 +O-14143,19.7 +O-14144,24.0 +O-14145,37.8 +O-14146,15.1 +O-14147,48.4 +O-14148,54.2 +O-14149,16.4 +O-14150,36.9 +O-14151,37.2 +O-14152,23.3 +O-14153,25.9 +O-14154,28.7 +O-14155,42.2 +O-14156,23.9 +O-14157,54.1 +O-14158,35.7 +O-14159,62.2 +O-14160,37.3 +O-14161,18.4 +O-14162,51.9 +O-14163,18.8 +O-14164,33.3 +O-14165,31.5 +O-14166,19.8 +O-14167,37.5 +O-14168,24.4 +O-14169,37.9 +O-14170,33.2 +O-14171,23.3 +O-14172,19.0 +O-14173,32.4 +O-14174,25.9 +O-14175,26.7 +O-14176,37.9 +O-14177,26.5 +O-14178,24.0 +O-14179,18.7 +O-14180,40.1 +O-14181,20.4 +O-14182,15.6 +O-14183,37.0 +O-14184,19.9 +O-14185,18.2 +O-14186,20.0 +O-14187,55.7 +O-14188,31.5 +O-14189,37.7 +O-14190,23.5 +O-14191,16.2 +O-14192,37.0 +O-14193,39.0 +O-14194,15.1 +O-14195,23.0 +O-14196,50.9 +O-14197,50.1 +O-14198,37.8 +O-14199,55.6 +O-14200,17.3 +O-14201,31.1 +O-14202,22.9 +O-14203,39.6 +O-14204,30.7 +O-14205,39.6 +O-14206,33.7 +O-14207,26.2 +O-14208,25.1 +O-14209,34.1 +O-14210,55.3 +O-14211,32.7 +O-14212,24.8 +O-14213,55.0 +O-14214,39.9 +O-14215,28.8 +O-14216,59.0 +O-14217,34.5 +O-14218,35.8 +O-14219,32.8 +O-14220,16.0 +O-14221,29.1 +O-14222,28.7 +O-14223,18.5 +O-14224,19.0 +O-14225,52.6 +O-14226,36.3 +O-14227,44.5 +O-14228,31.2 +O-14229,24.4 +O-14230,38.5 +O-14231,45.2 +O-14232,17.0 +O-14233,34.9 +O-14234,18.9 +O-14235,40.0 +O-14236,50.5 +O-14237,50.3 +O-14238,46.7 +O-14239,36.8 +O-14240,16.2 +O-14241,66.6 +O-14242,34.0 +O-14243,23.2 +O-14244,20.4 +O-14245,53.8 +O-14246,76.0 +O-14247,30.6 +O-14248,44.6 +O-14249,16.7 +O-14250,23.3 +O-14251,32.1 +O-14252,32.7 +O-14253,14.4 +O-14254,77.5 +O-14255,41.9 +O-14256,15.7 +O-14257,41.5 +O-14258,40.6 +O-14259,46.7 +O-14260,34.0 +O-14261,54.3 +O-14262,34.9 +O-14263,29.9 +O-14264,65.5 +O-14265,34.1 +O-14266,33.8 +O-14267,36.1 +O-14268,45.5 +O-14269,25.1 +O-14270,13.8 +O-14271,39.2 +O-14272,45.4 +O-14273,16.4 +O-14274,36.2 +O-14275,22.1 +O-14276,82.3 +O-14277,52.1 +O-14278,25.8 +O-14279,41.8 +O-14280,64.4 +O-14281,15.1 +O-14282,51.3 +O-14283,20.7 +O-14284,56.7 +O-14285,49.3 +O-14286,75.6 +O-14287,22.4 +O-14288,24.2 +O-14289,53.4 +O-14290,30.8 +O-14291,51.6 +O-14292,31.5 +O-14293,20.8 +O-14294,61.1 +O-14295,64.9 +O-14296,55.0 +O-14297,31.6 +O-14298,21.4 +O-14299,46.8 +O-14300,21.1 +O-14301,22.6 +O-14302,16.5 +O-14303,17.7 +O-14304,54.6 +O-14305,40.9 +O-14306,22.8 +O-14307,43.7 +O-14308,22.7 +O-14309,38.2 +O-14310,43.6 +O-14311,38.4 +O-14312,29.3 +O-14313,51.6 +O-14314,33.6 +O-14315,49.1 +O-14316,16.3 +O-14317,46.8 +O-14318,24.1 +O-14319,44.8 +O-14320,41.9 +O-14321,38.0 +O-14322,33.4 +O-14323,30.3 +O-14324,60.9 +O-14325,37.4 +O-14326,24.1 +O-14327,24.7 +O-14328,20.0 +O-14329,14.7 +O-14330,33.8 +O-14331,30.6 +O-14332,26.4 +O-14333,13.2 +O-14334,40.0 +O-14335,88.8 +O-14336,44.5 +O-14337,33.1 +O-14338,25.8 +O-14339,18.7 +O-14340,31.4 +O-14341,25.2 +O-14342,17.0 +O-14343,42.6 +O-14344,36.5 +O-14345,23.3 +O-14346,55.5 +O-14347,29.8 +O-14348,34.2 +O-14349,11.2 +O-14350,52.7 +O-14351,23.2 +O-14352,23.8 +O-14353,29.3 +O-14354,25.3 +O-14355,24.2 +O-14356,66.0 +O-14357,41.7 +O-14358,37.9 +O-14359,34.6 +O-14360,21.6 +O-14361,31.7 +O-14362,45.6 +O-14363,58.2 +O-14364,24.0 +O-14365,31.5 +O-14366,30.2 +O-14367,41.7 +O-14368,20.3 +O-14369,26.2 +O-14370,21.6 +O-14371,22.2 +O-14372,25.4 +O-14373,49.9 +O-14374,43.0 +O-14375,34.6 +O-14376,56.0 +O-14377,56.5 +O-14378,27.9 +O-14379,13.0 +O-14380,27.4 +O-14381,67.1 +O-14382,38.3 +O-14383,35.5 +O-14384,34.1 +O-14385,29.5 +O-14386,35.8 +O-14387,17.3 +O-14388,39.4 +O-14389,46.2 +O-14390,23.8 +O-14391,52.6 +O-14392,64.9 +O-14393,29.1 +O-14394,72.9 +O-14395,39.9 +O-14396,20.7 +O-14397,38.7 +O-14398,72.5 +O-14399,40.2 +O-14400,16.0 +O-14401,41.8 +O-14402,30.1 +O-14403,54.6 +O-14404,54.9 +O-14405,25.4 +O-14406,33.7 +O-14407,38.6 +O-14408,39.8 +O-14409,9.8 +O-14410,43.0 +O-14411,18.6 +O-14412,15.4 +O-14413,19.1 +O-14414,25.6 +O-14415,22.5 +O-14416,61.0 +O-14417,23.3 +O-14418,35.2 +O-14419,57.3 +O-14420,42.4 +O-14421,46.9 +O-14422,24.0 +O-14423,34.2 +O-14424,32.7 +O-14425,27.9 +O-14426,13.9 +O-14427,53.9 +O-14428,20.8 +O-14429,16.0 +O-14430,17.7 +O-14431,17.6 +O-14432,10.5 +O-14433,24.0 +O-14434,29.4 +O-14435,54.6 +O-14436,21.8 +O-14437,64.8 +O-14438,35.5 +O-14439,31.2 +O-14440,34.8 +O-14441,21.4 +O-14442,9.9 +O-14443,11.8 +O-14444,27.7 +O-14445,42.0 +O-14446,86.7 +O-14447,49.5 +O-14448,36.0 +O-14449,18.8 +O-14450,26.4 +O-14451,16.5 +O-14452,13.8 +O-14453,11.5 +O-14454,36.1 +O-14455,28.0 +O-14456,18.3 +O-14457,26.0 +O-14458,24.4 +O-14459,15.2 +O-14460,21.0 +O-14461,38.8 +O-14462,70.2 +O-14463,32.2 +O-14464,29.8 +O-14465,51.5 +O-14466,93.7 +O-14467,41.0 +O-14468,41.6 +O-14469,41.5 +O-14470,46.0 +O-14471,25.2 +O-14472,38.9 +O-14473,34.9 +O-14474,34.9 +O-14475,15.0 +O-14476,49.9 +O-14477,30.5 +O-14478,32.4 +O-14479,54.0 +O-14480,33.4 +O-14481,58.5 +O-14482,19.7 +O-14483,58.8 +O-14484,47.4 +O-14485,32.7 +O-14486,60.2 +O-14487,36.5 +O-14488,47.4 +O-14489,22.1 +O-14490,25.3 +O-14491,28.7 +O-14492,27.0 +O-14493,36.7 +O-14494,51.4 +O-14495,30.3 +O-14496,38.4 +O-14497,66.1 +O-14498,15.7 +O-14499,24.1 +O-14500,30.0 +O-14501,34.4 +O-14502,18.0 +O-14503,51.1 +O-14504,25.5 +O-14505,36.3 +O-14506,33.9 +O-14507,26.3 +O-14508,23.2 +O-14509,58.3 +O-14510,22.1 +O-14511,66.5 +O-14512,26.7 +O-14513,54.0 +O-14514,16.7 +O-14515,32.0 +O-14516,32.7 +O-14517,41.5 +O-14518,17.2 +O-14519,28.7 +O-14520,30.4 +O-14521,23.2 +O-14522,31.1 +O-14523,24.3 +O-14524,20.1 +O-14525,23.2 +O-14526,44.3 +O-14527,36.8 +O-14528,24.5 +O-14529,17.3 +O-14530,32.5 +O-14531,34.1 +O-14532,22.5 +O-14533,53.2 +O-14534,38.3 +O-14535,39.9 +O-14536,20.7 +O-14537,32.8 +O-14538,60.3 +O-14539,31.3 +O-14540,31.6 +O-14541,41.5 +O-14542,22.9 +O-14543,71.6 +O-14544,39.0 +O-14545,35.1 +O-14546,42.6 +O-14547,31.2 +O-14548,33.0 +O-14549,30.0 +O-14550,25.3 +O-14551,72.3 +O-14552,26.8 +O-14553,35.8 +O-14554,54.5 +O-14555,26.9 +O-14556,85.4 +O-14557,32.5 +O-14558,46.4 +O-14559,32.1 +O-14560,14.2 +O-14561,45.4 +O-14562,63.1 +O-14563,22.3 +O-14564,36.2 +O-14565,29.1 +O-14566,54.6 +O-14567,21.1 +O-14568,58.5 +O-14569,41.3 +O-14570,19.4 +O-14571,22.6 +O-14572,18.3 +O-14573,43.5 +O-14574,33.0 +O-14575,35.6 +O-14576,37.6 +O-14577,47.2 +O-14578,19.4 +O-14579,41.1 +O-14580,46.7 +O-14581,73.3 +O-14582,26.8 +O-14583,20.6 +O-14584,35.3 +O-14585,35.6 +O-14586,54.6 +O-14587,59.1 +O-14588,36.4 +O-14589,57.6 +O-14590,30.1 +O-14591,31.6 +O-14592,37.6 +O-14593,19.4 +O-14594,18.7 +O-14595,46.3 +O-14596,19.4 +O-14597,30.7 +O-14598,25.9 +O-14599,24.9 +O-14600,19.9 +O-14601,42.0 +O-14602,21.2 +O-14603,33.5 +O-14604,33.3 +O-14605,76.6 +O-14606,40.6 +O-14607,28.6 +O-14608,19.2 +O-14609,46.1 +O-14610,92.2 +O-14611,48.2 +O-14612,36.1 +O-14613,35.7 +O-14614,28.4 +O-14615,35.5 +O-14616,47.5 +O-14617,36.8 +O-14618,23.9 +O-14619,22.4 +O-14620,19.5 +O-14621,21.4 +O-14622,43.1 +O-14623,45.1 +O-14624,22.0 +O-14625,41.5 +O-14626,27.5 +O-14627,33.6 +O-14628,55.8 +O-14629,39.4 +O-14630,26.0 +O-14631,83.8 +O-14632,35.0 +O-14633,34.4 +O-14634,38.6 +O-14635,26.1 +O-14636,24.1 +O-14637,32.9 +O-14638,17.6 +O-14639,38.6 +O-14640,40.9 +O-14641,38.6 +O-14642,22.9 +O-14643,23.2 +O-14644,21.4 +O-14645,30.0 +O-14646,62.0 +O-14647,21.5 +O-14648,75.8 +O-14649,22.0 +O-14650,51.0 +O-14651,19.4 +O-14652,29.9 +O-14653,64.6 +O-14654,41.9 +O-14655,34.9 +O-14656,36.6 +O-14657,15.5 +O-14658,32.6 +O-14659,25.9 +O-14660,68.7 +O-14661,15.3 +O-14662,38.1 +O-14663,27.7 +O-14664,28.2 +O-14665,31.2 +O-14666,32.5 +O-14667,32.6 +O-14668,24.3 +O-14669,50.3 +O-14670,24.9 +O-14671,27.8 +O-14672,39.3 +O-14673,19.3 +O-14674,57.3 +O-14675,48.1 +O-14676,42.2 +O-14677,41.9 +O-14678,18.9 +O-14679,45.1 +O-14680,23.8 +O-14681,56.6 +O-14682,46.3 +O-14683,13.8 +O-14684,30.8 +O-14685,38.7 +O-14686,48.5 +O-14687,30.3 +O-14688,17.0 +O-14689,29.8 +O-14690,15.1 +O-14691,28.7 +O-14692,22.8 +O-14693,32.9 +O-14694,29.1 +O-14695,25.3 +O-14696,30.7 +O-14697,18.4 +O-14698,17.2 +O-14699,26.5 +O-14700,28.2 +O-14701,9.9 +O-14702,59.9 +O-14703,21.1 +O-14704,20.5 +O-14705,28.0 +O-14706,28.5 +O-14707,16.0 +O-14708,23.7 +O-14709,25.5 +O-14710,42.6 +O-14711,62.6 +O-14712,45.9 +O-14713,24.1 +O-14714,55.2 +O-14715,14.9 +O-14716,17.5 +O-14717,27.0 +O-14718,33.4 +O-14719,35.6 +O-14720,23.3 +O-14721,66.9 +O-14722,20.4 +O-14723,35.9 +O-14724,24.5 +O-14725,13.5 +O-14726,35.2 +O-14727,45.3 +O-14728,42.7 +O-14729,50.6 +O-14730,35.3 +O-14731,23.1 +O-14732,30.5 +O-14733,20.9 +O-14734,29.7 +O-14735,27.9 +O-14736,42.6 +O-14737,26.2 +O-14738,20.4 +O-14739,48.4 +O-14740,26.3 +O-14741,41.6 +O-14742,26.0 +O-14743,14.7 +O-14744,42.4 +O-14745,72.6 +O-14746,59.3 +O-14747,40.1 +O-14748,27.0 +O-14749,13.7 +O-14750,26.1 +O-14751,19.3 +O-14752,46.4 +O-14753,26.0 +O-14754,42.5 +O-14755,43.3 +O-14756,69.1 +O-14757,56.9 +O-14758,17.3 +O-14759,43.9 +O-14760,37.5 +O-14761,24.6 +O-14762,34.0 +O-14763,35.4 +O-14764,77.9 +O-14765,21.3 +O-14766,27.6 +O-14767,29.3 +O-14768,57.9 +O-14769,42.8 +O-14770,61.9 +O-14771,47.2 +O-14772,22.6 +O-14773,41.5 +O-14774,17.3 +O-14775,19.1 +O-14776,38.8 +O-14777,20.1 +O-14778,38.9 +O-14779,36.3 +O-14780,30.4 +O-14781,17.0 +O-14782,28.9 +O-14783,33.4 +O-14784,66.2 +O-14785,25.8 +O-14786,18.1 +O-14787,38.5 +O-14788,37.0 +O-14789,66.4 +O-14790,37.6 +O-14791,25.9 +O-14792,31.6 +O-14793,45.9 +O-14794,12.3 +O-14795,85.6 +O-14796,59.0 +O-14797,22.2 +O-14798,22.3 +O-14799,38.5 +O-14800,28.2 +O-14801,61.7 +O-14802,28.0 +O-14803,50.3 +O-14804,38.8 +O-14805,21.3 +O-14806,29.6 +O-14807,23.5 +O-14808,30.8 +O-14809,24.6 +O-14810,87.6 +O-14811,17.8 +O-14812,57.3 +O-14813,47.2 +O-14814,24.8 +O-14815,66.4 +O-14816,49.4 +O-14817,63.8 +O-14818,16.5 +O-14819,31.2 +O-14820,27.6 +O-14821,18.3 +O-14822,19.7 +O-14823,43.5 +O-14824,22.4 +O-14825,20.7 +O-14826,24.1 +O-14827,19.3 +O-14828,29.8 +O-14829,35.4 +O-14830,38.9 +O-14831,32.7 +O-14832,22.7 +O-14833,35.9 +O-14834,43.2 +O-14835,23.9 +O-14836,43.0 +O-14837,35.5 +O-14838,45.1 +O-14839,29.3 +O-14840,62.0 +O-14841,38.6 +O-14842,77.5 +O-14843,57.4 +O-14844,30.0 +O-14845,35.0 +O-14846,40.9 +O-14847,58.9 +O-14848,17.1 +O-14849,37.2 +O-14850,56.6 +O-14851,38.9 +O-14852,82.2 +O-14853,37.4 +O-14854,29.0 +O-14855,40.3 +O-14856,88.4 +O-14857,45.1 +O-14858,22.2 +O-14859,20.5 +O-14860,23.8 +O-14861,94.9 +O-14862,25.0 +O-14863,25.9 +O-14864,37.5 +O-14865,36.5 +O-14866,21.3 +O-14867,40.5 +O-14868,40.9 +O-14869,55.5 +O-14870,44.0 +O-14871,50.3 +O-14872,15.5 +O-14873,32.2 +O-14874,76.2 +O-14875,33.3 +O-14876,24.7 +O-14877,41.6 +O-14878,18.1 +O-14879,45.6 +O-14880,55.5 +O-14881,31.5 +O-14882,72.5 +O-14883,29.3 +O-14884,52.8 +O-14885,15.9 +O-14886,14.5 +O-14887,46.2 +O-14888,19.1 +O-14889,63.9 +O-14890,24.1 +O-14891,34.7 +O-14892,37.2 +O-14893,26.0 +O-14894,26.9 +O-14895,25.4 +O-14896,36.2 +O-14897,35.2 +O-14898,30.6 +O-14899,11.1 +O-14900,29.5 +O-14901,42.2 +O-14902,70.2 +O-14903,10.3 +O-14904,49.1 +O-14905,27.3 +O-14906,23.8 +O-14907,29.8 +O-14908,33.2 +O-14909,39.1 +O-14910,15.1 +O-14911,61.6 +O-14912,41.4 +O-14913,17.6 +O-14914,44.0 +O-14915,60.7 +O-14916,16.7 +O-14917,18.0 +O-14918,38.2 +O-14919,53.1 +O-14920,53.8 +O-14921,15.7 +O-14922,33.0 +O-14923,70.2 +O-14924,23.5 +O-14925,39.0 +O-14926,27.5 +O-14927,17.4 +O-14928,45.8 +O-14929,18.3 +O-14930,34.3 +O-14931,23.1 +O-14932,35.6 +O-14933,47.0 +O-14934,33.3 +O-14935,32.4 +O-14936,51.9 +O-14937,52.6 +O-14938,38.6 +O-14939,12.6 +O-14940,21.2 +O-14941,27.2 +O-14942,28.8 +O-14943,62.8 +O-14944,18.4 +O-14945,28.5 +O-14946,41.4 +O-14947,57.0 +O-14948,16.9 +O-14949,35.8 +O-14950,37.4 +O-14951,33.8 +O-14952,55.3 +O-14953,41.5 +O-14954,29.5 +O-14955,49.1 +O-14956,46.7 +O-14957,43.9 +O-14958,23.8 +O-14959,32.8 +O-14960,31.5 +O-14961,26.6 +O-14962,16.6 +O-14963,38.0 +O-14964,36.9 +O-14965,37.4 +O-14966,36.9 +O-14967,32.8 +O-14968,30.6 +O-14969,37.8 +O-14970,17.3 +O-14971,17.7 +O-14972,25.4 +O-14973,37.3 +O-14974,44.8 +O-14975,45.0 +O-14976,34.9 +O-14977,29.8 +O-14978,11.7 +O-14979,37.2 +O-14980,59.0 +O-14981,12.8 +O-14982,25.8 +O-14983,25.9 +O-14984,20.2 +O-14985,35.8 +O-14986,30.1 +O-14987,40.7 +O-14988,29.3 +O-14989,55.0 +O-14990,55.0 +O-14991,24.4 +O-14992,37.6 +O-14993,60.7 +O-14994,31.2 +O-14995,56.7 +O-14996,26.5 +O-14997,23.6 +O-14998,38.9 +O-14999,45.5 +O-15000,17.1 diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-renamed/case.json b/agents/evals/fixtures/cases/histogram-basic-pygal-renamed/case.json new file mode 100644 index 00000000000..0738b6b71bd --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-renamed/case.json @@ -0,0 +1,20 @@ +{ + "spec_id": "histogram-basic", + "library": "pygal", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "values", + "column": "Lieferzeit / Minuten" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "renamed", + "synthetic", + "renamed-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, renamed)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-renamed/data.csv b/agents/evals/fixtures/cases/histogram-basic-pygal-renamed/data.csv new file mode 100644 index 00000000000..0a8a710459b --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-renamed/data.csv @@ -0,0 +1,401 @@ +Bestellnummer,Lieferzeit / Minuten +O-10001,38.3 +O-10002,39.4 +O-10003,36.7 +O-10004,36.6 +O-10005,16.3 +O-10006,25.4 +O-10007,25.4 +O-10008,28.7 +O-10009,38.1 +O-10010,29.6 +O-10011,19.5 +O-10012,36.0 +O-10013,53.0 +O-10014,30.1 +O-10015,21.3 +O-10016,47.9 +O-10017,41.8 +O-10018,26.4 +O-10019,32.4 +O-10020,22.9 +O-10021,52.4 +O-10022,31.4 +O-10023,19.7 +O-10024,31.1 +O-10025,38.2 +O-10026,52.7 +O-10027,23.9 +O-10028,39.3 +O-10029,46.8 +O-10030,38.3 +O-10031,24.2 +O-10032,57.8 +O-10033,44.9 +O-10034,67.6 +O-10035,22.3 +O-10036,27.3 +O-10037,17.8 +O-10038,34.3 +O-10039,36.7 +O-10040,25.1 +O-10041,31.6 +O-10042,52.9 +O-10043,29.7 +O-10044,30.9 +O-10045,52.3 +O-10046,32.4 +O-10047,47.4 +O-10048,62.4 +O-10049,22.5 +O-10050,14.7 +O-10051,34.6 +O-10052,19.6 +O-10053,34.0 +O-10054,29.6 +O-10055,27.2 +O-10056,53.7 +O-10057,66.8 +O-10058,34.1 +O-10059,39.1 +O-10060,32.1 +O-10061,50.4 +O-10062,18.7 +O-10063,32.2 +O-10064,66.0 +O-10065,40.7 +O-10066,76.3 +O-10067,15.7 +O-10068,18.2 +O-10069,18.4 +O-10070,23.2 +O-10071,34.8 +O-10072,30.9 +O-10073,39.8 +O-10074,27.5 +O-10075,17.7 +O-10076,84.2 +O-10077,27.9 +O-10078,22.2 +O-10079,92.0 +O-10080,31.1 +O-10081,30.6 +O-10082,55.0 +O-10083,35.7 +O-10084,22.3 +O-10085,11.9 +O-10086,14.1 +O-10087,24.0 +O-10088,29.3 +O-10089,46.9 +O-10090,26.2 +O-10091,20.2 +O-10092,18.5 +O-10093,16.2 +O-10094,26.1 +O-10095,31.2 +O-10096,57.1 +O-10097,15.0 +O-10098,33.6 +O-10099,24.4 +O-10100,44.1 +O-10101,51.7 +O-10102,35.6 +O-10103,18.6 +O-10104,41.6 +O-10105,47.3 +O-10106,27.6 +O-10107,45.3 +O-10108,43.6 +O-10109,19.1 +O-10110,26.2 +O-10111,20.6 +O-10112,29.6 +O-10113,61.9 +O-10114,58.8 +O-10115,20.6 +O-10116,13.7 +O-10117,14.8 +O-10118,36.3 +O-10119,116.4 +O-10120,51.6 +O-10121,19.3 +O-10122,48.0 +O-10123,106.1 +O-10124,42.9 +O-10125,17.9 +O-10126,27.9 +O-10127,18.3 +O-10128,88.9 +O-10129,51.3 +O-10130,22.7 +O-10131,39.0 +O-10132,31.8 +O-10133,43.4 +O-10134,27.5 +O-10135,21.1 +O-10136,26.0 +O-10137,32.5 +O-10138,23.8 +O-10139,28.4 +O-10140,16.3 +O-10141,18.4 +O-10142,29.0 +O-10143,40.9 +O-10144,30.8 +O-10145,39.6 +O-10146,32.4 +O-10147,25.0 +O-10148,35.2 +O-10149,18.7 +O-10150,30.7 +O-10151,31.5 +O-10152,22.7 +O-10153,20.7 +O-10154,27.3 +O-10155,43.8 +O-10156,33.0 +O-10157,42.1 +O-10158,20.7 +O-10159,14.8 +O-10160,16.0 +O-10161,25.2 +O-10162,38.5 +O-10163,39.5 +O-10164,43.0 +O-10165,37.5 +O-10166,23.2 +O-10167,62.0 +O-10168,9.8 +O-10169,41.2 +O-10170,33.8 +O-10171,21.5 +O-10172,57.7 +O-10173,34.0 +O-10174,16.2 +O-10175,27.2 +O-10176,16.4 +O-10177,29.6 +O-10178,22.8 +O-10179,23.1 +O-10180,36.4 +O-10181,61.6 +O-10182,23.9 +O-10183,25.1 +O-10184,23.6 +O-10185,23.1 +O-10186,32.4 +O-10187,86.5 +O-10188,26.8 +O-10189,40.1 +O-10190,22.4 +O-10191,32.4 +O-10192,25.6 +O-10193,30.6 +O-10194,68.7 +O-10195,37.1 +O-10196,29.5 +O-10197,61.1 +O-10198,50.7 +O-10199,35.4 +O-10200,36.6 +O-10201,37.5 +O-10202,37.9 +O-10203,18.0 +O-10204,41.9 +O-10205,53.1 +O-10206,19.9 +O-10207,16.4 +O-10208,39.5 +O-10209,32.8 +O-10210,37.9 +O-10211,39.5 +O-10212,39.4 +O-10213,24.6 +O-10214,40.7 +O-10215,27.6 +O-10216,21.4 +O-10217,44.1 +O-10218,22.6 +O-10219,30.9 +O-10220,26.5 +O-10221,20.7 +O-10222,21.7 +O-10223,31.1 +O-10224,31.1 +O-10225,39.7 +O-10226,30.2 +O-10227,22.8 +O-10228,36.3 +O-10229,32.5 +O-10230,49.4 +O-10231,39.2 +O-10232,21.6 +O-10233,13.8 +O-10234,31.1 +O-10235,21.9 +O-10236,49.0 +O-10237,20.4 +O-10238,21.4 +O-10239,48.5 +O-10240,17.1 +O-10241,29.3 +O-10242,69.6 +O-10243,31.2 +O-10244,43.1 +O-10245,46.7 +O-10246,28.7 +O-10247,31.7 +O-10248,30.0 +O-10249,38.1 +O-10250,14.8 +O-10251,27.2 +O-10252,55.8 +O-10253,38.9 +O-10254,23.8 +O-10255,31.8 +O-10256,13.2 +O-10257,72.2 +O-10258,36.3 +O-10259,15.7 +O-10260,26.3 +O-10261,24.5 +O-10262,67.5 +O-10263,20.5 +O-10264,23.4 +O-10265,62.8 +O-10266,34.5 +O-10267,25.2 +O-10268,21.3 +O-10269,49.0 +O-10270,48.8 +O-10271,50.0 +O-10272,23.1 +O-10273,62.7 +O-10274,85.7 +O-10275,29.5 +O-10276,14.9 +O-10277,39.7 +O-10278,48.3 +O-10279,26.7 +O-10280,26.6 +O-10281,52.4 +O-10282,40.5 +O-10283,14.9 +O-10284,42.9 +O-10285,26.4 +O-10286,10.6 +O-10287,21.9 +O-10288,40.1 +O-10289,57.9 +O-10290,42.6 +O-10291,43.6 +O-10292,41.3 +O-10293,66.9 +O-10294,18.6 +O-10295,40.7 +O-10296,88.6 +O-10297,39.5 +O-10298,15.6 +O-10299,17.3 +O-10300,27.3 +O-10301,56.9 +O-10302,38.8 +O-10303,19.9 +O-10304,26.8 +O-10305,25.9 +O-10306,32.8 +O-10307,46.9 +O-10308,16.6 +O-10309,26.9 +O-10310,40.7 +O-10311,40.1 +O-10312,42.5 +O-10313,67.6 +O-10314,15.9 +O-10315,26.1 +O-10316,24.4 +O-10317,16.6 +O-10318,23.2 +O-10319,15.1 +O-10320,15.3 +O-10321,29.7 +O-10322,38.9 +O-10323,26.6 +O-10324,36.1 +O-10325,21.0 +O-10326,25.5 +O-10327,42.8 +O-10328,37.0 +O-10329,40.5 +O-10330,17.7 +O-10331,31.3 +O-10332,56.8 +O-10333,73.4 +O-10334,19.2 +O-10335,17.4 +O-10336,24.3 +O-10337,30.6 +O-10338,37.8 +O-10339,16.0 +O-10340,44.5 +O-10341,12.7 +O-10342,10.7 +O-10343,52.5 +O-10344,14.2 +O-10345,21.0 +O-10346,28.3 +O-10347,21.6 +O-10348,23.8 +O-10349,44.5 +O-10350,40.3 +O-10351,40.1 +O-10352,39.4 +O-10353,29.2 +O-10354,30.6 +O-10355,38.7 +O-10356,23.7 +O-10357,75.8 +O-10358,43.2 +O-10359,44.5 +O-10360,44.3 +O-10361,37.8 +O-10362,38.7 +O-10363,44.0 +O-10364,18.1 +O-10365,55.9 +O-10366,22.3 +O-10367,16.8 +O-10368,33.6 +O-10369,39.3 +O-10370,31.9 +O-10371,53.9 +O-10372,26.0 +O-10373,49.6 +O-10374,23.6 +O-10375,52.4 +O-10376,20.0 +O-10377,40.3 +O-10378,21.0 +O-10379,15.1 +O-10380,17.3 +O-10381,45.4 +O-10382,62.7 +O-10383,60.9 +O-10384,27.5 +O-10385,29.3 +O-10386,29.9 +O-10387,24.6 +O-10388,13.3 +O-10389,34.8 +O-10390,23.5 +O-10391,18.0 +O-10392,22.6 +O-10393,45.3 +O-10394,99.4 +O-10395,44.2 +O-10396,43.3 +O-10397,38.5 +O-10398,18.6 +O-10399,45.8 +O-10400,36.7 diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-x10/case.json b/agents/evals/fixtures/cases/histogram-basic-pygal-x10/case.json new file mode 100644 index 00000000000..f80880350c4 --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-x10/case.json @@ -0,0 +1,20 @@ +{ + "spec_id": "histogram-basic", + "library": "pygal", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "values", + "column": "Delivery Time (min)" + } + ], + "expected": "accepted", + "tags": [ + "histogram", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 404, x10)" +} diff --git a/agents/evals/fixtures/cases/histogram-basic-pygal-x10/data.csv b/agents/evals/fixtures/cases/histogram-basic-pygal-x10/data.csv new file mode 100644 index 00000000000..733d61def1d --- /dev/null +++ b/agents/evals/fixtures/cases/histogram-basic-pygal-x10/data.csv @@ -0,0 +1,401 @@ +Order ID,Delivery Time (min) +O-10001,383.1 +O-10002,393.6 +O-10003,366.8 +O-10004,366.3 +O-10005,163.0 +O-10006,253.5 +O-10007,253.9 +O-10008,286.6 +O-10009,381.0 +O-10010,296.2 +O-10011,195.2 +O-10012,360.2 +O-10013,530.2 +O-10014,300.6 +O-10015,212.6 +O-10016,479.4 +O-10017,418.4 +O-10018,264.2 +O-10019,324.4 +O-10020,228.7 +O-10021,524.3 +O-10022,314.3 +O-10023,197.5 +O-10024,310.6 +O-10025,381.5 +O-10026,526.9 +O-10027,239.1 +O-10028,392.9 +O-10029,468.4 +O-10030,383.1 +O-10031,242.2 +O-10032,577.5 +O-10033,449.1 +O-10034,676.5 +O-10035,223.0 +O-10036,273.5 +O-10037,177.9 +O-10038,342.6 +O-10039,366.8 +O-10040,251.2 +O-10041,316.5 +O-10042,529.3 +O-10043,296.5 +O-10044,309.4 +O-10045,523.2 +O-10046,324.4 +O-10047,474.3 +O-10048,624.4 +O-10049,225.0 +O-10050,146.7 +O-10051,346.2 +O-10052,196.3 +O-10053,339.6 +O-10054,296.1 +O-10055,272.2 +O-10056,537.0 +O-10057,668.0 +O-10058,341.3 +O-10059,391.4 +O-10060,321.0 +O-10061,503.9 +O-10062,186.8 +O-10063,322.0 +O-10064,659.6 +O-10065,406.9 +O-10066,762.6 +O-10067,157.1 +O-10068,182.2 +O-10069,183.7 +O-10070,232.3 +O-10071,348.1 +O-10072,309.1 +O-10073,397.6 +O-10074,275.3 +O-10075,176.5 +O-10076,842.4 +O-10077,279.0 +O-10078,222.2 +O-10079,920.2 +O-10080,310.8 +O-10081,305.7 +O-10082,550.3 +O-10083,356.7 +O-10084,222.8 +O-10085,119.4 +O-10086,140.6 +O-10087,240.3 +O-10088,293.0 +O-10089,468.6 +O-10090,262.3 +O-10091,202.4 +O-10092,184.9 +O-10093,162.5 +O-10094,261.1 +O-10095,311.7 +O-10096,570.6 +O-10097,150.1 +O-10098,336.4 +O-10099,243.5 +O-10100,441.0 +O-10101,516.9 +O-10102,355.9 +O-10103,186.0 +O-10104,416.2 +O-10105,473.4 +O-10106,276.3 +O-10107,452.6 +O-10108,435.9 +O-10109,190.6 +O-10110,262.2 +O-10111,206.4 +O-10112,296.5 +O-10113,618.8 +O-10114,588.3 +O-10115,206.1 +O-10116,137.1 +O-10117,148.4 +O-10118,362.9 +O-10119,1164.0 +O-10120,516.3 +O-10121,192.8 +O-10122,480.3 +O-10123,1060.6 +O-10124,429.0 +O-10125,179.1 +O-10126,279.2 +O-10127,183.2 +O-10128,889.5 +O-10129,512.6 +O-10130,227.0 +O-10131,390.2 +O-10132,317.8 +O-10133,434.1 +O-10134,274.6 +O-10135,211.2 +O-10136,260.2 +O-10137,325.4 +O-10138,238.2 +O-10139,283.6 +O-10140,162.5 +O-10141,183.8 +O-10142,290.4 +O-10143,409.1 +O-10144,308.0 +O-10145,395.7 +O-10146,324.1 +O-10147,249.6 +O-10148,352.2 +O-10149,187.4 +O-10150,306.5 +O-10151,314.9 +O-10152,227.1 +O-10153,206.5 +O-10154,273.4 +O-10155,437.9 +O-10156,329.5 +O-10157,421.2 +O-10158,207.1 +O-10159,147.5 +O-10160,160.0 +O-10161,251.9 +O-10162,384.8 +O-10163,394.8 +O-10164,430.4 +O-10165,374.6 +O-10166,231.7 +O-10167,620.5 +O-10168,98.4 +O-10169,412.2 +O-10170,337.6 +O-10171,215.4 +O-10172,576.6 +O-10173,340.3 +O-10174,162.2 +O-10175,272.2 +O-10176,163.5 +O-10177,296.3 +O-10178,227.8 +O-10179,230.9 +O-10180,364.1 +O-10181,615.6 +O-10182,238.6 +O-10183,250.7 +O-10184,236.4 +O-10185,230.9 +O-10186,324.4 +O-10187,865.4 +O-10188,267.5 +O-10189,400.8 +O-10190,223.9 +O-10191,323.9 +O-10192,255.7 +O-10193,305.5 +O-10194,687.4 +O-10195,370.7 +O-10196,295.3 +O-10197,610.7 +O-10198,507.2 +O-10199,353.8 +O-10200,365.6 +O-10201,375.0 +O-10202,378.7 +O-10203,180.4 +O-10204,419.2 +O-10205,531.1 +O-10206,198.6 +O-10207,164.4 +O-10208,395.4 +O-10209,327.8 +O-10210,379.5 +O-10211,394.6 +O-10212,393.9 +O-10213,245.6 +O-10214,407.4 +O-10215,275.9 +O-10216,214.2 +O-10217,440.5 +O-10218,225.9 +O-10219,308.9 +O-10220,265.1 +O-10221,206.8 +O-10222,217.0 +O-10223,311.4 +O-10224,311.2 +O-10225,397.0 +O-10226,301.7 +O-10227,227.6 +O-10228,362.7 +O-10229,324.5 +O-10230,493.8 +O-10231,391.5 +O-10232,215.6 +O-10233,138.4 +O-10234,311.2 +O-10235,219.3 +O-10236,490.1 +O-10237,204.4 +O-10238,214.4 +O-10239,484.9 +O-10240,170.9 +O-10241,292.7 +O-10242,695.8 +O-10243,312.5 +O-10244,430.6 +O-10245,467.1 +O-10246,286.8 +O-10247,317.3 +O-10248,299.8 +O-10249,380.7 +O-10250,147.6 +O-10251,272.3 +O-10252,558.1 +O-10253,389.1 +O-10254,238.0 +O-10255,318.4 +O-10256,131.7 +O-10257,721.7 +O-10258,363.0 +O-10259,157.0 +O-10260,262.8 +O-10261,244.9 +O-10262,675.3 +O-10263,204.8 +O-10264,233.6 +O-10265,628.2 +O-10266,345.1 +O-10267,252.3 +O-10268,213.3 +O-10269,490.2 +O-10270,488.2 +O-10271,499.9 +O-10272,230.8 +O-10273,627.0 +O-10274,856.6 +O-10275,295.3 +O-10276,149.1 +O-10277,397.5 +O-10278,482.9 +O-10279,267.1 +O-10280,266.3 +O-10281,523.8 +O-10282,405.4 +O-10283,149.2 +O-10284,429.4 +O-10285,263.9 +O-10286,106.3 +O-10287,219.1 +O-10288,401.3 +O-10289,578.6 +O-10290,425.8 +O-10291,436.4 +O-10292,413.3 +O-10293,669.3 +O-10294,185.5 +O-10295,407.2 +O-10296,886.2 +O-10297,394.8 +O-10298,155.9 +O-10299,172.7 +O-10300,273.1 +O-10301,569.0 +O-10302,388.2 +O-10303,198.9 +O-10304,268.0 +O-10305,259.1 +O-10306,327.9 +O-10307,469.4 +O-10308,166.0 +O-10309,268.9 +O-10310,407.2 +O-10311,400.9 +O-10312,425.5 +O-10313,675.5 +O-10314,159.2 +O-10315,261.2 +O-10316,244.2 +O-10317,165.5 +O-10318,232.5 +O-10319,150.9 +O-10320,153.5 +O-10321,296.8 +O-10322,389.3 +O-10323,266.5 +O-10324,361.5 +O-10325,210.2 +O-10326,254.7 +O-10327,427.7 +O-10328,370.0 +O-10329,405.3 +O-10330,176.7 +O-10331,312.5 +O-10332,568.2 +O-10333,734.2 +O-10334,191.7 +O-10335,174.1 +O-10336,243.2 +O-10337,306.4 +O-10338,378.2 +O-10339,160.4 +O-10340,444.9 +O-10341,127.2 +O-10342,107.4 +O-10343,524.9 +O-10344,141.7 +O-10345,210.4 +O-10346,282.5 +O-10347,216.0 +O-10348,237.6 +O-10349,445.4 +O-10350,402.9 +O-10351,400.9 +O-10352,394.1 +O-10353,292.5 +O-10354,306.5 +O-10355,387.3 +O-10356,236.9 +O-10357,757.9 +O-10358,431.8 +O-10359,445.1 +O-10360,443.2 +O-10361,378.3 +O-10362,387.3 +O-10363,439.7 +O-10364,181.3 +O-10365,559.1 +O-10366,222.9 +O-10367,167.6 +O-10368,336.2 +O-10369,392.9 +O-10370,318.6 +O-10371,538.6 +O-10372,260.2 +O-10373,495.9 +O-10374,236.0 +O-10375,524.1 +O-10376,200.3 +O-10377,403.0 +O-10378,210.2 +O-10379,151.2 +O-10380,172.6 +O-10381,454.4 +O-10382,627.4 +O-10383,608.8 +O-10384,275.3 +O-10385,293.3 +O-10386,299.0 +O-10387,246.3 +O-10388,133.2 +O-10389,347.9 +O-10390,235.3 +O-10391,179.7 +O-10392,225.9 +O-10393,452.7 +O-10394,994.0 +O-10395,442.2 +O-10396,432.7 +O-10397,384.7 +O-10398,186.2 +O-10399,457.6 +O-10400,367.4 diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-date/case.json b/agents/evals/fixtures/cases/line-basic-letsplot-date/case.json new file mode 100644 index 00000000000..6652f9730da --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "line-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "x", + "column": "Timestamp" + }, + { + "role": "y", + "column": "Tank Temperature (°C)" + } + ], + "expected": "accepted", + "tags": [ + "line", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "date-axis" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, date)" +} diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-date/data.csv b/agents/evals/fixtures/cases/line-basic-letsplot-date/data.csv new file mode 100644 index 00000000000..02d4c96346c --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-date/data.csv @@ -0,0 +1,62 @@ +Timestamp,Logged At,Tank Temperature (°C) +14.03.2026 06:00,2026-03-15T06:00,21.1 +14.03.2026 06:02,2026-03-15T06:02,23.2 +14.03.2026 06:04,2026-03-15T06:04,26.4 +14.03.2026 06:06,2026-03-15T06:06,30.0 +14.03.2026 06:08,2026-03-15T06:08,32.6 +14.03.2026 06:10,2026-03-15T06:10,37.1 +14.03.2026 06:12,2026-03-15T06:12,39.4 +14.03.2026 06:14,2026-03-15T06:14,41.8 +14.03.2026 06:16,2026-03-15T06:16,44.7 +14.03.2026 06:18,2026-03-15T06:18,45.8 +14.03.2026 06:20,2026-03-15T06:20,47.5 +14.03.2026 06:22,2026-03-15T06:22,50.5 +14.03.2026 06:24,2026-03-15T06:24,52.4 +14.03.2026 06:26,2026-03-15T06:26,53.6 +14.03.2026 06:28,2026-03-15T06:28,56.1 +14.03.2026 06:30,2026-03-15T06:30,58.3 +14.03.2026 06:32,2026-03-15T06:32,58.6 +14.03.2026 06:34,2026-03-15T06:34,60.5 +14.03.2026 06:36,2026-03-15T06:36,62.0 +14.03.2026 06:38,2026-03-15T06:38,63.3 +14.03.2026 06:40,2026-03-15T06:40,64.9 +14.03.2026 06:42,2026-03-15T06:42,65.8 +14.03.2026 06:44,2026-03-15T06:44,67.3 +14.03.2026 06:46,2026-03-15T06:46,67.1 +14.03.2026 06:48,2026-03-15T06:48,68.2 +14.03.2026 06:50,2026-03-15T06:50,69.9 +14.03.2026 06:52,2026-03-15T06:52,70.0 +14.03.2026 06:54,2026-03-15T06:54,70.8 +14.03.2026 06:56,2026-03-15T06:56,71.8 +14.03.2026 06:58,2026-03-15T06:58,72.8 +14.03.2026 07:00,2026-03-15T07:00,73.0 +14.03.2026 07:02,2026-03-15T07:02,74.3 +14.03.2026 07:04,2026-03-15T07:04,75.4 +14.03.2026 07:06,2026-03-15T07:06,74.1 +14.03.2026 07:08,2026-03-15T07:08,74.3 +14.03.2026 07:10,2026-03-15T07:10,76.7 +14.03.2026 07:12,2026-03-15T07:12,76.2 +14.03.2026 07:14,2026-03-15T07:14,78.0 +14.03.2026 07:16,2026-03-15T07:16,79.3 +14.03.2026 07:18,2026-03-15T07:18,77.9 +14.03.2026 07:20,2026-03-15T07:20,78.2 +14.03.2026 07:22,2026-03-15T07:22,78.8 +14.03.2026 07:24,2026-03-15T07:24,79.3 +14.03.2026 07:26,2026-03-15T07:26,79.4 +14.03.2026 07:28,2026-03-15T07:28,79.2 +14.03.2026 07:30,2026-03-15T07:30,80.3 +14.03.2026 07:32,2026-03-15T07:32,79.1 +14.03.2026 07:34,2026-03-15T07:34,80.8 +14.03.2026 07:36,2026-03-15T07:36,80.9 +14.03.2026 07:38,2026-03-15T07:38,81.8 +14.03.2026 07:40,2026-03-15T07:40,81.4 +14.03.2026 07:42,2026-03-15T07:42,81.8 +14.03.2026 07:44,2026-03-15T07:44,81.1 +14.03.2026 07:46,2026-03-15T07:46,82.0 +14.03.2026 07:48,2026-03-15T07:48,82.5 +14.03.2026 07:50,2026-03-15T07:50,82.8 +14.03.2026 07:52,2026-03-15T07:52,82.4 +14.03.2026 07:54,2026-03-15T07:54,83.4 +14.03.2026 07:56,2026-03-15T07:56,83.4 +14.03.2026 07:58,2026-03-15T07:58,82.4 +14.03.2026 08:00,2026-03-15T08:00,81.4 diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-decimal-comma/case.json b/agents/evals/fixtures/cases/line-basic-letsplot-decimal-comma/case.json new file mode 100644 index 00000000000..5c113b23902 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "x", + "column": "Elapsed Time (min)" + }, + { + "role": "y", + "column": "Tank Temperature (°C)" + } + ], + "expected": "accepted", + "tags": [ + "line", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-decimal-comma/data.csv b/agents/evals/fixtures/cases/line-basic-letsplot-decimal-comma/data.csv new file mode 100644 index 00000000000..5e8c0fc21ee --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-decimal-comma/data.csv @@ -0,0 +1,62 @@ +Elapsed Time (min);Tank Temperature (°C) +0,00;21,1 +2,00;23,2 +4,00;26,4 +6,00;30,0 +8,00;32,6 +10,00;37,1 +12,00;39,4 +14,00;41,8 +16,00;44,7 +18,00;45,8 +20,00;47,5 +22,00;50,5 +24,00;52,4 +26,00;53,6 +28,00;56,1 +30,00;58,3 +32,00;58,6 +34,00;60,5 +36,00;62,0 +38,00;63,3 +40,00;64,9 +42,00;65,8 +44,00;67,3 +46,00;67,1 +48,00;68,2 +50,00;69,9 +52,00;70,0 +54,00;70,8 +56,00;71,8 +58,00;72,8 +60,00;73,0 +62,00;74,3 +64,00;75,4 +66,00;74,1 +68,00;74,3 +70,00;76,7 +72,00;76,2 +74,00;78,0 +76,00;79,3 +78,00;77,9 +80,00;78,2 +82,00;78,8 +84,00;79,3 +86,00;79,4 +88,00;79,2 +90,00;80,3 +92,00;79,1 +94,00;80,8 +96,00;80,9 +98,00;81,8 +100,00;81,4 +102,00;81,8 +104,00;81,1 +106,00;82,0 +108,00;82,5 +110,00;82,8 +112,00;82,4 +114,00;83,4 +116,00;83,4 +118,00;82,4 +120,00;81,4 diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-n12/case.json b/agents/evals/fixtures/cases/line-basic-letsplot-n12/case.json new file mode 100644 index 00000000000..7f63fe31e9c --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "x", + "column": "Elapsed Time (min)" + }, + { + "role": "y", + "column": "Tank Temperature (°C)" + } + ], + "expected": "accepted", + "tags": [ + "line", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, n12)" +} diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-n12/data.csv b/agents/evals/fixtures/cases/line-basic-letsplot-n12/data.csv new file mode 100644 index 00000000000..484b2229ff5 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-n12/data.csv @@ -0,0 +1,13 @@ +Elapsed Time (min),Tank Temperature (°C) +0.00,19.6 +10.91,37.8 +21.82,49.3 +32.73,58.5 +43.64,66.1 +54.55,70.5 +65.45,75.6 +76.36,78.4 +87.27,80.4 +98.18,80.8 +109.09,82.4 +120.00,83.0 diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-n5000/case.json b/agents/evals/fixtures/cases/line-basic-letsplot-n5000/case.json new file mode 100644 index 00000000000..22c2ec618f0 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "x", + "column": "Elapsed Time (min)" + }, + { + "role": "y", + "column": "Tank Temperature (°C)" + } + ], + "expected": "accepted", + "tags": [ + "line", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, n5000)" +} diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-n5000/data.csv b/agents/evals/fixtures/cases/line-basic-letsplot-n5000/data.csv new file mode 100644 index 00000000000..bc2d96257a5 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-n5000/data.csv @@ -0,0 +1,5001 @@ +Elapsed Time (min),Tank Temperature (°C) +0.000,19.4 +0.024,20.3 +0.048,20.4 +0.072,20.6 +0.096,19.9 +0.120,20.6 +0.144,20.4 +0.168,21.0 +0.192,20.7 +0.216,20.9 +0.240,22.5 +0.264,20.0 +0.288,21.4 +0.312,20.9 +0.336,21.0 +0.360,20.2 +0.384,21.6 +0.408,20.5 +0.432,20.6 +0.456,20.0 +0.480,20.2 +0.504,21.4 +0.528,21.0 +0.552,21.3 +0.576,20.6 +0.600,21.0 +0.624,20.4 +0.648,22.0 +0.672,21.4 +0.696,21.5 +0.720,22.0 +0.744,21.3 +0.768,21.3 +0.792,22.1 +0.816,21.6 +0.840,21.8 +0.864,21.8 +0.888,21.6 +0.912,21.7 +0.936,21.4 +0.960,22.3 +0.984,21.4 +1.008,22.8 +1.032,22.2 +1.056,21.4 +1.080,21.7 +1.104,22.7 +1.128,22.1 +1.152,21.4 +1.176,22.3 +1.200,22.6 +1.224,22.9 +1.248,23.2 +1.272,23.7 +1.296,22.6 +1.320,22.8 +1.344,22.8 +1.368,22.2 +1.392,22.2 +1.416,22.9 +1.440,22.1 +1.464,21.5 +1.488,23.2 +1.512,22.5 +1.536,22.8 +1.560,23.4 +1.584,25.0 +1.608,21.9 +1.632,22.7 +1.656,23.9 +1.680,23.3 +1.704,23.1 +1.728,22.8 +1.752,23.4 +1.776,22.9 +1.800,23.0 +1.824,23.0 +1.848,22.7 +1.872,22.4 +1.896,23.3 +1.920,23.6 +1.944,23.8 +1.968,23.6 +1.992,23.7 +2.016,23.3 +2.040,23.9 +2.064,23.3 +2.088,23.3 +2.112,23.6 +2.136,24.6 +2.160,24.2 +2.184,23.9 +2.208,23.5 +2.232,24.9 +2.256,24.6 +2.280,23.6 +2.304,23.9 +2.328,24.2 +2.352,25.1 +2.376,24.5 +2.400,24.2 +2.424,24.7 +2.448,25.2 +2.472,24.1 +2.496,23.6 +2.521,24.1 +2.545,24.4 +2.569,25.6 +2.593,24.4 +2.617,24.8 +2.641,24.7 +2.665,24.2 +2.689,24.4 +2.713,24.8 +2.737,24.7 +2.761,24.1 +2.785,24.5 +2.809,25.2 +2.833,24.7 +2.857,23.6 +2.881,26.2 +2.905,24.7 +2.929,24.6 +2.953,24.6 +2.977,25.8 +3.001,25.8 +3.025,24.8 +3.049,24.6 +3.073,25.1 +3.097,25.9 +3.121,25.0 +3.145,25.5 +3.169,25.9 +3.193,24.6 +3.217,24.9 +3.241,24.9 +3.265,25.9 +3.289,25.8 +3.313,25.6 +3.337,25.9 +3.361,26.2 +3.385,26.2 +3.409,26.4 +3.433,25.1 +3.457,26.3 +3.481,24.9 +3.505,25.4 +3.529,25.7 +3.553,26.5 +3.577,26.4 +3.601,26.4 +3.625,25.9 +3.649,26.4 +3.673,26.1 +3.697,25.7 +3.721,26.3 +3.745,27.0 +3.769,26.6 +3.793,26.6 +3.817,27.1 +3.841,26.8 +3.865,26.6 +3.889,27.2 +3.913,25.8 +3.937,26.2 +3.961,27.7 +3.985,27.7 +4.009,27.0 +4.033,26.6 +4.057,26.6 +4.081,26.4 +4.105,28.4 +4.129,26.6 +4.153,27.4 +4.177,26.3 +4.201,26.4 +4.225,28.6 +4.249,27.8 +4.273,26.9 +4.297,27.8 +4.321,27.4 +4.345,28.3 +4.369,27.0 +4.393,27.2 +4.417,27.3 +4.441,28.4 +4.465,27.6 +4.489,27.8 +4.513,27.9 +4.537,28.8 +4.561,27.4 +4.585,28.3 +4.609,27.7 +4.633,28.4 +4.657,28.2 +4.681,28.1 +4.705,28.0 +4.729,29.4 +4.753,28.5 +4.777,27.9 +4.801,29.3 +4.825,27.9 +4.849,28.8 +4.873,28.8 +4.897,28.4 +4.921,26.9 +4.945,29.2 +4.969,28.2 +4.993,29.9 +5.017,28.5 +5.041,29.1 +5.065,27.9 +5.089,28.7 +5.113,29.3 +5.137,29.4 +5.161,28.6 +5.185,28.5 +5.209,28.7 +5.233,29.4 +5.257,29.1 +5.281,27.9 +5.305,30.5 +5.329,29.1 +5.353,29.2 +5.377,29.4 +5.401,29.7 +5.425,29.1 +5.449,29.3 +5.473,30.4 +5.497,30.4 +5.521,28.6 +5.545,29.7 +5.569,30.2 +5.593,29.8 +5.617,30.0 +5.641,29.3 +5.665,30.0 +5.689,30.5 +5.713,30.4 +5.737,30.7 +5.761,29.4 +5.785,30.3 +5.809,29.5 +5.833,29.7 +5.857,30.4 +5.881,28.6 +5.905,30.3 +5.929,30.4 +5.953,30.2 +5.977,31.2 +6.001,29.9 +6.025,31.0 +6.049,30.2 +6.073,30.2 +6.097,29.8 +6.121,30.3 +6.145,30.6 +6.169,30.2 +6.193,31.4 +6.217,30.1 +6.241,29.8 +6.265,32.1 +6.289,31.2 +6.313,29.7 +6.337,31.0 +6.361,29.8 +6.385,29.8 +6.409,31.4 +6.433,30.6 +6.457,31.9 +6.481,31.9 +6.505,31.3 +6.529,32.5 +6.553,31.3 +6.577,30.5 +6.601,31.3 +6.625,31.0 +6.649,31.0 +6.673,30.6 +6.697,30.9 +6.721,31.4 +6.745,31.4 +6.769,31.2 +6.793,32.6 +6.817,31.0 +6.841,31.3 +6.865,31.1 +6.889,31.5 +6.913,31.7 +6.937,30.9 +6.961,33.3 +6.985,32.9 +7.009,32.5 +7.033,32.2 +7.057,32.1 +7.081,31.6 +7.105,32.1 +7.129,31.9 +7.153,32.9 +7.177,32.6 +7.201,32.9 +7.225,31.7 +7.249,31.9 +7.273,32.2 +7.297,33.0 +7.321,32.2 +7.345,31.4 +7.369,32.8 +7.393,31.2 +7.417,32.0 +7.441,32.0 +7.465,32.1 +7.489,32.8 +7.514,32.9 +7.538,32.4 +7.562,32.5 +7.586,32.8 +7.610,33.0 +7.634,33.0 +7.658,33.1 +7.682,33.4 +7.706,33.8 +7.730,32.9 +7.754,32.4 +7.778,33.0 +7.802,33.3 +7.826,33.6 +7.850,32.6 +7.874,33.0 +7.898,32.5 +7.922,33.0 +7.946,33.7 +7.970,33.2 +7.994,33.8 +8.018,33.9 +8.042,34.0 +8.066,33.1 +8.090,34.1 +8.114,33.1 +8.138,33.5 +8.162,34.2 +8.186,34.3 +8.210,33.8 +8.234,33.5 +8.258,34.7 +8.282,34.0 +8.306,34.2 +8.330,33.1 +8.354,33.4 +8.378,34.7 +8.402,33.4 +8.426,33.0 +8.450,33.1 +8.474,33.6 +8.498,33.1 +8.522,33.7 +8.546,33.8 +8.570,34.0 +8.594,34.6 +8.618,34.2 +8.642,34.1 +8.666,34.6 +8.690,35.0 +8.714,32.5 +8.738,34.6 +8.762,34.3 +8.786,34.4 +8.810,34.6 +8.834,34.5 +8.858,33.3 +8.882,35.1 +8.906,34.5 +8.930,34.6 +8.954,35.7 +8.978,35.2 +9.002,35.1 +9.026,34.2 +9.050,34.3 +9.074,34.3 +9.098,34.8 +9.122,34.9 +9.146,36.1 +9.170,35.4 +9.194,35.1 +9.218,34.9 +9.242,34.2 +9.266,35.3 +9.290,34.7 +9.314,35.2 +9.338,35.0 +9.362,35.0 +9.386,34.6 +9.410,35.0 +9.434,34.7 +9.458,35.7 +9.482,35.0 +9.506,36.0 +9.530,35.3 +9.554,35.7 +9.578,36.2 +9.602,35.8 +9.626,35.5 +9.650,36.3 +9.674,36.2 +9.698,35.2 +9.722,35.6 +9.746,36.4 +9.770,35.4 +9.794,35.7 +9.818,34.9 +9.842,36.0 +9.866,35.3 +9.890,35.8 +9.914,35.3 +9.938,36.0 +9.962,35.9 +9.986,35.5 +10.010,35.6 +10.034,36.9 +10.058,35.5 +10.082,36.0 +10.106,36.3 +10.130,37.3 +10.154,36.2 +10.178,37.0 +10.202,36.2 +10.226,36.0 +10.250,37.2 +10.274,37.1 +10.298,36.8 +10.322,36.7 +10.346,35.6 +10.370,36.5 +10.394,36.6 +10.418,36.3 +10.442,36.8 +10.466,37.0 +10.490,37.2 +10.514,37.3 +10.538,36.4 +10.562,37.2 +10.586,37.3 +10.610,36.1 +10.634,36.6 +10.658,35.8 +10.682,36.7 +10.706,37.3 +10.730,37.3 +10.754,36.7 +10.778,38.2 +10.802,38.4 +10.826,37.5 +10.850,37.6 +10.874,37.5 +10.898,36.9 +10.922,38.3 +10.946,36.7 +10.970,38.8 +10.994,38.2 +11.018,38.3 +11.042,37.5 +11.066,37.9 +11.090,38.0 +11.114,37.9 +11.138,38.3 +11.162,38.2 +11.186,37.5 +11.210,38.7 +11.234,37.9 +11.258,37.2 +11.282,38.5 +11.306,37.3 +11.330,37.8 +11.354,39.3 +11.378,38.2 +11.402,37.7 +11.426,38.1 +11.450,39.1 +11.474,38.7 +11.498,39.0 +11.522,38.5 +11.546,38.3 +11.570,38.5 +11.594,38.0 +11.618,38.9 +11.642,38.3 +11.666,38.4 +11.690,37.6 +11.714,39.0 +11.738,38.8 +11.762,38.3 +11.786,38.1 +11.810,39.7 +11.834,37.8 +11.858,38.8 +11.882,37.9 +11.906,38.6 +11.930,39.5 +11.954,38.8 +11.978,38.4 +12.002,39.4 +12.026,39.7 +12.050,38.1 +12.074,39.5 +12.098,39.4 +12.122,38.4 +12.146,39.7 +12.170,39.1 +12.194,39.1 +12.218,39.2 +12.242,38.6 +12.266,39.4 +12.290,38.2 +12.314,39.9 +12.338,39.4 +12.362,39.4 +12.386,38.5 +12.410,40.3 +12.434,39.2 +12.458,39.1 +12.482,40.7 +12.507,39.2 +12.531,38.8 +12.555,40.0 +12.579,39.4 +12.603,40.0 +12.627,39.5 +12.651,39.6 +12.675,40.2 +12.699,40.0 +12.723,39.7 +12.747,40.0 +12.771,39.9 +12.795,40.6 +12.819,38.7 +12.843,40.1 +12.867,40.0 +12.891,40.6 +12.915,40.6 +12.939,40.0 +12.963,40.4 +12.987,41.0 +13.011,40.0 +13.035,40.7 +13.059,40.3 +13.083,40.5 +13.107,40.7 +13.131,40.4 +13.155,41.4 +13.179,40.3 +13.203,39.7 +13.227,40.6 +13.251,40.4 +13.275,40.4 +13.299,41.6 +13.323,40.2 +13.347,41.0 +13.371,40.5 +13.395,39.9 +13.419,41.1 +13.443,40.7 +13.467,41.5 +13.491,40.9 +13.515,40.4 +13.539,41.5 +13.563,40.7 +13.587,41.0 +13.611,41.1 +13.635,41.1 +13.659,42.0 +13.683,40.4 +13.707,41.0 +13.731,40.7 +13.755,40.2 +13.779,41.2 +13.803,41.8 +13.827,39.9 +13.851,40.6 +13.875,41.4 +13.899,41.4 +13.923,41.0 +13.947,40.6 +13.971,41.1 +13.995,41.2 +14.019,40.8 +14.043,42.2 +14.067,42.3 +14.091,41.4 +14.115,41.1 +14.139,41.6 +14.163,40.4 +14.187,42.1 +14.211,40.8 +14.235,41.4 +14.259,42.0 +14.283,41.6 +14.307,40.5 +14.331,42.4 +14.355,43.2 +14.379,43.0 +14.403,43.1 +14.427,43.0 +14.451,41.9 +14.475,43.0 +14.499,41.4 +14.523,41.9 +14.547,42.9 +14.571,42.0 +14.595,43.0 +14.619,43.2 +14.643,41.9 +14.667,42.5 +14.691,40.8 +14.715,42.4 +14.739,42.9 +14.763,42.6 +14.787,42.4 +14.811,41.3 +14.835,42.3 +14.859,42.2 +14.883,42.1 +14.907,43.2 +14.931,41.8 +14.955,41.9 +14.979,41.7 +15.003,42.4 +15.027,42.8 +15.051,42.8 +15.075,43.6 +15.099,41.8 +15.123,42.1 +15.147,43.3 +15.171,42.6 +15.195,42.3 +15.219,42.3 +15.243,42.9 +15.267,42.6 +15.291,43.1 +15.315,42.8 +15.339,43.0 +15.363,43.3 +15.387,44.5 +15.411,43.3 +15.435,42.1 +15.459,43.3 +15.483,42.8 +15.507,43.3 +15.531,43.0 +15.555,43.1 +15.579,42.0 +15.603,42.2 +15.627,45.1 +15.651,43.8 +15.675,43.3 +15.699,43.2 +15.723,44.2 +15.747,44.1 +15.771,44.8 +15.795,43.4 +15.819,43.5 +15.843,44.3 +15.867,44.3 +15.891,42.9 +15.915,43.1 +15.939,43.4 +15.963,43.7 +15.987,42.5 +16.011,43.4 +16.035,44.2 +16.059,44.4 +16.083,44.5 +16.107,43.8 +16.131,44.5 +16.155,43.8 +16.179,43.3 +16.203,43.7 +16.227,43.2 +16.251,44.8 +16.275,44.1 +16.299,44.5 +16.323,44.1 +16.347,43.9 +16.371,44.3 +16.395,44.0 +16.419,43.8 +16.443,44.2 +16.467,43.5 +16.491,43.7 +16.515,44.6 +16.539,43.3 +16.563,44.5 +16.587,44.1 +16.611,44.8 +16.635,45.0 +16.659,44.7 +16.683,44.0 +16.707,44.6 +16.731,44.4 +16.755,44.4 +16.779,45.3 +16.803,44.4 +16.827,43.7 +16.851,45.8 +16.875,44.9 +16.899,45.2 +16.923,44.7 +16.947,44.8 +16.971,44.2 +16.995,45.6 +17.019,45.3 +17.043,45.9 +17.067,45.0 +17.091,45.2 +17.115,45.4 +17.139,46.2 +17.163,44.7 +17.187,45.4 +17.211,45.5 +17.235,45.1 +17.259,45.8 +17.283,46.9 +17.307,44.9 +17.331,45.2 +17.355,45.4 +17.379,44.1 +17.403,44.5 +17.427,44.5 +17.451,45.7 +17.475,45.9 +17.499,45.1 +17.524,45.7 +17.548,45.4 +17.572,45.6 +17.596,46.3 +17.620,44.9 +17.644,46.2 +17.668,46.8 +17.692,46.6 +17.716,46.8 +17.740,45.7 +17.764,46.0 +17.788,44.8 +17.812,46.0 +17.836,47.5 +17.860,46.6 +17.884,46.8 +17.908,45.4 +17.932,45.1 +17.956,46.0 +17.980,46.5 +18.004,47.0 +18.028,46.5 +18.052,45.9 +18.076,47.1 +18.100,46.6 +18.124,46.5 +18.148,46.4 +18.172,46.8 +18.196,46.8 +18.220,46.5 +18.244,44.8 +18.268,46.6 +18.292,46.8 +18.316,46.4 +18.340,46.1 +18.364,46.3 +18.388,45.9 +18.412,46.3 +18.436,45.9 +18.460,46.6 +18.484,47.2 +18.508,46.1 +18.532,47.3 +18.556,48.1 +18.580,47.2 +18.604,46.7 +18.628,47.8 +18.652,46.5 +18.676,46.4 +18.700,46.7 +18.724,47.5 +18.748,47.5 +18.772,48.1 +18.796,47.8 +18.820,47.1 +18.844,46.9 +18.868,47.7 +18.892,47.9 +18.916,47.6 +18.940,46.4 +18.964,48.1 +18.988,47.0 +19.012,46.6 +19.036,47.4 +19.060,48.0 +19.084,47.8 +19.108,47.4 +19.132,47.5 +19.156,47.1 +19.180,48.2 +19.204,47.0 +19.228,47.6 +19.252,46.8 +19.276,48.3 +19.300,48.3 +19.324,47.7 +19.348,46.8 +19.372,47.6 +19.396,47.1 +19.420,47.9 +19.444,48.0 +19.468,49.1 +19.492,47.5 +19.516,47.8 +19.540,47.1 +19.564,48.9 +19.588,48.8 +19.612,48.1 +19.636,47.8 +19.660,47.2 +19.684,46.3 +19.708,47.9 +19.732,47.0 +19.756,47.2 +19.780,48.7 +19.804,48.5 +19.828,48.1 +19.852,48.1 +19.876,49.3 +19.900,47.6 +19.924,47.8 +19.948,47.5 +19.972,46.8 +19.996,49.0 +20.020,48.0 +20.044,48.8 +20.068,48.4 +20.092,48.7 +20.116,48.5 +20.140,47.8 +20.164,48.4 +20.188,48.7 +20.212,49.6 +20.236,47.7 +20.260,49.4 +20.284,49.7 +20.308,48.9 +20.332,48.9 +20.356,49.1 +20.380,49.0 +20.404,48.5 +20.428,48.4 +20.452,48.6 +20.476,49.3 +20.500,49.2 +20.524,49.4 +20.548,49.0 +20.572,49.8 +20.596,49.1 +20.620,49.7 +20.644,50.2 +20.668,48.4 +20.692,48.9 +20.716,48.7 +20.740,48.9 +20.764,48.6 +20.788,49.1 +20.812,50.3 +20.836,49.4 +20.860,48.3 +20.884,48.9 +20.908,50.1 +20.932,49.0 +20.956,50.1 +20.980,48.8 +21.004,49.9 +21.028,49.5 +21.052,48.8 +21.076,49.3 +21.100,49.8 +21.124,50.4 +21.148,49.3 +21.172,49.7 +21.196,49.7 +21.220,48.9 +21.244,49.9 +21.268,50.0 +21.292,49.6 +21.316,50.3 +21.340,49.9 +21.364,49.4 +21.388,49.8 +21.412,50.2 +21.436,49.6 +21.460,50.2 +21.484,49.2 +21.508,51.1 +21.532,49.2 +21.556,51.0 +21.580,50.2 +21.604,48.3 +21.628,50.8 +21.652,51.2 +21.676,51.9 +21.700,50.1 +21.724,50.9 +21.748,50.8 +21.772,49.9 +21.796,51.2 +21.820,49.3 +21.844,51.0 +21.868,50.4 +21.892,50.9 +21.916,49.6 +21.940,51.1 +21.964,50.5 +21.988,49.7 +22.012,50.5 +22.036,50.7 +22.060,49.4 +22.084,51.1 +22.108,50.8 +22.132,49.2 +22.156,49.6 +22.180,50.8 +22.204,50.4 +22.228,50.5 +22.252,49.7 +22.276,50.4 +22.300,50.7 +22.324,51.2 +22.348,51.0 +22.372,51.1 +22.396,50.7 +22.420,49.6 +22.444,51.2 +22.468,50.6 +22.492,50.2 +22.517,49.5 +22.541,49.5 +22.565,51.1 +22.589,49.8 +22.613,50.5 +22.637,52.0 +22.661,51.3 +22.685,50.9 +22.709,50.6 +22.733,50.7 +22.757,50.1 +22.781,50.3 +22.805,51.2 +22.829,51.6 +22.853,51.0 +22.877,50.6 +22.901,51.7 +22.925,52.1 +22.949,51.2 +22.973,51.5 +22.997,51.7 +23.021,51.6 +23.045,51.2 +23.069,51.5 +23.093,51.0 +23.117,51.7 +23.141,51.4 +23.165,52.3 +23.189,51.7 +23.213,51.3 +23.237,50.3 +23.261,51.7 +23.285,52.8 +23.309,51.5 +23.333,51.8 +23.357,51.6 +23.381,50.7 +23.405,52.1 +23.429,51.5 +23.453,52.5 +23.477,51.8 +23.501,50.3 +23.525,53.2 +23.549,51.8 +23.573,51.8 +23.597,51.8 +23.621,52.5 +23.645,53.3 +23.669,52.8 +23.693,51.2 +23.717,52.7 +23.741,52.9 +23.765,51.2 +23.789,52.3 +23.813,51.9 +23.837,52.1 +23.861,52.4 +23.885,52.8 +23.909,51.5 +23.933,51.9 +23.957,52.1 +23.981,51.9 +24.005,51.2 +24.029,53.1 +24.053,51.9 +24.077,52.0 +24.101,52.4 +24.125,52.9 +24.149,53.3 +24.173,52.0 +24.197,52.3 +24.221,51.8 +24.245,52.2 +24.269,52.8 +24.293,52.2 +24.317,52.7 +24.341,53.1 +24.365,52.4 +24.389,52.5 +24.413,52.8 +24.437,53.1 +24.461,52.7 +24.485,52.4 +24.509,53.0 +24.533,52.6 +24.557,52.7 +24.581,54.3 +24.605,54.4 +24.629,53.2 +24.653,53.1 +24.677,53.0 +24.701,54.0 +24.725,53.8 +24.749,52.8 +24.773,52.4 +24.797,52.7 +24.821,54.1 +24.845,53.9 +24.869,53.6 +24.893,53.2 +24.917,52.4 +24.941,52.4 +24.965,53.2 +24.989,53.5 +25.013,53.8 +25.037,54.1 +25.061,53.3 +25.085,53.4 +25.109,53.5 +25.133,54.5 +25.157,52.0 +25.181,54.0 +25.205,54.0 +25.229,52.6 +25.253,53.4 +25.277,53.5 +25.301,52.4 +25.325,52.9 +25.349,53.7 +25.373,53.2 +25.397,54.4 +25.421,53.1 +25.445,54.1 +25.469,53.3 +25.493,54.4 +25.517,54.1 +25.541,53.9 +25.565,52.6 +25.589,54.3 +25.613,53.4 +25.637,53.2 +25.661,53.4 +25.685,53.9 +25.709,53.5 +25.733,53.4 +25.757,54.3 +25.781,55.5 +25.805,53.7 +25.829,54.1 +25.853,54.0 +25.877,55.3 +25.901,54.2 +25.925,53.5 +25.949,54.8 +25.973,53.7 +25.997,55.0 +26.021,54.9 +26.045,54.7 +26.069,54.0 +26.093,54.7 +26.117,54.3 +26.141,54.3 +26.165,54.0 +26.189,54.4 +26.213,53.5 +26.237,54.8 +26.261,54.0 +26.285,54.6 +26.309,54.8 +26.333,53.9 +26.357,54.1 +26.381,53.7 +26.405,55.6 +26.429,53.8 +26.453,53.7 +26.477,54.9 +26.501,54.6 +26.525,54.3 +26.549,55.0 +26.573,54.9 +26.597,54.5 +26.621,53.2 +26.645,54.9 +26.669,54.8 +26.693,54.9 +26.717,53.7 +26.741,54.2 +26.765,54.6 +26.789,54.1 +26.813,54.4 +26.837,55.0 +26.861,56.1 +26.885,54.8 +26.909,54.9 +26.933,55.0 +26.957,54.7 +26.981,53.6 +27.005,55.3 +27.029,54.5 +27.053,55.3 +27.077,55.5 +27.101,55.7 +27.125,55.9 +27.149,55.4 +27.173,54.9 +27.197,54.4 +27.221,55.5 +27.245,55.8 +27.269,55.1 +27.293,54.6 +27.317,56.1 +27.341,54.6 +27.365,55.0 +27.389,54.8 +27.413,54.5 +27.437,55.1 +27.461,55.0 +27.485,54.4 +27.510,54.8 +27.534,56.5 +27.558,55.5 +27.582,54.1 +27.606,55.0 +27.630,54.9 +27.654,54.1 +27.678,54.6 +27.702,55.6 +27.726,55.8 +27.750,56.1 +27.774,54.3 +27.798,55.9 +27.822,57.2 +27.846,56.3 +27.870,55.7 +27.894,56.1 +27.918,55.8 +27.942,54.6 +27.966,56.2 +27.990,55.0 +28.014,56.2 +28.038,55.7 +28.062,56.1 +28.086,56.5 +28.110,55.9 +28.134,56.3 +28.158,56.4 +28.182,55.7 +28.206,56.5 +28.230,55.6 +28.254,56.6 +28.278,56.1 +28.302,56.8 +28.326,55.3 +28.350,56.7 +28.374,55.8 +28.398,56.2 +28.422,56.2 +28.446,55.7 +28.470,56.4 +28.494,56.0 +28.518,55.9 +28.542,55.9 +28.566,56.8 +28.590,55.7 +28.614,55.1 +28.638,55.8 +28.662,56.4 +28.686,56.1 +28.710,56.6 +28.734,56.4 +28.758,56.4 +28.782,57.6 +28.806,56.2 +28.830,56.5 +28.854,56.9 +28.878,56.4 +28.902,56.1 +28.926,56.4 +28.950,56.0 +28.974,55.9 +28.998,56.6 +29.022,56.9 +29.046,56.3 +29.070,57.0 +29.094,57.3 +29.118,56.4 +29.142,56.3 +29.166,56.7 +29.190,56.6 +29.214,57.0 +29.238,56.6 +29.262,57.0 +29.286,56.4 +29.310,55.9 +29.334,57.4 +29.358,55.9 +29.382,56.5 +29.406,57.8 +29.430,57.8 +29.454,56.5 +29.478,56.7 +29.502,57.5 +29.526,56.7 +29.550,57.6 +29.574,56.3 +29.598,56.6 +29.622,56.6 +29.646,56.9 +29.670,57.1 +29.694,56.4 +29.718,57.5 +29.742,57.5 +29.766,57.0 +29.790,57.7 +29.814,56.4 +29.838,57.7 +29.862,56.8 +29.886,57.4 +29.910,57.2 +29.934,56.5 +29.958,55.9 +29.982,56.6 +30.006,57.3 +30.030,58.6 +30.054,56.2 +30.078,57.4 +30.102,57.4 +30.126,58.3 +30.150,56.7 +30.174,57.7 +30.198,57.8 +30.222,56.9 +30.246,58.3 +30.270,58.4 +30.294,57.7 +30.318,57.4 +30.342,57.8 +30.366,57.9 +30.390,58.2 +30.414,57.6 +30.438,58.1 +30.462,58.1 +30.486,57.3 +30.510,58.3 +30.534,57.7 +30.558,57.8 +30.582,57.3 +30.606,57.3 +30.630,58.2 +30.654,57.5 +30.678,58.2 +30.702,57.4 +30.726,57.4 +30.750,56.9 +30.774,56.9 +30.798,57.9 +30.822,57.9 +30.846,57.5 +30.870,58.2 +30.894,57.9 +30.918,57.5 +30.942,57.2 +30.966,58.2 +30.990,59.4 +31.014,58.7 +31.038,58.0 +31.062,59.4 +31.086,57.7 +31.110,57.5 +31.134,59.2 +31.158,57.4 +31.182,57.4 +31.206,58.6 +31.230,59.0 +31.254,58.5 +31.278,59.6 +31.302,57.7 +31.326,59.3 +31.350,57.7 +31.374,58.7 +31.398,58.6 +31.422,59.1 +31.446,57.2 +31.470,59.0 +31.494,58.4 +31.518,58.6 +31.542,57.7 +31.566,58.5 +31.590,59.7 +31.614,59.3 +31.638,59.5 +31.662,58.4 +31.686,58.9 +31.710,58.3 +31.734,58.3 +31.758,58.5 +31.782,59.2 +31.806,60.4 +31.830,59.8 +31.854,58.8 +31.878,59.4 +31.902,58.6 +31.926,58.3 +31.950,59.1 +31.974,59.2 +31.998,57.9 +32.022,58.5 +32.046,58.5 +32.070,58.6 +32.094,58.3 +32.118,58.9 +32.142,57.9 +32.166,58.6 +32.190,58.3 +32.214,59.2 +32.238,58.6 +32.262,59.4 +32.286,59.2 +32.310,58.8 +32.334,59.2 +32.358,59.2 +32.382,60.1 +32.406,58.8 +32.430,59.9 +32.454,59.3 +32.478,59.5 +32.503,58.8 +32.527,59.1 +32.551,58.6 +32.575,59.3 +32.599,58.9 +32.623,59.3 +32.647,60.0 +32.671,60.9 +32.695,59.9 +32.719,59.7 +32.743,60.0 +32.767,60.9 +32.791,59.1 +32.815,60.2 +32.839,60.9 +32.863,59.8 +32.887,60.5 +32.911,59.4 +32.935,60.4 +32.959,59.1 +32.983,60.3 +33.007,60.6 +33.031,60.0 +33.055,58.6 +33.079,60.8 +33.103,59.8 +33.127,59.6 +33.151,59.5 +33.175,58.9 +33.199,59.8 +33.223,59.7 +33.247,58.9 +33.271,60.4 +33.295,60.7 +33.319,59.1 +33.343,58.8 +33.367,60.1 +33.391,60.3 +33.415,60.5 +33.439,59.1 +33.463,60.8 +33.487,60.3 +33.511,59.4 +33.535,60.2 +33.559,60.9 +33.583,60.5 +33.607,60.6 +33.631,58.9 +33.655,61.2 +33.679,60.1 +33.703,59.9 +33.727,59.6 +33.751,59.0 +33.775,59.9 +33.799,60.7 +33.823,60.4 +33.847,61.6 +33.871,60.1 +33.895,59.9 +33.919,60.0 +33.943,60.9 +33.967,61.2 +33.991,60.0 +34.015,61.0 +34.039,61.3 +34.063,61.5 +34.087,60.8 +34.111,60.9 +34.135,60.7 +34.159,60.3 +34.183,60.1 +34.207,60.2 +34.231,60.7 +34.255,60.3 +34.279,61.5 +34.303,61.1 +34.327,60.9 +34.351,60.6 +34.375,60.6 +34.399,60.9 +34.423,60.7 +34.447,60.5 +34.471,60.5 +34.495,61.0 +34.519,60.5 +34.543,59.8 +34.567,60.5 +34.591,60.7 +34.615,60.6 +34.639,60.2 +34.663,60.8 +34.687,61.4 +34.711,60.5 +34.735,61.2 +34.759,61.0 +34.783,61.1 +34.807,60.4 +34.831,60.3 +34.855,60.4 +34.879,61.4 +34.903,59.9 +34.927,61.8 +34.951,60.7 +34.975,61.4 +34.999,61.2 +35.023,61.1 +35.047,61.9 +35.071,62.5 +35.095,61.5 +35.119,61.2 +35.143,61.4 +35.167,61.1 +35.191,61.9 +35.215,60.3 +35.239,61.0 +35.263,60.7 +35.287,60.8 +35.311,61.9 +35.335,60.7 +35.359,61.7 +35.383,61.7 +35.407,61.5 +35.431,61.8 +35.455,62.3 +35.479,61.9 +35.503,61.5 +35.527,61.9 +35.551,62.3 +35.575,62.1 +35.599,61.5 +35.623,60.3 +35.647,62.7 +35.671,62.2 +35.695,60.9 +35.719,61.5 +35.743,61.5 +35.767,61.5 +35.791,61.7 +35.815,62.2 +35.839,61.8 +35.863,62.3 +35.887,61.9 +35.911,61.1 +35.935,62.8 +35.959,61.8 +35.983,62.1 +36.007,61.7 +36.031,61.6 +36.055,61.5 +36.079,61.9 +36.103,61.4 +36.127,60.9 +36.151,62.1 +36.175,62.4 +36.199,61.9 +36.223,62.2 +36.247,61.6 +36.271,62.2 +36.295,60.8 +36.319,61.9 +36.343,62.0 +36.367,62.8 +36.391,62.4 +36.415,61.4 +36.439,62.9 +36.463,61.2 +36.487,61.1 +36.511,62.6 +36.535,61.7 +36.559,62.2 +36.583,62.5 +36.607,61.9 +36.631,62.4 +36.655,61.8 +36.679,62.5 +36.703,62.6 +36.727,61.5 +36.751,62.1 +36.775,62.5 +36.799,62.7 +36.823,62.3 +36.847,61.9 +36.871,62.0 +36.895,62.9 +36.919,62.0 +36.943,61.3 +36.967,62.2 +36.991,62.7 +37.015,61.7 +37.039,61.8 +37.063,61.7 +37.087,63.3 +37.111,64.0 +37.135,63.0 +37.159,63.3 +37.183,62.8 +37.207,62.2 +37.231,62.9 +37.255,62.5 +37.279,62.3 +37.303,62.8 +37.327,61.1 +37.351,62.1 +37.375,63.0 +37.399,64.2 +37.423,62.7 +37.447,62.6 +37.471,63.1 +37.495,63.0 +37.520,63.9 +37.544,63.0 +37.568,62.7 +37.592,63.8 +37.616,63.1 +37.640,62.9 +37.664,61.8 +37.688,63.2 +37.712,62.6 +37.736,63.5 +37.760,63.3 +37.784,63.4 +37.808,62.4 +37.832,63.9 +37.856,62.8 +37.880,63.3 +37.904,64.0 +37.928,63.4 +37.952,63.2 +37.976,62.6 +38.000,63.4 +38.024,62.3 +38.048,63.2 +38.072,64.5 +38.096,63.5 +38.120,61.9 +38.144,63.7 +38.168,63.1 +38.192,63.8 +38.216,62.5 +38.240,64.4 +38.264,62.6 +38.288,62.7 +38.312,63.4 +38.336,63.9 +38.360,63.9 +38.384,62.2 +38.408,63.4 +38.432,63.4 +38.456,62.6 +38.480,62.0 +38.504,62.9 +38.528,63.8 +38.552,63.6 +38.576,63.8 +38.600,63.6 +38.624,63.9 +38.648,63.4 +38.672,62.2 +38.696,62.7 +38.720,62.9 +38.744,63.4 +38.768,63.2 +38.792,63.1 +38.816,63.5 +38.840,63.7 +38.864,63.6 +38.888,64.3 +38.912,63.4 +38.936,64.4 +38.960,62.8 +38.984,63.2 +39.008,63.6 +39.032,64.2 +39.056,63.4 +39.080,62.9 +39.104,63.8 +39.128,63.3 +39.152,63.9 +39.176,63.7 +39.200,64.0 +39.224,63.1 +39.248,63.6 +39.272,63.3 +39.296,64.0 +39.320,62.9 +39.344,64.2 +39.368,64.4 +39.392,63.5 +39.416,64.0 +39.440,64.2 +39.464,62.8 +39.488,64.2 +39.512,64.9 +39.536,63.2 +39.560,63.3 +39.584,64.6 +39.608,64.0 +39.632,64.3 +39.656,64.1 +39.680,63.3 +39.704,64.6 +39.728,63.5 +39.752,64.1 +39.776,65.2 +39.800,64.1 +39.824,65.1 +39.848,64.2 +39.872,64.2 +39.896,65.4 +39.920,64.0 +39.944,63.3 +39.968,64.5 +39.992,64.7 +40.016,63.9 +40.040,64.4 +40.064,65.3 +40.088,64.1 +40.112,64.5 +40.136,65.1 +40.160,64.3 +40.184,63.8 +40.208,64.3 +40.232,64.3 +40.256,64.8 +40.280,64.0 +40.304,65.4 +40.328,64.6 +40.352,64.2 +40.376,63.8 +40.400,64.4 +40.424,64.7 +40.448,63.4 +40.472,64.4 +40.496,64.3 +40.520,63.4 +40.544,64.7 +40.568,64.5 +40.592,64.8 +40.616,64.8 +40.640,64.3 +40.664,64.0 +40.688,64.4 +40.712,64.7 +40.736,64.3 +40.760,64.6 +40.784,64.5 +40.808,64.6 +40.832,64.6 +40.856,64.8 +40.880,65.1 +40.904,65.3 +40.928,64.5 +40.952,64.8 +40.976,65.3 +41.000,65.3 +41.024,64.4 +41.048,64.1 +41.072,65.2 +41.096,64.6 +41.120,65.2 +41.144,66.1 +41.168,65.8 +41.192,64.0 +41.216,65.5 +41.240,65.6 +41.264,65.4 +41.288,64.8 +41.312,65.1 +41.336,64.9 +41.360,65.4 +41.384,65.1 +41.408,63.4 +41.432,65.2 +41.456,65.3 +41.480,64.9 +41.504,64.7 +41.528,65.2 +41.552,64.5 +41.576,65.0 +41.600,65.5 +41.624,65.3 +41.648,64.1 +41.672,65.3 +41.696,65.7 +41.720,64.3 +41.744,65.5 +41.768,65.5 +41.792,64.5 +41.816,65.3 +41.840,64.5 +41.864,65.1 +41.888,65.2 +41.912,66.3 +41.936,65.3 +41.960,64.8 +41.984,65.5 +42.008,65.0 +42.032,65.5 +42.056,64.9 +42.080,64.6 +42.104,64.8 +42.128,65.6 +42.152,64.7 +42.176,65.4 +42.200,65.6 +42.224,65.5 +42.248,64.5 +42.272,64.7 +42.296,65.9 +42.320,64.5 +42.344,64.7 +42.368,65.0 +42.392,65.7 +42.416,66.4 +42.440,66.4 +42.464,64.8 +42.488,65.5 +42.513,66.8 +42.537,65.7 +42.561,64.7 +42.585,65.2 +42.609,65.8 +42.633,65.7 +42.657,65.7 +42.681,66.1 +42.705,65.3 +42.729,66.5 +42.753,65.9 +42.777,65.5 +42.801,65.5 +42.825,66.3 +42.849,65.3 +42.873,66.3 +42.897,65.9 +42.921,66.1 +42.945,65.1 +42.969,65.5 +42.993,66.1 +43.017,66.9 +43.041,65.9 +43.065,64.8 +43.089,66.0 +43.113,65.9 +43.137,66.1 +43.161,66.5 +43.185,65.9 +43.209,64.6 +43.233,65.4 +43.257,66.2 +43.281,66.2 +43.305,65.2 +43.329,66.5 +43.353,66.7 +43.377,65.9 +43.401,66.6 +43.425,65.7 +43.449,66.1 +43.473,65.3 +43.497,66.6 +43.521,66.0 +43.545,66.9 +43.569,66.7 +43.593,67.5 +43.617,66.3 +43.641,67.2 +43.665,65.9 +43.689,66.1 +43.713,66.9 +43.737,67.0 +43.761,67.1 +43.785,66.7 +43.809,65.5 +43.833,65.9 +43.857,67.8 +43.881,67.0 +43.905,65.8 +43.929,66.3 +43.953,67.1 +43.977,66.5 +44.001,65.7 +44.025,67.3 +44.049,67.0 +44.073,66.1 +44.097,67.1 +44.121,66.9 +44.145,66.8 +44.169,66.9 +44.193,65.6 +44.217,66.4 +44.241,66.2 +44.265,67.1 +44.289,67.4 +44.313,67.1 +44.337,66.1 +44.361,66.8 +44.385,66.4 +44.409,66.9 +44.433,66.9 +44.457,67.2 +44.481,65.8 +44.505,68.0 +44.529,66.4 +44.553,66.2 +44.577,68.1 +44.601,67.5 +44.625,66.4 +44.649,67.0 +44.673,67.5 +44.697,68.3 +44.721,66.6 +44.745,67.2 +44.769,66.0 +44.793,66.0 +44.817,67.8 +44.841,68.3 +44.865,67.2 +44.889,67.2 +44.913,66.0 +44.937,67.5 +44.961,66.5 +44.985,66.9 +45.009,66.5 +45.033,67.9 +45.057,67.4 +45.081,66.3 +45.105,67.2 +45.129,66.1 +45.153,67.2 +45.177,66.8 +45.201,66.6 +45.225,67.2 +45.249,66.9 +45.273,67.0 +45.297,66.7 +45.321,66.9 +45.345,66.9 +45.369,68.0 +45.393,68.0 +45.417,67.4 +45.441,67.8 +45.465,67.5 +45.489,68.5 +45.513,67.6 +45.537,66.4 +45.561,66.7 +45.585,66.5 +45.609,68.0 +45.633,67.3 +45.657,67.2 +45.681,67.6 +45.705,67.0 +45.729,67.0 +45.753,66.7 +45.777,66.5 +45.801,67.6 +45.825,68.5 +45.849,66.3 +45.873,66.9 +45.897,66.7 +45.921,68.8 +45.945,67.0 +45.969,67.6 +45.993,68.4 +46.017,67.3 +46.041,67.3 +46.065,68.7 +46.089,66.8 +46.113,67.1 +46.137,67.4 +46.161,68.0 +46.185,68.0 +46.209,67.7 +46.233,68.2 +46.257,67.9 +46.281,67.8 +46.305,67.7 +46.329,67.4 +46.353,68.1 +46.377,67.5 +46.401,67.2 +46.425,68.4 +46.449,67.8 +46.473,68.9 +46.497,67.8 +46.521,67.9 +46.545,67.6 +46.569,66.9 +46.593,67.5 +46.617,68.0 +46.641,67.8 +46.665,69.2 +46.689,67.8 +46.713,68.4 +46.737,68.5 +46.761,67.5 +46.785,69.1 +46.809,68.0 +46.833,67.6 +46.857,67.7 +46.881,67.4 +46.905,68.6 +46.929,67.7 +46.953,68.9 +46.977,67.7 +47.001,67.8 +47.025,67.9 +47.049,68.5 +47.073,68.8 +47.097,68.5 +47.121,67.4 +47.145,68.0 +47.169,67.9 +47.193,67.2 +47.217,67.9 +47.241,68.7 +47.265,67.9 +47.289,67.7 +47.313,68.5 +47.337,68.1 +47.361,67.6 +47.385,69.8 +47.409,68.3 +47.433,68.0 +47.457,68.7 +47.481,68.1 +47.506,68.2 +47.530,67.5 +47.554,68.4 +47.578,67.4 +47.602,68.2 +47.626,68.8 +47.650,67.4 +47.674,67.2 +47.698,69.8 +47.722,68.6 +47.746,69.2 +47.770,68.9 +47.794,68.1 +47.818,68.0 +47.842,67.9 +47.866,68.1 +47.890,68.1 +47.914,67.6 +47.938,68.7 +47.962,69.8 +47.986,67.9 +48.010,68.6 +48.034,68.2 +48.058,68.7 +48.082,69.3 +48.106,67.8 +48.130,69.1 +48.154,68.3 +48.178,68.3 +48.202,69.6 +48.226,69.4 +48.250,68.8 +48.274,67.7 +48.298,68.7 +48.322,68.3 +48.346,68.5 +48.370,68.5 +48.394,70.2 +48.418,69.6 +48.442,69.2 +48.466,68.6 +48.490,68.5 +48.514,69.2 +48.538,68.0 +48.562,68.5 +48.586,69.1 +48.610,69.1 +48.634,67.8 +48.658,68.4 +48.682,68.4 +48.706,69.1 +48.730,70.5 +48.754,68.3 +48.778,68.6 +48.802,68.3 +48.826,68.1 +48.850,69.1 +48.874,69.4 +48.898,69.3 +48.922,69.0 +48.946,67.2 +48.970,68.7 +48.994,68.3 +49.018,68.7 +49.042,69.1 +49.066,68.7 +49.090,69.5 +49.114,69.9 +49.138,68.9 +49.162,69.3 +49.186,68.5 +49.210,68.6 +49.234,69.3 +49.258,69.9 +49.282,69.1 +49.306,69.6 +49.330,69.1 +49.354,69.3 +49.378,68.8 +49.402,69.3 +49.426,69.7 +49.450,70.0 +49.474,70.5 +49.498,68.5 +49.522,69.5 +49.546,69.1 +49.570,69.4 +49.594,68.8 +49.618,69.0 +49.642,68.3 +49.666,68.6 +49.690,69.3 +49.714,69.8 +49.738,69.4 +49.762,68.8 +49.786,70.5 +49.810,68.7 +49.834,70.3 +49.858,68.5 +49.882,69.1 +49.906,69.6 +49.930,69.4 +49.954,68.9 +49.978,69.3 +50.002,69.6 +50.026,68.6 +50.050,69.7 +50.074,69.5 +50.098,70.2 +50.122,69.7 +50.146,68.9 +50.170,69.5 +50.194,68.9 +50.218,70.2 +50.242,69.9 +50.266,69.8 +50.290,70.0 +50.314,69.1 +50.338,69.0 +50.362,69.5 +50.386,69.5 +50.410,69.2 +50.434,69.6 +50.458,70.6 +50.482,68.6 +50.506,70.5 +50.530,69.8 +50.554,68.8 +50.578,69.7 +50.602,69.7 +50.626,69.1 +50.650,70.0 +50.674,69.9 +50.698,70.1 +50.722,69.7 +50.746,69.2 +50.770,69.9 +50.794,71.0 +50.818,68.8 +50.842,68.1 +50.866,69.6 +50.890,70.0 +50.914,70.1 +50.938,68.9 +50.962,70.4 +50.986,70.1 +51.010,70.7 +51.034,69.4 +51.058,69.9 +51.082,70.0 +51.106,69.7 +51.130,69.2 +51.154,70.1 +51.178,68.9 +51.202,68.3 +51.226,70.0 +51.250,70.8 +51.274,69.6 +51.298,70.3 +51.322,70.2 +51.346,69.6 +51.370,68.2 +51.394,70.1 +51.418,70.1 +51.442,70.5 +51.466,70.9 +51.490,69.3 +51.514,69.7 +51.538,70.3 +51.562,70.5 +51.586,70.3 +51.610,70.2 +51.634,69.6 +51.658,69.7 +51.682,71.2 +51.706,70.6 +51.730,70.3 +51.754,71.1 +51.778,70.7 +51.802,70.7 +51.826,69.9 +51.850,70.6 +51.874,70.4 +51.898,70.0 +51.922,69.6 +51.946,70.4 +51.970,70.0 +51.994,70.3 +52.018,71.3 +52.042,70.2 +52.066,70.4 +52.090,71.4 +52.114,71.0 +52.138,70.4 +52.162,70.2 +52.186,70.5 +52.210,69.9 +52.234,71.0 +52.258,70.6 +52.282,70.2 +52.306,71.3 +52.330,69.8 +52.354,69.3 +52.378,71.2 +52.402,70.8 +52.426,71.0 +52.450,71.5 +52.474,70.7 +52.498,70.8 +52.523,71.9 +52.547,70.4 +52.571,70.3 +52.595,71.0 +52.619,69.9 +52.643,71.4 +52.667,71.0 +52.691,69.7 +52.715,70.1 +52.739,70.6 +52.763,71.4 +52.787,69.7 +52.811,70.4 +52.835,70.8 +52.859,70.5 +52.883,69.4 +52.907,70.2 +52.931,70.5 +52.955,70.2 +52.979,70.1 +53.003,70.6 +53.027,71.1 +53.051,70.4 +53.075,71.3 +53.099,71.0 +53.123,72.5 +53.147,70.7 +53.171,70.3 +53.195,70.5 +53.219,71.3 +53.243,70.3 +53.267,71.0 +53.291,71.4 +53.315,70.3 +53.339,70.9 +53.363,71.1 +53.387,70.7 +53.411,69.5 +53.435,70.8 +53.459,70.6 +53.483,69.6 +53.507,69.8 +53.531,70.7 +53.555,70.2 +53.579,71.6 +53.603,70.9 +53.627,71.2 +53.651,71.6 +53.675,71.4 +53.699,72.0 +53.723,70.5 +53.747,70.9 +53.771,70.7 +53.795,70.4 +53.819,70.3 +53.843,70.4 +53.867,71.2 +53.891,71.0 +53.915,72.3 +53.939,70.3 +53.963,71.1 +53.987,71.1 +54.011,71.2 +54.035,71.2 +54.059,70.8 +54.083,71.7 +54.107,71.2 +54.131,70.4 +54.155,72.0 +54.179,70.7 +54.203,71.6 +54.227,71.8 +54.251,70.9 +54.275,71.4 +54.299,71.6 +54.323,71.9 +54.347,71.6 +54.371,70.4 +54.395,71.6 +54.419,71.7 +54.443,72.5 +54.467,71.8 +54.491,71.8 +54.515,70.7 +54.539,71.7 +54.563,70.0 +54.587,71.8 +54.611,71.7 +54.635,72.6 +54.659,72.1 +54.683,71.8 +54.707,70.7 +54.731,70.9 +54.755,71.0 +54.779,71.5 +54.803,71.3 +54.827,70.5 +54.851,72.0 +54.875,71.6 +54.899,73.1 +54.923,71.9 +54.947,72.0 +54.971,70.6 +54.995,71.4 +55.019,72.3 +55.043,72.2 +55.067,70.8 +55.091,71.9 +55.115,71.6 +55.139,70.6 +55.163,71.9 +55.187,70.1 +55.211,71.7 +55.235,70.6 +55.259,70.5 +55.283,71.8 +55.307,71.7 +55.331,70.3 +55.355,71.7 +55.379,71.1 +55.403,71.2 +55.427,72.5 +55.451,71.4 +55.475,72.0 +55.499,72.1 +55.523,71.8 +55.547,71.5 +55.571,72.2 +55.595,72.5 +55.619,71.6 +55.643,71.9 +55.667,70.3 +55.691,72.7 +55.715,72.1 +55.739,71.2 +55.763,72.1 +55.787,71.4 +55.811,72.2 +55.835,71.1 +55.859,71.9 +55.883,71.1 +55.907,71.1 +55.931,71.7 +55.955,72.7 +55.979,72.9 +56.003,73.1 +56.027,73.1 +56.051,72.2 +56.075,72.6 +56.099,72.1 +56.123,72.6 +56.147,72.1 +56.171,72.7 +56.195,72.5 +56.219,71.8 +56.243,71.8 +56.267,71.7 +56.291,72.0 +56.315,71.9 +56.339,71.8 +56.363,72.1 +56.387,71.5 +56.411,72.7 +56.435,71.5 +56.459,72.6 +56.483,72.7 +56.507,72.7 +56.531,72.3 +56.555,71.9 +56.579,73.3 +56.603,73.4 +56.627,72.5 +56.651,73.9 +56.675,72.6 +56.699,72.7 +56.723,71.6 +56.747,70.5 +56.771,71.5 +56.795,70.9 +56.819,72.8 +56.843,73.2 +56.867,71.9 +56.891,72.7 +56.915,72.0 +56.939,72.2 +56.963,72.2 +56.987,72.7 +57.011,72.1 +57.035,72.4 +57.059,71.3 +57.083,73.6 +57.107,71.6 +57.131,72.6 +57.155,72.7 +57.179,73.8 +57.203,72.1 +57.227,71.5 +57.251,72.2 +57.275,72.0 +57.299,72.9 +57.323,73.2 +57.347,73.4 +57.371,72.3 +57.395,73.4 +57.419,71.9 +57.443,72.1 +57.467,72.4 +57.491,73.0 +57.516,72.3 +57.540,72.3 +57.564,72.5 +57.588,73.7 +57.612,72.3 +57.636,73.0 +57.660,72.1 +57.684,72.4 +57.708,71.8 +57.732,73.1 +57.756,71.0 +57.780,71.7 +57.804,72.3 +57.828,72.2 +57.852,71.0 +57.876,72.1 +57.900,72.8 +57.924,73.3 +57.948,73.0 +57.972,72.8 +57.996,72.8 +58.020,72.8 +58.044,72.1 +58.068,73.4 +58.092,72.2 +58.116,73.1 +58.140,73.2 +58.164,71.9 +58.188,72.2 +58.212,73.4 +58.236,73.3 +58.260,72.2 +58.284,73.7 +58.308,73.2 +58.332,73.9 +58.356,72.5 +58.380,72.9 +58.404,71.8 +58.428,73.8 +58.452,72.1 +58.476,73.0 +58.500,72.4 +58.524,72.1 +58.548,73.0 +58.572,73.0 +58.596,72.2 +58.620,73.8 +58.644,72.7 +58.668,72.6 +58.692,72.4 +58.716,72.5 +58.740,73.1 +58.764,73.4 +58.788,72.6 +58.812,72.6 +58.836,73.0 +58.860,72.2 +58.884,72.4 +58.908,72.6 +58.932,74.2 +58.956,72.6 +58.980,72.5 +59.004,71.8 +59.028,72.7 +59.052,73.4 +59.076,73.1 +59.100,73.1 +59.124,73.1 +59.148,73.1 +59.172,72.9 +59.196,73.7 +59.220,73.0 +59.244,72.8 +59.268,73.0 +59.292,72.9 +59.316,73.1 +59.340,73.4 +59.364,73.5 +59.388,72.9 +59.412,73.2 +59.436,72.8 +59.460,73.0 +59.484,74.2 +59.508,73.6 +59.532,73.5 +59.556,74.5 +59.580,72.8 +59.604,73.4 +59.628,74.0 +59.652,73.6 +59.676,73.4 +59.700,73.3 +59.724,72.3 +59.748,73.2 +59.772,72.9 +59.796,72.8 +59.820,73.3 +59.844,72.7 +59.868,73.6 +59.892,73.1 +59.916,73.6 +59.940,73.4 +59.964,71.9 +59.988,73.6 +60.012,74.3 +60.036,74.3 +60.060,74.7 +60.084,74.2 +60.108,73.5 +60.132,73.0 +60.156,73.0 +60.180,73.4 +60.204,72.9 +60.228,72.5 +60.252,72.6 +60.276,73.7 +60.300,73.6 +60.324,73.9 +60.348,73.0 +60.372,73.4 +60.396,73.4 +60.420,73.0 +60.444,73.3 +60.468,73.2 +60.492,74.6 +60.516,74.8 +60.540,72.8 +60.564,73.1 +60.588,74.0 +60.612,74.2 +60.636,72.4 +60.660,73.8 +60.684,74.4 +60.708,73.6 +60.732,73.6 +60.756,73.1 +60.780,73.3 +60.804,73.2 +60.828,73.6 +60.852,73.6 +60.876,72.8 +60.900,74.6 +60.924,73.0 +60.948,72.9 +60.972,72.8 +60.996,72.7 +61.020,72.4 +61.044,73.8 +61.068,73.4 +61.092,72.6 +61.116,73.7 +61.140,74.1 +61.164,73.6 +61.188,72.6 +61.212,73.9 +61.236,73.5 +61.260,73.2 +61.284,72.8 +61.308,73.1 +61.332,73.3 +61.356,72.5 +61.380,72.7 +61.404,73.7 +61.428,74.4 +61.452,74.3 +61.476,74.0 +61.500,74.5 +61.524,73.7 +61.548,75.0 +61.572,73.8 +61.596,73.5 +61.620,74.9 +61.644,74.8 +61.668,73.2 +61.692,73.1 +61.716,74.1 +61.740,74.5 +61.764,74.9 +61.788,74.2 +61.812,73.7 +61.836,73.7 +61.860,73.4 +61.884,73.5 +61.908,74.2 +61.932,73.1 +61.956,73.1 +61.980,74.5 +62.004,74.3 +62.028,74.8 +62.052,73.8 +62.076,73.9 +62.100,73.6 +62.124,74.8 +62.148,73.9 +62.172,74.6 +62.196,73.9 +62.220,73.6 +62.244,74.1 +62.268,73.5 +62.292,74.9 +62.316,74.7 +62.340,73.8 +62.364,74.8 +62.388,74.6 +62.412,73.3 +62.436,74.1 +62.460,74.5 +62.484,74.4 +62.509,74.1 +62.533,74.2 +62.557,73.3 +62.581,74.0 +62.605,74.0 +62.629,74.3 +62.653,74.1 +62.677,73.7 +62.701,74.0 +62.725,74.0 +62.749,73.8 +62.773,74.2 +62.797,73.6 +62.821,73.5 +62.845,74.0 +62.869,74.9 +62.893,74.4 +62.917,76.2 +62.941,75.3 +62.965,74.3 +62.989,74.8 +63.013,73.8 +63.037,74.1 +63.061,74.7 +63.085,73.8 +63.109,74.4 +63.133,74.7 +63.157,74.8 +63.181,74.1 +63.205,75.2 +63.229,73.7 +63.253,73.6 +63.277,74.7 +63.301,74.1 +63.325,74.6 +63.349,74.1 +63.373,75.5 +63.397,74.6 +63.421,75.0 +63.445,74.6 +63.469,73.9 +63.493,74.4 +63.517,74.0 +63.541,74.2 +63.565,75.2 +63.589,74.9 +63.613,74.2 +63.637,74.6 +63.661,74.2 +63.685,75.1 +63.709,74.3 +63.733,74.9 +63.757,74.1 +63.781,74.9 +63.805,74.2 +63.829,75.0 +63.853,75.2 +63.877,74.4 +63.901,74.3 +63.925,74.5 +63.949,75.4 +63.973,74.1 +63.997,74.5 +64.021,75.7 +64.045,73.8 +64.069,74.7 +64.093,74.9 +64.117,75.0 +64.141,74.7 +64.165,75.6 +64.189,74.4 +64.213,75.1 +64.237,74.7 +64.261,74.4 +64.285,74.1 +64.309,74.7 +64.333,75.0 +64.357,74.4 +64.381,75.6 +64.405,74.4 +64.429,73.7 +64.453,75.1 +64.477,75.0 +64.501,74.7 +64.525,74.7 +64.549,73.7 +64.573,74.7 +64.597,75.5 +64.621,74.8 +64.645,74.6 +64.669,74.7 +64.693,74.5 +64.717,75.2 +64.741,74.2 +64.765,73.7 +64.789,75.4 +64.813,76.0 +64.837,75.0 +64.861,75.6 +64.885,74.8 +64.909,75.5 +64.933,74.2 +64.957,74.1 +64.981,75.3 +65.005,74.9 +65.029,74.9 +65.053,75.5 +65.077,74.8 +65.101,74.7 +65.125,74.6 +65.149,74.7 +65.173,74.5 +65.197,75.1 +65.221,75.1 +65.245,74.0 +65.269,75.6 +65.293,74.2 +65.317,75.4 +65.341,75.0 +65.365,74.3 +65.389,74.4 +65.413,75.5 +65.437,74.6 +65.461,75.2 +65.485,75.1 +65.509,75.4 +65.533,75.6 +65.557,74.6 +65.581,73.4 +65.605,75.0 +65.629,75.0 +65.653,75.2 +65.677,74.9 +65.701,74.5 +65.725,74.5 +65.749,76.5 +65.773,75.3 +65.797,74.8 +65.821,74.4 +65.845,74.9 +65.869,74.6 +65.893,76.3 +65.917,74.8 +65.941,75.6 +65.965,75.2 +65.989,75.4 +66.013,74.6 +66.037,75.0 +66.061,74.9 +66.085,75.0 +66.109,75.9 +66.133,75.7 +66.157,76.2 +66.181,75.0 +66.205,75.8 +66.229,74.8 +66.253,74.4 +66.277,74.8 +66.301,73.8 +66.325,75.8 +66.349,75.3 +66.373,75.0 +66.397,74.7 +66.421,75.5 +66.445,74.5 +66.469,74.4 +66.493,75.8 +66.517,75.2 +66.541,74.5 +66.565,75.2 +66.589,74.1 +66.613,75.9 +66.637,75.9 +66.661,75.7 +66.685,75.0 +66.709,74.9 +66.733,75.6 +66.757,75.3 +66.781,75.2 +66.805,75.7 +66.829,75.4 +66.853,75.7 +66.877,75.0 +66.901,75.3 +66.925,77.1 +66.949,74.6 +66.973,74.4 +66.997,76.1 +67.021,76.0 +67.045,75.1 +67.069,76.0 +67.093,75.3 +67.117,75.0 +67.141,76.0 +67.165,74.5 +67.189,75.4 +67.213,75.7 +67.237,75.2 +67.261,75.1 +67.285,76.7 +67.309,74.9 +67.333,75.3 +67.357,74.7 +67.381,75.7 +67.405,75.2 +67.429,74.9 +67.453,76.0 +67.477,75.7 +67.502,76.0 +67.526,75.6 +67.550,76.2 +67.574,76.6 +67.598,76.4 +67.622,75.6 +67.646,75.1 +67.670,76.5 +67.694,75.5 +67.718,74.6 +67.742,76.2 +67.766,75.9 +67.790,76.4 +67.814,75.9 +67.838,75.1 +67.862,76.5 +67.886,76.7 +67.910,74.7 +67.934,76.1 +67.958,75.6 +67.982,75.2 +68.006,76.0 +68.030,75.5 +68.054,75.5 +68.078,75.5 +68.102,73.5 +68.126,76.6 +68.150,73.8 +68.174,75.5 +68.198,75.5 +68.222,75.8 +68.246,75.4 +68.270,75.9 +68.294,74.6 +68.318,76.0 +68.342,75.1 +68.366,76.0 +68.390,76.0 +68.414,76.0 +68.438,76.6 +68.462,75.3 +68.486,75.6 +68.510,75.0 +68.534,75.6 +68.558,75.5 +68.582,75.4 +68.606,76.9 +68.630,77.0 +68.654,75.6 +68.678,76.1 +68.702,76.3 +68.726,75.5 +68.750,75.9 +68.774,76.6 +68.798,75.2 +68.822,75.6 +68.846,76.0 +68.870,74.6 +68.894,76.0 +68.918,75.6 +68.942,77.1 +68.966,75.0 +68.990,75.4 +69.014,77.0 +69.038,76.2 +69.062,76.4 +69.086,76.8 +69.110,76.9 +69.134,76.0 +69.158,75.2 +69.182,76.3 +69.206,76.3 +69.230,75.7 +69.254,75.9 +69.278,76.7 +69.302,75.3 +69.326,76.4 +69.350,75.8 +69.374,76.1 +69.398,76.1 +69.422,76.5 +69.446,75.9 +69.470,77.0 +69.494,77.7 +69.518,76.5 +69.542,76.4 +69.566,76.5 +69.590,75.9 +69.614,76.0 +69.638,76.5 +69.662,77.1 +69.686,75.6 +69.710,75.7 +69.734,76.9 +69.758,76.5 +69.782,75.8 +69.806,76.6 +69.830,75.9 +69.854,76.7 +69.878,76.2 +69.902,76.5 +69.926,76.1 +69.950,75.9 +69.974,77.0 +69.998,75.4 +70.022,77.1 +70.046,76.8 +70.070,76.5 +70.094,75.5 +70.118,75.2 +70.142,75.5 +70.166,76.9 +70.190,76.6 +70.214,75.9 +70.238,75.9 +70.262,76.9 +70.286,75.2 +70.310,76.4 +70.334,76.9 +70.358,75.9 +70.382,75.8 +70.406,77.6 +70.430,75.9 +70.454,76.6 +70.478,76.3 +70.502,75.9 +70.526,75.9 +70.550,76.2 +70.574,76.8 +70.598,76.5 +70.622,76.7 +70.646,76.5 +70.670,76.6 +70.694,76.0 +70.718,76.7 +70.742,76.0 +70.766,75.7 +70.790,76.6 +70.814,76.8 +70.838,76.9 +70.862,75.5 +70.886,76.6 +70.910,76.6 +70.934,76.0 +70.958,77.2 +70.982,77.1 +71.006,75.0 +71.030,77.2 +71.054,77.0 +71.078,76.3 +71.102,76.2 +71.126,77.2 +71.150,76.1 +71.174,76.9 +71.198,76.7 +71.222,75.4 +71.246,76.6 +71.270,76.2 +71.294,76.1 +71.318,76.3 +71.342,77.4 +71.366,76.9 +71.390,76.6 +71.414,76.9 +71.438,76.5 +71.462,75.8 +71.486,76.2 +71.510,76.6 +71.534,76.8 +71.558,77.2 +71.582,76.4 +71.606,77.1 +71.630,76.9 +71.654,77.2 +71.678,77.2 +71.702,76.6 +71.726,77.3 +71.750,76.4 +71.774,76.7 +71.798,76.9 +71.822,75.4 +71.846,76.8 +71.870,77.5 +71.894,76.6 +71.918,76.9 +71.942,77.2 +71.966,77.1 +71.990,76.7 +72.014,76.3 +72.038,77.1 +72.062,75.9 +72.086,77.1 +72.110,76.1 +72.134,77.4 +72.158,77.4 +72.182,76.7 +72.206,76.5 +72.230,76.8 +72.254,76.5 +72.278,77.4 +72.302,76.3 +72.326,76.5 +72.350,77.1 +72.374,76.6 +72.398,77.1 +72.422,77.2 +72.446,76.4 +72.470,76.8 +72.494,78.2 +72.519,76.1 +72.543,77.2 +72.567,76.4 +72.591,76.9 +72.615,77.2 +72.639,76.5 +72.663,75.8 +72.687,77.5 +72.711,76.3 +72.735,78.1 +72.759,77.0 +72.783,77.9 +72.807,76.9 +72.831,75.9 +72.855,77.1 +72.879,77.1 +72.903,76.3 +72.927,77.1 +72.951,76.9 +72.975,78.0 +72.999,76.2 +73.023,77.2 +73.047,77.2 +73.071,77.2 +73.095,76.1 +73.119,76.1 +73.143,77.1 +73.167,76.7 +73.191,77.4 +73.215,76.1 +73.239,77.5 +73.263,76.9 +73.287,76.9 +73.311,77.4 +73.335,77.2 +73.359,77.4 +73.383,76.5 +73.407,77.9 +73.431,76.9 +73.455,77.8 +73.479,76.5 +73.503,76.9 +73.527,76.1 +73.551,77.2 +73.575,77.6 +73.599,75.5 +73.623,77.3 +73.647,77.2 +73.671,76.8 +73.695,77.0 +73.719,76.8 +73.743,76.9 +73.767,77.9 +73.791,77.1 +73.815,77.0 +73.839,77.3 +73.863,76.8 +73.887,75.9 +73.911,77.8 +73.935,77.0 +73.959,77.2 +73.983,77.4 +74.007,77.8 +74.031,76.9 +74.055,77.2 +74.079,77.1 +74.103,77.2 +74.127,77.0 +74.151,77.3 +74.175,78.4 +74.199,78.1 +74.223,77.5 +74.247,77.4 +74.271,76.8 +74.295,77.5 +74.319,76.9 +74.343,77.5 +74.367,77.2 +74.391,77.7 +74.415,78.0 +74.439,76.9 +74.463,76.6 +74.487,77.8 +74.511,76.0 +74.535,77.0 +74.559,77.5 +74.583,78.0 +74.607,78.2 +74.631,77.2 +74.655,75.8 +74.679,78.2 +74.703,77.0 +74.727,76.9 +74.751,76.7 +74.775,77.7 +74.799,77.8 +74.823,76.4 +74.847,78.3 +74.871,77.4 +74.895,77.1 +74.919,77.4 +74.943,76.6 +74.967,77.3 +74.991,78.1 +75.015,76.8 +75.039,77.4 +75.063,78.2 +75.087,77.7 +75.111,78.2 +75.135,77.3 +75.159,77.3 +75.183,76.9 +75.207,77.1 +75.231,77.3 +75.255,77.4 +75.279,77.6 +75.303,77.8 +75.327,76.9 +75.351,76.9 +75.375,77.4 +75.399,77.9 +75.423,77.7 +75.447,77.2 +75.471,77.0 +75.495,77.0 +75.519,76.9 +75.543,77.5 +75.567,76.7 +75.591,76.7 +75.615,78.9 +75.639,77.5 +75.663,76.8 +75.687,77.2 +75.711,78.3 +75.735,78.1 +75.759,77.8 +75.783,77.2 +75.807,77.4 +75.831,77.9 +75.855,76.9 +75.879,77.3 +75.903,77.0 +75.927,76.5 +75.951,76.6 +75.975,78.1 +75.999,76.2 +76.023,78.1 +76.047,78.6 +76.071,77.6 +76.095,77.9 +76.119,78.4 +76.143,77.6 +76.167,78.1 +76.191,77.9 +76.215,77.8 +76.239,78.1 +76.263,77.4 +76.287,77.7 +76.311,76.3 +76.335,78.1 +76.359,78.2 +76.383,77.8 +76.407,77.5 +76.431,77.5 +76.455,78.3 +76.479,77.7 +76.503,77.7 +76.527,79.1 +76.551,78.5 +76.575,79.1 +76.599,79.3 +76.623,78.1 +76.647,78.3 +76.671,78.6 +76.695,77.1 +76.719,77.9 +76.743,77.9 +76.767,78.3 +76.791,77.1 +76.815,78.2 +76.839,78.0 +76.863,77.2 +76.887,78.5 +76.911,77.7 +76.935,78.3 +76.959,78.1 +76.983,77.2 +77.007,78.3 +77.031,77.2 +77.055,77.8 +77.079,78.0 +77.103,77.8 +77.127,77.5 +77.151,78.1 +77.175,79.1 +77.199,77.4 +77.223,77.6 +77.247,77.6 +77.271,78.3 +77.295,78.3 +77.319,77.9 +77.343,77.3 +77.367,77.5 +77.391,77.2 +77.415,78.3 +77.439,77.4 +77.463,77.8 +77.487,78.4 +77.512,77.3 +77.536,78.6 +77.560,78.4 +77.584,77.6 +77.608,78.0 +77.632,77.6 +77.656,78.1 +77.680,78.4 +77.704,77.0 +77.728,77.1 +77.752,78.0 +77.776,77.7 +77.800,78.1 +77.824,79.8 +77.848,77.3 +77.872,77.4 +77.896,78.3 +77.920,78.3 +77.944,77.6 +77.968,77.5 +77.992,77.5 +78.016,77.8 +78.040,78.5 +78.064,78.2 +78.088,78.1 +78.112,78.3 +78.136,78.2 +78.160,78.1 +78.184,78.5 +78.208,78.2 +78.232,78.8 +78.256,77.9 +78.280,78.6 +78.304,77.3 +78.328,76.9 +78.352,77.4 +78.376,79.1 +78.400,77.7 +78.424,77.8 +78.448,78.1 +78.472,78.8 +78.496,77.5 +78.520,77.7 +78.544,78.8 +78.568,78.7 +78.592,78.4 +78.616,77.1 +78.640,77.8 +78.664,78.5 +78.688,78.6 +78.712,77.6 +78.736,78.9 +78.760,76.9 +78.784,77.6 +78.808,78.6 +78.832,78.8 +78.856,78.0 +78.880,77.6 +78.904,79.2 +78.928,77.4 +78.952,78.5 +78.976,78.1 +79.000,78.3 +79.024,78.6 +79.048,78.4 +79.072,78.0 +79.096,79.1 +79.120,78.4 +79.144,78.1 +79.168,78.0 +79.192,77.4 +79.216,78.0 +79.240,78.4 +79.264,77.6 +79.288,79.6 +79.312,79.3 +79.336,76.8 +79.360,78.0 +79.384,78.9 +79.408,78.2 +79.432,79.3 +79.456,79.1 +79.480,77.9 +79.504,77.5 +79.528,77.7 +79.552,78.4 +79.576,79.1 +79.600,77.0 +79.624,78.0 +79.648,77.7 +79.672,78.3 +79.696,77.6 +79.720,78.0 +79.744,78.0 +79.768,78.4 +79.792,77.9 +79.816,77.0 +79.840,78.7 +79.864,78.7 +79.888,78.0 +79.912,78.1 +79.936,78.0 +79.960,79.6 +79.984,78.0 +80.008,77.3 +80.032,78.0 +80.056,79.1 +80.080,79.0 +80.104,77.9 +80.128,77.4 +80.152,77.8 +80.176,78.5 +80.200,78.8 +80.224,78.5 +80.248,79.3 +80.272,78.6 +80.296,78.0 +80.320,79.0 +80.344,78.9 +80.368,78.1 +80.392,78.9 +80.416,77.6 +80.440,78.7 +80.464,79.1 +80.488,78.5 +80.512,78.9 +80.536,78.5 +80.560,78.8 +80.584,78.4 +80.608,78.3 +80.632,78.9 +80.656,79.4 +80.680,78.4 +80.704,78.4 +80.728,79.1 +80.752,79.9 +80.776,78.8 +80.800,77.3 +80.824,78.3 +80.848,78.2 +80.872,78.5 +80.896,79.2 +80.920,79.1 +80.944,78.6 +80.968,78.7 +80.992,79.5 +81.016,79.2 +81.040,78.7 +81.064,78.2 +81.088,78.6 +81.112,78.8 +81.136,79.1 +81.160,78.3 +81.184,79.4 +81.208,78.9 +81.232,79.4 +81.256,78.7 +81.280,78.5 +81.304,78.5 +81.328,78.2 +81.352,77.4 +81.376,78.4 +81.400,79.4 +81.424,78.4 +81.448,79.1 +81.472,79.1 +81.496,78.2 +81.520,78.0 +81.544,78.2 +81.568,78.4 +81.592,78.6 +81.616,78.6 +81.640,78.4 +81.664,78.7 +81.688,78.7 +81.712,78.6 +81.736,78.3 +81.760,78.6 +81.784,79.6 +81.808,78.2 +81.832,79.5 +81.856,78.0 +81.880,77.9 +81.904,78.8 +81.928,79.1 +81.952,79.2 +81.976,78.4 +82.000,79.7 +82.024,79.0 +82.048,79.2 +82.072,79.8 +82.096,79.8 +82.120,77.9 +82.144,79.0 +82.168,78.2 +82.192,79.2 +82.216,77.9 +82.240,79.1 +82.264,78.7 +82.288,78.6 +82.312,78.0 +82.336,77.7 +82.360,78.7 +82.384,78.2 +82.408,79.5 +82.432,78.4 +82.456,79.6 +82.480,79.3 +82.505,78.6 +82.529,77.4 +82.553,79.0 +82.577,78.7 +82.601,79.5 +82.625,78.1 +82.649,78.6 +82.673,79.5 +82.697,78.1 +82.721,77.6 +82.745,79.0 +82.769,78.6 +82.793,79.1 +82.817,79.5 +82.841,79.5 +82.865,79.1 +82.889,78.7 +82.913,78.7 +82.937,79.5 +82.961,78.4 +82.985,79.6 +83.009,79.4 +83.033,79.4 +83.057,78.1 +83.081,79.1 +83.105,79.2 +83.129,78.5 +83.153,80.1 +83.177,77.5 +83.201,79.5 +83.225,78.3 +83.249,81.1 +83.273,79.2 +83.297,77.8 +83.321,79.6 +83.345,79.7 +83.369,79.6 +83.393,78.9 +83.417,79.2 +83.441,78.2 +83.465,78.4 +83.489,79.0 +83.513,79.8 +83.537,78.7 +83.561,78.8 +83.585,79.2 +83.609,79.5 +83.633,78.7 +83.657,79.5 +83.681,79.4 +83.705,77.4 +83.729,79.3 +83.753,78.5 +83.777,79.4 +83.801,80.0 +83.825,80.1 +83.849,78.8 +83.873,79.1 +83.897,79.5 +83.921,79.0 +83.945,79.0 +83.969,79.0 +83.993,79.7 +84.017,78.6 +84.041,79.1 +84.065,79.5 +84.089,77.6 +84.113,79.0 +84.137,78.8 +84.161,79.4 +84.185,79.7 +84.209,79.0 +84.233,79.8 +84.257,78.7 +84.281,78.0 +84.305,79.7 +84.329,78.9 +84.353,78.9 +84.377,79.2 +84.401,80.4 +84.425,78.7 +84.449,79.3 +84.473,78.8 +84.497,79.0 +84.521,79.1 +84.545,79.8 +84.569,78.8 +84.593,79.3 +84.617,79.4 +84.641,79.0 +84.665,78.0 +84.689,78.0 +84.713,79.5 +84.737,78.3 +84.761,80.1 +84.785,78.4 +84.809,78.8 +84.833,79.2 +84.857,79.3 +84.881,78.6 +84.905,79.7 +84.929,78.5 +84.953,78.8 +84.977,80.1 +85.001,78.8 +85.025,78.4 +85.049,78.1 +85.073,79.1 +85.097,78.7 +85.121,78.8 +85.145,80.5 +85.169,79.2 +85.193,79.1 +85.217,79.8 +85.241,78.0 +85.265,79.2 +85.289,80.3 +85.313,79.4 +85.337,79.9 +85.361,80.0 +85.385,79.7 +85.409,79.5 +85.433,80.1 +85.457,80.2 +85.481,79.6 +85.505,79.1 +85.529,78.5 +85.553,77.8 +85.577,79.3 +85.601,79.1 +85.625,80.3 +85.649,79.1 +85.673,79.4 +85.697,79.3 +85.721,79.3 +85.745,79.7 +85.769,79.5 +85.793,78.7 +85.817,80.3 +85.841,79.6 +85.865,79.9 +85.889,79.2 +85.913,78.9 +85.937,80.1 +85.961,78.9 +85.985,78.4 +86.009,80.0 +86.033,79.6 +86.057,79.4 +86.081,78.8 +86.105,79.4 +86.129,79.6 +86.153,79.2 +86.177,79.1 +86.201,79.4 +86.225,79.7 +86.249,79.4 +86.273,79.2 +86.297,79.1 +86.321,80.1 +86.345,80.6 +86.369,79.8 +86.393,80.1 +86.417,79.1 +86.441,80.0 +86.465,79.5 +86.489,79.8 +86.513,79.9 +86.537,79.7 +86.561,80.1 +86.585,78.9 +86.609,80.0 +86.633,80.6 +86.657,79.8 +86.681,79.3 +86.705,79.7 +86.729,77.8 +86.753,80.1 +86.777,78.6 +86.801,79.9 +86.825,79.8 +86.849,80.3 +86.873,80.4 +86.897,79.1 +86.921,80.5 +86.945,80.3 +86.969,79.5 +86.993,79.3 +87.017,79.6 +87.041,78.8 +87.065,79.3 +87.089,79.5 +87.113,80.3 +87.137,80.0 +87.161,79.9 +87.185,79.5 +87.209,79.8 +87.233,79.1 +87.257,79.5 +87.281,79.8 +87.305,79.8 +87.329,79.9 +87.353,80.0 +87.377,80.4 +87.401,80.7 +87.425,79.1 +87.449,78.3 +87.473,79.2 +87.497,80.0 +87.522,80.2 +87.546,78.7 +87.570,79.9 +87.594,80.5 +87.618,79.8 +87.642,80.4 +87.666,78.6 +87.690,80.3 +87.714,80.2 +87.738,79.4 +87.762,79.7 +87.786,79.5 +87.810,80.0 +87.834,79.8 +87.858,78.9 +87.882,80.8 +87.906,79.0 +87.930,79.8 +87.954,79.3 +87.978,79.0 +88.002,80.1 +88.026,79.0 +88.050,80.7 +88.074,80.6 +88.098,79.6 +88.122,79.7 +88.146,79.7 +88.170,80.5 +88.194,78.7 +88.218,79.5 +88.242,78.6 +88.266,79.7 +88.290,78.9 +88.314,79.8 +88.338,80.6 +88.362,78.9 +88.386,79.8 +88.410,79.5 +88.434,80.4 +88.458,80.1 +88.482,78.9 +88.506,80.1 +88.530,79.9 +88.554,78.9 +88.578,80.1 +88.602,79.6 +88.626,80.2 +88.650,80.0 +88.674,79.0 +88.698,78.5 +88.722,80.0 +88.746,79.6 +88.770,81.0 +88.794,79.4 +88.818,79.9 +88.842,80.5 +88.866,79.9 +88.890,80.6 +88.914,80.0 +88.938,81.1 +88.962,79.3 +88.986,80.3 +89.010,79.3 +89.034,79.3 +89.058,79.5 +89.082,79.5 +89.106,79.8 +89.130,80.0 +89.154,80.2 +89.178,79.3 +89.202,79.6 +89.226,80.3 +89.250,80.2 +89.274,79.7 +89.298,78.9 +89.322,80.8 +89.346,80.8 +89.370,79.4 +89.394,80.8 +89.418,80.3 +89.442,79.8 +89.466,79.7 +89.490,79.1 +89.514,80.4 +89.538,80.3 +89.562,80.2 +89.586,79.7 +89.610,80.7 +89.634,80.8 +89.658,81.1 +89.682,79.9 +89.706,79.6 +89.730,79.0 +89.754,80.0 +89.778,79.4 +89.802,80.0 +89.826,81.0 +89.850,79.7 +89.874,80.1 +89.898,80.9 +89.922,79.9 +89.946,80.3 +89.970,80.6 +89.994,80.4 +90.018,79.6 +90.042,79.8 +90.066,80.0 +90.090,80.0 +90.114,79.7 +90.138,80.2 +90.162,80.4 +90.186,80.2 +90.210,80.9 +90.234,80.4 +90.258,80.3 +90.282,80.3 +90.306,80.7 +90.330,78.8 +90.354,81.2 +90.378,80.3 +90.402,80.3 +90.426,80.2 +90.450,80.2 +90.474,80.2 +90.498,79.7 +90.522,80.5 +90.546,80.4 +90.570,81.2 +90.594,81.1 +90.618,78.5 +90.642,80.1 +90.666,80.2 +90.690,81.0 +90.714,79.1 +90.738,79.9 +90.762,81.9 +90.786,79.6 +90.810,80.4 +90.834,80.2 +90.858,80.1 +90.882,79.7 +90.906,80.0 +90.930,81.1 +90.954,80.1 +90.978,80.8 +91.002,79.8 +91.026,81.4 +91.050,79.9 +91.074,81.3 +91.098,80.8 +91.122,80.7 +91.146,80.9 +91.170,79.9 +91.194,80.1 +91.218,80.8 +91.242,80.9 +91.266,80.2 +91.290,81.1 +91.314,80.5 +91.338,80.0 +91.362,80.0 +91.386,79.4 +91.410,80.8 +91.434,81.0 +91.458,80.8 +91.482,80.2 +91.506,79.7 +91.530,80.9 +91.554,80.4 +91.578,80.7 +91.602,80.4 +91.626,80.2 +91.650,81.1 +91.674,81.6 +91.698,79.7 +91.722,80.1 +91.746,80.2 +91.770,80.2 +91.794,79.9 +91.818,80.8 +91.842,80.9 +91.866,80.2 +91.890,80.3 +91.914,80.9 +91.938,81.1 +91.962,79.8 +91.986,81.1 +92.010,80.4 +92.034,80.3 +92.058,80.2 +92.082,80.6 +92.106,80.4 +92.130,80.6 +92.154,79.2 +92.178,80.5 +92.202,80.2 +92.226,80.5 +92.250,79.3 +92.274,79.8 +92.298,80.6 +92.322,80.7 +92.346,80.3 +92.370,81.1 +92.394,81.1 +92.418,80.3 +92.442,80.5 +92.466,80.8 +92.490,80.3 +92.515,81.0 +92.539,80.2 +92.563,81.7 +92.587,80.0 +92.611,80.8 +92.635,80.5 +92.659,80.3 +92.683,81.8 +92.707,80.8 +92.731,80.2 +92.755,81.4 +92.779,81.1 +92.803,80.8 +92.827,81.5 +92.851,81.0 +92.875,80.5 +92.899,80.5 +92.923,80.8 +92.947,80.5 +92.971,80.0 +92.995,80.3 +93.019,81.0 +93.043,81.2 +93.067,80.7 +93.091,81.5 +93.115,80.1 +93.139,80.9 +93.163,80.3 +93.187,80.4 +93.211,80.5 +93.235,79.5 +93.259,80.3 +93.283,79.9 +93.307,80.5 +93.331,80.2 +93.355,79.7 +93.379,81.0 +93.403,81.6 +93.427,80.0 +93.451,81.6 +93.475,80.6 +93.499,80.4 +93.523,79.6 +93.547,79.3 +93.571,80.6 +93.595,80.7 +93.619,81.0 +93.643,79.8 +93.667,79.1 +93.691,80.1 +93.715,81.2 +93.739,82.3 +93.763,80.6 +93.787,80.2 +93.811,80.1 +93.835,80.4 +93.859,80.0 +93.883,81.1 +93.907,79.9 +93.931,80.1 +93.955,81.0 +93.979,79.7 +94.003,81.3 +94.027,80.2 +94.051,80.9 +94.075,80.0 +94.099,80.2 +94.123,80.4 +94.147,80.9 +94.171,80.2 +94.195,81.3 +94.219,81.2 +94.243,81.0 +94.267,80.3 +94.291,80.5 +94.315,81.0 +94.339,80.9 +94.363,80.8 +94.387,80.3 +94.411,80.3 +94.435,80.7 +94.459,80.5 +94.483,80.1 +94.507,82.0 +94.531,81.3 +94.555,80.5 +94.579,81.2 +94.603,80.7 +94.627,81.2 +94.651,79.9 +94.675,80.5 +94.699,80.0 +94.723,80.2 +94.747,80.7 +94.771,80.0 +94.795,81.5 +94.819,81.3 +94.843,81.7 +94.867,81.1 +94.891,80.9 +94.915,80.5 +94.939,80.6 +94.963,82.2 +94.987,81.2 +95.011,80.2 +95.035,80.9 +95.059,80.8 +95.083,80.7 +95.107,80.3 +95.131,80.6 +95.155,80.1 +95.179,80.4 +95.203,80.9 +95.227,81.0 +95.251,79.3 +95.275,81.6 +95.299,81.4 +95.323,80.8 +95.347,80.2 +95.371,81.8 +95.395,80.1 +95.419,81.1 +95.443,80.9 +95.467,80.9 +95.491,79.7 +95.515,81.3 +95.539,80.9 +95.563,81.9 +95.587,80.6 +95.611,80.5 +95.635,80.4 +95.659,80.1 +95.683,81.2 +95.707,81.0 +95.731,81.9 +95.755,80.4 +95.779,81.2 +95.803,82.0 +95.827,80.9 +95.851,80.9 +95.875,81.1 +95.899,80.6 +95.923,80.7 +95.947,80.7 +95.971,82.0 +95.995,81.1 +96.019,81.0 +96.043,80.9 +96.067,81.9 +96.091,81.3 +96.115,80.9 +96.139,81.2 +96.163,80.9 +96.187,80.9 +96.211,80.3 +96.235,80.4 +96.259,80.7 +96.283,80.9 +96.307,81.0 +96.331,81.5 +96.355,80.4 +96.379,79.8 +96.403,80.7 +96.427,80.0 +96.451,81.3 +96.475,80.1 +96.499,81.0 +96.523,81.3 +96.547,80.5 +96.571,79.7 +96.595,81.3 +96.619,79.9 +96.643,81.2 +96.667,80.4 +96.691,80.9 +96.715,81.5 +96.739,80.3 +96.763,81.0 +96.787,81.2 +96.811,81.9 +96.835,81.1 +96.859,80.9 +96.883,81.3 +96.907,82.1 +96.931,80.6 +96.955,80.6 +96.979,81.5 +97.003,82.0 +97.027,81.0 +97.051,80.8 +97.075,80.3 +97.099,81.2 +97.123,79.8 +97.147,81.0 +97.171,80.7 +97.195,81.5 +97.219,80.6 +97.243,81.0 +97.267,81.5 +97.291,81.3 +97.315,80.3 +97.339,81.6 +97.363,80.7 +97.387,81.5 +97.411,80.3 +97.435,82.0 +97.459,80.7 +97.483,80.7 +97.508,80.3 +97.532,80.6 +97.556,81.1 +97.580,80.5 +97.604,81.9 +97.628,80.2 +97.652,80.5 +97.676,80.3 +97.700,81.3 +97.724,80.5 +97.748,80.8 +97.772,80.6 +97.796,81.0 +97.820,81.5 +97.844,80.7 +97.868,81.2 +97.892,81.2 +97.916,80.1 +97.940,80.9 +97.964,80.9 +97.988,81.2 +98.012,80.5 +98.036,80.9 +98.060,82.6 +98.084,79.9 +98.108,80.4 +98.132,82.0 +98.156,81.3 +98.180,81.5 +98.204,80.9 +98.228,80.1 +98.252,80.7 +98.276,82.0 +98.300,80.0 +98.324,81.0 +98.348,80.0 +98.372,81.2 +98.396,81.5 +98.420,81.5 +98.444,80.8 +98.468,81.4 +98.492,81.3 +98.516,80.5 +98.540,81.3 +98.564,82.4 +98.588,81.0 +98.612,82.1 +98.636,82.0 +98.660,81.7 +98.684,80.9 +98.708,80.8 +98.732,81.8 +98.756,80.9 +98.780,79.7 +98.804,80.7 +98.828,81.4 +98.852,81.7 +98.876,81.0 +98.900,80.7 +98.924,82.0 +98.948,81.7 +98.972,82.0 +98.996,81.1 +99.020,80.8 +99.044,80.3 +99.068,81.0 +99.092,81.8 +99.116,81.8 +99.140,81.7 +99.164,80.7 +99.188,81.9 +99.212,80.6 +99.236,81.7 +99.260,80.9 +99.284,80.0 +99.308,81.7 +99.332,82.1 +99.356,82.0 +99.380,81.2 +99.404,81.1 +99.428,81.8 +99.452,81.8 +99.476,81.5 +99.500,82.0 +99.524,81.1 +99.548,80.8 +99.572,81.4 +99.596,81.1 +99.620,81.2 +99.644,80.9 +99.668,81.5 +99.692,79.9 +99.716,81.3 +99.740,81.6 +99.764,81.2 +99.788,81.7 +99.812,81.7 +99.836,80.9 +99.860,81.1 +99.884,80.9 +99.908,81.0 +99.932,81.2 +99.956,81.4 +99.980,82.1 +100.004,81.3 +100.028,80.6 +100.052,80.3 +100.076,81.7 +100.100,82.1 +100.124,80.7 +100.148,81.3 +100.172,81.6 +100.196,80.0 +100.220,81.7 +100.244,82.0 +100.268,81.4 +100.292,80.6 +100.316,81.4 +100.340,81.7 +100.364,81.0 +100.388,82.3 +100.412,81.3 +100.436,80.9 +100.460,81.2 +100.484,80.9 +100.508,81.3 +100.532,81.4 +100.556,80.4 +100.580,80.6 +100.604,81.6 +100.628,81.4 +100.652,81.0 +100.676,81.6 +100.700,82.6 +100.724,82.3 +100.748,81.0 +100.772,80.3 +100.796,81.0 +100.820,81.6 +100.844,81.7 +100.868,81.9 +100.892,81.5 +100.916,82.3 +100.940,82.0 +100.964,80.1 +100.988,80.7 +101.012,81.9 +101.036,80.8 +101.060,81.2 +101.084,81.3 +101.108,80.9 +101.132,82.9 +101.156,82.0 +101.180,81.6 +101.204,82.1 +101.228,81.2 +101.252,81.1 +101.276,81.3 +101.300,81.6 +101.324,81.5 +101.348,81.5 +101.372,81.7 +101.396,81.0 +101.420,80.1 +101.444,80.3 +101.468,81.9 +101.492,81.1 +101.516,81.0 +101.540,81.8 +101.564,82.7 +101.588,80.3 +101.612,80.5 +101.636,82.0 +101.660,81.7 +101.684,81.7 +101.708,80.7 +101.732,82.3 +101.756,81.9 +101.780,81.0 +101.804,81.7 +101.828,81.1 +101.852,82.3 +101.876,81.7 +101.900,81.9 +101.924,80.6 +101.948,82.1 +101.972,80.5 +101.996,80.4 +102.020,82.3 +102.044,82.0 +102.068,81.3 +102.092,82.4 +102.116,81.6 +102.140,81.8 +102.164,81.4 +102.188,81.4 +102.212,82.2 +102.236,81.9 +102.260,80.8 +102.284,81.8 +102.308,80.9 +102.332,82.1 +102.356,80.9 +102.380,81.5 +102.404,82.1 +102.428,81.1 +102.452,81.5 +102.476,81.4 +102.501,81.3 +102.525,82.1 +102.549,81.7 +102.573,81.4 +102.597,80.7 +102.621,81.1 +102.645,81.2 +102.669,80.4 +102.693,82.2 +102.717,83.0 +102.741,82.5 +102.765,81.4 +102.789,81.2 +102.813,81.8 +102.837,82.5 +102.861,82.0 +102.885,82.6 +102.909,81.3 +102.933,80.8 +102.957,81.5 +102.981,82.1 +103.005,82.1 +103.029,81.5 +103.053,81.6 +103.077,81.2 +103.101,81.6 +103.125,80.6 +103.149,82.7 +103.173,80.7 +103.197,81.8 +103.221,82.3 +103.245,81.9 +103.269,82.0 +103.293,81.1 +103.317,82.0 +103.341,81.9 +103.365,81.4 +103.389,81.6 +103.413,81.3 +103.437,80.8 +103.461,81.7 +103.485,81.8 +103.509,81.1 +103.533,81.1 +103.557,81.9 +103.581,83.1 +103.605,82.3 +103.629,82.5 +103.653,81.2 +103.677,82.0 +103.701,81.4 +103.725,82.5 +103.749,82.1 +103.773,82.8 +103.797,82.0 +103.821,83.0 +103.845,81.9 +103.869,81.7 +103.893,81.6 +103.917,82.3 +103.941,81.5 +103.965,80.8 +103.989,80.9 +104.013,81.0 +104.037,80.6 +104.061,81.5 +104.085,82.2 +104.109,81.8 +104.133,81.1 +104.157,81.5 +104.181,82.8 +104.205,82.4 +104.229,81.1 +104.253,82.3 +104.277,82.3 +104.301,82.7 +104.325,81.5 +104.349,81.5 +104.373,81.9 +104.397,81.7 +104.421,82.0 +104.445,81.0 +104.469,81.7 +104.493,81.8 +104.517,82.1 +104.541,81.5 +104.565,81.4 +104.589,81.7 +104.613,82.4 +104.637,80.7 +104.661,81.3 +104.685,82.0 +104.709,81.9 +104.733,81.4 +104.757,82.2 +104.781,82.6 +104.805,82.9 +104.829,82.2 +104.853,82.3 +104.877,82.0 +104.901,82.4 +104.925,81.9 +104.949,80.9 +104.973,80.8 +104.997,80.4 +105.021,82.3 +105.045,81.4 +105.069,82.3 +105.093,83.5 +105.117,81.3 +105.141,82.0 +105.165,82.0 +105.189,81.6 +105.213,83.2 +105.237,82.4 +105.261,80.9 +105.285,82.7 +105.309,81.4 +105.333,81.2 +105.357,81.2 +105.381,81.3 +105.405,82.0 +105.429,80.9 +105.453,80.9 +105.477,82.5 +105.501,81.6 +105.525,81.6 +105.549,80.9 +105.573,81.9 +105.597,82.4 +105.621,81.2 +105.645,82.7 +105.669,81.5 +105.693,82.2 +105.717,83.5 +105.741,82.3 +105.765,81.2 +105.789,81.4 +105.813,81.8 +105.837,81.4 +105.861,83.0 +105.885,83.1 +105.909,82.4 +105.933,82.1 +105.957,82.7 +105.981,82.0 +106.005,82.4 +106.029,82.2 +106.053,81.9 +106.077,82.5 +106.101,81.7 +106.125,82.4 +106.149,81.8 +106.173,80.7 +106.197,82.5 +106.221,81.5 +106.245,81.0 +106.269,81.6 +106.293,82.2 +106.317,81.4 +106.341,81.1 +106.365,82.1 +106.389,81.8 +106.413,80.8 +106.437,81.2 +106.461,82.1 +106.485,82.2 +106.509,83.1 +106.533,81.7 +106.557,81.5 +106.581,82.0 +106.605,82.6 +106.629,82.1 +106.653,81.2 +106.677,82.8 +106.701,82.5 +106.725,81.8 +106.749,82.8 +106.773,82.5 +106.797,83.2 +106.821,83.4 +106.845,81.8 +106.869,82.4 +106.893,82.8 +106.917,82.7 +106.941,82.0 +106.965,82.4 +106.989,82.3 +107.013,82.3 +107.037,81.5 +107.061,82.2 +107.085,80.9 +107.109,81.5 +107.133,82.9 +107.157,81.8 +107.181,81.8 +107.205,82.0 +107.229,81.9 +107.253,82.4 +107.277,82.1 +107.301,83.1 +107.325,82.1 +107.349,81.2 +107.373,82.0 +107.397,82.2 +107.421,82.9 +107.445,82.1 +107.469,82.3 +107.493,82.2 +107.518,81.8 +107.542,82.5 +107.566,81.9 +107.590,81.3 +107.614,81.9 +107.638,82.7 +107.662,82.1 +107.686,81.8 +107.710,82.3 +107.734,82.2 +107.758,82.0 +107.782,81.5 +107.806,82.5 +107.830,81.2 +107.854,81.1 +107.878,81.8 +107.902,81.3 +107.926,82.0 +107.950,82.6 +107.974,81.8 +107.998,82.2 +108.022,81.9 +108.046,82.0 +108.070,82.7 +108.094,81.8 +108.118,83.2 +108.142,81.1 +108.166,82.2 +108.190,82.8 +108.214,81.6 +108.238,81.1 +108.262,81.6 +108.286,82.3 +108.310,81.8 +108.334,82.3 +108.358,82.5 +108.382,82.1 +108.406,81.3 +108.430,82.5 +108.454,82.6 +108.478,81.5 +108.502,81.6 +108.526,82.6 +108.550,81.6 +108.574,82.7 +108.598,82.7 +108.622,81.6 +108.646,82.3 +108.670,81.0 +108.694,81.5 +108.718,82.7 +108.742,83.0 +108.766,81.3 +108.790,81.9 +108.814,81.6 +108.838,81.1 +108.862,82.6 +108.886,81.9 +108.910,82.7 +108.934,82.9 +108.958,82.3 +108.982,83.9 +109.006,81.1 +109.030,82.6 +109.054,82.2 +109.078,82.0 +109.102,81.1 +109.126,82.5 +109.150,82.3 +109.174,81.7 +109.198,81.9 +109.222,83.2 +109.246,81.4 +109.270,82.2 +109.294,82.1 +109.318,82.5 +109.342,81.3 +109.366,82.5 +109.390,81.4 +109.414,81.2 +109.438,82.1 +109.462,82.0 +109.486,83.6 +109.510,82.0 +109.534,82.1 +109.558,82.8 +109.582,82.0 +109.606,81.4 +109.630,82.9 +109.654,83.5 +109.678,82.2 +109.702,82.9 +109.726,82.3 +109.750,81.7 +109.774,83.3 +109.798,81.4 +109.822,82.3 +109.846,82.0 +109.870,83.0 +109.894,82.5 +109.918,82.7 +109.942,81.2 +109.966,83.2 +109.990,81.1 +110.014,82.8 +110.038,81.0 +110.062,82.2 +110.086,81.4 +110.110,82.3 +110.134,82.8 +110.158,82.5 +110.182,82.0 +110.206,81.9 +110.230,81.3 +110.254,83.0 +110.278,82.3 +110.302,82.4 +110.326,82.2 +110.350,82.3 +110.374,82.2 +110.398,82.3 +110.422,82.0 +110.446,82.6 +110.470,82.5 +110.494,82.3 +110.518,82.0 +110.542,80.9 +110.566,84.0 +110.590,82.0 +110.614,82.2 +110.638,82.0 +110.662,82.0 +110.686,81.5 +110.710,82.8 +110.734,82.1 +110.758,81.9 +110.782,83.1 +110.806,82.7 +110.830,82.9 +110.854,82.0 +110.878,83.3 +110.902,82.7 +110.926,82.0 +110.950,82.7 +110.974,82.4 +110.998,82.7 +111.022,82.2 +111.046,82.6 +111.070,82.9 +111.094,81.6 +111.118,82.3 +111.142,82.0 +111.166,81.9 +111.190,81.7 +111.214,82.0 +111.238,82.6 +111.262,82.2 +111.286,82.3 +111.310,81.9 +111.334,83.6 +111.358,81.4 +111.382,82.3 +111.406,83.1 +111.430,81.8 +111.454,82.3 +111.478,82.3 +111.502,82.5 +111.526,82.9 +111.550,81.7 +111.574,82.4 +111.598,81.8 +111.622,83.0 +111.646,82.1 +111.670,82.8 +111.694,81.9 +111.718,81.1 +111.742,82.3 +111.766,82.3 +111.790,82.2 +111.814,82.2 +111.838,81.4 +111.862,82.6 +111.886,82.8 +111.910,83.3 +111.934,82.5 +111.958,82.4 +111.982,82.2 +112.006,82.2 +112.030,83.0 +112.054,81.1 +112.078,82.6 +112.102,83.8 +112.126,81.6 +112.150,82.8 +112.174,82.9 +112.198,81.8 +112.222,81.9 +112.246,81.5 +112.270,82.8 +112.294,81.3 +112.318,82.5 +112.342,82.0 +112.366,82.6 +112.390,81.9 +112.414,82.5 +112.438,82.0 +112.462,82.8 +112.486,82.6 +112.511,82.8 +112.535,81.4 +112.559,82.4 +112.583,83.6 +112.607,82.9 +112.631,82.4 +112.655,82.1 +112.679,81.8 +112.703,82.1 +112.727,82.4 +112.751,82.2 +112.775,81.7 +112.799,81.8 +112.823,82.2 +112.847,82.7 +112.871,81.9 +112.895,82.3 +112.919,83.2 +112.943,82.1 +112.967,82.5 +112.991,82.6 +113.015,82.6 +113.039,83.3 +113.063,82.5 +113.087,81.8 +113.111,82.3 +113.135,82.3 +113.159,81.1 +113.183,81.9 +113.207,82.1 +113.231,82.8 +113.255,83.0 +113.279,82.4 +113.303,83.4 +113.327,82.4 +113.351,83.7 +113.375,83.4 +113.399,83.0 +113.423,83.2 +113.447,81.6 +113.471,82.8 +113.495,82.6 +113.519,82.9 +113.543,82.9 +113.567,83.5 +113.591,82.1 +113.615,81.6 +113.639,82.2 +113.663,82.4 +113.687,82.7 +113.711,82.4 +113.735,81.9 +113.759,82.3 +113.783,82.4 +113.807,83.0 +113.831,82.7 +113.855,82.8 +113.879,81.8 +113.903,82.8 +113.927,81.8 +113.951,82.6 +113.975,81.8 +113.999,83.6 +114.023,82.3 +114.047,81.7 +114.071,83.4 +114.095,82.1 +114.119,83.1 +114.143,82.0 +114.167,83.1 +114.191,82.2 +114.215,81.9 +114.239,83.5 +114.263,81.5 +114.287,82.5 +114.311,81.2 +114.335,82.8 +114.359,83.0 +114.383,82.9 +114.407,82.2 +114.431,82.1 +114.455,82.3 +114.479,82.7 +114.503,82.2 +114.527,82.9 +114.551,82.9 +114.575,82.8 +114.599,83.1 +114.623,82.4 +114.647,81.1 +114.671,82.4 +114.695,82.7 +114.719,81.7 +114.743,81.5 +114.767,83.0 +114.791,82.6 +114.815,81.8 +114.839,82.9 +114.863,83.5 +114.887,82.4 +114.911,81.9 +114.935,83.7 +114.959,82.6 +114.983,81.8 +115.007,81.4 +115.031,83.4 +115.055,83.0 +115.079,82.5 +115.103,82.5 +115.127,82.4 +115.151,82.4 +115.175,83.6 +115.199,82.4 +115.223,82.5 +115.247,81.9 +115.271,82.3 +115.295,81.7 +115.319,82.8 +115.343,82.7 +115.367,82.8 +115.391,82.8 +115.415,83.0 +115.439,82.8 +115.463,82.6 +115.487,82.6 +115.511,82.2 +115.535,83.5 +115.559,82.4 +115.583,83.0 +115.607,82.7 +115.631,81.9 +115.655,82.7 +115.679,83.0 +115.703,82.5 +115.727,82.9 +115.751,82.2 +115.775,83.1 +115.799,83.3 +115.823,82.1 +115.847,82.4 +115.871,83.3 +115.895,82.9 +115.919,83.5 +115.943,81.4 +115.967,82.8 +115.991,81.9 +116.015,82.6 +116.039,81.4 +116.063,82.6 +116.087,83.2 +116.111,82.6 +116.135,81.8 +116.159,83.0 +116.183,82.5 +116.207,82.1 +116.231,83.2 +116.255,82.3 +116.279,81.7 +116.303,82.6 +116.327,83.5 +116.351,82.5 +116.375,82.5 +116.399,82.9 +116.423,82.7 +116.447,82.8 +116.471,82.8 +116.495,82.3 +116.519,81.6 +116.543,82.2 +116.567,82.4 +116.591,82.8 +116.615,82.5 +116.639,82.9 +116.663,81.5 +116.687,81.7 +116.711,82.8 +116.735,82.6 +116.759,82.3 +116.783,83.3 +116.807,82.6 +116.831,82.6 +116.855,82.3 +116.879,82.1 +116.903,82.4 +116.927,82.8 +116.951,82.5 +116.975,83.0 +116.999,82.6 +117.023,81.5 +117.047,82.4 +117.071,82.5 +117.095,82.0 +117.119,83.2 +117.143,83.5 +117.167,82.7 +117.191,83.0 +117.215,82.7 +117.239,82.9 +117.263,83.2 +117.287,83.3 +117.311,82.6 +117.335,82.8 +117.359,82.6 +117.383,83.8 +117.407,82.3 +117.431,82.4 +117.455,81.8 +117.479,82.3 +117.504,83.1 +117.528,83.7 +117.552,83.7 +117.576,83.0 +117.600,82.8 +117.624,82.4 +117.648,82.6 +117.672,83.5 +117.696,83.3 +117.720,83.0 +117.744,82.4 +117.768,82.4 +117.792,83.6 +117.816,82.2 +117.840,83.2 +117.864,84.2 +117.888,83.1 +117.912,82.0 +117.936,83.6 +117.960,82.5 +117.984,82.0 +118.008,81.3 +118.032,81.1 +118.056,82.6 +118.080,82.4 +118.104,83.4 +118.128,82.4 +118.152,82.1 +118.176,83.0 +118.200,83.7 +118.224,82.3 +118.248,82.6 +118.272,83.3 +118.296,82.5 +118.320,83.5 +118.344,82.5 +118.368,83.1 +118.392,82.8 +118.416,82.4 +118.440,83.7 +118.464,82.3 +118.488,84.9 +118.512,83.1 +118.536,82.7 +118.560,83.7 +118.584,82.9 +118.608,83.9 +118.632,82.4 +118.656,83.2 +118.680,83.1 +118.704,82.0 +118.728,82.4 +118.752,82.2 +118.776,83.1 +118.800,82.8 +118.824,82.0 +118.848,83.5 +118.872,82.7 +118.896,82.7 +118.920,82.8 +118.944,83.0 +118.968,82.5 +118.992,81.4 +119.016,82.6 +119.040,82.4 +119.064,82.1 +119.088,82.2 +119.112,82.4 +119.136,83.1 +119.160,82.3 +119.184,82.4 +119.208,83.5 +119.232,82.0 +119.256,81.6 +119.280,81.5 +119.304,83.0 +119.328,83.9 +119.352,82.8 +119.376,82.4 +119.400,83.0 +119.424,83.7 +119.448,82.6 +119.472,82.2 +119.496,82.6 +119.520,82.8 +119.544,82.7 +119.568,83.9 +119.592,83.6 +119.616,83.9 +119.640,83.2 +119.664,83.0 +119.688,82.9 +119.712,83.7 +119.736,82.8 +119.760,83.3 +119.784,83.0 +119.808,82.8 +119.832,83.5 +119.856,82.3 +119.880,83.0 +119.904,83.5 +119.928,83.3 +119.952,83.2 +119.976,82.3 +120.000,82.8 diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-renamed/case.json b/agents/evals/fixtures/cases/line-basic-letsplot-renamed/case.json new file mode 100644 index 00000000000..925cfbcd5c7 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-renamed/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "line-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "x", + "column": "t [min]" + }, + { + "role": "y", + "column": "T_tank [°C]" + } + ], + "expected": "accepted", + "tags": [ + "line", + "renamed", + "synthetic", + "renamed-headers", + "non-ascii-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, renamed)" +} diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-renamed/data.csv b/agents/evals/fixtures/cases/line-basic-letsplot-renamed/data.csv new file mode 100644 index 00000000000..40cd36cf968 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-renamed/data.csv @@ -0,0 +1,62 @@ +t [min],T_tank [°C] +0.00,21.1 +2.00,23.2 +4.00,26.4 +6.00,30.0 +8.00,32.6 +10.00,37.1 +12.00,39.4 +14.00,41.8 +16.00,44.7 +18.00,45.8 +20.00,47.5 +22.00,50.5 +24.00,52.4 +26.00,53.6 +28.00,56.1 +30.00,58.3 +32.00,58.6 +34.00,60.5 +36.00,62.0 +38.00,63.3 +40.00,64.9 +42.00,65.8 +44.00,67.3 +46.00,67.1 +48.00,68.2 +50.00,69.9 +52.00,70.0 +54.00,70.8 +56.00,71.8 +58.00,72.8 +60.00,73.0 +62.00,74.3 +64.00,75.4 +66.00,74.1 +68.00,74.3 +70.00,76.7 +72.00,76.2 +74.00,78.0 +76.00,79.3 +78.00,77.9 +80.00,78.2 +82.00,78.8 +84.00,79.3 +86.00,79.4 +88.00,79.2 +90.00,80.3 +92.00,79.1 +94.00,80.8 +96.00,80.9 +98.00,81.8 +100.00,81.4 +102.00,81.8 +104.00,81.1 +106.00,82.0 +108.00,82.5 +110.00,82.8 +112.00,82.4 +114.00,83.4 +116.00,83.4 +118.00,82.4 +120.00,81.4 diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-x10/case.json b/agents/evals/fixtures/cases/line-basic-letsplot-x10/case.json new file mode 100644 index 00000000000..a8a30625332 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "x", + "column": "Elapsed Time (min)" + }, + { + "role": "y", + "column": "Tank Temperature (°C)" + } + ], + "expected": "accepted", + "tags": [ + "line", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, x10)" +} diff --git a/agents/evals/fixtures/cases/line-basic-letsplot-x10/data.csv b/agents/evals/fixtures/cases/line-basic-letsplot-x10/data.csv new file mode 100644 index 00000000000..7fdabb0d61c --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-letsplot-x10/data.csv @@ -0,0 +1,62 @@ +Elapsed Time (min),Tank Temperature (°C) +0.00,210.9 +2.00,231.7 +4.00,263.7 +6.00,300.0 +8.00,325.9 +10.00,370.6 +12.00,393.9 +14.00,418.1 +16.00,447.0 +18.00,457.7 +20.00,475.0 +22.00,505.4 +24.00,524.4 +26.00,535.6 +28.00,561.2 +30.00,583.0 +32.00,586.3 +34.00,605.1 +36.00,619.7 +38.00,633.4 +40.00,648.8 +42.00,657.8 +44.00,673.5 +46.00,670.5 +48.00,682.2 +50.00,699.1 +52.00,700.2 +54.00,707.7 +56.00,718.5 +58.00,728.2 +60.00,730.0 +62.00,743.0 +64.00,753.9 +66.00,740.7 +68.00,743.1 +70.00,766.5 +72.00,762.1 +74.00,780.3 +76.00,793.1 +78.00,779.2 +80.00,781.6 +82.00,787.5 +84.00,792.7 +86.00,794.0 +88.00,792.0 +90.00,802.8 +92.00,791.0 +94.00,808.0 +96.00,808.8 +98.00,818.3 +100.00,813.6 +102.00,817.7 +104.00,811.0 +106.00,819.6 +108.00,825.0 +110.00,828.1 +112.00,824.2 +114.00,834.5 +116.00,834.0 +118.00,823.8 +120.00,814.1 diff --git a/agents/evals/fixtures/cases/line-basic-pygal-date/case.json b/agents/evals/fixtures/cases/line-basic-pygal-date/case.json new file mode 100644 index 00000000000..8fd4dd1028d --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "line-basic", + "library": "pygal", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "x", + "column": "Timestamp" + }, + { + "role": "y", + "column": "Tank Temperature (°C)" + } + ], + "expected": "accepted", + "tags": [ + "line", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "date-axis" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, date)" +} diff --git a/agents/evals/fixtures/cases/line-basic-pygal-date/data.csv b/agents/evals/fixtures/cases/line-basic-pygal-date/data.csv new file mode 100644 index 00000000000..02d4c96346c --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-date/data.csv @@ -0,0 +1,62 @@ +Timestamp,Logged At,Tank Temperature (°C) +14.03.2026 06:00,2026-03-15T06:00,21.1 +14.03.2026 06:02,2026-03-15T06:02,23.2 +14.03.2026 06:04,2026-03-15T06:04,26.4 +14.03.2026 06:06,2026-03-15T06:06,30.0 +14.03.2026 06:08,2026-03-15T06:08,32.6 +14.03.2026 06:10,2026-03-15T06:10,37.1 +14.03.2026 06:12,2026-03-15T06:12,39.4 +14.03.2026 06:14,2026-03-15T06:14,41.8 +14.03.2026 06:16,2026-03-15T06:16,44.7 +14.03.2026 06:18,2026-03-15T06:18,45.8 +14.03.2026 06:20,2026-03-15T06:20,47.5 +14.03.2026 06:22,2026-03-15T06:22,50.5 +14.03.2026 06:24,2026-03-15T06:24,52.4 +14.03.2026 06:26,2026-03-15T06:26,53.6 +14.03.2026 06:28,2026-03-15T06:28,56.1 +14.03.2026 06:30,2026-03-15T06:30,58.3 +14.03.2026 06:32,2026-03-15T06:32,58.6 +14.03.2026 06:34,2026-03-15T06:34,60.5 +14.03.2026 06:36,2026-03-15T06:36,62.0 +14.03.2026 06:38,2026-03-15T06:38,63.3 +14.03.2026 06:40,2026-03-15T06:40,64.9 +14.03.2026 06:42,2026-03-15T06:42,65.8 +14.03.2026 06:44,2026-03-15T06:44,67.3 +14.03.2026 06:46,2026-03-15T06:46,67.1 +14.03.2026 06:48,2026-03-15T06:48,68.2 +14.03.2026 06:50,2026-03-15T06:50,69.9 +14.03.2026 06:52,2026-03-15T06:52,70.0 +14.03.2026 06:54,2026-03-15T06:54,70.8 +14.03.2026 06:56,2026-03-15T06:56,71.8 +14.03.2026 06:58,2026-03-15T06:58,72.8 +14.03.2026 07:00,2026-03-15T07:00,73.0 +14.03.2026 07:02,2026-03-15T07:02,74.3 +14.03.2026 07:04,2026-03-15T07:04,75.4 +14.03.2026 07:06,2026-03-15T07:06,74.1 +14.03.2026 07:08,2026-03-15T07:08,74.3 +14.03.2026 07:10,2026-03-15T07:10,76.7 +14.03.2026 07:12,2026-03-15T07:12,76.2 +14.03.2026 07:14,2026-03-15T07:14,78.0 +14.03.2026 07:16,2026-03-15T07:16,79.3 +14.03.2026 07:18,2026-03-15T07:18,77.9 +14.03.2026 07:20,2026-03-15T07:20,78.2 +14.03.2026 07:22,2026-03-15T07:22,78.8 +14.03.2026 07:24,2026-03-15T07:24,79.3 +14.03.2026 07:26,2026-03-15T07:26,79.4 +14.03.2026 07:28,2026-03-15T07:28,79.2 +14.03.2026 07:30,2026-03-15T07:30,80.3 +14.03.2026 07:32,2026-03-15T07:32,79.1 +14.03.2026 07:34,2026-03-15T07:34,80.8 +14.03.2026 07:36,2026-03-15T07:36,80.9 +14.03.2026 07:38,2026-03-15T07:38,81.8 +14.03.2026 07:40,2026-03-15T07:40,81.4 +14.03.2026 07:42,2026-03-15T07:42,81.8 +14.03.2026 07:44,2026-03-15T07:44,81.1 +14.03.2026 07:46,2026-03-15T07:46,82.0 +14.03.2026 07:48,2026-03-15T07:48,82.5 +14.03.2026 07:50,2026-03-15T07:50,82.8 +14.03.2026 07:52,2026-03-15T07:52,82.4 +14.03.2026 07:54,2026-03-15T07:54,83.4 +14.03.2026 07:56,2026-03-15T07:56,83.4 +14.03.2026 07:58,2026-03-15T07:58,82.4 +14.03.2026 08:00,2026-03-15T08:00,81.4 diff --git a/agents/evals/fixtures/cases/line-basic-pygal-decimal-comma/case.json b/agents/evals/fixtures/cases/line-basic-pygal-decimal-comma/case.json new file mode 100644 index 00000000000..58495a5f88d --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-basic", + "library": "pygal", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "x", + "column": "Elapsed Time (min)" + }, + { + "role": "y", + "column": "Tank Temperature (°C)" + } + ], + "expected": "accepted", + "tags": [ + "line", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/line-basic-pygal-decimal-comma/data.csv b/agents/evals/fixtures/cases/line-basic-pygal-decimal-comma/data.csv new file mode 100644 index 00000000000..5e8c0fc21ee --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-decimal-comma/data.csv @@ -0,0 +1,62 @@ +Elapsed Time (min);Tank Temperature (°C) +0,00;21,1 +2,00;23,2 +4,00;26,4 +6,00;30,0 +8,00;32,6 +10,00;37,1 +12,00;39,4 +14,00;41,8 +16,00;44,7 +18,00;45,8 +20,00;47,5 +22,00;50,5 +24,00;52,4 +26,00;53,6 +28,00;56,1 +30,00;58,3 +32,00;58,6 +34,00;60,5 +36,00;62,0 +38,00;63,3 +40,00;64,9 +42,00;65,8 +44,00;67,3 +46,00;67,1 +48,00;68,2 +50,00;69,9 +52,00;70,0 +54,00;70,8 +56,00;71,8 +58,00;72,8 +60,00;73,0 +62,00;74,3 +64,00;75,4 +66,00;74,1 +68,00;74,3 +70,00;76,7 +72,00;76,2 +74,00;78,0 +76,00;79,3 +78,00;77,9 +80,00;78,2 +82,00;78,8 +84,00;79,3 +86,00;79,4 +88,00;79,2 +90,00;80,3 +92,00;79,1 +94,00;80,8 +96,00;80,9 +98,00;81,8 +100,00;81,4 +102,00;81,8 +104,00;81,1 +106,00;82,0 +108,00;82,5 +110,00;82,8 +112,00;82,4 +114,00;83,4 +116,00;83,4 +118,00;82,4 +120,00;81,4 diff --git a/agents/evals/fixtures/cases/line-basic-pygal-n12/case.json b/agents/evals/fixtures/cases/line-basic-pygal-n12/case.json new file mode 100644 index 00000000000..8433945ccba --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "x", + "column": "Elapsed Time (min)" + }, + { + "role": "y", + "column": "Tank Temperature (°C)" + } + ], + "expected": "accepted", + "tags": [ + "line", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, n12)" +} diff --git a/agents/evals/fixtures/cases/line-basic-pygal-n12/data.csv b/agents/evals/fixtures/cases/line-basic-pygal-n12/data.csv new file mode 100644 index 00000000000..484b2229ff5 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-n12/data.csv @@ -0,0 +1,13 @@ +Elapsed Time (min),Tank Temperature (°C) +0.00,19.6 +10.91,37.8 +21.82,49.3 +32.73,58.5 +43.64,66.1 +54.55,70.5 +65.45,75.6 +76.36,78.4 +87.27,80.4 +98.18,80.8 +109.09,82.4 +120.00,83.0 diff --git a/agents/evals/fixtures/cases/line-basic-pygal-n5000/case.json b/agents/evals/fixtures/cases/line-basic-pygal-n5000/case.json new file mode 100644 index 00000000000..e89337faf34 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "x", + "column": "Elapsed Time (min)" + }, + { + "role": "y", + "column": "Tank Temperature (°C)" + } + ], + "expected": "accepted", + "tags": [ + "line", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, n5000)" +} diff --git a/agents/evals/fixtures/cases/line-basic-pygal-n5000/data.csv b/agents/evals/fixtures/cases/line-basic-pygal-n5000/data.csv new file mode 100644 index 00000000000..bc2d96257a5 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-n5000/data.csv @@ -0,0 +1,5001 @@ +Elapsed Time (min),Tank Temperature (°C) +0.000,19.4 +0.024,20.3 +0.048,20.4 +0.072,20.6 +0.096,19.9 +0.120,20.6 +0.144,20.4 +0.168,21.0 +0.192,20.7 +0.216,20.9 +0.240,22.5 +0.264,20.0 +0.288,21.4 +0.312,20.9 +0.336,21.0 +0.360,20.2 +0.384,21.6 +0.408,20.5 +0.432,20.6 +0.456,20.0 +0.480,20.2 +0.504,21.4 +0.528,21.0 +0.552,21.3 +0.576,20.6 +0.600,21.0 +0.624,20.4 +0.648,22.0 +0.672,21.4 +0.696,21.5 +0.720,22.0 +0.744,21.3 +0.768,21.3 +0.792,22.1 +0.816,21.6 +0.840,21.8 +0.864,21.8 +0.888,21.6 +0.912,21.7 +0.936,21.4 +0.960,22.3 +0.984,21.4 +1.008,22.8 +1.032,22.2 +1.056,21.4 +1.080,21.7 +1.104,22.7 +1.128,22.1 +1.152,21.4 +1.176,22.3 +1.200,22.6 +1.224,22.9 +1.248,23.2 +1.272,23.7 +1.296,22.6 +1.320,22.8 +1.344,22.8 +1.368,22.2 +1.392,22.2 +1.416,22.9 +1.440,22.1 +1.464,21.5 +1.488,23.2 +1.512,22.5 +1.536,22.8 +1.560,23.4 +1.584,25.0 +1.608,21.9 +1.632,22.7 +1.656,23.9 +1.680,23.3 +1.704,23.1 +1.728,22.8 +1.752,23.4 +1.776,22.9 +1.800,23.0 +1.824,23.0 +1.848,22.7 +1.872,22.4 +1.896,23.3 +1.920,23.6 +1.944,23.8 +1.968,23.6 +1.992,23.7 +2.016,23.3 +2.040,23.9 +2.064,23.3 +2.088,23.3 +2.112,23.6 +2.136,24.6 +2.160,24.2 +2.184,23.9 +2.208,23.5 +2.232,24.9 +2.256,24.6 +2.280,23.6 +2.304,23.9 +2.328,24.2 +2.352,25.1 +2.376,24.5 +2.400,24.2 +2.424,24.7 +2.448,25.2 +2.472,24.1 +2.496,23.6 +2.521,24.1 +2.545,24.4 +2.569,25.6 +2.593,24.4 +2.617,24.8 +2.641,24.7 +2.665,24.2 +2.689,24.4 +2.713,24.8 +2.737,24.7 +2.761,24.1 +2.785,24.5 +2.809,25.2 +2.833,24.7 +2.857,23.6 +2.881,26.2 +2.905,24.7 +2.929,24.6 +2.953,24.6 +2.977,25.8 +3.001,25.8 +3.025,24.8 +3.049,24.6 +3.073,25.1 +3.097,25.9 +3.121,25.0 +3.145,25.5 +3.169,25.9 +3.193,24.6 +3.217,24.9 +3.241,24.9 +3.265,25.9 +3.289,25.8 +3.313,25.6 +3.337,25.9 +3.361,26.2 +3.385,26.2 +3.409,26.4 +3.433,25.1 +3.457,26.3 +3.481,24.9 +3.505,25.4 +3.529,25.7 +3.553,26.5 +3.577,26.4 +3.601,26.4 +3.625,25.9 +3.649,26.4 +3.673,26.1 +3.697,25.7 +3.721,26.3 +3.745,27.0 +3.769,26.6 +3.793,26.6 +3.817,27.1 +3.841,26.8 +3.865,26.6 +3.889,27.2 +3.913,25.8 +3.937,26.2 +3.961,27.7 +3.985,27.7 +4.009,27.0 +4.033,26.6 +4.057,26.6 +4.081,26.4 +4.105,28.4 +4.129,26.6 +4.153,27.4 +4.177,26.3 +4.201,26.4 +4.225,28.6 +4.249,27.8 +4.273,26.9 +4.297,27.8 +4.321,27.4 +4.345,28.3 +4.369,27.0 +4.393,27.2 +4.417,27.3 +4.441,28.4 +4.465,27.6 +4.489,27.8 +4.513,27.9 +4.537,28.8 +4.561,27.4 +4.585,28.3 +4.609,27.7 +4.633,28.4 +4.657,28.2 +4.681,28.1 +4.705,28.0 +4.729,29.4 +4.753,28.5 +4.777,27.9 +4.801,29.3 +4.825,27.9 +4.849,28.8 +4.873,28.8 +4.897,28.4 +4.921,26.9 +4.945,29.2 +4.969,28.2 +4.993,29.9 +5.017,28.5 +5.041,29.1 +5.065,27.9 +5.089,28.7 +5.113,29.3 +5.137,29.4 +5.161,28.6 +5.185,28.5 +5.209,28.7 +5.233,29.4 +5.257,29.1 +5.281,27.9 +5.305,30.5 +5.329,29.1 +5.353,29.2 +5.377,29.4 +5.401,29.7 +5.425,29.1 +5.449,29.3 +5.473,30.4 +5.497,30.4 +5.521,28.6 +5.545,29.7 +5.569,30.2 +5.593,29.8 +5.617,30.0 +5.641,29.3 +5.665,30.0 +5.689,30.5 +5.713,30.4 +5.737,30.7 +5.761,29.4 +5.785,30.3 +5.809,29.5 +5.833,29.7 +5.857,30.4 +5.881,28.6 +5.905,30.3 +5.929,30.4 +5.953,30.2 +5.977,31.2 +6.001,29.9 +6.025,31.0 +6.049,30.2 +6.073,30.2 +6.097,29.8 +6.121,30.3 +6.145,30.6 +6.169,30.2 +6.193,31.4 +6.217,30.1 +6.241,29.8 +6.265,32.1 +6.289,31.2 +6.313,29.7 +6.337,31.0 +6.361,29.8 +6.385,29.8 +6.409,31.4 +6.433,30.6 +6.457,31.9 +6.481,31.9 +6.505,31.3 +6.529,32.5 +6.553,31.3 +6.577,30.5 +6.601,31.3 +6.625,31.0 +6.649,31.0 +6.673,30.6 +6.697,30.9 +6.721,31.4 +6.745,31.4 +6.769,31.2 +6.793,32.6 +6.817,31.0 +6.841,31.3 +6.865,31.1 +6.889,31.5 +6.913,31.7 +6.937,30.9 +6.961,33.3 +6.985,32.9 +7.009,32.5 +7.033,32.2 +7.057,32.1 +7.081,31.6 +7.105,32.1 +7.129,31.9 +7.153,32.9 +7.177,32.6 +7.201,32.9 +7.225,31.7 +7.249,31.9 +7.273,32.2 +7.297,33.0 +7.321,32.2 +7.345,31.4 +7.369,32.8 +7.393,31.2 +7.417,32.0 +7.441,32.0 +7.465,32.1 +7.489,32.8 +7.514,32.9 +7.538,32.4 +7.562,32.5 +7.586,32.8 +7.610,33.0 +7.634,33.0 +7.658,33.1 +7.682,33.4 +7.706,33.8 +7.730,32.9 +7.754,32.4 +7.778,33.0 +7.802,33.3 +7.826,33.6 +7.850,32.6 +7.874,33.0 +7.898,32.5 +7.922,33.0 +7.946,33.7 +7.970,33.2 +7.994,33.8 +8.018,33.9 +8.042,34.0 +8.066,33.1 +8.090,34.1 +8.114,33.1 +8.138,33.5 +8.162,34.2 +8.186,34.3 +8.210,33.8 +8.234,33.5 +8.258,34.7 +8.282,34.0 +8.306,34.2 +8.330,33.1 +8.354,33.4 +8.378,34.7 +8.402,33.4 +8.426,33.0 +8.450,33.1 +8.474,33.6 +8.498,33.1 +8.522,33.7 +8.546,33.8 +8.570,34.0 +8.594,34.6 +8.618,34.2 +8.642,34.1 +8.666,34.6 +8.690,35.0 +8.714,32.5 +8.738,34.6 +8.762,34.3 +8.786,34.4 +8.810,34.6 +8.834,34.5 +8.858,33.3 +8.882,35.1 +8.906,34.5 +8.930,34.6 +8.954,35.7 +8.978,35.2 +9.002,35.1 +9.026,34.2 +9.050,34.3 +9.074,34.3 +9.098,34.8 +9.122,34.9 +9.146,36.1 +9.170,35.4 +9.194,35.1 +9.218,34.9 +9.242,34.2 +9.266,35.3 +9.290,34.7 +9.314,35.2 +9.338,35.0 +9.362,35.0 +9.386,34.6 +9.410,35.0 +9.434,34.7 +9.458,35.7 +9.482,35.0 +9.506,36.0 +9.530,35.3 +9.554,35.7 +9.578,36.2 +9.602,35.8 +9.626,35.5 +9.650,36.3 +9.674,36.2 +9.698,35.2 +9.722,35.6 +9.746,36.4 +9.770,35.4 +9.794,35.7 +9.818,34.9 +9.842,36.0 +9.866,35.3 +9.890,35.8 +9.914,35.3 +9.938,36.0 +9.962,35.9 +9.986,35.5 +10.010,35.6 +10.034,36.9 +10.058,35.5 +10.082,36.0 +10.106,36.3 +10.130,37.3 +10.154,36.2 +10.178,37.0 +10.202,36.2 +10.226,36.0 +10.250,37.2 +10.274,37.1 +10.298,36.8 +10.322,36.7 +10.346,35.6 +10.370,36.5 +10.394,36.6 +10.418,36.3 +10.442,36.8 +10.466,37.0 +10.490,37.2 +10.514,37.3 +10.538,36.4 +10.562,37.2 +10.586,37.3 +10.610,36.1 +10.634,36.6 +10.658,35.8 +10.682,36.7 +10.706,37.3 +10.730,37.3 +10.754,36.7 +10.778,38.2 +10.802,38.4 +10.826,37.5 +10.850,37.6 +10.874,37.5 +10.898,36.9 +10.922,38.3 +10.946,36.7 +10.970,38.8 +10.994,38.2 +11.018,38.3 +11.042,37.5 +11.066,37.9 +11.090,38.0 +11.114,37.9 +11.138,38.3 +11.162,38.2 +11.186,37.5 +11.210,38.7 +11.234,37.9 +11.258,37.2 +11.282,38.5 +11.306,37.3 +11.330,37.8 +11.354,39.3 +11.378,38.2 +11.402,37.7 +11.426,38.1 +11.450,39.1 +11.474,38.7 +11.498,39.0 +11.522,38.5 +11.546,38.3 +11.570,38.5 +11.594,38.0 +11.618,38.9 +11.642,38.3 +11.666,38.4 +11.690,37.6 +11.714,39.0 +11.738,38.8 +11.762,38.3 +11.786,38.1 +11.810,39.7 +11.834,37.8 +11.858,38.8 +11.882,37.9 +11.906,38.6 +11.930,39.5 +11.954,38.8 +11.978,38.4 +12.002,39.4 +12.026,39.7 +12.050,38.1 +12.074,39.5 +12.098,39.4 +12.122,38.4 +12.146,39.7 +12.170,39.1 +12.194,39.1 +12.218,39.2 +12.242,38.6 +12.266,39.4 +12.290,38.2 +12.314,39.9 +12.338,39.4 +12.362,39.4 +12.386,38.5 +12.410,40.3 +12.434,39.2 +12.458,39.1 +12.482,40.7 +12.507,39.2 +12.531,38.8 +12.555,40.0 +12.579,39.4 +12.603,40.0 +12.627,39.5 +12.651,39.6 +12.675,40.2 +12.699,40.0 +12.723,39.7 +12.747,40.0 +12.771,39.9 +12.795,40.6 +12.819,38.7 +12.843,40.1 +12.867,40.0 +12.891,40.6 +12.915,40.6 +12.939,40.0 +12.963,40.4 +12.987,41.0 +13.011,40.0 +13.035,40.7 +13.059,40.3 +13.083,40.5 +13.107,40.7 +13.131,40.4 +13.155,41.4 +13.179,40.3 +13.203,39.7 +13.227,40.6 +13.251,40.4 +13.275,40.4 +13.299,41.6 +13.323,40.2 +13.347,41.0 +13.371,40.5 +13.395,39.9 +13.419,41.1 +13.443,40.7 +13.467,41.5 +13.491,40.9 +13.515,40.4 +13.539,41.5 +13.563,40.7 +13.587,41.0 +13.611,41.1 +13.635,41.1 +13.659,42.0 +13.683,40.4 +13.707,41.0 +13.731,40.7 +13.755,40.2 +13.779,41.2 +13.803,41.8 +13.827,39.9 +13.851,40.6 +13.875,41.4 +13.899,41.4 +13.923,41.0 +13.947,40.6 +13.971,41.1 +13.995,41.2 +14.019,40.8 +14.043,42.2 +14.067,42.3 +14.091,41.4 +14.115,41.1 +14.139,41.6 +14.163,40.4 +14.187,42.1 +14.211,40.8 +14.235,41.4 +14.259,42.0 +14.283,41.6 +14.307,40.5 +14.331,42.4 +14.355,43.2 +14.379,43.0 +14.403,43.1 +14.427,43.0 +14.451,41.9 +14.475,43.0 +14.499,41.4 +14.523,41.9 +14.547,42.9 +14.571,42.0 +14.595,43.0 +14.619,43.2 +14.643,41.9 +14.667,42.5 +14.691,40.8 +14.715,42.4 +14.739,42.9 +14.763,42.6 +14.787,42.4 +14.811,41.3 +14.835,42.3 +14.859,42.2 +14.883,42.1 +14.907,43.2 +14.931,41.8 +14.955,41.9 +14.979,41.7 +15.003,42.4 +15.027,42.8 +15.051,42.8 +15.075,43.6 +15.099,41.8 +15.123,42.1 +15.147,43.3 +15.171,42.6 +15.195,42.3 +15.219,42.3 +15.243,42.9 +15.267,42.6 +15.291,43.1 +15.315,42.8 +15.339,43.0 +15.363,43.3 +15.387,44.5 +15.411,43.3 +15.435,42.1 +15.459,43.3 +15.483,42.8 +15.507,43.3 +15.531,43.0 +15.555,43.1 +15.579,42.0 +15.603,42.2 +15.627,45.1 +15.651,43.8 +15.675,43.3 +15.699,43.2 +15.723,44.2 +15.747,44.1 +15.771,44.8 +15.795,43.4 +15.819,43.5 +15.843,44.3 +15.867,44.3 +15.891,42.9 +15.915,43.1 +15.939,43.4 +15.963,43.7 +15.987,42.5 +16.011,43.4 +16.035,44.2 +16.059,44.4 +16.083,44.5 +16.107,43.8 +16.131,44.5 +16.155,43.8 +16.179,43.3 +16.203,43.7 +16.227,43.2 +16.251,44.8 +16.275,44.1 +16.299,44.5 +16.323,44.1 +16.347,43.9 +16.371,44.3 +16.395,44.0 +16.419,43.8 +16.443,44.2 +16.467,43.5 +16.491,43.7 +16.515,44.6 +16.539,43.3 +16.563,44.5 +16.587,44.1 +16.611,44.8 +16.635,45.0 +16.659,44.7 +16.683,44.0 +16.707,44.6 +16.731,44.4 +16.755,44.4 +16.779,45.3 +16.803,44.4 +16.827,43.7 +16.851,45.8 +16.875,44.9 +16.899,45.2 +16.923,44.7 +16.947,44.8 +16.971,44.2 +16.995,45.6 +17.019,45.3 +17.043,45.9 +17.067,45.0 +17.091,45.2 +17.115,45.4 +17.139,46.2 +17.163,44.7 +17.187,45.4 +17.211,45.5 +17.235,45.1 +17.259,45.8 +17.283,46.9 +17.307,44.9 +17.331,45.2 +17.355,45.4 +17.379,44.1 +17.403,44.5 +17.427,44.5 +17.451,45.7 +17.475,45.9 +17.499,45.1 +17.524,45.7 +17.548,45.4 +17.572,45.6 +17.596,46.3 +17.620,44.9 +17.644,46.2 +17.668,46.8 +17.692,46.6 +17.716,46.8 +17.740,45.7 +17.764,46.0 +17.788,44.8 +17.812,46.0 +17.836,47.5 +17.860,46.6 +17.884,46.8 +17.908,45.4 +17.932,45.1 +17.956,46.0 +17.980,46.5 +18.004,47.0 +18.028,46.5 +18.052,45.9 +18.076,47.1 +18.100,46.6 +18.124,46.5 +18.148,46.4 +18.172,46.8 +18.196,46.8 +18.220,46.5 +18.244,44.8 +18.268,46.6 +18.292,46.8 +18.316,46.4 +18.340,46.1 +18.364,46.3 +18.388,45.9 +18.412,46.3 +18.436,45.9 +18.460,46.6 +18.484,47.2 +18.508,46.1 +18.532,47.3 +18.556,48.1 +18.580,47.2 +18.604,46.7 +18.628,47.8 +18.652,46.5 +18.676,46.4 +18.700,46.7 +18.724,47.5 +18.748,47.5 +18.772,48.1 +18.796,47.8 +18.820,47.1 +18.844,46.9 +18.868,47.7 +18.892,47.9 +18.916,47.6 +18.940,46.4 +18.964,48.1 +18.988,47.0 +19.012,46.6 +19.036,47.4 +19.060,48.0 +19.084,47.8 +19.108,47.4 +19.132,47.5 +19.156,47.1 +19.180,48.2 +19.204,47.0 +19.228,47.6 +19.252,46.8 +19.276,48.3 +19.300,48.3 +19.324,47.7 +19.348,46.8 +19.372,47.6 +19.396,47.1 +19.420,47.9 +19.444,48.0 +19.468,49.1 +19.492,47.5 +19.516,47.8 +19.540,47.1 +19.564,48.9 +19.588,48.8 +19.612,48.1 +19.636,47.8 +19.660,47.2 +19.684,46.3 +19.708,47.9 +19.732,47.0 +19.756,47.2 +19.780,48.7 +19.804,48.5 +19.828,48.1 +19.852,48.1 +19.876,49.3 +19.900,47.6 +19.924,47.8 +19.948,47.5 +19.972,46.8 +19.996,49.0 +20.020,48.0 +20.044,48.8 +20.068,48.4 +20.092,48.7 +20.116,48.5 +20.140,47.8 +20.164,48.4 +20.188,48.7 +20.212,49.6 +20.236,47.7 +20.260,49.4 +20.284,49.7 +20.308,48.9 +20.332,48.9 +20.356,49.1 +20.380,49.0 +20.404,48.5 +20.428,48.4 +20.452,48.6 +20.476,49.3 +20.500,49.2 +20.524,49.4 +20.548,49.0 +20.572,49.8 +20.596,49.1 +20.620,49.7 +20.644,50.2 +20.668,48.4 +20.692,48.9 +20.716,48.7 +20.740,48.9 +20.764,48.6 +20.788,49.1 +20.812,50.3 +20.836,49.4 +20.860,48.3 +20.884,48.9 +20.908,50.1 +20.932,49.0 +20.956,50.1 +20.980,48.8 +21.004,49.9 +21.028,49.5 +21.052,48.8 +21.076,49.3 +21.100,49.8 +21.124,50.4 +21.148,49.3 +21.172,49.7 +21.196,49.7 +21.220,48.9 +21.244,49.9 +21.268,50.0 +21.292,49.6 +21.316,50.3 +21.340,49.9 +21.364,49.4 +21.388,49.8 +21.412,50.2 +21.436,49.6 +21.460,50.2 +21.484,49.2 +21.508,51.1 +21.532,49.2 +21.556,51.0 +21.580,50.2 +21.604,48.3 +21.628,50.8 +21.652,51.2 +21.676,51.9 +21.700,50.1 +21.724,50.9 +21.748,50.8 +21.772,49.9 +21.796,51.2 +21.820,49.3 +21.844,51.0 +21.868,50.4 +21.892,50.9 +21.916,49.6 +21.940,51.1 +21.964,50.5 +21.988,49.7 +22.012,50.5 +22.036,50.7 +22.060,49.4 +22.084,51.1 +22.108,50.8 +22.132,49.2 +22.156,49.6 +22.180,50.8 +22.204,50.4 +22.228,50.5 +22.252,49.7 +22.276,50.4 +22.300,50.7 +22.324,51.2 +22.348,51.0 +22.372,51.1 +22.396,50.7 +22.420,49.6 +22.444,51.2 +22.468,50.6 +22.492,50.2 +22.517,49.5 +22.541,49.5 +22.565,51.1 +22.589,49.8 +22.613,50.5 +22.637,52.0 +22.661,51.3 +22.685,50.9 +22.709,50.6 +22.733,50.7 +22.757,50.1 +22.781,50.3 +22.805,51.2 +22.829,51.6 +22.853,51.0 +22.877,50.6 +22.901,51.7 +22.925,52.1 +22.949,51.2 +22.973,51.5 +22.997,51.7 +23.021,51.6 +23.045,51.2 +23.069,51.5 +23.093,51.0 +23.117,51.7 +23.141,51.4 +23.165,52.3 +23.189,51.7 +23.213,51.3 +23.237,50.3 +23.261,51.7 +23.285,52.8 +23.309,51.5 +23.333,51.8 +23.357,51.6 +23.381,50.7 +23.405,52.1 +23.429,51.5 +23.453,52.5 +23.477,51.8 +23.501,50.3 +23.525,53.2 +23.549,51.8 +23.573,51.8 +23.597,51.8 +23.621,52.5 +23.645,53.3 +23.669,52.8 +23.693,51.2 +23.717,52.7 +23.741,52.9 +23.765,51.2 +23.789,52.3 +23.813,51.9 +23.837,52.1 +23.861,52.4 +23.885,52.8 +23.909,51.5 +23.933,51.9 +23.957,52.1 +23.981,51.9 +24.005,51.2 +24.029,53.1 +24.053,51.9 +24.077,52.0 +24.101,52.4 +24.125,52.9 +24.149,53.3 +24.173,52.0 +24.197,52.3 +24.221,51.8 +24.245,52.2 +24.269,52.8 +24.293,52.2 +24.317,52.7 +24.341,53.1 +24.365,52.4 +24.389,52.5 +24.413,52.8 +24.437,53.1 +24.461,52.7 +24.485,52.4 +24.509,53.0 +24.533,52.6 +24.557,52.7 +24.581,54.3 +24.605,54.4 +24.629,53.2 +24.653,53.1 +24.677,53.0 +24.701,54.0 +24.725,53.8 +24.749,52.8 +24.773,52.4 +24.797,52.7 +24.821,54.1 +24.845,53.9 +24.869,53.6 +24.893,53.2 +24.917,52.4 +24.941,52.4 +24.965,53.2 +24.989,53.5 +25.013,53.8 +25.037,54.1 +25.061,53.3 +25.085,53.4 +25.109,53.5 +25.133,54.5 +25.157,52.0 +25.181,54.0 +25.205,54.0 +25.229,52.6 +25.253,53.4 +25.277,53.5 +25.301,52.4 +25.325,52.9 +25.349,53.7 +25.373,53.2 +25.397,54.4 +25.421,53.1 +25.445,54.1 +25.469,53.3 +25.493,54.4 +25.517,54.1 +25.541,53.9 +25.565,52.6 +25.589,54.3 +25.613,53.4 +25.637,53.2 +25.661,53.4 +25.685,53.9 +25.709,53.5 +25.733,53.4 +25.757,54.3 +25.781,55.5 +25.805,53.7 +25.829,54.1 +25.853,54.0 +25.877,55.3 +25.901,54.2 +25.925,53.5 +25.949,54.8 +25.973,53.7 +25.997,55.0 +26.021,54.9 +26.045,54.7 +26.069,54.0 +26.093,54.7 +26.117,54.3 +26.141,54.3 +26.165,54.0 +26.189,54.4 +26.213,53.5 +26.237,54.8 +26.261,54.0 +26.285,54.6 +26.309,54.8 +26.333,53.9 +26.357,54.1 +26.381,53.7 +26.405,55.6 +26.429,53.8 +26.453,53.7 +26.477,54.9 +26.501,54.6 +26.525,54.3 +26.549,55.0 +26.573,54.9 +26.597,54.5 +26.621,53.2 +26.645,54.9 +26.669,54.8 +26.693,54.9 +26.717,53.7 +26.741,54.2 +26.765,54.6 +26.789,54.1 +26.813,54.4 +26.837,55.0 +26.861,56.1 +26.885,54.8 +26.909,54.9 +26.933,55.0 +26.957,54.7 +26.981,53.6 +27.005,55.3 +27.029,54.5 +27.053,55.3 +27.077,55.5 +27.101,55.7 +27.125,55.9 +27.149,55.4 +27.173,54.9 +27.197,54.4 +27.221,55.5 +27.245,55.8 +27.269,55.1 +27.293,54.6 +27.317,56.1 +27.341,54.6 +27.365,55.0 +27.389,54.8 +27.413,54.5 +27.437,55.1 +27.461,55.0 +27.485,54.4 +27.510,54.8 +27.534,56.5 +27.558,55.5 +27.582,54.1 +27.606,55.0 +27.630,54.9 +27.654,54.1 +27.678,54.6 +27.702,55.6 +27.726,55.8 +27.750,56.1 +27.774,54.3 +27.798,55.9 +27.822,57.2 +27.846,56.3 +27.870,55.7 +27.894,56.1 +27.918,55.8 +27.942,54.6 +27.966,56.2 +27.990,55.0 +28.014,56.2 +28.038,55.7 +28.062,56.1 +28.086,56.5 +28.110,55.9 +28.134,56.3 +28.158,56.4 +28.182,55.7 +28.206,56.5 +28.230,55.6 +28.254,56.6 +28.278,56.1 +28.302,56.8 +28.326,55.3 +28.350,56.7 +28.374,55.8 +28.398,56.2 +28.422,56.2 +28.446,55.7 +28.470,56.4 +28.494,56.0 +28.518,55.9 +28.542,55.9 +28.566,56.8 +28.590,55.7 +28.614,55.1 +28.638,55.8 +28.662,56.4 +28.686,56.1 +28.710,56.6 +28.734,56.4 +28.758,56.4 +28.782,57.6 +28.806,56.2 +28.830,56.5 +28.854,56.9 +28.878,56.4 +28.902,56.1 +28.926,56.4 +28.950,56.0 +28.974,55.9 +28.998,56.6 +29.022,56.9 +29.046,56.3 +29.070,57.0 +29.094,57.3 +29.118,56.4 +29.142,56.3 +29.166,56.7 +29.190,56.6 +29.214,57.0 +29.238,56.6 +29.262,57.0 +29.286,56.4 +29.310,55.9 +29.334,57.4 +29.358,55.9 +29.382,56.5 +29.406,57.8 +29.430,57.8 +29.454,56.5 +29.478,56.7 +29.502,57.5 +29.526,56.7 +29.550,57.6 +29.574,56.3 +29.598,56.6 +29.622,56.6 +29.646,56.9 +29.670,57.1 +29.694,56.4 +29.718,57.5 +29.742,57.5 +29.766,57.0 +29.790,57.7 +29.814,56.4 +29.838,57.7 +29.862,56.8 +29.886,57.4 +29.910,57.2 +29.934,56.5 +29.958,55.9 +29.982,56.6 +30.006,57.3 +30.030,58.6 +30.054,56.2 +30.078,57.4 +30.102,57.4 +30.126,58.3 +30.150,56.7 +30.174,57.7 +30.198,57.8 +30.222,56.9 +30.246,58.3 +30.270,58.4 +30.294,57.7 +30.318,57.4 +30.342,57.8 +30.366,57.9 +30.390,58.2 +30.414,57.6 +30.438,58.1 +30.462,58.1 +30.486,57.3 +30.510,58.3 +30.534,57.7 +30.558,57.8 +30.582,57.3 +30.606,57.3 +30.630,58.2 +30.654,57.5 +30.678,58.2 +30.702,57.4 +30.726,57.4 +30.750,56.9 +30.774,56.9 +30.798,57.9 +30.822,57.9 +30.846,57.5 +30.870,58.2 +30.894,57.9 +30.918,57.5 +30.942,57.2 +30.966,58.2 +30.990,59.4 +31.014,58.7 +31.038,58.0 +31.062,59.4 +31.086,57.7 +31.110,57.5 +31.134,59.2 +31.158,57.4 +31.182,57.4 +31.206,58.6 +31.230,59.0 +31.254,58.5 +31.278,59.6 +31.302,57.7 +31.326,59.3 +31.350,57.7 +31.374,58.7 +31.398,58.6 +31.422,59.1 +31.446,57.2 +31.470,59.0 +31.494,58.4 +31.518,58.6 +31.542,57.7 +31.566,58.5 +31.590,59.7 +31.614,59.3 +31.638,59.5 +31.662,58.4 +31.686,58.9 +31.710,58.3 +31.734,58.3 +31.758,58.5 +31.782,59.2 +31.806,60.4 +31.830,59.8 +31.854,58.8 +31.878,59.4 +31.902,58.6 +31.926,58.3 +31.950,59.1 +31.974,59.2 +31.998,57.9 +32.022,58.5 +32.046,58.5 +32.070,58.6 +32.094,58.3 +32.118,58.9 +32.142,57.9 +32.166,58.6 +32.190,58.3 +32.214,59.2 +32.238,58.6 +32.262,59.4 +32.286,59.2 +32.310,58.8 +32.334,59.2 +32.358,59.2 +32.382,60.1 +32.406,58.8 +32.430,59.9 +32.454,59.3 +32.478,59.5 +32.503,58.8 +32.527,59.1 +32.551,58.6 +32.575,59.3 +32.599,58.9 +32.623,59.3 +32.647,60.0 +32.671,60.9 +32.695,59.9 +32.719,59.7 +32.743,60.0 +32.767,60.9 +32.791,59.1 +32.815,60.2 +32.839,60.9 +32.863,59.8 +32.887,60.5 +32.911,59.4 +32.935,60.4 +32.959,59.1 +32.983,60.3 +33.007,60.6 +33.031,60.0 +33.055,58.6 +33.079,60.8 +33.103,59.8 +33.127,59.6 +33.151,59.5 +33.175,58.9 +33.199,59.8 +33.223,59.7 +33.247,58.9 +33.271,60.4 +33.295,60.7 +33.319,59.1 +33.343,58.8 +33.367,60.1 +33.391,60.3 +33.415,60.5 +33.439,59.1 +33.463,60.8 +33.487,60.3 +33.511,59.4 +33.535,60.2 +33.559,60.9 +33.583,60.5 +33.607,60.6 +33.631,58.9 +33.655,61.2 +33.679,60.1 +33.703,59.9 +33.727,59.6 +33.751,59.0 +33.775,59.9 +33.799,60.7 +33.823,60.4 +33.847,61.6 +33.871,60.1 +33.895,59.9 +33.919,60.0 +33.943,60.9 +33.967,61.2 +33.991,60.0 +34.015,61.0 +34.039,61.3 +34.063,61.5 +34.087,60.8 +34.111,60.9 +34.135,60.7 +34.159,60.3 +34.183,60.1 +34.207,60.2 +34.231,60.7 +34.255,60.3 +34.279,61.5 +34.303,61.1 +34.327,60.9 +34.351,60.6 +34.375,60.6 +34.399,60.9 +34.423,60.7 +34.447,60.5 +34.471,60.5 +34.495,61.0 +34.519,60.5 +34.543,59.8 +34.567,60.5 +34.591,60.7 +34.615,60.6 +34.639,60.2 +34.663,60.8 +34.687,61.4 +34.711,60.5 +34.735,61.2 +34.759,61.0 +34.783,61.1 +34.807,60.4 +34.831,60.3 +34.855,60.4 +34.879,61.4 +34.903,59.9 +34.927,61.8 +34.951,60.7 +34.975,61.4 +34.999,61.2 +35.023,61.1 +35.047,61.9 +35.071,62.5 +35.095,61.5 +35.119,61.2 +35.143,61.4 +35.167,61.1 +35.191,61.9 +35.215,60.3 +35.239,61.0 +35.263,60.7 +35.287,60.8 +35.311,61.9 +35.335,60.7 +35.359,61.7 +35.383,61.7 +35.407,61.5 +35.431,61.8 +35.455,62.3 +35.479,61.9 +35.503,61.5 +35.527,61.9 +35.551,62.3 +35.575,62.1 +35.599,61.5 +35.623,60.3 +35.647,62.7 +35.671,62.2 +35.695,60.9 +35.719,61.5 +35.743,61.5 +35.767,61.5 +35.791,61.7 +35.815,62.2 +35.839,61.8 +35.863,62.3 +35.887,61.9 +35.911,61.1 +35.935,62.8 +35.959,61.8 +35.983,62.1 +36.007,61.7 +36.031,61.6 +36.055,61.5 +36.079,61.9 +36.103,61.4 +36.127,60.9 +36.151,62.1 +36.175,62.4 +36.199,61.9 +36.223,62.2 +36.247,61.6 +36.271,62.2 +36.295,60.8 +36.319,61.9 +36.343,62.0 +36.367,62.8 +36.391,62.4 +36.415,61.4 +36.439,62.9 +36.463,61.2 +36.487,61.1 +36.511,62.6 +36.535,61.7 +36.559,62.2 +36.583,62.5 +36.607,61.9 +36.631,62.4 +36.655,61.8 +36.679,62.5 +36.703,62.6 +36.727,61.5 +36.751,62.1 +36.775,62.5 +36.799,62.7 +36.823,62.3 +36.847,61.9 +36.871,62.0 +36.895,62.9 +36.919,62.0 +36.943,61.3 +36.967,62.2 +36.991,62.7 +37.015,61.7 +37.039,61.8 +37.063,61.7 +37.087,63.3 +37.111,64.0 +37.135,63.0 +37.159,63.3 +37.183,62.8 +37.207,62.2 +37.231,62.9 +37.255,62.5 +37.279,62.3 +37.303,62.8 +37.327,61.1 +37.351,62.1 +37.375,63.0 +37.399,64.2 +37.423,62.7 +37.447,62.6 +37.471,63.1 +37.495,63.0 +37.520,63.9 +37.544,63.0 +37.568,62.7 +37.592,63.8 +37.616,63.1 +37.640,62.9 +37.664,61.8 +37.688,63.2 +37.712,62.6 +37.736,63.5 +37.760,63.3 +37.784,63.4 +37.808,62.4 +37.832,63.9 +37.856,62.8 +37.880,63.3 +37.904,64.0 +37.928,63.4 +37.952,63.2 +37.976,62.6 +38.000,63.4 +38.024,62.3 +38.048,63.2 +38.072,64.5 +38.096,63.5 +38.120,61.9 +38.144,63.7 +38.168,63.1 +38.192,63.8 +38.216,62.5 +38.240,64.4 +38.264,62.6 +38.288,62.7 +38.312,63.4 +38.336,63.9 +38.360,63.9 +38.384,62.2 +38.408,63.4 +38.432,63.4 +38.456,62.6 +38.480,62.0 +38.504,62.9 +38.528,63.8 +38.552,63.6 +38.576,63.8 +38.600,63.6 +38.624,63.9 +38.648,63.4 +38.672,62.2 +38.696,62.7 +38.720,62.9 +38.744,63.4 +38.768,63.2 +38.792,63.1 +38.816,63.5 +38.840,63.7 +38.864,63.6 +38.888,64.3 +38.912,63.4 +38.936,64.4 +38.960,62.8 +38.984,63.2 +39.008,63.6 +39.032,64.2 +39.056,63.4 +39.080,62.9 +39.104,63.8 +39.128,63.3 +39.152,63.9 +39.176,63.7 +39.200,64.0 +39.224,63.1 +39.248,63.6 +39.272,63.3 +39.296,64.0 +39.320,62.9 +39.344,64.2 +39.368,64.4 +39.392,63.5 +39.416,64.0 +39.440,64.2 +39.464,62.8 +39.488,64.2 +39.512,64.9 +39.536,63.2 +39.560,63.3 +39.584,64.6 +39.608,64.0 +39.632,64.3 +39.656,64.1 +39.680,63.3 +39.704,64.6 +39.728,63.5 +39.752,64.1 +39.776,65.2 +39.800,64.1 +39.824,65.1 +39.848,64.2 +39.872,64.2 +39.896,65.4 +39.920,64.0 +39.944,63.3 +39.968,64.5 +39.992,64.7 +40.016,63.9 +40.040,64.4 +40.064,65.3 +40.088,64.1 +40.112,64.5 +40.136,65.1 +40.160,64.3 +40.184,63.8 +40.208,64.3 +40.232,64.3 +40.256,64.8 +40.280,64.0 +40.304,65.4 +40.328,64.6 +40.352,64.2 +40.376,63.8 +40.400,64.4 +40.424,64.7 +40.448,63.4 +40.472,64.4 +40.496,64.3 +40.520,63.4 +40.544,64.7 +40.568,64.5 +40.592,64.8 +40.616,64.8 +40.640,64.3 +40.664,64.0 +40.688,64.4 +40.712,64.7 +40.736,64.3 +40.760,64.6 +40.784,64.5 +40.808,64.6 +40.832,64.6 +40.856,64.8 +40.880,65.1 +40.904,65.3 +40.928,64.5 +40.952,64.8 +40.976,65.3 +41.000,65.3 +41.024,64.4 +41.048,64.1 +41.072,65.2 +41.096,64.6 +41.120,65.2 +41.144,66.1 +41.168,65.8 +41.192,64.0 +41.216,65.5 +41.240,65.6 +41.264,65.4 +41.288,64.8 +41.312,65.1 +41.336,64.9 +41.360,65.4 +41.384,65.1 +41.408,63.4 +41.432,65.2 +41.456,65.3 +41.480,64.9 +41.504,64.7 +41.528,65.2 +41.552,64.5 +41.576,65.0 +41.600,65.5 +41.624,65.3 +41.648,64.1 +41.672,65.3 +41.696,65.7 +41.720,64.3 +41.744,65.5 +41.768,65.5 +41.792,64.5 +41.816,65.3 +41.840,64.5 +41.864,65.1 +41.888,65.2 +41.912,66.3 +41.936,65.3 +41.960,64.8 +41.984,65.5 +42.008,65.0 +42.032,65.5 +42.056,64.9 +42.080,64.6 +42.104,64.8 +42.128,65.6 +42.152,64.7 +42.176,65.4 +42.200,65.6 +42.224,65.5 +42.248,64.5 +42.272,64.7 +42.296,65.9 +42.320,64.5 +42.344,64.7 +42.368,65.0 +42.392,65.7 +42.416,66.4 +42.440,66.4 +42.464,64.8 +42.488,65.5 +42.513,66.8 +42.537,65.7 +42.561,64.7 +42.585,65.2 +42.609,65.8 +42.633,65.7 +42.657,65.7 +42.681,66.1 +42.705,65.3 +42.729,66.5 +42.753,65.9 +42.777,65.5 +42.801,65.5 +42.825,66.3 +42.849,65.3 +42.873,66.3 +42.897,65.9 +42.921,66.1 +42.945,65.1 +42.969,65.5 +42.993,66.1 +43.017,66.9 +43.041,65.9 +43.065,64.8 +43.089,66.0 +43.113,65.9 +43.137,66.1 +43.161,66.5 +43.185,65.9 +43.209,64.6 +43.233,65.4 +43.257,66.2 +43.281,66.2 +43.305,65.2 +43.329,66.5 +43.353,66.7 +43.377,65.9 +43.401,66.6 +43.425,65.7 +43.449,66.1 +43.473,65.3 +43.497,66.6 +43.521,66.0 +43.545,66.9 +43.569,66.7 +43.593,67.5 +43.617,66.3 +43.641,67.2 +43.665,65.9 +43.689,66.1 +43.713,66.9 +43.737,67.0 +43.761,67.1 +43.785,66.7 +43.809,65.5 +43.833,65.9 +43.857,67.8 +43.881,67.0 +43.905,65.8 +43.929,66.3 +43.953,67.1 +43.977,66.5 +44.001,65.7 +44.025,67.3 +44.049,67.0 +44.073,66.1 +44.097,67.1 +44.121,66.9 +44.145,66.8 +44.169,66.9 +44.193,65.6 +44.217,66.4 +44.241,66.2 +44.265,67.1 +44.289,67.4 +44.313,67.1 +44.337,66.1 +44.361,66.8 +44.385,66.4 +44.409,66.9 +44.433,66.9 +44.457,67.2 +44.481,65.8 +44.505,68.0 +44.529,66.4 +44.553,66.2 +44.577,68.1 +44.601,67.5 +44.625,66.4 +44.649,67.0 +44.673,67.5 +44.697,68.3 +44.721,66.6 +44.745,67.2 +44.769,66.0 +44.793,66.0 +44.817,67.8 +44.841,68.3 +44.865,67.2 +44.889,67.2 +44.913,66.0 +44.937,67.5 +44.961,66.5 +44.985,66.9 +45.009,66.5 +45.033,67.9 +45.057,67.4 +45.081,66.3 +45.105,67.2 +45.129,66.1 +45.153,67.2 +45.177,66.8 +45.201,66.6 +45.225,67.2 +45.249,66.9 +45.273,67.0 +45.297,66.7 +45.321,66.9 +45.345,66.9 +45.369,68.0 +45.393,68.0 +45.417,67.4 +45.441,67.8 +45.465,67.5 +45.489,68.5 +45.513,67.6 +45.537,66.4 +45.561,66.7 +45.585,66.5 +45.609,68.0 +45.633,67.3 +45.657,67.2 +45.681,67.6 +45.705,67.0 +45.729,67.0 +45.753,66.7 +45.777,66.5 +45.801,67.6 +45.825,68.5 +45.849,66.3 +45.873,66.9 +45.897,66.7 +45.921,68.8 +45.945,67.0 +45.969,67.6 +45.993,68.4 +46.017,67.3 +46.041,67.3 +46.065,68.7 +46.089,66.8 +46.113,67.1 +46.137,67.4 +46.161,68.0 +46.185,68.0 +46.209,67.7 +46.233,68.2 +46.257,67.9 +46.281,67.8 +46.305,67.7 +46.329,67.4 +46.353,68.1 +46.377,67.5 +46.401,67.2 +46.425,68.4 +46.449,67.8 +46.473,68.9 +46.497,67.8 +46.521,67.9 +46.545,67.6 +46.569,66.9 +46.593,67.5 +46.617,68.0 +46.641,67.8 +46.665,69.2 +46.689,67.8 +46.713,68.4 +46.737,68.5 +46.761,67.5 +46.785,69.1 +46.809,68.0 +46.833,67.6 +46.857,67.7 +46.881,67.4 +46.905,68.6 +46.929,67.7 +46.953,68.9 +46.977,67.7 +47.001,67.8 +47.025,67.9 +47.049,68.5 +47.073,68.8 +47.097,68.5 +47.121,67.4 +47.145,68.0 +47.169,67.9 +47.193,67.2 +47.217,67.9 +47.241,68.7 +47.265,67.9 +47.289,67.7 +47.313,68.5 +47.337,68.1 +47.361,67.6 +47.385,69.8 +47.409,68.3 +47.433,68.0 +47.457,68.7 +47.481,68.1 +47.506,68.2 +47.530,67.5 +47.554,68.4 +47.578,67.4 +47.602,68.2 +47.626,68.8 +47.650,67.4 +47.674,67.2 +47.698,69.8 +47.722,68.6 +47.746,69.2 +47.770,68.9 +47.794,68.1 +47.818,68.0 +47.842,67.9 +47.866,68.1 +47.890,68.1 +47.914,67.6 +47.938,68.7 +47.962,69.8 +47.986,67.9 +48.010,68.6 +48.034,68.2 +48.058,68.7 +48.082,69.3 +48.106,67.8 +48.130,69.1 +48.154,68.3 +48.178,68.3 +48.202,69.6 +48.226,69.4 +48.250,68.8 +48.274,67.7 +48.298,68.7 +48.322,68.3 +48.346,68.5 +48.370,68.5 +48.394,70.2 +48.418,69.6 +48.442,69.2 +48.466,68.6 +48.490,68.5 +48.514,69.2 +48.538,68.0 +48.562,68.5 +48.586,69.1 +48.610,69.1 +48.634,67.8 +48.658,68.4 +48.682,68.4 +48.706,69.1 +48.730,70.5 +48.754,68.3 +48.778,68.6 +48.802,68.3 +48.826,68.1 +48.850,69.1 +48.874,69.4 +48.898,69.3 +48.922,69.0 +48.946,67.2 +48.970,68.7 +48.994,68.3 +49.018,68.7 +49.042,69.1 +49.066,68.7 +49.090,69.5 +49.114,69.9 +49.138,68.9 +49.162,69.3 +49.186,68.5 +49.210,68.6 +49.234,69.3 +49.258,69.9 +49.282,69.1 +49.306,69.6 +49.330,69.1 +49.354,69.3 +49.378,68.8 +49.402,69.3 +49.426,69.7 +49.450,70.0 +49.474,70.5 +49.498,68.5 +49.522,69.5 +49.546,69.1 +49.570,69.4 +49.594,68.8 +49.618,69.0 +49.642,68.3 +49.666,68.6 +49.690,69.3 +49.714,69.8 +49.738,69.4 +49.762,68.8 +49.786,70.5 +49.810,68.7 +49.834,70.3 +49.858,68.5 +49.882,69.1 +49.906,69.6 +49.930,69.4 +49.954,68.9 +49.978,69.3 +50.002,69.6 +50.026,68.6 +50.050,69.7 +50.074,69.5 +50.098,70.2 +50.122,69.7 +50.146,68.9 +50.170,69.5 +50.194,68.9 +50.218,70.2 +50.242,69.9 +50.266,69.8 +50.290,70.0 +50.314,69.1 +50.338,69.0 +50.362,69.5 +50.386,69.5 +50.410,69.2 +50.434,69.6 +50.458,70.6 +50.482,68.6 +50.506,70.5 +50.530,69.8 +50.554,68.8 +50.578,69.7 +50.602,69.7 +50.626,69.1 +50.650,70.0 +50.674,69.9 +50.698,70.1 +50.722,69.7 +50.746,69.2 +50.770,69.9 +50.794,71.0 +50.818,68.8 +50.842,68.1 +50.866,69.6 +50.890,70.0 +50.914,70.1 +50.938,68.9 +50.962,70.4 +50.986,70.1 +51.010,70.7 +51.034,69.4 +51.058,69.9 +51.082,70.0 +51.106,69.7 +51.130,69.2 +51.154,70.1 +51.178,68.9 +51.202,68.3 +51.226,70.0 +51.250,70.8 +51.274,69.6 +51.298,70.3 +51.322,70.2 +51.346,69.6 +51.370,68.2 +51.394,70.1 +51.418,70.1 +51.442,70.5 +51.466,70.9 +51.490,69.3 +51.514,69.7 +51.538,70.3 +51.562,70.5 +51.586,70.3 +51.610,70.2 +51.634,69.6 +51.658,69.7 +51.682,71.2 +51.706,70.6 +51.730,70.3 +51.754,71.1 +51.778,70.7 +51.802,70.7 +51.826,69.9 +51.850,70.6 +51.874,70.4 +51.898,70.0 +51.922,69.6 +51.946,70.4 +51.970,70.0 +51.994,70.3 +52.018,71.3 +52.042,70.2 +52.066,70.4 +52.090,71.4 +52.114,71.0 +52.138,70.4 +52.162,70.2 +52.186,70.5 +52.210,69.9 +52.234,71.0 +52.258,70.6 +52.282,70.2 +52.306,71.3 +52.330,69.8 +52.354,69.3 +52.378,71.2 +52.402,70.8 +52.426,71.0 +52.450,71.5 +52.474,70.7 +52.498,70.8 +52.523,71.9 +52.547,70.4 +52.571,70.3 +52.595,71.0 +52.619,69.9 +52.643,71.4 +52.667,71.0 +52.691,69.7 +52.715,70.1 +52.739,70.6 +52.763,71.4 +52.787,69.7 +52.811,70.4 +52.835,70.8 +52.859,70.5 +52.883,69.4 +52.907,70.2 +52.931,70.5 +52.955,70.2 +52.979,70.1 +53.003,70.6 +53.027,71.1 +53.051,70.4 +53.075,71.3 +53.099,71.0 +53.123,72.5 +53.147,70.7 +53.171,70.3 +53.195,70.5 +53.219,71.3 +53.243,70.3 +53.267,71.0 +53.291,71.4 +53.315,70.3 +53.339,70.9 +53.363,71.1 +53.387,70.7 +53.411,69.5 +53.435,70.8 +53.459,70.6 +53.483,69.6 +53.507,69.8 +53.531,70.7 +53.555,70.2 +53.579,71.6 +53.603,70.9 +53.627,71.2 +53.651,71.6 +53.675,71.4 +53.699,72.0 +53.723,70.5 +53.747,70.9 +53.771,70.7 +53.795,70.4 +53.819,70.3 +53.843,70.4 +53.867,71.2 +53.891,71.0 +53.915,72.3 +53.939,70.3 +53.963,71.1 +53.987,71.1 +54.011,71.2 +54.035,71.2 +54.059,70.8 +54.083,71.7 +54.107,71.2 +54.131,70.4 +54.155,72.0 +54.179,70.7 +54.203,71.6 +54.227,71.8 +54.251,70.9 +54.275,71.4 +54.299,71.6 +54.323,71.9 +54.347,71.6 +54.371,70.4 +54.395,71.6 +54.419,71.7 +54.443,72.5 +54.467,71.8 +54.491,71.8 +54.515,70.7 +54.539,71.7 +54.563,70.0 +54.587,71.8 +54.611,71.7 +54.635,72.6 +54.659,72.1 +54.683,71.8 +54.707,70.7 +54.731,70.9 +54.755,71.0 +54.779,71.5 +54.803,71.3 +54.827,70.5 +54.851,72.0 +54.875,71.6 +54.899,73.1 +54.923,71.9 +54.947,72.0 +54.971,70.6 +54.995,71.4 +55.019,72.3 +55.043,72.2 +55.067,70.8 +55.091,71.9 +55.115,71.6 +55.139,70.6 +55.163,71.9 +55.187,70.1 +55.211,71.7 +55.235,70.6 +55.259,70.5 +55.283,71.8 +55.307,71.7 +55.331,70.3 +55.355,71.7 +55.379,71.1 +55.403,71.2 +55.427,72.5 +55.451,71.4 +55.475,72.0 +55.499,72.1 +55.523,71.8 +55.547,71.5 +55.571,72.2 +55.595,72.5 +55.619,71.6 +55.643,71.9 +55.667,70.3 +55.691,72.7 +55.715,72.1 +55.739,71.2 +55.763,72.1 +55.787,71.4 +55.811,72.2 +55.835,71.1 +55.859,71.9 +55.883,71.1 +55.907,71.1 +55.931,71.7 +55.955,72.7 +55.979,72.9 +56.003,73.1 +56.027,73.1 +56.051,72.2 +56.075,72.6 +56.099,72.1 +56.123,72.6 +56.147,72.1 +56.171,72.7 +56.195,72.5 +56.219,71.8 +56.243,71.8 +56.267,71.7 +56.291,72.0 +56.315,71.9 +56.339,71.8 +56.363,72.1 +56.387,71.5 +56.411,72.7 +56.435,71.5 +56.459,72.6 +56.483,72.7 +56.507,72.7 +56.531,72.3 +56.555,71.9 +56.579,73.3 +56.603,73.4 +56.627,72.5 +56.651,73.9 +56.675,72.6 +56.699,72.7 +56.723,71.6 +56.747,70.5 +56.771,71.5 +56.795,70.9 +56.819,72.8 +56.843,73.2 +56.867,71.9 +56.891,72.7 +56.915,72.0 +56.939,72.2 +56.963,72.2 +56.987,72.7 +57.011,72.1 +57.035,72.4 +57.059,71.3 +57.083,73.6 +57.107,71.6 +57.131,72.6 +57.155,72.7 +57.179,73.8 +57.203,72.1 +57.227,71.5 +57.251,72.2 +57.275,72.0 +57.299,72.9 +57.323,73.2 +57.347,73.4 +57.371,72.3 +57.395,73.4 +57.419,71.9 +57.443,72.1 +57.467,72.4 +57.491,73.0 +57.516,72.3 +57.540,72.3 +57.564,72.5 +57.588,73.7 +57.612,72.3 +57.636,73.0 +57.660,72.1 +57.684,72.4 +57.708,71.8 +57.732,73.1 +57.756,71.0 +57.780,71.7 +57.804,72.3 +57.828,72.2 +57.852,71.0 +57.876,72.1 +57.900,72.8 +57.924,73.3 +57.948,73.0 +57.972,72.8 +57.996,72.8 +58.020,72.8 +58.044,72.1 +58.068,73.4 +58.092,72.2 +58.116,73.1 +58.140,73.2 +58.164,71.9 +58.188,72.2 +58.212,73.4 +58.236,73.3 +58.260,72.2 +58.284,73.7 +58.308,73.2 +58.332,73.9 +58.356,72.5 +58.380,72.9 +58.404,71.8 +58.428,73.8 +58.452,72.1 +58.476,73.0 +58.500,72.4 +58.524,72.1 +58.548,73.0 +58.572,73.0 +58.596,72.2 +58.620,73.8 +58.644,72.7 +58.668,72.6 +58.692,72.4 +58.716,72.5 +58.740,73.1 +58.764,73.4 +58.788,72.6 +58.812,72.6 +58.836,73.0 +58.860,72.2 +58.884,72.4 +58.908,72.6 +58.932,74.2 +58.956,72.6 +58.980,72.5 +59.004,71.8 +59.028,72.7 +59.052,73.4 +59.076,73.1 +59.100,73.1 +59.124,73.1 +59.148,73.1 +59.172,72.9 +59.196,73.7 +59.220,73.0 +59.244,72.8 +59.268,73.0 +59.292,72.9 +59.316,73.1 +59.340,73.4 +59.364,73.5 +59.388,72.9 +59.412,73.2 +59.436,72.8 +59.460,73.0 +59.484,74.2 +59.508,73.6 +59.532,73.5 +59.556,74.5 +59.580,72.8 +59.604,73.4 +59.628,74.0 +59.652,73.6 +59.676,73.4 +59.700,73.3 +59.724,72.3 +59.748,73.2 +59.772,72.9 +59.796,72.8 +59.820,73.3 +59.844,72.7 +59.868,73.6 +59.892,73.1 +59.916,73.6 +59.940,73.4 +59.964,71.9 +59.988,73.6 +60.012,74.3 +60.036,74.3 +60.060,74.7 +60.084,74.2 +60.108,73.5 +60.132,73.0 +60.156,73.0 +60.180,73.4 +60.204,72.9 +60.228,72.5 +60.252,72.6 +60.276,73.7 +60.300,73.6 +60.324,73.9 +60.348,73.0 +60.372,73.4 +60.396,73.4 +60.420,73.0 +60.444,73.3 +60.468,73.2 +60.492,74.6 +60.516,74.8 +60.540,72.8 +60.564,73.1 +60.588,74.0 +60.612,74.2 +60.636,72.4 +60.660,73.8 +60.684,74.4 +60.708,73.6 +60.732,73.6 +60.756,73.1 +60.780,73.3 +60.804,73.2 +60.828,73.6 +60.852,73.6 +60.876,72.8 +60.900,74.6 +60.924,73.0 +60.948,72.9 +60.972,72.8 +60.996,72.7 +61.020,72.4 +61.044,73.8 +61.068,73.4 +61.092,72.6 +61.116,73.7 +61.140,74.1 +61.164,73.6 +61.188,72.6 +61.212,73.9 +61.236,73.5 +61.260,73.2 +61.284,72.8 +61.308,73.1 +61.332,73.3 +61.356,72.5 +61.380,72.7 +61.404,73.7 +61.428,74.4 +61.452,74.3 +61.476,74.0 +61.500,74.5 +61.524,73.7 +61.548,75.0 +61.572,73.8 +61.596,73.5 +61.620,74.9 +61.644,74.8 +61.668,73.2 +61.692,73.1 +61.716,74.1 +61.740,74.5 +61.764,74.9 +61.788,74.2 +61.812,73.7 +61.836,73.7 +61.860,73.4 +61.884,73.5 +61.908,74.2 +61.932,73.1 +61.956,73.1 +61.980,74.5 +62.004,74.3 +62.028,74.8 +62.052,73.8 +62.076,73.9 +62.100,73.6 +62.124,74.8 +62.148,73.9 +62.172,74.6 +62.196,73.9 +62.220,73.6 +62.244,74.1 +62.268,73.5 +62.292,74.9 +62.316,74.7 +62.340,73.8 +62.364,74.8 +62.388,74.6 +62.412,73.3 +62.436,74.1 +62.460,74.5 +62.484,74.4 +62.509,74.1 +62.533,74.2 +62.557,73.3 +62.581,74.0 +62.605,74.0 +62.629,74.3 +62.653,74.1 +62.677,73.7 +62.701,74.0 +62.725,74.0 +62.749,73.8 +62.773,74.2 +62.797,73.6 +62.821,73.5 +62.845,74.0 +62.869,74.9 +62.893,74.4 +62.917,76.2 +62.941,75.3 +62.965,74.3 +62.989,74.8 +63.013,73.8 +63.037,74.1 +63.061,74.7 +63.085,73.8 +63.109,74.4 +63.133,74.7 +63.157,74.8 +63.181,74.1 +63.205,75.2 +63.229,73.7 +63.253,73.6 +63.277,74.7 +63.301,74.1 +63.325,74.6 +63.349,74.1 +63.373,75.5 +63.397,74.6 +63.421,75.0 +63.445,74.6 +63.469,73.9 +63.493,74.4 +63.517,74.0 +63.541,74.2 +63.565,75.2 +63.589,74.9 +63.613,74.2 +63.637,74.6 +63.661,74.2 +63.685,75.1 +63.709,74.3 +63.733,74.9 +63.757,74.1 +63.781,74.9 +63.805,74.2 +63.829,75.0 +63.853,75.2 +63.877,74.4 +63.901,74.3 +63.925,74.5 +63.949,75.4 +63.973,74.1 +63.997,74.5 +64.021,75.7 +64.045,73.8 +64.069,74.7 +64.093,74.9 +64.117,75.0 +64.141,74.7 +64.165,75.6 +64.189,74.4 +64.213,75.1 +64.237,74.7 +64.261,74.4 +64.285,74.1 +64.309,74.7 +64.333,75.0 +64.357,74.4 +64.381,75.6 +64.405,74.4 +64.429,73.7 +64.453,75.1 +64.477,75.0 +64.501,74.7 +64.525,74.7 +64.549,73.7 +64.573,74.7 +64.597,75.5 +64.621,74.8 +64.645,74.6 +64.669,74.7 +64.693,74.5 +64.717,75.2 +64.741,74.2 +64.765,73.7 +64.789,75.4 +64.813,76.0 +64.837,75.0 +64.861,75.6 +64.885,74.8 +64.909,75.5 +64.933,74.2 +64.957,74.1 +64.981,75.3 +65.005,74.9 +65.029,74.9 +65.053,75.5 +65.077,74.8 +65.101,74.7 +65.125,74.6 +65.149,74.7 +65.173,74.5 +65.197,75.1 +65.221,75.1 +65.245,74.0 +65.269,75.6 +65.293,74.2 +65.317,75.4 +65.341,75.0 +65.365,74.3 +65.389,74.4 +65.413,75.5 +65.437,74.6 +65.461,75.2 +65.485,75.1 +65.509,75.4 +65.533,75.6 +65.557,74.6 +65.581,73.4 +65.605,75.0 +65.629,75.0 +65.653,75.2 +65.677,74.9 +65.701,74.5 +65.725,74.5 +65.749,76.5 +65.773,75.3 +65.797,74.8 +65.821,74.4 +65.845,74.9 +65.869,74.6 +65.893,76.3 +65.917,74.8 +65.941,75.6 +65.965,75.2 +65.989,75.4 +66.013,74.6 +66.037,75.0 +66.061,74.9 +66.085,75.0 +66.109,75.9 +66.133,75.7 +66.157,76.2 +66.181,75.0 +66.205,75.8 +66.229,74.8 +66.253,74.4 +66.277,74.8 +66.301,73.8 +66.325,75.8 +66.349,75.3 +66.373,75.0 +66.397,74.7 +66.421,75.5 +66.445,74.5 +66.469,74.4 +66.493,75.8 +66.517,75.2 +66.541,74.5 +66.565,75.2 +66.589,74.1 +66.613,75.9 +66.637,75.9 +66.661,75.7 +66.685,75.0 +66.709,74.9 +66.733,75.6 +66.757,75.3 +66.781,75.2 +66.805,75.7 +66.829,75.4 +66.853,75.7 +66.877,75.0 +66.901,75.3 +66.925,77.1 +66.949,74.6 +66.973,74.4 +66.997,76.1 +67.021,76.0 +67.045,75.1 +67.069,76.0 +67.093,75.3 +67.117,75.0 +67.141,76.0 +67.165,74.5 +67.189,75.4 +67.213,75.7 +67.237,75.2 +67.261,75.1 +67.285,76.7 +67.309,74.9 +67.333,75.3 +67.357,74.7 +67.381,75.7 +67.405,75.2 +67.429,74.9 +67.453,76.0 +67.477,75.7 +67.502,76.0 +67.526,75.6 +67.550,76.2 +67.574,76.6 +67.598,76.4 +67.622,75.6 +67.646,75.1 +67.670,76.5 +67.694,75.5 +67.718,74.6 +67.742,76.2 +67.766,75.9 +67.790,76.4 +67.814,75.9 +67.838,75.1 +67.862,76.5 +67.886,76.7 +67.910,74.7 +67.934,76.1 +67.958,75.6 +67.982,75.2 +68.006,76.0 +68.030,75.5 +68.054,75.5 +68.078,75.5 +68.102,73.5 +68.126,76.6 +68.150,73.8 +68.174,75.5 +68.198,75.5 +68.222,75.8 +68.246,75.4 +68.270,75.9 +68.294,74.6 +68.318,76.0 +68.342,75.1 +68.366,76.0 +68.390,76.0 +68.414,76.0 +68.438,76.6 +68.462,75.3 +68.486,75.6 +68.510,75.0 +68.534,75.6 +68.558,75.5 +68.582,75.4 +68.606,76.9 +68.630,77.0 +68.654,75.6 +68.678,76.1 +68.702,76.3 +68.726,75.5 +68.750,75.9 +68.774,76.6 +68.798,75.2 +68.822,75.6 +68.846,76.0 +68.870,74.6 +68.894,76.0 +68.918,75.6 +68.942,77.1 +68.966,75.0 +68.990,75.4 +69.014,77.0 +69.038,76.2 +69.062,76.4 +69.086,76.8 +69.110,76.9 +69.134,76.0 +69.158,75.2 +69.182,76.3 +69.206,76.3 +69.230,75.7 +69.254,75.9 +69.278,76.7 +69.302,75.3 +69.326,76.4 +69.350,75.8 +69.374,76.1 +69.398,76.1 +69.422,76.5 +69.446,75.9 +69.470,77.0 +69.494,77.7 +69.518,76.5 +69.542,76.4 +69.566,76.5 +69.590,75.9 +69.614,76.0 +69.638,76.5 +69.662,77.1 +69.686,75.6 +69.710,75.7 +69.734,76.9 +69.758,76.5 +69.782,75.8 +69.806,76.6 +69.830,75.9 +69.854,76.7 +69.878,76.2 +69.902,76.5 +69.926,76.1 +69.950,75.9 +69.974,77.0 +69.998,75.4 +70.022,77.1 +70.046,76.8 +70.070,76.5 +70.094,75.5 +70.118,75.2 +70.142,75.5 +70.166,76.9 +70.190,76.6 +70.214,75.9 +70.238,75.9 +70.262,76.9 +70.286,75.2 +70.310,76.4 +70.334,76.9 +70.358,75.9 +70.382,75.8 +70.406,77.6 +70.430,75.9 +70.454,76.6 +70.478,76.3 +70.502,75.9 +70.526,75.9 +70.550,76.2 +70.574,76.8 +70.598,76.5 +70.622,76.7 +70.646,76.5 +70.670,76.6 +70.694,76.0 +70.718,76.7 +70.742,76.0 +70.766,75.7 +70.790,76.6 +70.814,76.8 +70.838,76.9 +70.862,75.5 +70.886,76.6 +70.910,76.6 +70.934,76.0 +70.958,77.2 +70.982,77.1 +71.006,75.0 +71.030,77.2 +71.054,77.0 +71.078,76.3 +71.102,76.2 +71.126,77.2 +71.150,76.1 +71.174,76.9 +71.198,76.7 +71.222,75.4 +71.246,76.6 +71.270,76.2 +71.294,76.1 +71.318,76.3 +71.342,77.4 +71.366,76.9 +71.390,76.6 +71.414,76.9 +71.438,76.5 +71.462,75.8 +71.486,76.2 +71.510,76.6 +71.534,76.8 +71.558,77.2 +71.582,76.4 +71.606,77.1 +71.630,76.9 +71.654,77.2 +71.678,77.2 +71.702,76.6 +71.726,77.3 +71.750,76.4 +71.774,76.7 +71.798,76.9 +71.822,75.4 +71.846,76.8 +71.870,77.5 +71.894,76.6 +71.918,76.9 +71.942,77.2 +71.966,77.1 +71.990,76.7 +72.014,76.3 +72.038,77.1 +72.062,75.9 +72.086,77.1 +72.110,76.1 +72.134,77.4 +72.158,77.4 +72.182,76.7 +72.206,76.5 +72.230,76.8 +72.254,76.5 +72.278,77.4 +72.302,76.3 +72.326,76.5 +72.350,77.1 +72.374,76.6 +72.398,77.1 +72.422,77.2 +72.446,76.4 +72.470,76.8 +72.494,78.2 +72.519,76.1 +72.543,77.2 +72.567,76.4 +72.591,76.9 +72.615,77.2 +72.639,76.5 +72.663,75.8 +72.687,77.5 +72.711,76.3 +72.735,78.1 +72.759,77.0 +72.783,77.9 +72.807,76.9 +72.831,75.9 +72.855,77.1 +72.879,77.1 +72.903,76.3 +72.927,77.1 +72.951,76.9 +72.975,78.0 +72.999,76.2 +73.023,77.2 +73.047,77.2 +73.071,77.2 +73.095,76.1 +73.119,76.1 +73.143,77.1 +73.167,76.7 +73.191,77.4 +73.215,76.1 +73.239,77.5 +73.263,76.9 +73.287,76.9 +73.311,77.4 +73.335,77.2 +73.359,77.4 +73.383,76.5 +73.407,77.9 +73.431,76.9 +73.455,77.8 +73.479,76.5 +73.503,76.9 +73.527,76.1 +73.551,77.2 +73.575,77.6 +73.599,75.5 +73.623,77.3 +73.647,77.2 +73.671,76.8 +73.695,77.0 +73.719,76.8 +73.743,76.9 +73.767,77.9 +73.791,77.1 +73.815,77.0 +73.839,77.3 +73.863,76.8 +73.887,75.9 +73.911,77.8 +73.935,77.0 +73.959,77.2 +73.983,77.4 +74.007,77.8 +74.031,76.9 +74.055,77.2 +74.079,77.1 +74.103,77.2 +74.127,77.0 +74.151,77.3 +74.175,78.4 +74.199,78.1 +74.223,77.5 +74.247,77.4 +74.271,76.8 +74.295,77.5 +74.319,76.9 +74.343,77.5 +74.367,77.2 +74.391,77.7 +74.415,78.0 +74.439,76.9 +74.463,76.6 +74.487,77.8 +74.511,76.0 +74.535,77.0 +74.559,77.5 +74.583,78.0 +74.607,78.2 +74.631,77.2 +74.655,75.8 +74.679,78.2 +74.703,77.0 +74.727,76.9 +74.751,76.7 +74.775,77.7 +74.799,77.8 +74.823,76.4 +74.847,78.3 +74.871,77.4 +74.895,77.1 +74.919,77.4 +74.943,76.6 +74.967,77.3 +74.991,78.1 +75.015,76.8 +75.039,77.4 +75.063,78.2 +75.087,77.7 +75.111,78.2 +75.135,77.3 +75.159,77.3 +75.183,76.9 +75.207,77.1 +75.231,77.3 +75.255,77.4 +75.279,77.6 +75.303,77.8 +75.327,76.9 +75.351,76.9 +75.375,77.4 +75.399,77.9 +75.423,77.7 +75.447,77.2 +75.471,77.0 +75.495,77.0 +75.519,76.9 +75.543,77.5 +75.567,76.7 +75.591,76.7 +75.615,78.9 +75.639,77.5 +75.663,76.8 +75.687,77.2 +75.711,78.3 +75.735,78.1 +75.759,77.8 +75.783,77.2 +75.807,77.4 +75.831,77.9 +75.855,76.9 +75.879,77.3 +75.903,77.0 +75.927,76.5 +75.951,76.6 +75.975,78.1 +75.999,76.2 +76.023,78.1 +76.047,78.6 +76.071,77.6 +76.095,77.9 +76.119,78.4 +76.143,77.6 +76.167,78.1 +76.191,77.9 +76.215,77.8 +76.239,78.1 +76.263,77.4 +76.287,77.7 +76.311,76.3 +76.335,78.1 +76.359,78.2 +76.383,77.8 +76.407,77.5 +76.431,77.5 +76.455,78.3 +76.479,77.7 +76.503,77.7 +76.527,79.1 +76.551,78.5 +76.575,79.1 +76.599,79.3 +76.623,78.1 +76.647,78.3 +76.671,78.6 +76.695,77.1 +76.719,77.9 +76.743,77.9 +76.767,78.3 +76.791,77.1 +76.815,78.2 +76.839,78.0 +76.863,77.2 +76.887,78.5 +76.911,77.7 +76.935,78.3 +76.959,78.1 +76.983,77.2 +77.007,78.3 +77.031,77.2 +77.055,77.8 +77.079,78.0 +77.103,77.8 +77.127,77.5 +77.151,78.1 +77.175,79.1 +77.199,77.4 +77.223,77.6 +77.247,77.6 +77.271,78.3 +77.295,78.3 +77.319,77.9 +77.343,77.3 +77.367,77.5 +77.391,77.2 +77.415,78.3 +77.439,77.4 +77.463,77.8 +77.487,78.4 +77.512,77.3 +77.536,78.6 +77.560,78.4 +77.584,77.6 +77.608,78.0 +77.632,77.6 +77.656,78.1 +77.680,78.4 +77.704,77.0 +77.728,77.1 +77.752,78.0 +77.776,77.7 +77.800,78.1 +77.824,79.8 +77.848,77.3 +77.872,77.4 +77.896,78.3 +77.920,78.3 +77.944,77.6 +77.968,77.5 +77.992,77.5 +78.016,77.8 +78.040,78.5 +78.064,78.2 +78.088,78.1 +78.112,78.3 +78.136,78.2 +78.160,78.1 +78.184,78.5 +78.208,78.2 +78.232,78.8 +78.256,77.9 +78.280,78.6 +78.304,77.3 +78.328,76.9 +78.352,77.4 +78.376,79.1 +78.400,77.7 +78.424,77.8 +78.448,78.1 +78.472,78.8 +78.496,77.5 +78.520,77.7 +78.544,78.8 +78.568,78.7 +78.592,78.4 +78.616,77.1 +78.640,77.8 +78.664,78.5 +78.688,78.6 +78.712,77.6 +78.736,78.9 +78.760,76.9 +78.784,77.6 +78.808,78.6 +78.832,78.8 +78.856,78.0 +78.880,77.6 +78.904,79.2 +78.928,77.4 +78.952,78.5 +78.976,78.1 +79.000,78.3 +79.024,78.6 +79.048,78.4 +79.072,78.0 +79.096,79.1 +79.120,78.4 +79.144,78.1 +79.168,78.0 +79.192,77.4 +79.216,78.0 +79.240,78.4 +79.264,77.6 +79.288,79.6 +79.312,79.3 +79.336,76.8 +79.360,78.0 +79.384,78.9 +79.408,78.2 +79.432,79.3 +79.456,79.1 +79.480,77.9 +79.504,77.5 +79.528,77.7 +79.552,78.4 +79.576,79.1 +79.600,77.0 +79.624,78.0 +79.648,77.7 +79.672,78.3 +79.696,77.6 +79.720,78.0 +79.744,78.0 +79.768,78.4 +79.792,77.9 +79.816,77.0 +79.840,78.7 +79.864,78.7 +79.888,78.0 +79.912,78.1 +79.936,78.0 +79.960,79.6 +79.984,78.0 +80.008,77.3 +80.032,78.0 +80.056,79.1 +80.080,79.0 +80.104,77.9 +80.128,77.4 +80.152,77.8 +80.176,78.5 +80.200,78.8 +80.224,78.5 +80.248,79.3 +80.272,78.6 +80.296,78.0 +80.320,79.0 +80.344,78.9 +80.368,78.1 +80.392,78.9 +80.416,77.6 +80.440,78.7 +80.464,79.1 +80.488,78.5 +80.512,78.9 +80.536,78.5 +80.560,78.8 +80.584,78.4 +80.608,78.3 +80.632,78.9 +80.656,79.4 +80.680,78.4 +80.704,78.4 +80.728,79.1 +80.752,79.9 +80.776,78.8 +80.800,77.3 +80.824,78.3 +80.848,78.2 +80.872,78.5 +80.896,79.2 +80.920,79.1 +80.944,78.6 +80.968,78.7 +80.992,79.5 +81.016,79.2 +81.040,78.7 +81.064,78.2 +81.088,78.6 +81.112,78.8 +81.136,79.1 +81.160,78.3 +81.184,79.4 +81.208,78.9 +81.232,79.4 +81.256,78.7 +81.280,78.5 +81.304,78.5 +81.328,78.2 +81.352,77.4 +81.376,78.4 +81.400,79.4 +81.424,78.4 +81.448,79.1 +81.472,79.1 +81.496,78.2 +81.520,78.0 +81.544,78.2 +81.568,78.4 +81.592,78.6 +81.616,78.6 +81.640,78.4 +81.664,78.7 +81.688,78.7 +81.712,78.6 +81.736,78.3 +81.760,78.6 +81.784,79.6 +81.808,78.2 +81.832,79.5 +81.856,78.0 +81.880,77.9 +81.904,78.8 +81.928,79.1 +81.952,79.2 +81.976,78.4 +82.000,79.7 +82.024,79.0 +82.048,79.2 +82.072,79.8 +82.096,79.8 +82.120,77.9 +82.144,79.0 +82.168,78.2 +82.192,79.2 +82.216,77.9 +82.240,79.1 +82.264,78.7 +82.288,78.6 +82.312,78.0 +82.336,77.7 +82.360,78.7 +82.384,78.2 +82.408,79.5 +82.432,78.4 +82.456,79.6 +82.480,79.3 +82.505,78.6 +82.529,77.4 +82.553,79.0 +82.577,78.7 +82.601,79.5 +82.625,78.1 +82.649,78.6 +82.673,79.5 +82.697,78.1 +82.721,77.6 +82.745,79.0 +82.769,78.6 +82.793,79.1 +82.817,79.5 +82.841,79.5 +82.865,79.1 +82.889,78.7 +82.913,78.7 +82.937,79.5 +82.961,78.4 +82.985,79.6 +83.009,79.4 +83.033,79.4 +83.057,78.1 +83.081,79.1 +83.105,79.2 +83.129,78.5 +83.153,80.1 +83.177,77.5 +83.201,79.5 +83.225,78.3 +83.249,81.1 +83.273,79.2 +83.297,77.8 +83.321,79.6 +83.345,79.7 +83.369,79.6 +83.393,78.9 +83.417,79.2 +83.441,78.2 +83.465,78.4 +83.489,79.0 +83.513,79.8 +83.537,78.7 +83.561,78.8 +83.585,79.2 +83.609,79.5 +83.633,78.7 +83.657,79.5 +83.681,79.4 +83.705,77.4 +83.729,79.3 +83.753,78.5 +83.777,79.4 +83.801,80.0 +83.825,80.1 +83.849,78.8 +83.873,79.1 +83.897,79.5 +83.921,79.0 +83.945,79.0 +83.969,79.0 +83.993,79.7 +84.017,78.6 +84.041,79.1 +84.065,79.5 +84.089,77.6 +84.113,79.0 +84.137,78.8 +84.161,79.4 +84.185,79.7 +84.209,79.0 +84.233,79.8 +84.257,78.7 +84.281,78.0 +84.305,79.7 +84.329,78.9 +84.353,78.9 +84.377,79.2 +84.401,80.4 +84.425,78.7 +84.449,79.3 +84.473,78.8 +84.497,79.0 +84.521,79.1 +84.545,79.8 +84.569,78.8 +84.593,79.3 +84.617,79.4 +84.641,79.0 +84.665,78.0 +84.689,78.0 +84.713,79.5 +84.737,78.3 +84.761,80.1 +84.785,78.4 +84.809,78.8 +84.833,79.2 +84.857,79.3 +84.881,78.6 +84.905,79.7 +84.929,78.5 +84.953,78.8 +84.977,80.1 +85.001,78.8 +85.025,78.4 +85.049,78.1 +85.073,79.1 +85.097,78.7 +85.121,78.8 +85.145,80.5 +85.169,79.2 +85.193,79.1 +85.217,79.8 +85.241,78.0 +85.265,79.2 +85.289,80.3 +85.313,79.4 +85.337,79.9 +85.361,80.0 +85.385,79.7 +85.409,79.5 +85.433,80.1 +85.457,80.2 +85.481,79.6 +85.505,79.1 +85.529,78.5 +85.553,77.8 +85.577,79.3 +85.601,79.1 +85.625,80.3 +85.649,79.1 +85.673,79.4 +85.697,79.3 +85.721,79.3 +85.745,79.7 +85.769,79.5 +85.793,78.7 +85.817,80.3 +85.841,79.6 +85.865,79.9 +85.889,79.2 +85.913,78.9 +85.937,80.1 +85.961,78.9 +85.985,78.4 +86.009,80.0 +86.033,79.6 +86.057,79.4 +86.081,78.8 +86.105,79.4 +86.129,79.6 +86.153,79.2 +86.177,79.1 +86.201,79.4 +86.225,79.7 +86.249,79.4 +86.273,79.2 +86.297,79.1 +86.321,80.1 +86.345,80.6 +86.369,79.8 +86.393,80.1 +86.417,79.1 +86.441,80.0 +86.465,79.5 +86.489,79.8 +86.513,79.9 +86.537,79.7 +86.561,80.1 +86.585,78.9 +86.609,80.0 +86.633,80.6 +86.657,79.8 +86.681,79.3 +86.705,79.7 +86.729,77.8 +86.753,80.1 +86.777,78.6 +86.801,79.9 +86.825,79.8 +86.849,80.3 +86.873,80.4 +86.897,79.1 +86.921,80.5 +86.945,80.3 +86.969,79.5 +86.993,79.3 +87.017,79.6 +87.041,78.8 +87.065,79.3 +87.089,79.5 +87.113,80.3 +87.137,80.0 +87.161,79.9 +87.185,79.5 +87.209,79.8 +87.233,79.1 +87.257,79.5 +87.281,79.8 +87.305,79.8 +87.329,79.9 +87.353,80.0 +87.377,80.4 +87.401,80.7 +87.425,79.1 +87.449,78.3 +87.473,79.2 +87.497,80.0 +87.522,80.2 +87.546,78.7 +87.570,79.9 +87.594,80.5 +87.618,79.8 +87.642,80.4 +87.666,78.6 +87.690,80.3 +87.714,80.2 +87.738,79.4 +87.762,79.7 +87.786,79.5 +87.810,80.0 +87.834,79.8 +87.858,78.9 +87.882,80.8 +87.906,79.0 +87.930,79.8 +87.954,79.3 +87.978,79.0 +88.002,80.1 +88.026,79.0 +88.050,80.7 +88.074,80.6 +88.098,79.6 +88.122,79.7 +88.146,79.7 +88.170,80.5 +88.194,78.7 +88.218,79.5 +88.242,78.6 +88.266,79.7 +88.290,78.9 +88.314,79.8 +88.338,80.6 +88.362,78.9 +88.386,79.8 +88.410,79.5 +88.434,80.4 +88.458,80.1 +88.482,78.9 +88.506,80.1 +88.530,79.9 +88.554,78.9 +88.578,80.1 +88.602,79.6 +88.626,80.2 +88.650,80.0 +88.674,79.0 +88.698,78.5 +88.722,80.0 +88.746,79.6 +88.770,81.0 +88.794,79.4 +88.818,79.9 +88.842,80.5 +88.866,79.9 +88.890,80.6 +88.914,80.0 +88.938,81.1 +88.962,79.3 +88.986,80.3 +89.010,79.3 +89.034,79.3 +89.058,79.5 +89.082,79.5 +89.106,79.8 +89.130,80.0 +89.154,80.2 +89.178,79.3 +89.202,79.6 +89.226,80.3 +89.250,80.2 +89.274,79.7 +89.298,78.9 +89.322,80.8 +89.346,80.8 +89.370,79.4 +89.394,80.8 +89.418,80.3 +89.442,79.8 +89.466,79.7 +89.490,79.1 +89.514,80.4 +89.538,80.3 +89.562,80.2 +89.586,79.7 +89.610,80.7 +89.634,80.8 +89.658,81.1 +89.682,79.9 +89.706,79.6 +89.730,79.0 +89.754,80.0 +89.778,79.4 +89.802,80.0 +89.826,81.0 +89.850,79.7 +89.874,80.1 +89.898,80.9 +89.922,79.9 +89.946,80.3 +89.970,80.6 +89.994,80.4 +90.018,79.6 +90.042,79.8 +90.066,80.0 +90.090,80.0 +90.114,79.7 +90.138,80.2 +90.162,80.4 +90.186,80.2 +90.210,80.9 +90.234,80.4 +90.258,80.3 +90.282,80.3 +90.306,80.7 +90.330,78.8 +90.354,81.2 +90.378,80.3 +90.402,80.3 +90.426,80.2 +90.450,80.2 +90.474,80.2 +90.498,79.7 +90.522,80.5 +90.546,80.4 +90.570,81.2 +90.594,81.1 +90.618,78.5 +90.642,80.1 +90.666,80.2 +90.690,81.0 +90.714,79.1 +90.738,79.9 +90.762,81.9 +90.786,79.6 +90.810,80.4 +90.834,80.2 +90.858,80.1 +90.882,79.7 +90.906,80.0 +90.930,81.1 +90.954,80.1 +90.978,80.8 +91.002,79.8 +91.026,81.4 +91.050,79.9 +91.074,81.3 +91.098,80.8 +91.122,80.7 +91.146,80.9 +91.170,79.9 +91.194,80.1 +91.218,80.8 +91.242,80.9 +91.266,80.2 +91.290,81.1 +91.314,80.5 +91.338,80.0 +91.362,80.0 +91.386,79.4 +91.410,80.8 +91.434,81.0 +91.458,80.8 +91.482,80.2 +91.506,79.7 +91.530,80.9 +91.554,80.4 +91.578,80.7 +91.602,80.4 +91.626,80.2 +91.650,81.1 +91.674,81.6 +91.698,79.7 +91.722,80.1 +91.746,80.2 +91.770,80.2 +91.794,79.9 +91.818,80.8 +91.842,80.9 +91.866,80.2 +91.890,80.3 +91.914,80.9 +91.938,81.1 +91.962,79.8 +91.986,81.1 +92.010,80.4 +92.034,80.3 +92.058,80.2 +92.082,80.6 +92.106,80.4 +92.130,80.6 +92.154,79.2 +92.178,80.5 +92.202,80.2 +92.226,80.5 +92.250,79.3 +92.274,79.8 +92.298,80.6 +92.322,80.7 +92.346,80.3 +92.370,81.1 +92.394,81.1 +92.418,80.3 +92.442,80.5 +92.466,80.8 +92.490,80.3 +92.515,81.0 +92.539,80.2 +92.563,81.7 +92.587,80.0 +92.611,80.8 +92.635,80.5 +92.659,80.3 +92.683,81.8 +92.707,80.8 +92.731,80.2 +92.755,81.4 +92.779,81.1 +92.803,80.8 +92.827,81.5 +92.851,81.0 +92.875,80.5 +92.899,80.5 +92.923,80.8 +92.947,80.5 +92.971,80.0 +92.995,80.3 +93.019,81.0 +93.043,81.2 +93.067,80.7 +93.091,81.5 +93.115,80.1 +93.139,80.9 +93.163,80.3 +93.187,80.4 +93.211,80.5 +93.235,79.5 +93.259,80.3 +93.283,79.9 +93.307,80.5 +93.331,80.2 +93.355,79.7 +93.379,81.0 +93.403,81.6 +93.427,80.0 +93.451,81.6 +93.475,80.6 +93.499,80.4 +93.523,79.6 +93.547,79.3 +93.571,80.6 +93.595,80.7 +93.619,81.0 +93.643,79.8 +93.667,79.1 +93.691,80.1 +93.715,81.2 +93.739,82.3 +93.763,80.6 +93.787,80.2 +93.811,80.1 +93.835,80.4 +93.859,80.0 +93.883,81.1 +93.907,79.9 +93.931,80.1 +93.955,81.0 +93.979,79.7 +94.003,81.3 +94.027,80.2 +94.051,80.9 +94.075,80.0 +94.099,80.2 +94.123,80.4 +94.147,80.9 +94.171,80.2 +94.195,81.3 +94.219,81.2 +94.243,81.0 +94.267,80.3 +94.291,80.5 +94.315,81.0 +94.339,80.9 +94.363,80.8 +94.387,80.3 +94.411,80.3 +94.435,80.7 +94.459,80.5 +94.483,80.1 +94.507,82.0 +94.531,81.3 +94.555,80.5 +94.579,81.2 +94.603,80.7 +94.627,81.2 +94.651,79.9 +94.675,80.5 +94.699,80.0 +94.723,80.2 +94.747,80.7 +94.771,80.0 +94.795,81.5 +94.819,81.3 +94.843,81.7 +94.867,81.1 +94.891,80.9 +94.915,80.5 +94.939,80.6 +94.963,82.2 +94.987,81.2 +95.011,80.2 +95.035,80.9 +95.059,80.8 +95.083,80.7 +95.107,80.3 +95.131,80.6 +95.155,80.1 +95.179,80.4 +95.203,80.9 +95.227,81.0 +95.251,79.3 +95.275,81.6 +95.299,81.4 +95.323,80.8 +95.347,80.2 +95.371,81.8 +95.395,80.1 +95.419,81.1 +95.443,80.9 +95.467,80.9 +95.491,79.7 +95.515,81.3 +95.539,80.9 +95.563,81.9 +95.587,80.6 +95.611,80.5 +95.635,80.4 +95.659,80.1 +95.683,81.2 +95.707,81.0 +95.731,81.9 +95.755,80.4 +95.779,81.2 +95.803,82.0 +95.827,80.9 +95.851,80.9 +95.875,81.1 +95.899,80.6 +95.923,80.7 +95.947,80.7 +95.971,82.0 +95.995,81.1 +96.019,81.0 +96.043,80.9 +96.067,81.9 +96.091,81.3 +96.115,80.9 +96.139,81.2 +96.163,80.9 +96.187,80.9 +96.211,80.3 +96.235,80.4 +96.259,80.7 +96.283,80.9 +96.307,81.0 +96.331,81.5 +96.355,80.4 +96.379,79.8 +96.403,80.7 +96.427,80.0 +96.451,81.3 +96.475,80.1 +96.499,81.0 +96.523,81.3 +96.547,80.5 +96.571,79.7 +96.595,81.3 +96.619,79.9 +96.643,81.2 +96.667,80.4 +96.691,80.9 +96.715,81.5 +96.739,80.3 +96.763,81.0 +96.787,81.2 +96.811,81.9 +96.835,81.1 +96.859,80.9 +96.883,81.3 +96.907,82.1 +96.931,80.6 +96.955,80.6 +96.979,81.5 +97.003,82.0 +97.027,81.0 +97.051,80.8 +97.075,80.3 +97.099,81.2 +97.123,79.8 +97.147,81.0 +97.171,80.7 +97.195,81.5 +97.219,80.6 +97.243,81.0 +97.267,81.5 +97.291,81.3 +97.315,80.3 +97.339,81.6 +97.363,80.7 +97.387,81.5 +97.411,80.3 +97.435,82.0 +97.459,80.7 +97.483,80.7 +97.508,80.3 +97.532,80.6 +97.556,81.1 +97.580,80.5 +97.604,81.9 +97.628,80.2 +97.652,80.5 +97.676,80.3 +97.700,81.3 +97.724,80.5 +97.748,80.8 +97.772,80.6 +97.796,81.0 +97.820,81.5 +97.844,80.7 +97.868,81.2 +97.892,81.2 +97.916,80.1 +97.940,80.9 +97.964,80.9 +97.988,81.2 +98.012,80.5 +98.036,80.9 +98.060,82.6 +98.084,79.9 +98.108,80.4 +98.132,82.0 +98.156,81.3 +98.180,81.5 +98.204,80.9 +98.228,80.1 +98.252,80.7 +98.276,82.0 +98.300,80.0 +98.324,81.0 +98.348,80.0 +98.372,81.2 +98.396,81.5 +98.420,81.5 +98.444,80.8 +98.468,81.4 +98.492,81.3 +98.516,80.5 +98.540,81.3 +98.564,82.4 +98.588,81.0 +98.612,82.1 +98.636,82.0 +98.660,81.7 +98.684,80.9 +98.708,80.8 +98.732,81.8 +98.756,80.9 +98.780,79.7 +98.804,80.7 +98.828,81.4 +98.852,81.7 +98.876,81.0 +98.900,80.7 +98.924,82.0 +98.948,81.7 +98.972,82.0 +98.996,81.1 +99.020,80.8 +99.044,80.3 +99.068,81.0 +99.092,81.8 +99.116,81.8 +99.140,81.7 +99.164,80.7 +99.188,81.9 +99.212,80.6 +99.236,81.7 +99.260,80.9 +99.284,80.0 +99.308,81.7 +99.332,82.1 +99.356,82.0 +99.380,81.2 +99.404,81.1 +99.428,81.8 +99.452,81.8 +99.476,81.5 +99.500,82.0 +99.524,81.1 +99.548,80.8 +99.572,81.4 +99.596,81.1 +99.620,81.2 +99.644,80.9 +99.668,81.5 +99.692,79.9 +99.716,81.3 +99.740,81.6 +99.764,81.2 +99.788,81.7 +99.812,81.7 +99.836,80.9 +99.860,81.1 +99.884,80.9 +99.908,81.0 +99.932,81.2 +99.956,81.4 +99.980,82.1 +100.004,81.3 +100.028,80.6 +100.052,80.3 +100.076,81.7 +100.100,82.1 +100.124,80.7 +100.148,81.3 +100.172,81.6 +100.196,80.0 +100.220,81.7 +100.244,82.0 +100.268,81.4 +100.292,80.6 +100.316,81.4 +100.340,81.7 +100.364,81.0 +100.388,82.3 +100.412,81.3 +100.436,80.9 +100.460,81.2 +100.484,80.9 +100.508,81.3 +100.532,81.4 +100.556,80.4 +100.580,80.6 +100.604,81.6 +100.628,81.4 +100.652,81.0 +100.676,81.6 +100.700,82.6 +100.724,82.3 +100.748,81.0 +100.772,80.3 +100.796,81.0 +100.820,81.6 +100.844,81.7 +100.868,81.9 +100.892,81.5 +100.916,82.3 +100.940,82.0 +100.964,80.1 +100.988,80.7 +101.012,81.9 +101.036,80.8 +101.060,81.2 +101.084,81.3 +101.108,80.9 +101.132,82.9 +101.156,82.0 +101.180,81.6 +101.204,82.1 +101.228,81.2 +101.252,81.1 +101.276,81.3 +101.300,81.6 +101.324,81.5 +101.348,81.5 +101.372,81.7 +101.396,81.0 +101.420,80.1 +101.444,80.3 +101.468,81.9 +101.492,81.1 +101.516,81.0 +101.540,81.8 +101.564,82.7 +101.588,80.3 +101.612,80.5 +101.636,82.0 +101.660,81.7 +101.684,81.7 +101.708,80.7 +101.732,82.3 +101.756,81.9 +101.780,81.0 +101.804,81.7 +101.828,81.1 +101.852,82.3 +101.876,81.7 +101.900,81.9 +101.924,80.6 +101.948,82.1 +101.972,80.5 +101.996,80.4 +102.020,82.3 +102.044,82.0 +102.068,81.3 +102.092,82.4 +102.116,81.6 +102.140,81.8 +102.164,81.4 +102.188,81.4 +102.212,82.2 +102.236,81.9 +102.260,80.8 +102.284,81.8 +102.308,80.9 +102.332,82.1 +102.356,80.9 +102.380,81.5 +102.404,82.1 +102.428,81.1 +102.452,81.5 +102.476,81.4 +102.501,81.3 +102.525,82.1 +102.549,81.7 +102.573,81.4 +102.597,80.7 +102.621,81.1 +102.645,81.2 +102.669,80.4 +102.693,82.2 +102.717,83.0 +102.741,82.5 +102.765,81.4 +102.789,81.2 +102.813,81.8 +102.837,82.5 +102.861,82.0 +102.885,82.6 +102.909,81.3 +102.933,80.8 +102.957,81.5 +102.981,82.1 +103.005,82.1 +103.029,81.5 +103.053,81.6 +103.077,81.2 +103.101,81.6 +103.125,80.6 +103.149,82.7 +103.173,80.7 +103.197,81.8 +103.221,82.3 +103.245,81.9 +103.269,82.0 +103.293,81.1 +103.317,82.0 +103.341,81.9 +103.365,81.4 +103.389,81.6 +103.413,81.3 +103.437,80.8 +103.461,81.7 +103.485,81.8 +103.509,81.1 +103.533,81.1 +103.557,81.9 +103.581,83.1 +103.605,82.3 +103.629,82.5 +103.653,81.2 +103.677,82.0 +103.701,81.4 +103.725,82.5 +103.749,82.1 +103.773,82.8 +103.797,82.0 +103.821,83.0 +103.845,81.9 +103.869,81.7 +103.893,81.6 +103.917,82.3 +103.941,81.5 +103.965,80.8 +103.989,80.9 +104.013,81.0 +104.037,80.6 +104.061,81.5 +104.085,82.2 +104.109,81.8 +104.133,81.1 +104.157,81.5 +104.181,82.8 +104.205,82.4 +104.229,81.1 +104.253,82.3 +104.277,82.3 +104.301,82.7 +104.325,81.5 +104.349,81.5 +104.373,81.9 +104.397,81.7 +104.421,82.0 +104.445,81.0 +104.469,81.7 +104.493,81.8 +104.517,82.1 +104.541,81.5 +104.565,81.4 +104.589,81.7 +104.613,82.4 +104.637,80.7 +104.661,81.3 +104.685,82.0 +104.709,81.9 +104.733,81.4 +104.757,82.2 +104.781,82.6 +104.805,82.9 +104.829,82.2 +104.853,82.3 +104.877,82.0 +104.901,82.4 +104.925,81.9 +104.949,80.9 +104.973,80.8 +104.997,80.4 +105.021,82.3 +105.045,81.4 +105.069,82.3 +105.093,83.5 +105.117,81.3 +105.141,82.0 +105.165,82.0 +105.189,81.6 +105.213,83.2 +105.237,82.4 +105.261,80.9 +105.285,82.7 +105.309,81.4 +105.333,81.2 +105.357,81.2 +105.381,81.3 +105.405,82.0 +105.429,80.9 +105.453,80.9 +105.477,82.5 +105.501,81.6 +105.525,81.6 +105.549,80.9 +105.573,81.9 +105.597,82.4 +105.621,81.2 +105.645,82.7 +105.669,81.5 +105.693,82.2 +105.717,83.5 +105.741,82.3 +105.765,81.2 +105.789,81.4 +105.813,81.8 +105.837,81.4 +105.861,83.0 +105.885,83.1 +105.909,82.4 +105.933,82.1 +105.957,82.7 +105.981,82.0 +106.005,82.4 +106.029,82.2 +106.053,81.9 +106.077,82.5 +106.101,81.7 +106.125,82.4 +106.149,81.8 +106.173,80.7 +106.197,82.5 +106.221,81.5 +106.245,81.0 +106.269,81.6 +106.293,82.2 +106.317,81.4 +106.341,81.1 +106.365,82.1 +106.389,81.8 +106.413,80.8 +106.437,81.2 +106.461,82.1 +106.485,82.2 +106.509,83.1 +106.533,81.7 +106.557,81.5 +106.581,82.0 +106.605,82.6 +106.629,82.1 +106.653,81.2 +106.677,82.8 +106.701,82.5 +106.725,81.8 +106.749,82.8 +106.773,82.5 +106.797,83.2 +106.821,83.4 +106.845,81.8 +106.869,82.4 +106.893,82.8 +106.917,82.7 +106.941,82.0 +106.965,82.4 +106.989,82.3 +107.013,82.3 +107.037,81.5 +107.061,82.2 +107.085,80.9 +107.109,81.5 +107.133,82.9 +107.157,81.8 +107.181,81.8 +107.205,82.0 +107.229,81.9 +107.253,82.4 +107.277,82.1 +107.301,83.1 +107.325,82.1 +107.349,81.2 +107.373,82.0 +107.397,82.2 +107.421,82.9 +107.445,82.1 +107.469,82.3 +107.493,82.2 +107.518,81.8 +107.542,82.5 +107.566,81.9 +107.590,81.3 +107.614,81.9 +107.638,82.7 +107.662,82.1 +107.686,81.8 +107.710,82.3 +107.734,82.2 +107.758,82.0 +107.782,81.5 +107.806,82.5 +107.830,81.2 +107.854,81.1 +107.878,81.8 +107.902,81.3 +107.926,82.0 +107.950,82.6 +107.974,81.8 +107.998,82.2 +108.022,81.9 +108.046,82.0 +108.070,82.7 +108.094,81.8 +108.118,83.2 +108.142,81.1 +108.166,82.2 +108.190,82.8 +108.214,81.6 +108.238,81.1 +108.262,81.6 +108.286,82.3 +108.310,81.8 +108.334,82.3 +108.358,82.5 +108.382,82.1 +108.406,81.3 +108.430,82.5 +108.454,82.6 +108.478,81.5 +108.502,81.6 +108.526,82.6 +108.550,81.6 +108.574,82.7 +108.598,82.7 +108.622,81.6 +108.646,82.3 +108.670,81.0 +108.694,81.5 +108.718,82.7 +108.742,83.0 +108.766,81.3 +108.790,81.9 +108.814,81.6 +108.838,81.1 +108.862,82.6 +108.886,81.9 +108.910,82.7 +108.934,82.9 +108.958,82.3 +108.982,83.9 +109.006,81.1 +109.030,82.6 +109.054,82.2 +109.078,82.0 +109.102,81.1 +109.126,82.5 +109.150,82.3 +109.174,81.7 +109.198,81.9 +109.222,83.2 +109.246,81.4 +109.270,82.2 +109.294,82.1 +109.318,82.5 +109.342,81.3 +109.366,82.5 +109.390,81.4 +109.414,81.2 +109.438,82.1 +109.462,82.0 +109.486,83.6 +109.510,82.0 +109.534,82.1 +109.558,82.8 +109.582,82.0 +109.606,81.4 +109.630,82.9 +109.654,83.5 +109.678,82.2 +109.702,82.9 +109.726,82.3 +109.750,81.7 +109.774,83.3 +109.798,81.4 +109.822,82.3 +109.846,82.0 +109.870,83.0 +109.894,82.5 +109.918,82.7 +109.942,81.2 +109.966,83.2 +109.990,81.1 +110.014,82.8 +110.038,81.0 +110.062,82.2 +110.086,81.4 +110.110,82.3 +110.134,82.8 +110.158,82.5 +110.182,82.0 +110.206,81.9 +110.230,81.3 +110.254,83.0 +110.278,82.3 +110.302,82.4 +110.326,82.2 +110.350,82.3 +110.374,82.2 +110.398,82.3 +110.422,82.0 +110.446,82.6 +110.470,82.5 +110.494,82.3 +110.518,82.0 +110.542,80.9 +110.566,84.0 +110.590,82.0 +110.614,82.2 +110.638,82.0 +110.662,82.0 +110.686,81.5 +110.710,82.8 +110.734,82.1 +110.758,81.9 +110.782,83.1 +110.806,82.7 +110.830,82.9 +110.854,82.0 +110.878,83.3 +110.902,82.7 +110.926,82.0 +110.950,82.7 +110.974,82.4 +110.998,82.7 +111.022,82.2 +111.046,82.6 +111.070,82.9 +111.094,81.6 +111.118,82.3 +111.142,82.0 +111.166,81.9 +111.190,81.7 +111.214,82.0 +111.238,82.6 +111.262,82.2 +111.286,82.3 +111.310,81.9 +111.334,83.6 +111.358,81.4 +111.382,82.3 +111.406,83.1 +111.430,81.8 +111.454,82.3 +111.478,82.3 +111.502,82.5 +111.526,82.9 +111.550,81.7 +111.574,82.4 +111.598,81.8 +111.622,83.0 +111.646,82.1 +111.670,82.8 +111.694,81.9 +111.718,81.1 +111.742,82.3 +111.766,82.3 +111.790,82.2 +111.814,82.2 +111.838,81.4 +111.862,82.6 +111.886,82.8 +111.910,83.3 +111.934,82.5 +111.958,82.4 +111.982,82.2 +112.006,82.2 +112.030,83.0 +112.054,81.1 +112.078,82.6 +112.102,83.8 +112.126,81.6 +112.150,82.8 +112.174,82.9 +112.198,81.8 +112.222,81.9 +112.246,81.5 +112.270,82.8 +112.294,81.3 +112.318,82.5 +112.342,82.0 +112.366,82.6 +112.390,81.9 +112.414,82.5 +112.438,82.0 +112.462,82.8 +112.486,82.6 +112.511,82.8 +112.535,81.4 +112.559,82.4 +112.583,83.6 +112.607,82.9 +112.631,82.4 +112.655,82.1 +112.679,81.8 +112.703,82.1 +112.727,82.4 +112.751,82.2 +112.775,81.7 +112.799,81.8 +112.823,82.2 +112.847,82.7 +112.871,81.9 +112.895,82.3 +112.919,83.2 +112.943,82.1 +112.967,82.5 +112.991,82.6 +113.015,82.6 +113.039,83.3 +113.063,82.5 +113.087,81.8 +113.111,82.3 +113.135,82.3 +113.159,81.1 +113.183,81.9 +113.207,82.1 +113.231,82.8 +113.255,83.0 +113.279,82.4 +113.303,83.4 +113.327,82.4 +113.351,83.7 +113.375,83.4 +113.399,83.0 +113.423,83.2 +113.447,81.6 +113.471,82.8 +113.495,82.6 +113.519,82.9 +113.543,82.9 +113.567,83.5 +113.591,82.1 +113.615,81.6 +113.639,82.2 +113.663,82.4 +113.687,82.7 +113.711,82.4 +113.735,81.9 +113.759,82.3 +113.783,82.4 +113.807,83.0 +113.831,82.7 +113.855,82.8 +113.879,81.8 +113.903,82.8 +113.927,81.8 +113.951,82.6 +113.975,81.8 +113.999,83.6 +114.023,82.3 +114.047,81.7 +114.071,83.4 +114.095,82.1 +114.119,83.1 +114.143,82.0 +114.167,83.1 +114.191,82.2 +114.215,81.9 +114.239,83.5 +114.263,81.5 +114.287,82.5 +114.311,81.2 +114.335,82.8 +114.359,83.0 +114.383,82.9 +114.407,82.2 +114.431,82.1 +114.455,82.3 +114.479,82.7 +114.503,82.2 +114.527,82.9 +114.551,82.9 +114.575,82.8 +114.599,83.1 +114.623,82.4 +114.647,81.1 +114.671,82.4 +114.695,82.7 +114.719,81.7 +114.743,81.5 +114.767,83.0 +114.791,82.6 +114.815,81.8 +114.839,82.9 +114.863,83.5 +114.887,82.4 +114.911,81.9 +114.935,83.7 +114.959,82.6 +114.983,81.8 +115.007,81.4 +115.031,83.4 +115.055,83.0 +115.079,82.5 +115.103,82.5 +115.127,82.4 +115.151,82.4 +115.175,83.6 +115.199,82.4 +115.223,82.5 +115.247,81.9 +115.271,82.3 +115.295,81.7 +115.319,82.8 +115.343,82.7 +115.367,82.8 +115.391,82.8 +115.415,83.0 +115.439,82.8 +115.463,82.6 +115.487,82.6 +115.511,82.2 +115.535,83.5 +115.559,82.4 +115.583,83.0 +115.607,82.7 +115.631,81.9 +115.655,82.7 +115.679,83.0 +115.703,82.5 +115.727,82.9 +115.751,82.2 +115.775,83.1 +115.799,83.3 +115.823,82.1 +115.847,82.4 +115.871,83.3 +115.895,82.9 +115.919,83.5 +115.943,81.4 +115.967,82.8 +115.991,81.9 +116.015,82.6 +116.039,81.4 +116.063,82.6 +116.087,83.2 +116.111,82.6 +116.135,81.8 +116.159,83.0 +116.183,82.5 +116.207,82.1 +116.231,83.2 +116.255,82.3 +116.279,81.7 +116.303,82.6 +116.327,83.5 +116.351,82.5 +116.375,82.5 +116.399,82.9 +116.423,82.7 +116.447,82.8 +116.471,82.8 +116.495,82.3 +116.519,81.6 +116.543,82.2 +116.567,82.4 +116.591,82.8 +116.615,82.5 +116.639,82.9 +116.663,81.5 +116.687,81.7 +116.711,82.8 +116.735,82.6 +116.759,82.3 +116.783,83.3 +116.807,82.6 +116.831,82.6 +116.855,82.3 +116.879,82.1 +116.903,82.4 +116.927,82.8 +116.951,82.5 +116.975,83.0 +116.999,82.6 +117.023,81.5 +117.047,82.4 +117.071,82.5 +117.095,82.0 +117.119,83.2 +117.143,83.5 +117.167,82.7 +117.191,83.0 +117.215,82.7 +117.239,82.9 +117.263,83.2 +117.287,83.3 +117.311,82.6 +117.335,82.8 +117.359,82.6 +117.383,83.8 +117.407,82.3 +117.431,82.4 +117.455,81.8 +117.479,82.3 +117.504,83.1 +117.528,83.7 +117.552,83.7 +117.576,83.0 +117.600,82.8 +117.624,82.4 +117.648,82.6 +117.672,83.5 +117.696,83.3 +117.720,83.0 +117.744,82.4 +117.768,82.4 +117.792,83.6 +117.816,82.2 +117.840,83.2 +117.864,84.2 +117.888,83.1 +117.912,82.0 +117.936,83.6 +117.960,82.5 +117.984,82.0 +118.008,81.3 +118.032,81.1 +118.056,82.6 +118.080,82.4 +118.104,83.4 +118.128,82.4 +118.152,82.1 +118.176,83.0 +118.200,83.7 +118.224,82.3 +118.248,82.6 +118.272,83.3 +118.296,82.5 +118.320,83.5 +118.344,82.5 +118.368,83.1 +118.392,82.8 +118.416,82.4 +118.440,83.7 +118.464,82.3 +118.488,84.9 +118.512,83.1 +118.536,82.7 +118.560,83.7 +118.584,82.9 +118.608,83.9 +118.632,82.4 +118.656,83.2 +118.680,83.1 +118.704,82.0 +118.728,82.4 +118.752,82.2 +118.776,83.1 +118.800,82.8 +118.824,82.0 +118.848,83.5 +118.872,82.7 +118.896,82.7 +118.920,82.8 +118.944,83.0 +118.968,82.5 +118.992,81.4 +119.016,82.6 +119.040,82.4 +119.064,82.1 +119.088,82.2 +119.112,82.4 +119.136,83.1 +119.160,82.3 +119.184,82.4 +119.208,83.5 +119.232,82.0 +119.256,81.6 +119.280,81.5 +119.304,83.0 +119.328,83.9 +119.352,82.8 +119.376,82.4 +119.400,83.0 +119.424,83.7 +119.448,82.6 +119.472,82.2 +119.496,82.6 +119.520,82.8 +119.544,82.7 +119.568,83.9 +119.592,83.6 +119.616,83.9 +119.640,83.2 +119.664,83.0 +119.688,82.9 +119.712,83.7 +119.736,82.8 +119.760,83.3 +119.784,83.0 +119.808,82.8 +119.832,83.5 +119.856,82.3 +119.880,83.0 +119.904,83.5 +119.928,83.3 +119.952,83.2 +119.976,82.3 +120.000,82.8 diff --git a/agents/evals/fixtures/cases/line-basic-pygal-renamed/case.json b/agents/evals/fixtures/cases/line-basic-pygal-renamed/case.json new file mode 100644 index 00000000000..e4ba7a1fc3f --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-renamed/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "line-basic", + "library": "pygal", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "x", + "column": "t [min]" + }, + { + "role": "y", + "column": "T_tank [°C]" + } + ], + "expected": "accepted", + "tags": [ + "line", + "renamed", + "synthetic", + "renamed-headers", + "non-ascii-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, renamed)" +} diff --git a/agents/evals/fixtures/cases/line-basic-pygal-renamed/data.csv b/agents/evals/fixtures/cases/line-basic-pygal-renamed/data.csv new file mode 100644 index 00000000000..40cd36cf968 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-renamed/data.csv @@ -0,0 +1,62 @@ +t [min],T_tank [°C] +0.00,21.1 +2.00,23.2 +4.00,26.4 +6.00,30.0 +8.00,32.6 +10.00,37.1 +12.00,39.4 +14.00,41.8 +16.00,44.7 +18.00,45.8 +20.00,47.5 +22.00,50.5 +24.00,52.4 +26.00,53.6 +28.00,56.1 +30.00,58.3 +32.00,58.6 +34.00,60.5 +36.00,62.0 +38.00,63.3 +40.00,64.9 +42.00,65.8 +44.00,67.3 +46.00,67.1 +48.00,68.2 +50.00,69.9 +52.00,70.0 +54.00,70.8 +56.00,71.8 +58.00,72.8 +60.00,73.0 +62.00,74.3 +64.00,75.4 +66.00,74.1 +68.00,74.3 +70.00,76.7 +72.00,76.2 +74.00,78.0 +76.00,79.3 +78.00,77.9 +80.00,78.2 +82.00,78.8 +84.00,79.3 +86.00,79.4 +88.00,79.2 +90.00,80.3 +92.00,79.1 +94.00,80.8 +96.00,80.9 +98.00,81.8 +100.00,81.4 +102.00,81.8 +104.00,81.1 +106.00,82.0 +108.00,82.5 +110.00,82.8 +112.00,82.4 +114.00,83.4 +116.00,83.4 +118.00,82.4 +120.00,81.4 diff --git a/agents/evals/fixtures/cases/line-basic-pygal-x10/case.json b/agents/evals/fixtures/cases/line-basic-pygal-x10/case.json new file mode 100644 index 00000000000..9d17a4e6843 --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-basic", + "library": "pygal", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "x", + "column": "Elapsed Time (min)" + }, + { + "role": "y", + "column": "Tank Temperature (°C)" + } + ], + "expected": "accepted", + "tags": [ + "line", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 202, x10)" +} diff --git a/agents/evals/fixtures/cases/line-basic-pygal-x10/data.csv b/agents/evals/fixtures/cases/line-basic-pygal-x10/data.csv new file mode 100644 index 00000000000..7fdabb0d61c --- /dev/null +++ b/agents/evals/fixtures/cases/line-basic-pygal-x10/data.csv @@ -0,0 +1,62 @@ +Elapsed Time (min),Tank Temperature (°C) +0.00,210.9 +2.00,231.7 +4.00,263.7 +6.00,300.0 +8.00,325.9 +10.00,370.6 +12.00,393.9 +14.00,418.1 +16.00,447.0 +18.00,457.7 +20.00,475.0 +22.00,505.4 +24.00,524.4 +26.00,535.6 +28.00,561.2 +30.00,583.0 +32.00,586.3 +34.00,605.1 +36.00,619.7 +38.00,633.4 +40.00,648.8 +42.00,657.8 +44.00,673.5 +46.00,670.5 +48.00,682.2 +50.00,699.1 +52.00,700.2 +54.00,707.7 +56.00,718.5 +58.00,728.2 +60.00,730.0 +62.00,743.0 +64.00,753.9 +66.00,740.7 +68.00,743.1 +70.00,766.5 +72.00,762.1 +74.00,780.3 +76.00,793.1 +78.00,779.2 +80.00,781.6 +82.00,787.5 +84.00,792.7 +86.00,794.0 +88.00,792.0 +90.00,802.8 +92.00,791.0 +94.00,808.0 +96.00,808.8 +98.00,818.3 +100.00,813.6 +102.00,817.7 +104.00,811.0 +106.00,819.6 +108.00,825.0 +110.00,828.1 +112.00,824.2 +114.00,834.5 +116.00,834.0 +118.00,823.8 +120.00,814.1 diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-date/case.json b/agents/evals/fixtures/cases/line-timeseries-letsplot-date/case.json new file mode 100644 index 00000000000..1fb3a39690b --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "line-timeseries", + "library": "letsplot", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "date", + "column": "Date" + }, + { + "role": "value", + "column": "PM2.5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "date-axis" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, date)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-date/data.csv b/agents/evals/fixtures/cases/line-timeseries-letsplot-date/data.csv new file mode 100644 index 00000000000..47cb7354f58 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-date/data.csv @@ -0,0 +1,366 @@ +Date,Validated On,PM2.5 (µg/m³) +01.01.2025,2025-01-03,17.9 +02.01.2025,2025-01-04,24.6 +03.01.2025,2025-01-05,22.3 +04.01.2025,2025-01-06,19.7 +05.01.2025,2025-01-07,24.6 +06.01.2025,2025-01-08,18.5 +07.01.2025,2025-01-09,24.3 +08.01.2025,2025-01-10,27.0 +09.01.2025,2025-01-11,19.5 +10.01.2025,2025-01-12,23.5 +11.01.2025,2025-01-13,22.1 +12.01.2025,2025-01-14,18.0 +13.01.2025,2025-01-15,23.4 +14.01.2025,2025-01-16,17.7 +15.01.2025,2025-01-17,23.4 +16.01.2025,2025-01-18,27.7 +17.01.2025,2025-01-19,25.0 +18.01.2025,2025-01-20,25.4 +19.01.2025,2025-01-21,27.6 +20.01.2025,2025-01-22,21.4 +21.01.2025,2025-01-23,27.6 +22.01.2025,2025-01-24,23.7 +23.01.2025,2025-01-25,15.1 +24.01.2025,2025-01-26,21.3 +25.01.2025,2025-01-27,19.2 +26.01.2025,2025-01-28,20.5 +27.01.2025,2025-01-29,22.6 +28.01.2025,2025-01-30,19.9 +29.01.2025,2025-01-31,19.4 +30.01.2025,2025-02-01,22.3 +31.01.2025,2025-02-02,23.3 +01.02.2025,2025-02-03,16.0 +02.02.2025,2025-02-04,23.0 +03.02.2025,2025-02-05,24.3 +04.02.2025,2025-02-06,19.1 +05.02.2025,2025-02-07,24.0 +06.02.2025,2025-02-08,26.4 +07.02.2025,2025-02-09,21.2 +08.02.2025,2025-02-10,21.2 +09.02.2025,2025-02-11,19.0 +10.02.2025,2025-02-12,19.3 +11.02.2025,2025-02-13,22.2 +12.02.2025,2025-02-14,17.0 +13.02.2025,2025-02-15,21.7 +14.02.2025,2025-02-16,22.9 +15.02.2025,2025-02-17,23.2 +16.02.2025,2025-02-18,17.4 +17.02.2025,2025-02-19,15.9 +18.02.2025,2025-02-20,24.8 +19.02.2025,2025-02-21,15.1 +20.02.2025,2025-02-22,18.2 +21.02.2025,2025-02-23,18.8 +22.02.2025,2025-02-24,20.0 +23.02.2025,2025-02-25,19.5 +24.02.2025,2025-02-26,16.1 +25.02.2025,2025-02-27,19.4 +26.02.2025,2025-02-28,14.9 +27.02.2025,2025-03-01,16.9 +28.02.2025,2025-03-02,13.7 +01.03.2025,2025-03-03,16.2 +02.03.2025,2025-03-04,17.4 +03.03.2025,2025-03-05,17.6 +04.03.2025,2025-03-06,18.8 +05.03.2025,2025-03-07,18.1 +06.03.2025,2025-03-08,14.9 +07.03.2025,2025-03-09,21.0 +08.03.2025,2025-03-10,18.6 +09.03.2025,2025-03-11,19.7 +10.03.2025,2025-03-12,21.0 +11.03.2025,2025-03-13,18.8 +12.03.2025,2025-03-14,15.6 +13.03.2025,2025-03-15,21.5 +14.03.2025,2025-03-16,19.8 +15.03.2025,2025-03-17,20.0 +16.03.2025,2025-03-18,13.3 +17.03.2025,2025-03-19,18.1 +18.03.2025,2025-03-20,19.4 +19.03.2025,2025-03-21,18.5 +20.03.2025,2025-03-22,11.2 +21.03.2025,2025-03-23,13.9 +22.03.2025,2025-03-24,14.1 +23.03.2025,2025-03-25,17.1 +24.03.2025,2025-03-26,17.4 +25.03.2025,2025-03-27,16.5 +26.03.2025,2025-03-28,12.9 +27.03.2025,2025-03-29,17.8 +28.03.2025,2025-03-30,12.5 +29.03.2025,2025-03-31,13.4 +30.03.2025,2025-04-01,17.2 +31.03.2025,2025-04-02,14.9 +01.04.2025,2025-04-03,13.2 +02.04.2025,2025-04-04,11.7 +03.04.2025,2025-04-05,12.6 +04.04.2025,2025-04-06,13.2 +05.04.2025,2025-04-07,13.4 +06.04.2025,2025-04-08,13.9 +07.04.2025,2025-04-09,12.0 +08.04.2025,2025-04-10,12.9 +09.04.2025,2025-04-11,14.9 +10.04.2025,2025-04-12,14.9 +11.04.2025,2025-04-13,14.0 +12.04.2025,2025-04-14,11.7 +13.04.2025,2025-04-15,17.6 +14.04.2025,2025-04-16,13.3 +15.04.2025,2025-04-17,13.7 +16.04.2025,2025-04-18,14.3 +17.04.2025,2025-04-19,12.6 +18.04.2025,2025-04-20,6.9 +19.04.2025,2025-04-21,15.9 +20.04.2025,2025-04-22,9.3 +21.04.2025,2025-04-23,12.4 +22.04.2025,2025-04-24,11.9 +23.04.2025,2025-04-25,9.2 +24.04.2025,2025-04-26,14.0 +25.04.2025,2025-04-27,10.5 +26.04.2025,2025-04-28,3.5 +27.04.2025,2025-04-29,13.9 +28.04.2025,2025-04-30,9.8 +29.04.2025,2025-05-01,12.6 +30.04.2025,2025-05-02,10.1 +01.05.2025,2025-05-03,8.7 +02.05.2025,2025-05-04,8.4 +03.05.2025,2025-05-05,7.9 +04.05.2025,2025-05-06,11.6 +05.05.2025,2025-05-07,10.4 +06.05.2025,2025-05-08,8.5 +07.05.2025,2025-05-09,4.8 +08.05.2025,2025-05-10,6.6 +09.05.2025,2025-05-11,5.8 +10.05.2025,2025-05-12,8.1 +11.05.2025,2025-05-13,7.7 +12.05.2025,2025-05-14,3.0 +13.05.2025,2025-05-15,11.8 +14.05.2025,2025-05-16,2.0 +15.05.2025,2025-05-17,4.9 +16.05.2025,2025-05-18,5.6 +17.05.2025,2025-05-19,13.2 +18.05.2025,2025-05-20,5.6 +19.05.2025,2025-05-21,8.5 +20.05.2025,2025-05-22,10.2 +21.05.2025,2025-05-23,8.9 +22.05.2025,2025-05-24,13.2 +23.05.2025,2025-05-25,9.8 +24.05.2025,2025-05-26,11.2 +25.05.2025,2025-05-27,10.2 +26.05.2025,2025-05-28,11.0 +27.05.2025,2025-05-29,2.7 +28.05.2025,2025-05-30,8.0 +29.05.2025,2025-05-31,4.9 +30.05.2025,2025-06-01,6.1 +31.05.2025,2025-06-02,8.3 +01.06.2025,2025-06-03,5.0 +02.06.2025,2025-06-04,5.5 +03.06.2025,2025-06-05,1.0 +04.06.2025,2025-06-06,5.8 +05.06.2025,2025-06-07,13.9 +06.06.2025,2025-06-08,1.0 +07.06.2025,2025-06-09,6.7 +08.06.2025,2025-06-10,2.8 +09.06.2025,2025-06-11,6.8 +10.06.2025,2025-06-12,7.7 +11.06.2025,2025-06-13,1.8 +12.06.2025,2025-06-14,5.2 +13.06.2025,2025-06-15,6.9 +14.06.2025,2025-06-16,9.8 +15.06.2025,2025-06-17,3.7 +16.06.2025,2025-06-18,5.5 +17.06.2025,2025-06-19,9.5 +18.06.2025,2025-06-20,7.0 +19.06.2025,2025-06-21,2.0 +20.06.2025,2025-06-22,10.5 +21.06.2025,2025-06-23,5.8 +22.06.2025,2025-06-24,9.9 +23.06.2025,2025-06-25,8.1 +24.06.2025,2025-06-26,9.7 +25.06.2025,2025-06-27,6.0 +26.06.2025,2025-06-28,1.0 +27.06.2025,2025-06-29,10.1 +28.06.2025,2025-06-30,5.7 +29.06.2025,2025-07-01,5.4 +30.06.2025,2025-07-02,1.7 +01.07.2025,2025-07-03,1.0 +02.07.2025,2025-07-04,4.1 +03.07.2025,2025-07-05,9.5 +04.07.2025,2025-07-06,6.5 +05.07.2025,2025-07-07,6.7 +06.07.2025,2025-07-08,6.0 +07.07.2025,2025-07-09,6.6 +08.07.2025,2025-07-10,6.2 +09.07.2025,2025-07-11,1.0 +10.07.2025,2025-07-12,3.9 +11.07.2025,2025-07-13,3.2 +12.07.2025,2025-07-14,7.3 +13.07.2025,2025-07-15,8.5 +14.07.2025,2025-07-16,5.7 +15.07.2025,2025-07-17,1.0 +16.07.2025,2025-07-18,5.3 +17.07.2025,2025-07-19,2.0 +18.07.2025,2025-07-20,5.3 +19.07.2025,2025-07-21,11.1 +20.07.2025,2025-07-22,1.0 +21.07.2025,2025-07-23,5.9 +22.07.2025,2025-07-24,7.5 +23.07.2025,2025-07-25,10.8 +24.07.2025,2025-07-26,4.7 +25.07.2025,2025-07-27,3.9 +26.07.2025,2025-07-28,5.6 +27.07.2025,2025-07-29,4.3 +28.07.2025,2025-07-30,6.9 +29.07.2025,2025-07-31,7.3 +30.07.2025,2025-08-01,11.5 +31.07.2025,2025-08-02,6.4 +01.08.2025,2025-08-03,3.3 +02.08.2025,2025-08-04,4.5 +03.08.2025,2025-08-05,5.9 +04.08.2025,2025-08-06,8.8 +05.08.2025,2025-08-07,4.1 +06.08.2025,2025-08-08,1.0 +07.08.2025,2025-08-09,4.9 +08.08.2025,2025-08-10,6.5 +09.08.2025,2025-08-11,2.7 +10.08.2025,2025-08-12,7.3 +11.08.2025,2025-08-13,14.3 +12.08.2025,2025-08-14,4.8 +13.08.2025,2025-08-15,9.0 +14.08.2025,2025-08-16,7.6 +15.08.2025,2025-08-17,9.1 +16.08.2025,2025-08-18,9.1 +17.08.2025,2025-08-19,1.0 +18.08.2025,2025-08-20,5.4 +19.08.2025,2025-08-21,10.8 +20.08.2025,2025-08-22,11.0 +21.08.2025,2025-08-23,5.4 +22.08.2025,2025-08-24,7.8 +23.08.2025,2025-08-25,4.6 +24.08.2025,2025-08-26,7.1 +25.08.2025,2025-08-27,10.3 +26.08.2025,2025-08-28,10.0 +27.08.2025,2025-08-29,8.1 +28.08.2025,2025-08-30,10.8 +29.08.2025,2025-08-31,6.1 +30.08.2025,2025-09-01,12.0 +31.08.2025,2025-09-02,12.1 +01.09.2025,2025-09-03,10.2 +02.09.2025,2025-09-04,8.0 +03.09.2025,2025-09-05,8.6 +04.09.2025,2025-09-06,6.4 +05.09.2025,2025-09-07,10.7 +06.09.2025,2025-09-08,9.6 +07.09.2025,2025-09-09,16.1 +08.09.2025,2025-09-10,15.1 +09.09.2025,2025-09-11,10.9 +10.09.2025,2025-09-12,12.6 +11.09.2025,2025-09-13,8.1 +12.09.2025,2025-09-14,9.8 +13.09.2025,2025-09-15,10.3 +14.09.2025,2025-09-16,15.2 +15.09.2025,2025-09-17,6.7 +16.09.2025,2025-09-18,13.8 +17.09.2025,2025-09-19,15.9 +18.09.2025,2025-09-20,15.9 +19.09.2025,2025-09-21,12.7 +20.09.2025,2025-09-22,11.9 +21.09.2025,2025-09-23,11.2 +22.09.2025,2025-09-24,12.6 +23.09.2025,2025-09-25,10.3 +24.09.2025,2025-09-26,15.6 +25.09.2025,2025-09-27,15.9 +26.09.2025,2025-09-28,16.0 +27.09.2025,2025-09-29,15.7 +28.09.2025,2025-09-30,16.3 +29.09.2025,2025-10-01,17.1 +30.09.2025,2025-10-02,13.0 +01.10.2025,2025-10-03,9.4 +02.10.2025,2025-10-04,13.8 +03.10.2025,2025-10-05,15.5 +04.10.2025,2025-10-06,16.7 +05.10.2025,2025-10-07,7.5 +06.10.2025,2025-10-08,15.5 +07.10.2025,2025-10-09,14.6 +08.10.2025,2025-10-10,8.4 +09.10.2025,2025-10-11,12.4 +10.10.2025,2025-10-12,14.0 +11.10.2025,2025-10-13,19.5 +12.10.2025,2025-10-14,16.5 +13.10.2025,2025-10-15,16.2 +14.10.2025,2025-10-16,20.3 +15.10.2025,2025-10-17,13.1 +16.10.2025,2025-10-18,11.8 +17.10.2025,2025-10-19,16.5 +18.10.2025,2025-10-20,17.6 +19.10.2025,2025-10-21,14.6 +20.10.2025,2025-10-22,17.0 +21.10.2025,2025-10-23,23.6 +22.10.2025,2025-10-24,13.7 +23.10.2025,2025-10-25,22.0 +24.10.2025,2025-10-26,20.6 +25.10.2025,2025-10-27,19.7 +26.10.2025,2025-10-28,16.0 +27.10.2025,2025-10-29,16.8 +28.10.2025,2025-10-30,20.3 +29.10.2025,2025-10-31,22.0 +30.10.2025,2025-11-01,12.7 +31.10.2025,2025-11-02,22.1 +01.11.2025,2025-11-03,15.8 +02.11.2025,2025-11-04,14.0 +03.11.2025,2025-11-05,18.2 +04.11.2025,2025-11-06,22.0 +05.11.2025,2025-11-07,19.9 +06.11.2025,2025-11-08,14.6 +07.11.2025,2025-11-09,18.6 +08.11.2025,2025-11-10,23.5 +09.11.2025,2025-11-11,18.2 +10.11.2025,2025-11-12,21.3 +11.11.2025,2025-11-13,19.6 +12.11.2025,2025-11-14,21.4 +13.11.2025,2025-11-15,24.2 +14.11.2025,2025-11-16,23.5 +15.11.2025,2025-11-17,24.8 +16.11.2025,2025-11-18,20.7 +17.11.2025,2025-11-19,15.9 +18.11.2025,2025-11-20,22.3 +19.11.2025,2025-11-21,18.0 +20.11.2025,2025-11-22,19.9 +21.11.2025,2025-11-23,27.6 +22.11.2025,2025-11-24,20.2 +23.11.2025,2025-11-25,21.4 +24.11.2025,2025-11-26,19.1 +25.11.2025,2025-11-27,24.8 +26.11.2025,2025-11-28,26.6 +27.11.2025,2025-11-29,20.4 +28.11.2025,2025-11-30,18.0 +29.11.2025,2025-12-01,22.4 +30.11.2025,2025-12-02,22.0 +01.12.2025,2025-12-03,26.8 +02.12.2025,2025-12-04,23.8 +03.12.2025,2025-12-05,25.2 +04.12.2025,2025-12-06,19.9 +05.12.2025,2025-12-07,25.3 +06.12.2025,2025-12-08,27.0 +07.12.2025,2025-12-09,22.7 +08.12.2025,2025-12-10,27.2 +09.12.2025,2025-12-11,21.1 +10.12.2025,2025-12-12,26.7 +11.12.2025,2025-12-13,20.8 +12.12.2025,2025-12-14,23.9 +13.12.2025,2025-12-15,25.4 +14.12.2025,2025-12-16,26.1 +15.12.2025,2025-12-17,22.2 +16.12.2025,2025-12-18,22.4 +17.12.2025,2025-12-19,28.7 +18.12.2025,2025-12-20,26.0 +19.12.2025,2025-12-21,19.5 +20.12.2025,2025-12-22,25.6 +21.12.2025,2025-12-23,20.2 +22.12.2025,2025-12-24,16.5 +23.12.2025,2025-12-25,23.7 +24.12.2025,2025-12-26,21.2 +25.12.2025,2025-12-27,20.3 +26.12.2025,2025-12-28,21.8 +27.12.2025,2025-12-29,20.9 +28.12.2025,2025-12-30,33.7 +29.12.2025,2025-12-31,24.7 +30.12.2025,2026-01-01,19.7 +31.12.2025,2026-01-02,20.3 diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-decimal-comma/case.json b/agents/evals/fixtures/cases/line-timeseries-letsplot-decimal-comma/case.json new file mode 100644 index 00000000000..b6072ec82d6 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-decimal-comma/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "line-timeseries", + "library": "letsplot", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "date", + "column": "Date" + }, + { + "role": "value", + "column": "PM2.5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "decimal-comma", + "synthetic", + "semicolon", + "dd.mm.yyyy" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-decimal-comma/data.csv b/agents/evals/fixtures/cases/line-timeseries-letsplot-decimal-comma/data.csv new file mode 100644 index 00000000000..df75a07f5c2 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-decimal-comma/data.csv @@ -0,0 +1,366 @@ +Date;PM2.5 (µg/m³) +01.01.2025;17,9 +02.01.2025;24,6 +03.01.2025;22,3 +04.01.2025;19,7 +05.01.2025;24,6 +06.01.2025;18,5 +07.01.2025;24,3 +08.01.2025;27,0 +09.01.2025;19,5 +10.01.2025;23,5 +11.01.2025;22,1 +12.01.2025;18,0 +13.01.2025;23,4 +14.01.2025;17,7 +15.01.2025;23,4 +16.01.2025;27,7 +17.01.2025;25,0 +18.01.2025;25,4 +19.01.2025;27,6 +20.01.2025;21,4 +21.01.2025;27,6 +22.01.2025;23,7 +23.01.2025;15,1 +24.01.2025;21,3 +25.01.2025;19,2 +26.01.2025;20,5 +27.01.2025;22,6 +28.01.2025;19,9 +29.01.2025;19,4 +30.01.2025;22,3 +31.01.2025;23,3 +01.02.2025;16,0 +02.02.2025;23,0 +03.02.2025;24,3 +04.02.2025;19,1 +05.02.2025;24,0 +06.02.2025;26,4 +07.02.2025;21,2 +08.02.2025;21,2 +09.02.2025;19,0 +10.02.2025;19,3 +11.02.2025;22,2 +12.02.2025;17,0 +13.02.2025;21,7 +14.02.2025;22,9 +15.02.2025;23,2 +16.02.2025;17,4 +17.02.2025;15,9 +18.02.2025;24,8 +19.02.2025;15,1 +20.02.2025;18,2 +21.02.2025;18,8 +22.02.2025;20,0 +23.02.2025;19,5 +24.02.2025;16,1 +25.02.2025;19,4 +26.02.2025;14,9 +27.02.2025;16,9 +28.02.2025;13,7 +01.03.2025;16,2 +02.03.2025;17,4 +03.03.2025;17,6 +04.03.2025;18,8 +05.03.2025;18,1 +06.03.2025;14,9 +07.03.2025;21,0 +08.03.2025;18,6 +09.03.2025;19,7 +10.03.2025;21,0 +11.03.2025;18,8 +12.03.2025;15,6 +13.03.2025;21,5 +14.03.2025;19,8 +15.03.2025;20,0 +16.03.2025;13,3 +17.03.2025;18,1 +18.03.2025;19,4 +19.03.2025;18,5 +20.03.2025;11,2 +21.03.2025;13,9 +22.03.2025;14,1 +23.03.2025;17,1 +24.03.2025;17,4 +25.03.2025;16,5 +26.03.2025;12,9 +27.03.2025;17,8 +28.03.2025;12,5 +29.03.2025;13,4 +30.03.2025;17,2 +31.03.2025;14,9 +01.04.2025;13,2 +02.04.2025;11,7 +03.04.2025;12,6 +04.04.2025;13,2 +05.04.2025;13,4 +06.04.2025;13,9 +07.04.2025;12,0 +08.04.2025;12,9 +09.04.2025;14,9 +10.04.2025;14,9 +11.04.2025;14,0 +12.04.2025;11,7 +13.04.2025;17,6 +14.04.2025;13,3 +15.04.2025;13,7 +16.04.2025;14,3 +17.04.2025;12,6 +18.04.2025;6,9 +19.04.2025;15,9 +20.04.2025;9,3 +21.04.2025;12,4 +22.04.2025;11,9 +23.04.2025;9,2 +24.04.2025;14,0 +25.04.2025;10,5 +26.04.2025;3,5 +27.04.2025;13,9 +28.04.2025;9,8 +29.04.2025;12,6 +30.04.2025;10,1 +01.05.2025;8,7 +02.05.2025;8,4 +03.05.2025;7,9 +04.05.2025;11,6 +05.05.2025;10,4 +06.05.2025;8,5 +07.05.2025;4,8 +08.05.2025;6,6 +09.05.2025;5,8 +10.05.2025;8,1 +11.05.2025;7,7 +12.05.2025;3,0 +13.05.2025;11,8 +14.05.2025;2,0 +15.05.2025;4,9 +16.05.2025;5,6 +17.05.2025;13,2 +18.05.2025;5,6 +19.05.2025;8,5 +20.05.2025;10,2 +21.05.2025;8,9 +22.05.2025;13,2 +23.05.2025;9,8 +24.05.2025;11,2 +25.05.2025;10,2 +26.05.2025;11,0 +27.05.2025;2,7 +28.05.2025;8,0 +29.05.2025;4,9 +30.05.2025;6,1 +31.05.2025;8,3 +01.06.2025;5,0 +02.06.2025;5,5 +03.06.2025;1,0 +04.06.2025;5,8 +05.06.2025;13,9 +06.06.2025;1,0 +07.06.2025;6,7 +08.06.2025;2,8 +09.06.2025;6,8 +10.06.2025;7,7 +11.06.2025;1,8 +12.06.2025;5,2 +13.06.2025;6,9 +14.06.2025;9,8 +15.06.2025;3,7 +16.06.2025;5,5 +17.06.2025;9,5 +18.06.2025;7,0 +19.06.2025;2,0 +20.06.2025;10,5 +21.06.2025;5,8 +22.06.2025;9,9 +23.06.2025;8,1 +24.06.2025;9,7 +25.06.2025;6,0 +26.06.2025;1,0 +27.06.2025;10,1 +28.06.2025;5,7 +29.06.2025;5,4 +30.06.2025;1,7 +01.07.2025;1,0 +02.07.2025;4,1 +03.07.2025;9,5 +04.07.2025;6,5 +05.07.2025;6,7 +06.07.2025;6,0 +07.07.2025;6,6 +08.07.2025;6,2 +09.07.2025;1,0 +10.07.2025;3,9 +11.07.2025;3,2 +12.07.2025;7,3 +13.07.2025;8,5 +14.07.2025;5,7 +15.07.2025;1,0 +16.07.2025;5,3 +17.07.2025;2,0 +18.07.2025;5,3 +19.07.2025;11,1 +20.07.2025;1,0 +21.07.2025;5,9 +22.07.2025;7,5 +23.07.2025;10,8 +24.07.2025;4,7 +25.07.2025;3,9 +26.07.2025;5,6 +27.07.2025;4,3 +28.07.2025;6,9 +29.07.2025;7,3 +30.07.2025;11,5 +31.07.2025;6,4 +01.08.2025;3,3 +02.08.2025;4,5 +03.08.2025;5,9 +04.08.2025;8,8 +05.08.2025;4,1 +06.08.2025;1,0 +07.08.2025;4,9 +08.08.2025;6,5 +09.08.2025;2,7 +10.08.2025;7,3 +11.08.2025;14,3 +12.08.2025;4,8 +13.08.2025;9,0 +14.08.2025;7,6 +15.08.2025;9,1 +16.08.2025;9,1 +17.08.2025;1,0 +18.08.2025;5,4 +19.08.2025;10,8 +20.08.2025;11,0 +21.08.2025;5,4 +22.08.2025;7,8 +23.08.2025;4,6 +24.08.2025;7,1 +25.08.2025;10,3 +26.08.2025;10,0 +27.08.2025;8,1 +28.08.2025;10,8 +29.08.2025;6,1 +30.08.2025;12,0 +31.08.2025;12,1 +01.09.2025;10,2 +02.09.2025;8,0 +03.09.2025;8,6 +04.09.2025;6,4 +05.09.2025;10,7 +06.09.2025;9,6 +07.09.2025;16,1 +08.09.2025;15,1 +09.09.2025;10,9 +10.09.2025;12,6 +11.09.2025;8,1 +12.09.2025;9,8 +13.09.2025;10,3 +14.09.2025;15,2 +15.09.2025;6,7 +16.09.2025;13,8 +17.09.2025;15,9 +18.09.2025;15,9 +19.09.2025;12,7 +20.09.2025;11,9 +21.09.2025;11,2 +22.09.2025;12,6 +23.09.2025;10,3 +24.09.2025;15,6 +25.09.2025;15,9 +26.09.2025;16,0 +27.09.2025;15,7 +28.09.2025;16,3 +29.09.2025;17,1 +30.09.2025;13,0 +01.10.2025;9,4 +02.10.2025;13,8 +03.10.2025;15,5 +04.10.2025;16,7 +05.10.2025;7,5 +06.10.2025;15,5 +07.10.2025;14,6 +08.10.2025;8,4 +09.10.2025;12,4 +10.10.2025;14,0 +11.10.2025;19,5 +12.10.2025;16,5 +13.10.2025;16,2 +14.10.2025;20,3 +15.10.2025;13,1 +16.10.2025;11,8 +17.10.2025;16,5 +18.10.2025;17,6 +19.10.2025;14,6 +20.10.2025;17,0 +21.10.2025;23,6 +22.10.2025;13,7 +23.10.2025;22,0 +24.10.2025;20,6 +25.10.2025;19,7 +26.10.2025;16,0 +27.10.2025;16,8 +28.10.2025;20,3 +29.10.2025;22,0 +30.10.2025;12,7 +31.10.2025;22,1 +01.11.2025;15,8 +02.11.2025;14,0 +03.11.2025;18,2 +04.11.2025;22,0 +05.11.2025;19,9 +06.11.2025;14,6 +07.11.2025;18,6 +08.11.2025;23,5 +09.11.2025;18,2 +10.11.2025;21,3 +11.11.2025;19,6 +12.11.2025;21,4 +13.11.2025;24,2 +14.11.2025;23,5 +15.11.2025;24,8 +16.11.2025;20,7 +17.11.2025;15,9 +18.11.2025;22,3 +19.11.2025;18,0 +20.11.2025;19,9 +21.11.2025;27,6 +22.11.2025;20,2 +23.11.2025;21,4 +24.11.2025;19,1 +25.11.2025;24,8 +26.11.2025;26,6 +27.11.2025;20,4 +28.11.2025;18,0 +29.11.2025;22,4 +30.11.2025;22,0 +01.12.2025;26,8 +02.12.2025;23,8 +03.12.2025;25,2 +04.12.2025;19,9 +05.12.2025;25,3 +06.12.2025;27,0 +07.12.2025;22,7 +08.12.2025;27,2 +09.12.2025;21,1 +10.12.2025;26,7 +11.12.2025;20,8 +12.12.2025;23,9 +13.12.2025;25,4 +14.12.2025;26,1 +15.12.2025;22,2 +16.12.2025;22,4 +17.12.2025;28,7 +18.12.2025;26,0 +19.12.2025;19,5 +20.12.2025;25,6 +21.12.2025;20,2 +22.12.2025;16,5 +23.12.2025;23,7 +24.12.2025;21,2 +25.12.2025;20,3 +26.12.2025;21,8 +27.12.2025;20,9 +28.12.2025;33,7 +29.12.2025;24,7 +30.12.2025;19,7 +31.12.2025;20,3 diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-n12/case.json b/agents/evals/fixtures/cases/line-timeseries-letsplot-n12/case.json new file mode 100644 index 00000000000..c0236359ed4 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-timeseries", + "library": "letsplot", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "date", + "column": "Date" + }, + { + "role": "value", + "column": "PM2.5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, n12)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-n12/data.csv b/agents/evals/fixtures/cases/line-timeseries-letsplot-n12/data.csv new file mode 100644 index 00000000000..d71bc31879f --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-n12/data.csv @@ -0,0 +1,13 @@ +Date,PM2.5 (µg/m³) +2025-01-01,18.7 +2025-01-02,20.3 +2025-01-03,22.9 +2025-01-04,21.5 +2025-01-05,19.6 +2025-01-06,26.1 +2025-01-07,18.5 +2025-01-08,25.4 +2025-01-09,20.1 +2025-01-10,27.9 +2025-01-11,22.7 +2025-01-12,24.6 diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-n5000/case.json b/agents/evals/fixtures/cases/line-timeseries-letsplot-n5000/case.json new file mode 100644 index 00000000000..e0ee94ff3b0 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-timeseries", + "library": "letsplot", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "date", + "column": "Date" + }, + { + "role": "value", + "column": "PM2.5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, n5000)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-n5000/data.csv b/agents/evals/fixtures/cases/line-timeseries-letsplot-n5000/data.csv new file mode 100644 index 00000000000..9b339924b86 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-n5000/data.csv @@ -0,0 +1,5001 @@ +Date,PM2.5 (µg/m³) +2025-01-01T00:00,16.6 +2025-01-01T01:00,22.5 +2025-01-01T02:00,19.2 +2025-01-01T03:00,20.8 +2025-01-01T04:00,23.7 +2025-01-01T05:00,21.5 +2025-01-01T06:00,23.7 +2025-01-01T07:00,21.9 +2025-01-01T08:00,26.5 +2025-01-01T09:00,26.8 +2025-01-01T10:00,29.7 +2025-01-01T11:00,27.3 +2025-01-01T12:00,27.1 +2025-01-01T13:00,23.3 +2025-01-01T14:00,31.7 +2025-01-01T15:00,28.3 +2025-01-01T16:00,24.5 +2025-01-01T17:00,21.8 +2025-01-01T18:00,20.5 +2025-01-01T19:00,20.9 +2025-01-01T20:00,22.5 +2025-01-01T21:00,20.7 +2025-01-01T22:00,19.7 +2025-01-01T23:00,15.8 +2025-01-02T00:00,21.1 +2025-01-02T01:00,19.2 +2025-01-02T02:00,21.2 +2025-01-02T03:00,20.0 +2025-01-02T04:00,23.1 +2025-01-02T05:00,22.8 +2025-01-02T06:00,18.6 +2025-01-02T07:00,23.9 +2025-01-02T08:00,25.1 +2025-01-02T09:00,29.1 +2025-01-02T10:00,28.4 +2025-01-02T11:00,22.5 +2025-01-02T12:00,27.4 +2025-01-02T13:00,22.6 +2025-01-02T14:00,28.5 +2025-01-02T15:00,29.7 +2025-01-02T16:00,26.8 +2025-01-02T17:00,28.3 +2025-01-02T18:00,18.6 +2025-01-02T19:00,21.4 +2025-01-02T20:00,18.0 +2025-01-02T21:00,21.2 +2025-01-02T22:00,16.6 +2025-01-02T23:00,19.8 +2025-01-03T00:00,16.6 +2025-01-03T01:00,20.8 +2025-01-03T02:00,22.8 +2025-01-03T03:00,22.4 +2025-01-03T04:00,15.4 +2025-01-03T05:00,22.6 +2025-01-03T06:00,24.8 +2025-01-03T07:00,23.8 +2025-01-03T08:00,26.5 +2025-01-03T09:00,25.1 +2025-01-03T10:00,26.5 +2025-01-03T11:00,27.0 +2025-01-03T12:00,23.2 +2025-01-03T13:00,28.1 +2025-01-03T14:00,21.1 +2025-01-03T15:00,28.5 +2025-01-03T16:00,25.2 +2025-01-03T17:00,22.9 +2025-01-03T18:00,23.5 +2025-01-03T19:00,24.8 +2025-01-03T20:00,21.9 +2025-01-03T21:00,20.4 +2025-01-03T22:00,20.6 +2025-01-03T23:00,15.9 +2025-01-04T00:00,15.6 +2025-01-04T01:00,19.6 +2025-01-04T02:00,18.9 +2025-01-04T03:00,15.7 +2025-01-04T04:00,19.6 +2025-01-04T05:00,17.5 +2025-01-04T06:00,20.6 +2025-01-04T07:00,21.3 +2025-01-04T08:00,28.0 +2025-01-04T09:00,24.2 +2025-01-04T10:00,25.1 +2025-01-04T11:00,26.8 +2025-01-04T12:00,27.4 +2025-01-04T13:00,27.9 +2025-01-04T14:00,25.9 +2025-01-04T15:00,28.1 +2025-01-04T16:00,26.0 +2025-01-04T17:00,23.5 +2025-01-04T18:00,22.4 +2025-01-04T19:00,23.4 +2025-01-04T20:00,19.4 +2025-01-04T21:00,20.4 +2025-01-04T22:00,17.9 +2025-01-04T23:00,19.7 +2025-01-05T00:00,18.1 +2025-01-05T01:00,18.6 +2025-01-05T02:00,21.4 +2025-01-05T03:00,20.6 +2025-01-05T04:00,20.6 +2025-01-05T05:00,19.6 +2025-01-05T06:00,24.6 +2025-01-05T07:00,26.3 +2025-01-05T08:00,23.5 +2025-01-05T09:00,20.3 +2025-01-05T10:00,21.9 +2025-01-05T11:00,23.9 +2025-01-05T12:00,30.3 +2025-01-05T13:00,23.6 +2025-01-05T14:00,29.7 +2025-01-05T15:00,28.8 +2025-01-05T16:00,24.9 +2025-01-05T17:00,23.5 +2025-01-05T18:00,23.4 +2025-01-05T19:00,21.6 +2025-01-05T20:00,16.3 +2025-01-05T21:00,19.0 +2025-01-05T22:00,21.5 +2025-01-05T23:00,21.1 +2025-01-06T00:00,22.4 +2025-01-06T01:00,18.8 +2025-01-06T02:00,22.3 +2025-01-06T03:00,18.7 +2025-01-06T04:00,16.7 +2025-01-06T05:00,19.0 +2025-01-06T06:00,22.9 +2025-01-06T07:00,24.7 +2025-01-06T08:00,24.2 +2025-01-06T09:00,26.7 +2025-01-06T10:00,27.9 +2025-01-06T11:00,26.1 +2025-01-06T12:00,28.9 +2025-01-06T13:00,26.2 +2025-01-06T14:00,27.5 +2025-01-06T15:00,25.4 +2025-01-06T16:00,26.4 +2025-01-06T17:00,23.7 +2025-01-06T18:00,23.5 +2025-01-06T19:00,18.8 +2025-01-06T20:00,20.2 +2025-01-06T21:00,18.2 +2025-01-06T22:00,16.1 +2025-01-06T23:00,17.4 +2025-01-07T00:00,25.8 +2025-01-07T01:00,19.2 +2025-01-07T02:00,17.2 +2025-01-07T03:00,19.3 +2025-01-07T04:00,22.7 +2025-01-07T05:00,19.5 +2025-01-07T06:00,26.4 +2025-01-07T07:00,25.6 +2025-01-07T08:00,27.3 +2025-01-07T09:00,21.9 +2025-01-07T10:00,28.4 +2025-01-07T11:00,28.6 +2025-01-07T12:00,32.7 +2025-01-07T13:00,30.1 +2025-01-07T14:00,23.3 +2025-01-07T15:00,24.2 +2025-01-07T16:00,23.3 +2025-01-07T17:00,25.9 +2025-01-07T18:00,27.7 +2025-01-07T19:00,21.7 +2025-01-07T20:00,20.8 +2025-01-07T21:00,21.4 +2025-01-07T22:00,16.2 +2025-01-07T23:00,14.6 +2025-01-08T00:00,17.5 +2025-01-08T01:00,16.8 +2025-01-08T02:00,15.0 +2025-01-08T03:00,18.4 +2025-01-08T04:00,22.6 +2025-01-08T05:00,20.4 +2025-01-08T06:00,19.9 +2025-01-08T07:00,28.4 +2025-01-08T08:00,25.6 +2025-01-08T09:00,29.5 +2025-01-08T10:00,26.3 +2025-01-08T11:00,24.4 +2025-01-08T12:00,25.3 +2025-01-08T13:00,30.8 +2025-01-08T14:00,28.3 +2025-01-08T15:00,27.7 +2025-01-08T16:00,24.2 +2025-01-08T17:00,20.7 +2025-01-08T18:00,23.5 +2025-01-08T19:00,20.8 +2025-01-08T20:00,24.8 +2025-01-08T21:00,19.4 +2025-01-08T22:00,15.6 +2025-01-08T23:00,21.9 +2025-01-09T00:00,15.4 +2025-01-09T01:00,23.2 +2025-01-09T02:00,17.4 +2025-01-09T03:00,19.9 +2025-01-09T04:00,21.5 +2025-01-09T05:00,18.1 +2025-01-09T06:00,22.3 +2025-01-09T07:00,31.2 +2025-01-09T08:00,24.5 +2025-01-09T09:00,23.2 +2025-01-09T10:00,27.8 +2025-01-09T11:00,24.5 +2025-01-09T12:00,25.6 +2025-01-09T13:00,21.3 +2025-01-09T14:00,21.4 +2025-01-09T15:00,27.2 +2025-01-09T16:00,22.9 +2025-01-09T17:00,27.8 +2025-01-09T18:00,18.9 +2025-01-09T19:00,17.0 +2025-01-09T20:00,25.1 +2025-01-09T21:00,17.7 +2025-01-09T22:00,20.0 +2025-01-09T23:00,19.3 +2025-01-10T00:00,18.8 +2025-01-10T01:00,20.5 +2025-01-10T02:00,20.4 +2025-01-10T03:00,21.6 +2025-01-10T04:00,17.8 +2025-01-10T05:00,22.4 +2025-01-10T06:00,24.1 +2025-01-10T07:00,25.8 +2025-01-10T08:00,25.9 +2025-01-10T09:00,26.9 +2025-01-10T10:00,28.9 +2025-01-10T11:00,27.6 +2025-01-10T12:00,27.7 +2025-01-10T13:00,25.8 +2025-01-10T14:00,23.3 +2025-01-10T15:00,28.0 +2025-01-10T16:00,22.5 +2025-01-10T17:00,26.7 +2025-01-10T18:00,23.4 +2025-01-10T19:00,22.8 +2025-01-10T20:00,18.1 +2025-01-10T21:00,15.2 +2025-01-10T22:00,20.8 +2025-01-10T23:00,18.0 +2025-01-11T00:00,22.0 +2025-01-11T01:00,16.4 +2025-01-11T02:00,18.4 +2025-01-11T03:00,16.6 +2025-01-11T04:00,21.2 +2025-01-11T05:00,28.4 +2025-01-11T06:00,21.5 +2025-01-11T07:00,27.3 +2025-01-11T08:00,23.3 +2025-01-11T09:00,26.5 +2025-01-11T10:00,27.1 +2025-01-11T11:00,28.4 +2025-01-11T12:00,29.1 +2025-01-11T13:00,25.0 +2025-01-11T14:00,26.1 +2025-01-11T15:00,23.1 +2025-01-11T16:00,25.4 +2025-01-11T17:00,23.4 +2025-01-11T18:00,26.8 +2025-01-11T19:00,21.1 +2025-01-11T20:00,18.6 +2025-01-11T21:00,22.6 +2025-01-11T22:00,20.4 +2025-01-11T23:00,20.2 +2025-01-12T00:00,17.0 +2025-01-12T01:00,23.3 +2025-01-12T02:00,22.6 +2025-01-12T03:00,17.7 +2025-01-12T04:00,22.9 +2025-01-12T05:00,22.0 +2025-01-12T06:00,25.8 +2025-01-12T07:00,19.5 +2025-01-12T08:00,27.4 +2025-01-12T09:00,25.2 +2025-01-12T10:00,24.3 +2025-01-12T11:00,22.1 +2025-01-12T12:00,27.1 +2025-01-12T13:00,28.6 +2025-01-12T14:00,28.8 +2025-01-12T15:00,29.4 +2025-01-12T16:00,24.4 +2025-01-12T17:00,24.0 +2025-01-12T18:00,20.9 +2025-01-12T19:00,22.8 +2025-01-12T20:00,21.0 +2025-01-12T21:00,18.3 +2025-01-12T22:00,20.7 +2025-01-12T23:00,20.1 +2025-01-13T00:00,21.5 +2025-01-13T01:00,21.4 +2025-01-13T02:00,18.1 +2025-01-13T03:00,21.5 +2025-01-13T04:00,20.6 +2025-01-13T05:00,23.6 +2025-01-13T06:00,20.1 +2025-01-13T07:00,27.2 +2025-01-13T08:00,25.3 +2025-01-13T09:00,26.4 +2025-01-13T10:00,24.8 +2025-01-13T11:00,29.1 +2025-01-13T12:00,26.6 +2025-01-13T13:00,25.4 +2025-01-13T14:00,22.2 +2025-01-13T15:00,25.3 +2025-01-13T16:00,23.5 +2025-01-13T17:00,25.9 +2025-01-13T18:00,23.6 +2025-01-13T19:00,19.1 +2025-01-13T20:00,23.8 +2025-01-13T21:00,21.5 +2025-01-13T22:00,23.2 +2025-01-13T23:00,18.5 +2025-01-14T00:00,12.9 +2025-01-14T01:00,21.5 +2025-01-14T02:00,19.4 +2025-01-14T03:00,19.5 +2025-01-14T04:00,22.9 +2025-01-14T05:00,19.5 +2025-01-14T06:00,23.8 +2025-01-14T07:00,21.4 +2025-01-14T08:00,24.5 +2025-01-14T09:00,25.3 +2025-01-14T10:00,27.2 +2025-01-14T11:00,27.0 +2025-01-14T12:00,24.6 +2025-01-14T13:00,27.2 +2025-01-14T14:00,29.6 +2025-01-14T15:00,23.1 +2025-01-14T16:00,25.0 +2025-01-14T17:00,21.2 +2025-01-14T18:00,23.2 +2025-01-14T19:00,22.5 +2025-01-14T20:00,23.0 +2025-01-14T21:00,20.5 +2025-01-14T22:00,17.4 +2025-01-14T23:00,15.6 +2025-01-15T00:00,19.9 +2025-01-15T01:00,15.3 +2025-01-15T02:00,22.5 +2025-01-15T03:00,20.4 +2025-01-15T04:00,20.0 +2025-01-15T05:00,21.0 +2025-01-15T06:00,23.0 +2025-01-15T07:00,21.9 +2025-01-15T08:00,24.7 +2025-01-15T09:00,23.8 +2025-01-15T10:00,26.8 +2025-01-15T11:00,27.0 +2025-01-15T12:00,28.4 +2025-01-15T13:00,29.3 +2025-01-15T14:00,25.9 +2025-01-15T15:00,24.3 +2025-01-15T16:00,20.0 +2025-01-15T17:00,24.0 +2025-01-15T18:00,25.9 +2025-01-15T19:00,18.7 +2025-01-15T20:00,26.1 +2025-01-15T21:00,16.9 +2025-01-15T22:00,19.9 +2025-01-15T23:00,16.4 +2025-01-16T00:00,17.2 +2025-01-16T01:00,21.6 +2025-01-16T02:00,20.8 +2025-01-16T03:00,19.7 +2025-01-16T04:00,24.4 +2025-01-16T05:00,20.5 +2025-01-16T06:00,27.4 +2025-01-16T07:00,22.2 +2025-01-16T08:00,26.4 +2025-01-16T09:00,23.0 +2025-01-16T10:00,27.3 +2025-01-16T11:00,27.1 +2025-01-16T12:00,25.8 +2025-01-16T13:00,24.5 +2025-01-16T14:00,28.2 +2025-01-16T15:00,23.5 +2025-01-16T16:00,29.6 +2025-01-16T17:00,24.2 +2025-01-16T18:00,25.6 +2025-01-16T19:00,21.6 +2025-01-16T20:00,20.7 +2025-01-16T21:00,16.7 +2025-01-16T22:00,17.9 +2025-01-16T23:00,14.4 +2025-01-17T00:00,21.0 +2025-01-17T01:00,14.0 +2025-01-17T02:00,23.3 +2025-01-17T03:00,21.5 +2025-01-17T04:00,19.5 +2025-01-17T05:00,20.5 +2025-01-17T06:00,22.9 +2025-01-17T07:00,21.7 +2025-01-17T08:00,26.2 +2025-01-17T09:00,26.0 +2025-01-17T10:00,26.9 +2025-01-17T11:00,33.9 +2025-01-17T12:00,28.2 +2025-01-17T13:00,28.7 +2025-01-17T14:00,25.3 +2025-01-17T15:00,23.2 +2025-01-17T16:00,21.7 +2025-01-17T17:00,24.8 +2025-01-17T18:00,23.6 +2025-01-17T19:00,21.9 +2025-01-17T20:00,20.4 +2025-01-17T21:00,23.1 +2025-01-17T22:00,18.4 +2025-01-17T23:00,16.4 +2025-01-18T00:00,20.6 +2025-01-18T01:00,20.2 +2025-01-18T02:00,19.4 +2025-01-18T03:00,17.6 +2025-01-18T04:00,19.8 +2025-01-18T05:00,16.4 +2025-01-18T06:00,25.2 +2025-01-18T07:00,23.7 +2025-01-18T08:00,25.0 +2025-01-18T09:00,27.1 +2025-01-18T10:00,30.0 +2025-01-18T11:00,29.0 +2025-01-18T12:00,24.8 +2025-01-18T13:00,22.3 +2025-01-18T14:00,23.3 +2025-01-18T15:00,28.0 +2025-01-18T16:00,26.1 +2025-01-18T17:00,26.9 +2025-01-18T18:00,24.6 +2025-01-18T19:00,25.6 +2025-01-18T20:00,23.2 +2025-01-18T21:00,24.9 +2025-01-18T22:00,18.3 +2025-01-18T23:00,17.7 +2025-01-19T00:00,18.2 +2025-01-19T01:00,19.5 +2025-01-19T02:00,13.9 +2025-01-19T03:00,20.6 +2025-01-19T04:00,18.8 +2025-01-19T05:00,23.1 +2025-01-19T06:00,20.3 +2025-01-19T07:00,22.8 +2025-01-19T08:00,21.7 +2025-01-19T09:00,28.0 +2025-01-19T10:00,25.3 +2025-01-19T11:00,28.8 +2025-01-19T12:00,22.9 +2025-01-19T13:00,29.2 +2025-01-19T14:00,27.0 +2025-01-19T15:00,25.6 +2025-01-19T16:00,28.1 +2025-01-19T17:00,25.6 +2025-01-19T18:00,24.0 +2025-01-19T19:00,23.0 +2025-01-19T20:00,20.1 +2025-01-19T21:00,18.7 +2025-01-19T22:00,19.6 +2025-01-19T23:00,22.4 +2025-01-20T00:00,15.0 +2025-01-20T01:00,22.1 +2025-01-20T02:00,21.2 +2025-01-20T03:00,22.0 +2025-01-20T04:00,21.1 +2025-01-20T05:00,24.1 +2025-01-20T06:00,20.5 +2025-01-20T07:00,22.1 +2025-01-20T08:00,25.7 +2025-01-20T09:00,28.3 +2025-01-20T10:00,28.5 +2025-01-20T11:00,28.4 +2025-01-20T12:00,29.9 +2025-01-20T13:00,25.8 +2025-01-20T14:00,27.0 +2025-01-20T15:00,29.1 +2025-01-20T16:00,28.5 +2025-01-20T17:00,23.6 +2025-01-20T18:00,25.3 +2025-01-20T19:00,24.5 +2025-01-20T20:00,22.7 +2025-01-20T21:00,18.0 +2025-01-20T22:00,19.4 +2025-01-20T23:00,21.2 +2025-01-21T00:00,18.6 +2025-01-21T01:00,15.9 +2025-01-21T02:00,21.7 +2025-01-21T03:00,17.4 +2025-01-21T04:00,19.8 +2025-01-21T05:00,23.6 +2025-01-21T06:00,24.4 +2025-01-21T07:00,20.3 +2025-01-21T08:00,26.8 +2025-01-21T09:00,25.9 +2025-01-21T10:00,23.2 +2025-01-21T11:00,26.1 +2025-01-21T12:00,29.0 +2025-01-21T13:00,23.8 +2025-01-21T14:00,28.3 +2025-01-21T15:00,28.0 +2025-01-21T16:00,23.9 +2025-01-21T17:00,26.7 +2025-01-21T18:00,22.7 +2025-01-21T19:00,24.2 +2025-01-21T20:00,20.0 +2025-01-21T21:00,15.2 +2025-01-21T22:00,16.4 +2025-01-21T23:00,21.5 +2025-01-22T00:00,21.5 +2025-01-22T01:00,20.0 +2025-01-22T02:00,18.0 +2025-01-22T03:00,17.2 +2025-01-22T04:00,18.3 +2025-01-22T05:00,23.9 +2025-01-22T06:00,23.1 +2025-01-22T07:00,21.7 +2025-01-22T08:00,30.4 +2025-01-22T09:00,27.1 +2025-01-22T10:00,28.1 +2025-01-22T11:00,26.2 +2025-01-22T12:00,27.7 +2025-01-22T13:00,19.5 +2025-01-22T14:00,25.5 +2025-01-22T15:00,34.3 +2025-01-22T16:00,24.0 +2025-01-22T17:00,23.0 +2025-01-22T18:00,19.0 +2025-01-22T19:00,19.9 +2025-01-22T20:00,19.3 +2025-01-22T21:00,17.8 +2025-01-22T22:00,19.4 +2025-01-22T23:00,23.2 +2025-01-23T00:00,20.8 +2025-01-23T01:00,21.7 +2025-01-23T02:00,13.8 +2025-01-23T03:00,19.3 +2025-01-23T04:00,17.5 +2025-01-23T05:00,21.9 +2025-01-23T06:00,25.3 +2025-01-23T07:00,21.4 +2025-01-23T08:00,28.9 +2025-01-23T09:00,25.2 +2025-01-23T10:00,26.1 +2025-01-23T11:00,23.3 +2025-01-23T12:00,30.2 +2025-01-23T13:00,24.1 +2025-01-23T14:00,26.0 +2025-01-23T15:00,27.5 +2025-01-23T16:00,24.8 +2025-01-23T17:00,21.3 +2025-01-23T18:00,22.1 +2025-01-23T19:00,23.0 +2025-01-23T20:00,19.2 +2025-01-23T21:00,21.1 +2025-01-23T22:00,21.0 +2025-01-23T23:00,13.0 +2025-01-24T00:00,21.2 +2025-01-24T01:00,17.8 +2025-01-24T02:00,19.4 +2025-01-24T03:00,16.4 +2025-01-24T04:00,18.4 +2025-01-24T05:00,20.9 +2025-01-24T06:00,26.9 +2025-01-24T07:00,26.7 +2025-01-24T08:00,26.2 +2025-01-24T09:00,23.0 +2025-01-24T10:00,22.5 +2025-01-24T11:00,29.7 +2025-01-24T12:00,29.6 +2025-01-24T13:00,25.3 +2025-01-24T14:00,19.6 +2025-01-24T15:00,23.8 +2025-01-24T16:00,24.8 +2025-01-24T17:00,18.4 +2025-01-24T18:00,20.0 +2025-01-24T19:00,22.7 +2025-01-24T20:00,21.4 +2025-01-24T21:00,17.9 +2025-01-24T22:00,24.0 +2025-01-24T23:00,19.6 +2025-01-25T00:00,20.7 +2025-01-25T01:00,18.2 +2025-01-25T02:00,17.0 +2025-01-25T03:00,18.7 +2025-01-25T04:00,21.5 +2025-01-25T05:00,23.5 +2025-01-25T06:00,21.6 +2025-01-25T07:00,19.6 +2025-01-25T08:00,24.8 +2025-01-25T09:00,21.9 +2025-01-25T10:00,26.4 +2025-01-25T11:00,21.9 +2025-01-25T12:00,24.0 +2025-01-25T13:00,30.2 +2025-01-25T14:00,25.3 +2025-01-25T15:00,22.2 +2025-01-25T16:00,21.5 +2025-01-25T17:00,19.9 +2025-01-25T18:00,21.5 +2025-01-25T19:00,23.7 +2025-01-25T20:00,20.6 +2025-01-25T21:00,15.7 +2025-01-25T22:00,20.1 +2025-01-25T23:00,18.8 +2025-01-26T00:00,19.3 +2025-01-26T01:00,18.6 +2025-01-26T02:00,18.9 +2025-01-26T03:00,18.1 +2025-01-26T04:00,22.6 +2025-01-26T05:00,20.9 +2025-01-26T06:00,24.9 +2025-01-26T07:00,25.0 +2025-01-26T08:00,21.8 +2025-01-26T09:00,22.3 +2025-01-26T10:00,22.5 +2025-01-26T11:00,26.0 +2025-01-26T12:00,26.7 +2025-01-26T13:00,26.7 +2025-01-26T14:00,25.3 +2025-01-26T15:00,24.6 +2025-01-26T16:00,26.8 +2025-01-26T17:00,20.7 +2025-01-26T18:00,23.5 +2025-01-26T19:00,21.4 +2025-01-26T20:00,22.7 +2025-01-26T21:00,18.2 +2025-01-26T22:00,19.2 +2025-01-26T23:00,17.7 +2025-01-27T00:00,22.9 +2025-01-27T01:00,16.4 +2025-01-27T02:00,20.3 +2025-01-27T03:00,25.2 +2025-01-27T04:00,23.1 +2025-01-27T05:00,19.2 +2025-01-27T06:00,23.4 +2025-01-27T07:00,20.6 +2025-01-27T08:00,29.0 +2025-01-27T09:00,26.1 +2025-01-27T10:00,25.4 +2025-01-27T11:00,28.4 +2025-01-27T12:00,25.6 +2025-01-27T13:00,27.4 +2025-01-27T14:00,28.0 +2025-01-27T15:00,25.0 +2025-01-27T16:00,22.7 +2025-01-27T17:00,24.5 +2025-01-27T18:00,24.3 +2025-01-27T19:00,22.6 +2025-01-27T20:00,23.7 +2025-01-27T21:00,17.1 +2025-01-27T22:00,22.9 +2025-01-27T23:00,18.0 +2025-01-28T00:00,20.0 +2025-01-28T01:00,16.2 +2025-01-28T02:00,18.9 +2025-01-28T03:00,19.4 +2025-01-28T04:00,15.2 +2025-01-28T05:00,21.8 +2025-01-28T06:00,20.9 +2025-01-28T07:00,25.1 +2025-01-28T08:00,27.1 +2025-01-28T09:00,24.4 +2025-01-28T10:00,28.8 +2025-01-28T11:00,24.2 +2025-01-28T12:00,26.7 +2025-01-28T13:00,27.6 +2025-01-28T14:00,29.6 +2025-01-28T15:00,25.7 +2025-01-28T16:00,15.6 +2025-01-28T17:00,23.6 +2025-01-28T18:00,22.4 +2025-01-28T19:00,23.2 +2025-01-28T20:00,21.4 +2025-01-28T21:00,19.5 +2025-01-28T22:00,22.0 +2025-01-28T23:00,17.2 +2025-01-29T00:00,16.0 +2025-01-29T01:00,20.9 +2025-01-29T02:00,18.1 +2025-01-29T03:00,20.7 +2025-01-29T04:00,18.3 +2025-01-29T05:00,24.3 +2025-01-29T06:00,26.4 +2025-01-29T07:00,24.1 +2025-01-29T08:00,23.3 +2025-01-29T09:00,33.5 +2025-01-29T10:00,22.9 +2025-01-29T11:00,27.3 +2025-01-29T12:00,27.6 +2025-01-29T13:00,27.2 +2025-01-29T14:00,23.8 +2025-01-29T15:00,28.5 +2025-01-29T16:00,22.3 +2025-01-29T17:00,23.7 +2025-01-29T18:00,23.4 +2025-01-29T19:00,21.9 +2025-01-29T20:00,19.8 +2025-01-29T21:00,22.3 +2025-01-29T22:00,17.9 +2025-01-29T23:00,17.9 +2025-01-30T00:00,17.4 +2025-01-30T01:00,25.8 +2025-01-30T02:00,18.9 +2025-01-30T03:00,16.9 +2025-01-30T04:00,22.6 +2025-01-30T05:00,20.3 +2025-01-30T06:00,21.1 +2025-01-30T07:00,26.1 +2025-01-30T08:00,25.2 +2025-01-30T09:00,29.2 +2025-01-30T10:00,18.6 +2025-01-30T11:00,22.6 +2025-01-30T12:00,27.2 +2025-01-30T13:00,28.2 +2025-01-30T14:00,32.1 +2025-01-30T15:00,25.6 +2025-01-30T16:00,22.5 +2025-01-30T17:00,22.4 +2025-01-30T18:00,19.2 +2025-01-30T19:00,18.5 +2025-01-30T20:00,23.1 +2025-01-30T21:00,18.6 +2025-01-30T22:00,16.6 +2025-01-30T23:00,19.7 +2025-01-31T00:00,18.9 +2025-01-31T01:00,17.4 +2025-01-31T02:00,19.2 +2025-01-31T03:00,15.2 +2025-01-31T04:00,25.9 +2025-01-31T05:00,18.7 +2025-01-31T06:00,28.0 +2025-01-31T07:00,23.0 +2025-01-31T08:00,21.8 +2025-01-31T09:00,19.9 +2025-01-31T10:00,22.6 +2025-01-31T11:00,22.1 +2025-01-31T12:00,24.0 +2025-01-31T13:00,28.4 +2025-01-31T14:00,27.5 +2025-01-31T15:00,22.0 +2025-01-31T16:00,24.2 +2025-01-31T17:00,22.3 +2025-01-31T18:00,22.0 +2025-01-31T19:00,24.5 +2025-01-31T20:00,18.8 +2025-01-31T21:00,15.1 +2025-01-31T22:00,16.6 +2025-01-31T23:00,18.8 +2025-02-01T00:00,19.9 +2025-02-01T01:00,23.0 +2025-02-01T02:00,17.9 +2025-02-01T03:00,18.3 +2025-02-01T04:00,20.5 +2025-02-01T05:00,19.6 +2025-02-01T06:00,24.5 +2025-02-01T07:00,24.6 +2025-02-01T08:00,26.0 +2025-02-01T09:00,25.7 +2025-02-01T10:00,27.5 +2025-02-01T11:00,26.4 +2025-02-01T12:00,26.8 +2025-02-01T13:00,27.1 +2025-02-01T14:00,23.1 +2025-02-01T15:00,25.3 +2025-02-01T16:00,16.7 +2025-02-01T17:00,27.4 +2025-02-01T18:00,27.1 +2025-02-01T19:00,24.4 +2025-02-01T20:00,20.4 +2025-02-01T21:00,20.4 +2025-02-01T22:00,16.1 +2025-02-01T23:00,13.2 +2025-02-02T00:00,17.1 +2025-02-02T01:00,15.3 +2025-02-02T02:00,21.4 +2025-02-02T03:00,20.7 +2025-02-02T04:00,19.3 +2025-02-02T05:00,16.9 +2025-02-02T06:00,18.3 +2025-02-02T07:00,23.0 +2025-02-02T08:00,21.5 +2025-02-02T09:00,29.0 +2025-02-02T10:00,23.6 +2025-02-02T11:00,31.2 +2025-02-02T12:00,27.7 +2025-02-02T13:00,24.2 +2025-02-02T14:00,21.9 +2025-02-02T15:00,25.8 +2025-02-02T16:00,24.7 +2025-02-02T17:00,20.1 +2025-02-02T18:00,21.6 +2025-02-02T19:00,16.4 +2025-02-02T20:00,23.6 +2025-02-02T21:00,16.8 +2025-02-02T22:00,13.9 +2025-02-02T23:00,19.2 +2025-02-03T00:00,17.0 +2025-02-03T01:00,15.6 +2025-02-03T02:00,19.6 +2025-02-03T03:00,19.2 +2025-02-03T04:00,15.7 +2025-02-03T05:00,22.1 +2025-02-03T06:00,20.3 +2025-02-03T07:00,21.7 +2025-02-03T08:00,24.0 +2025-02-03T09:00,22.1 +2025-02-03T10:00,27.9 +2025-02-03T11:00,31.0 +2025-02-03T12:00,26.3 +2025-02-03T13:00,26.7 +2025-02-03T14:00,22.5 +2025-02-03T15:00,22.0 +2025-02-03T16:00,23.5 +2025-02-03T17:00,21.9 +2025-02-03T18:00,18.7 +2025-02-03T19:00,20.7 +2025-02-03T20:00,19.5 +2025-02-03T21:00,16.0 +2025-02-03T22:00,17.8 +2025-02-03T23:00,18.8 +2025-02-04T00:00,15.8 +2025-02-04T01:00,20.6 +2025-02-04T02:00,19.2 +2025-02-04T03:00,18.0 +2025-02-04T04:00,20.3 +2025-02-04T05:00,21.0 +2025-02-04T06:00,19.4 +2025-02-04T07:00,25.7 +2025-02-04T08:00,22.9 +2025-02-04T09:00,25.4 +2025-02-04T10:00,32.3 +2025-02-04T11:00,26.1 +2025-02-04T12:00,31.1 +2025-02-04T13:00,26.2 +2025-02-04T14:00,24.4 +2025-02-04T15:00,27.5 +2025-02-04T16:00,25.8 +2025-02-04T17:00,23.1 +2025-02-04T18:00,18.9 +2025-02-04T19:00,20.4 +2025-02-04T20:00,18.8 +2025-02-04T21:00,18.3 +2025-02-04T22:00,19.4 +2025-02-04T23:00,17.8 +2025-02-05T00:00,16.1 +2025-02-05T01:00,16.4 +2025-02-05T02:00,20.2 +2025-02-05T03:00,13.7 +2025-02-05T04:00,19.4 +2025-02-05T05:00,19.8 +2025-02-05T06:00,23.2 +2025-02-05T07:00,27.1 +2025-02-05T08:00,26.0 +2025-02-05T09:00,26.5 +2025-02-05T10:00,20.4 +2025-02-05T11:00,26.1 +2025-02-05T12:00,27.5 +2025-02-05T13:00,28.4 +2025-02-05T14:00,27.0 +2025-02-05T15:00,25.9 +2025-02-05T16:00,24.3 +2025-02-05T17:00,20.1 +2025-02-05T18:00,20.0 +2025-02-05T19:00,21.2 +2025-02-05T20:00,24.0 +2025-02-05T21:00,23.0 +2025-02-05T22:00,20.6 +2025-02-05T23:00,15.4 +2025-02-06T00:00,17.4 +2025-02-06T01:00,21.6 +2025-02-06T02:00,18.3 +2025-02-06T03:00,19.8 +2025-02-06T04:00,20.8 +2025-02-06T05:00,20.4 +2025-02-06T06:00,21.1 +2025-02-06T07:00,25.4 +2025-02-06T08:00,28.2 +2025-02-06T09:00,25.5 +2025-02-06T10:00,24.5 +2025-02-06T11:00,28.0 +2025-02-06T12:00,21.3 +2025-02-06T13:00,21.2 +2025-02-06T14:00,27.2 +2025-02-06T15:00,28.4 +2025-02-06T16:00,20.6 +2025-02-06T17:00,20.0 +2025-02-06T18:00,19.1 +2025-02-06T19:00,19.2 +2025-02-06T20:00,22.1 +2025-02-06T21:00,18.8 +2025-02-06T22:00,16.9 +2025-02-06T23:00,15.0 +2025-02-07T00:00,15.9 +2025-02-07T01:00,18.3 +2025-02-07T02:00,15.1 +2025-02-07T03:00,22.0 +2025-02-07T04:00,21.2 +2025-02-07T05:00,24.9 +2025-02-07T06:00,20.8 +2025-02-07T07:00,20.4 +2025-02-07T08:00,21.3 +2025-02-07T09:00,24.8 +2025-02-07T10:00,23.0 +2025-02-07T11:00,24.5 +2025-02-07T12:00,18.2 +2025-02-07T13:00,29.7 +2025-02-07T14:00,25.9 +2025-02-07T15:00,23.3 +2025-02-07T16:00,23.0 +2025-02-07T17:00,23.6 +2025-02-07T18:00,20.9 +2025-02-07T19:00,25.7 +2025-02-07T20:00,21.1 +2025-02-07T21:00,20.6 +2025-02-07T22:00,21.1 +2025-02-07T23:00,22.1 +2025-02-08T00:00,18.5 +2025-02-08T01:00,19.0 +2025-02-08T02:00,15.0 +2025-02-08T03:00,16.2 +2025-02-08T04:00,20.1 +2025-02-08T05:00,16.6 +2025-02-08T06:00,19.1 +2025-02-08T07:00,26.2 +2025-02-08T08:00,23.0 +2025-02-08T09:00,21.8 +2025-02-08T10:00,28.9 +2025-02-08T11:00,27.0 +2025-02-08T12:00,25.3 +2025-02-08T13:00,24.7 +2025-02-08T14:00,25.1 +2025-02-08T15:00,26.8 +2025-02-08T16:00,18.8 +2025-02-08T17:00,19.9 +2025-02-08T18:00,21.3 +2025-02-08T19:00,26.8 +2025-02-08T20:00,20.5 +2025-02-08T21:00,15.2 +2025-02-08T22:00,17.8 +2025-02-08T23:00,19.3 +2025-02-09T00:00,13.6 +2025-02-09T01:00,18.3 +2025-02-09T02:00,18.2 +2025-02-09T03:00,18.9 +2025-02-09T04:00,17.7 +2025-02-09T05:00,22.3 +2025-02-09T06:00,22.9 +2025-02-09T07:00,23.0 +2025-02-09T08:00,25.4 +2025-02-09T09:00,21.6 +2025-02-09T10:00,22.6 +2025-02-09T11:00,29.6 +2025-02-09T12:00,22.4 +2025-02-09T13:00,25.8 +2025-02-09T14:00,25.7 +2025-02-09T15:00,20.2 +2025-02-09T16:00,25.3 +2025-02-09T17:00,25.3 +2025-02-09T18:00,18.9 +2025-02-09T19:00,21.4 +2025-02-09T20:00,13.6 +2025-02-09T21:00,14.9 +2025-02-09T22:00,17.7 +2025-02-09T23:00,17.3 +2025-02-10T00:00,18.3 +2025-02-10T01:00,19.3 +2025-02-10T02:00,16.1 +2025-02-10T03:00,12.1 +2025-02-10T04:00,19.3 +2025-02-10T05:00,21.2 +2025-02-10T06:00,20.8 +2025-02-10T07:00,22.5 +2025-02-10T08:00,27.1 +2025-02-10T09:00,24.8 +2025-02-10T10:00,26.9 +2025-02-10T11:00,24.7 +2025-02-10T12:00,28.9 +2025-02-10T13:00,27.3 +2025-02-10T14:00,21.4 +2025-02-10T15:00,20.9 +2025-02-10T16:00,21.6 +2025-02-10T17:00,18.7 +2025-02-10T18:00,18.9 +2025-02-10T19:00,19.7 +2025-02-10T20:00,19.6 +2025-02-10T21:00,20.9 +2025-02-10T22:00,13.6 +2025-02-10T23:00,17.4 +2025-02-11T00:00,19.1 +2025-02-11T01:00,11.9 +2025-02-11T02:00,17.8 +2025-02-11T03:00,15.3 +2025-02-11T04:00,18.4 +2025-02-11T05:00,17.4 +2025-02-11T06:00,16.4 +2025-02-11T07:00,21.9 +2025-02-11T08:00,22.6 +2025-02-11T09:00,26.5 +2025-02-11T10:00,27.7 +2025-02-11T11:00,25.2 +2025-02-11T12:00,27.0 +2025-02-11T13:00,21.3 +2025-02-11T14:00,22.9 +2025-02-11T15:00,24.2 +2025-02-11T16:00,20.4 +2025-02-11T17:00,16.6 +2025-02-11T18:00,20.9 +2025-02-11T19:00,22.1 +2025-02-11T20:00,19.2 +2025-02-11T21:00,18.0 +2025-02-11T22:00,17.3 +2025-02-11T23:00,16.5 +2025-02-12T00:00,12.9 +2025-02-12T01:00,17.3 +2025-02-12T02:00,15.9 +2025-02-12T03:00,18.9 +2025-02-12T04:00,18.1 +2025-02-12T05:00,18.8 +2025-02-12T06:00,19.2 +2025-02-12T07:00,19.0 +2025-02-12T08:00,23.2 +2025-02-12T09:00,21.2 +2025-02-12T10:00,22.1 +2025-02-12T11:00,21.8 +2025-02-12T12:00,24.5 +2025-02-12T13:00,25.5 +2025-02-12T14:00,22.4 +2025-02-12T15:00,22.2 +2025-02-12T16:00,23.4 +2025-02-12T17:00,30.6 +2025-02-12T18:00,20.2 +2025-02-12T19:00,17.2 +2025-02-12T20:00,18.1 +2025-02-12T21:00,16.4 +2025-02-12T22:00,16.2 +2025-02-12T23:00,13.8 +2025-02-13T00:00,19.4 +2025-02-13T01:00,20.2 +2025-02-13T02:00,16.8 +2025-02-13T03:00,18.5 +2025-02-13T04:00,18.7 +2025-02-13T05:00,17.4 +2025-02-13T06:00,18.6 +2025-02-13T07:00,24.8 +2025-02-13T08:00,21.0 +2025-02-13T09:00,22.7 +2025-02-13T10:00,23.4 +2025-02-13T11:00,20.2 +2025-02-13T12:00,25.3 +2025-02-13T13:00,27.7 +2025-02-13T14:00,22.3 +2025-02-13T15:00,22.7 +2025-02-13T16:00,25.3 +2025-02-13T17:00,19.8 +2025-02-13T18:00,22.6 +2025-02-13T19:00,17.6 +2025-02-13T20:00,15.4 +2025-02-13T21:00,14.6 +2025-02-13T22:00,17.7 +2025-02-13T23:00,14.6 +2025-02-14T00:00,15.7 +2025-02-14T01:00,19.6 +2025-02-14T02:00,9.6 +2025-02-14T03:00,16.9 +2025-02-14T04:00,21.8 +2025-02-14T05:00,13.8 +2025-02-14T06:00,20.1 +2025-02-14T07:00,19.6 +2025-02-14T08:00,24.7 +2025-02-14T09:00,21.7 +2025-02-14T10:00,24.0 +2025-02-14T11:00,21.9 +2025-02-14T12:00,24.8 +2025-02-14T13:00,22.6 +2025-02-14T14:00,24.8 +2025-02-14T15:00,24.5 +2025-02-14T16:00,25.6 +2025-02-14T17:00,23.0 +2025-02-14T18:00,19.7 +2025-02-14T19:00,19.7 +2025-02-14T20:00,14.5 +2025-02-14T21:00,21.4 +2025-02-14T22:00,15.4 +2025-02-14T23:00,14.4 +2025-02-15T00:00,16.5 +2025-02-15T01:00,16.6 +2025-02-15T02:00,17.9 +2025-02-15T03:00,20.8 +2025-02-15T04:00,17.4 +2025-02-15T05:00,21.5 +2025-02-15T06:00,19.6 +2025-02-15T07:00,19.8 +2025-02-15T08:00,24.1 +2025-02-15T09:00,24.3 +2025-02-15T10:00,22.5 +2025-02-15T11:00,24.8 +2025-02-15T12:00,23.0 +2025-02-15T13:00,23.9 +2025-02-15T14:00,24.8 +2025-02-15T15:00,22.2 +2025-02-15T16:00,18.3 +2025-02-15T17:00,18.8 +2025-02-15T18:00,17.9 +2025-02-15T19:00,20.2 +2025-02-15T20:00,17.3 +2025-02-15T21:00,15.5 +2025-02-15T22:00,20.7 +2025-02-15T23:00,18.0 +2025-02-16T00:00,20.2 +2025-02-16T01:00,21.1 +2025-02-16T02:00,15.7 +2025-02-16T03:00,20.6 +2025-02-16T04:00,24.0 +2025-02-16T05:00,21.4 +2025-02-16T06:00,21.1 +2025-02-16T07:00,17.4 +2025-02-16T08:00,22.6 +2025-02-16T09:00,24.1 +2025-02-16T10:00,28.3 +2025-02-16T11:00,27.9 +2025-02-16T12:00,23.0 +2025-02-16T13:00,20.8 +2025-02-16T14:00,22.3 +2025-02-16T15:00,23.0 +2025-02-16T16:00,23.4 +2025-02-16T17:00,18.2 +2025-02-16T18:00,18.0 +2025-02-16T19:00,20.1 +2025-02-16T20:00,18.2 +2025-02-16T21:00,14.6 +2025-02-16T22:00,17.6 +2025-02-16T23:00,17.8 +2025-02-17T00:00,14.4 +2025-02-17T01:00,10.4 +2025-02-17T02:00,19.7 +2025-02-17T03:00,14.2 +2025-02-17T04:00,18.2 +2025-02-17T05:00,17.3 +2025-02-17T06:00,19.4 +2025-02-17T07:00,22.9 +2025-02-17T08:00,22.6 +2025-02-17T09:00,24.1 +2025-02-17T10:00,20.6 +2025-02-17T11:00,23.8 +2025-02-17T12:00,23.2 +2025-02-17T13:00,22.5 +2025-02-17T14:00,25.0 +2025-02-17T15:00,20.9 +2025-02-17T16:00,19.8 +2025-02-17T17:00,18.9 +2025-02-17T18:00,19.1 +2025-02-17T19:00,23.3 +2025-02-17T20:00,18.2 +2025-02-17T21:00,16.1 +2025-02-17T22:00,15.8 +2025-02-17T23:00,17.5 +2025-02-18T00:00,15.5 +2025-02-18T01:00,14.5 +2025-02-18T02:00,17.1 +2025-02-18T03:00,17.1 +2025-02-18T04:00,19.5 +2025-02-18T05:00,17.5 +2025-02-18T06:00,18.3 +2025-02-18T07:00,23.1 +2025-02-18T08:00,26.8 +2025-02-18T09:00,19.9 +2025-02-18T10:00,25.0 +2025-02-18T11:00,25.7 +2025-02-18T12:00,21.9 +2025-02-18T13:00,28.6 +2025-02-18T14:00,25.6 +2025-02-18T15:00,26.6 +2025-02-18T16:00,24.5 +2025-02-18T17:00,21.3 +2025-02-18T18:00,20.8 +2025-02-18T19:00,17.4 +2025-02-18T20:00,16.4 +2025-02-18T21:00,16.8 +2025-02-18T22:00,16.7 +2025-02-18T23:00,18.3 +2025-02-19T00:00,17.9 +2025-02-19T01:00,15.4 +2025-02-19T02:00,16.9 +2025-02-19T03:00,19.1 +2025-02-19T04:00,24.8 +2025-02-19T05:00,19.9 +2025-02-19T06:00,23.2 +2025-02-19T07:00,23.0 +2025-02-19T08:00,22.5 +2025-02-19T09:00,22.8 +2025-02-19T10:00,22.0 +2025-02-19T11:00,23.8 +2025-02-19T12:00,22.7 +2025-02-19T13:00,25.0 +2025-02-19T14:00,23.3 +2025-02-19T15:00,19.4 +2025-02-19T16:00,24.1 +2025-02-19T17:00,26.2 +2025-02-19T18:00,22.9 +2025-02-19T19:00,20.0 +2025-02-19T20:00,12.4 +2025-02-19T21:00,17.5 +2025-02-19T22:00,19.9 +2025-02-19T23:00,18.6 +2025-02-20T00:00,14.3 +2025-02-20T01:00,18.0 +2025-02-20T02:00,17.7 +2025-02-20T03:00,16.4 +2025-02-20T04:00,18.5 +2025-02-20T05:00,21.4 +2025-02-20T06:00,21.9 +2025-02-20T07:00,19.1 +2025-02-20T08:00,22.3 +2025-02-20T09:00,19.6 +2025-02-20T10:00,23.1 +2025-02-20T11:00,20.9 +2025-02-20T12:00,27.0 +2025-02-20T13:00,26.8 +2025-02-20T14:00,25.3 +2025-02-20T15:00,22.7 +2025-02-20T16:00,21.5 +2025-02-20T17:00,22.4 +2025-02-20T18:00,17.5 +2025-02-20T19:00,24.5 +2025-02-20T20:00,17.2 +2025-02-20T21:00,16.2 +2025-02-20T22:00,20.0 +2025-02-20T23:00,15.7 +2025-02-21T00:00,16.4 +2025-02-21T01:00,15.7 +2025-02-21T02:00,12.7 +2025-02-21T03:00,19.3 +2025-02-21T04:00,17.0 +2025-02-21T05:00,18.1 +2025-02-21T06:00,22.2 +2025-02-21T07:00,20.2 +2025-02-21T08:00,24.5 +2025-02-21T09:00,19.3 +2025-02-21T10:00,20.9 +2025-02-21T11:00,20.3 +2025-02-21T12:00,24.6 +2025-02-21T13:00,26.3 +2025-02-21T14:00,24.5 +2025-02-21T15:00,22.9 +2025-02-21T16:00,22.7 +2025-02-21T17:00,18.9 +2025-02-21T18:00,22.3 +2025-02-21T19:00,20.4 +2025-02-21T20:00,23.9 +2025-02-21T21:00,17.5 +2025-02-21T22:00,20.4 +2025-02-21T23:00,17.6 +2025-02-22T00:00,16.1 +2025-02-22T01:00,19.5 +2025-02-22T02:00,12.3 +2025-02-22T03:00,14.5 +2025-02-22T04:00,15.3 +2025-02-22T05:00,17.9 +2025-02-22T06:00,18.1 +2025-02-22T07:00,21.7 +2025-02-22T08:00,21.1 +2025-02-22T09:00,20.1 +2025-02-22T10:00,25.5 +2025-02-22T11:00,27.3 +2025-02-22T12:00,25.5 +2025-02-22T13:00,23.5 +2025-02-22T14:00,26.4 +2025-02-22T15:00,23.9 +2025-02-22T16:00,18.8 +2025-02-22T17:00,19.0 +2025-02-22T18:00,17.6 +2025-02-22T19:00,16.9 +2025-02-22T20:00,14.6 +2025-02-22T21:00,12.5 +2025-02-22T22:00,12.7 +2025-02-22T23:00,21.0 +2025-02-23T00:00,15.1 +2025-02-23T01:00,13.1 +2025-02-23T02:00,16.0 +2025-02-23T03:00,16.8 +2025-02-23T04:00,17.5 +2025-02-23T05:00,18.9 +2025-02-23T06:00,19.1 +2025-02-23T07:00,26.2 +2025-02-23T08:00,22.4 +2025-02-23T09:00,23.8 +2025-02-23T10:00,22.7 +2025-02-23T11:00,22.5 +2025-02-23T12:00,23.3 +2025-02-23T13:00,21.4 +2025-02-23T14:00,20.8 +2025-02-23T15:00,23.9 +2025-02-23T16:00,16.4 +2025-02-23T17:00,22.7 +2025-02-23T18:00,22.4 +2025-02-23T19:00,16.2 +2025-02-23T20:00,16.9 +2025-02-23T21:00,15.5 +2025-02-23T22:00,16.7 +2025-02-23T23:00,15.6 +2025-02-24T00:00,12.9 +2025-02-24T01:00,17.9 +2025-02-24T02:00,15.5 +2025-02-24T03:00,15.4 +2025-02-24T04:00,18.3 +2025-02-24T05:00,16.5 +2025-02-24T06:00,16.6 +2025-02-24T07:00,23.2 +2025-02-24T08:00,21.0 +2025-02-24T09:00,26.9 +2025-02-24T10:00,21.1 +2025-02-24T11:00,27.0 +2025-02-24T12:00,23.6 +2025-02-24T13:00,19.5 +2025-02-24T14:00,24.1 +2025-02-24T15:00,24.6 +2025-02-24T16:00,23.8 +2025-02-24T17:00,17.9 +2025-02-24T18:00,21.9 +2025-02-24T19:00,13.6 +2025-02-24T20:00,18.5 +2025-02-24T21:00,17.2 +2025-02-24T22:00,22.3 +2025-02-24T23:00,16.8 +2025-02-25T00:00,11.2 +2025-02-25T01:00,15.0 +2025-02-25T02:00,15.5 +2025-02-25T03:00,14.4 +2025-02-25T04:00,16.2 +2025-02-25T05:00,20.0 +2025-02-25T06:00,17.5 +2025-02-25T07:00,21.0 +2025-02-25T08:00,21.1 +2025-02-25T09:00,22.7 +2025-02-25T10:00,18.8 +2025-02-25T11:00,22.3 +2025-02-25T12:00,22.7 +2025-02-25T13:00,23.2 +2025-02-25T14:00,21.7 +2025-02-25T15:00,18.2 +2025-02-25T16:00,15.4 +2025-02-25T17:00,22.0 +2025-02-25T18:00,15.4 +2025-02-25T19:00,16.0 +2025-02-25T20:00,17.7 +2025-02-25T21:00,18.9 +2025-02-25T22:00,11.4 +2025-02-25T23:00,10.9 +2025-02-26T00:00,18.5 +2025-02-26T01:00,13.5 +2025-02-26T02:00,13.0 +2025-02-26T03:00,15.9 +2025-02-26T04:00,17.0 +2025-02-26T05:00,18.8 +2025-02-26T06:00,18.0 +2025-02-26T07:00,19.8 +2025-02-26T08:00,23.4 +2025-02-26T09:00,23.0 +2025-02-26T10:00,18.7 +2025-02-26T11:00,26.8 +2025-02-26T12:00,25.0 +2025-02-26T13:00,25.5 +2025-02-26T14:00,25.5 +2025-02-26T15:00,22.7 +2025-02-26T16:00,19.3 +2025-02-26T17:00,19.3 +2025-02-26T18:00,21.9 +2025-02-26T19:00,17.8 +2025-02-26T20:00,16.9 +2025-02-26T21:00,16.0 +2025-02-26T22:00,16.7 +2025-02-26T23:00,13.8 +2025-02-27T00:00,16.6 +2025-02-27T01:00,15.8 +2025-02-27T02:00,18.1 +2025-02-27T03:00,16.6 +2025-02-27T04:00,16.0 +2025-02-27T05:00,16.5 +2025-02-27T06:00,17.5 +2025-02-27T07:00,20.3 +2025-02-27T08:00,23.6 +2025-02-27T09:00,21.8 +2025-02-27T10:00,19.7 +2025-02-27T11:00,27.6 +2025-02-27T12:00,18.9 +2025-02-27T13:00,21.1 +2025-02-27T14:00,25.8 +2025-02-27T15:00,17.3 +2025-02-27T16:00,18.9 +2025-02-27T17:00,17.3 +2025-02-27T18:00,17.5 +2025-02-27T19:00,15.3 +2025-02-27T20:00,16.9 +2025-02-27T21:00,20.7 +2025-02-27T22:00,12.2 +2025-02-27T23:00,12.5 +2025-02-28T00:00,15.3 +2025-02-28T01:00,16.4 +2025-02-28T02:00,14.4 +2025-02-28T03:00,21.4 +2025-02-28T04:00,21.0 +2025-02-28T05:00,16.7 +2025-02-28T06:00,23.1 +2025-02-28T07:00,22.6 +2025-02-28T08:00,22.4 +2025-02-28T09:00,19.8 +2025-02-28T10:00,19.4 +2025-02-28T11:00,22.9 +2025-02-28T12:00,22.9 +2025-02-28T13:00,18.3 +2025-02-28T14:00,23.8 +2025-02-28T15:00,22.8 +2025-02-28T16:00,23.0 +2025-02-28T17:00,15.3 +2025-02-28T18:00,14.6 +2025-02-28T19:00,14.9 +2025-02-28T20:00,22.3 +2025-02-28T21:00,16.7 +2025-02-28T22:00,17.5 +2025-02-28T23:00,15.5 +2025-03-01T00:00,13.6 +2025-03-01T01:00,16.9 +2025-03-01T02:00,14.3 +2025-03-01T03:00,15.6 +2025-03-01T04:00,19.9 +2025-03-01T05:00,16.9 +2025-03-01T06:00,22.9 +2025-03-01T07:00,18.3 +2025-03-01T08:00,17.3 +2025-03-01T09:00,22.6 +2025-03-01T10:00,22.7 +2025-03-01T11:00,21.7 +2025-03-01T12:00,20.6 +2025-03-01T13:00,24.7 +2025-03-01T14:00,22.8 +2025-03-01T15:00,22.4 +2025-03-01T16:00,24.9 +2025-03-01T17:00,18.2 +2025-03-01T18:00,19.6 +2025-03-01T19:00,18.8 +2025-03-01T20:00,15.3 +2025-03-01T21:00,16.0 +2025-03-01T22:00,16.1 +2025-03-01T23:00,15.2 +2025-03-02T00:00,14.0 +2025-03-02T01:00,14.1 +2025-03-02T02:00,17.5 +2025-03-02T03:00,15.7 +2025-03-02T04:00,19.5 +2025-03-02T05:00,19.0 +2025-03-02T06:00,16.7 +2025-03-02T07:00,19.9 +2025-03-02T08:00,22.0 +2025-03-02T09:00,24.9 +2025-03-02T10:00,23.3 +2025-03-02T11:00,22.8 +2025-03-02T12:00,24.0 +2025-03-02T13:00,22.9 +2025-03-02T14:00,23.3 +2025-03-02T15:00,20.3 +2025-03-02T16:00,18.5 +2025-03-02T17:00,19.6 +2025-03-02T18:00,16.0 +2025-03-02T19:00,13.7 +2025-03-02T20:00,14.0 +2025-03-02T21:00,17.6 +2025-03-02T22:00,20.2 +2025-03-02T23:00,13.1 +2025-03-03T00:00,14.3 +2025-03-03T01:00,21.0 +2025-03-03T02:00,15.9 +2025-03-03T03:00,17.6 +2025-03-03T04:00,15.3 +2025-03-03T05:00,19.8 +2025-03-03T06:00,21.8 +2025-03-03T07:00,16.9 +2025-03-03T08:00,19.1 +2025-03-03T09:00,17.9 +2025-03-03T10:00,21.5 +2025-03-03T11:00,21.4 +2025-03-03T12:00,24.8 +2025-03-03T13:00,22.7 +2025-03-03T14:00,20.6 +2025-03-03T15:00,16.6 +2025-03-03T16:00,21.4 +2025-03-03T17:00,17.7 +2025-03-03T18:00,17.2 +2025-03-03T19:00,16.2 +2025-03-03T20:00,17.3 +2025-03-03T21:00,14.6 +2025-03-03T22:00,14.9 +2025-03-03T23:00,12.7 +2025-03-04T00:00,12.6 +2025-03-04T01:00,13.5 +2025-03-04T02:00,12.9 +2025-03-04T03:00,19.5 +2025-03-04T04:00,15.9 +2025-03-04T05:00,15.6 +2025-03-04T06:00,14.5 +2025-03-04T07:00,18.6 +2025-03-04T08:00,17.0 +2025-03-04T09:00,20.3 +2025-03-04T10:00,24.6 +2025-03-04T11:00,21.8 +2025-03-04T12:00,23.7 +2025-03-04T13:00,22.9 +2025-03-04T14:00,19.4 +2025-03-04T15:00,22.1 +2025-03-04T16:00,19.0 +2025-03-04T17:00,22.1 +2025-03-04T18:00,18.6 +2025-03-04T19:00,14.5 +2025-03-04T20:00,13.3 +2025-03-04T21:00,18.5 +2025-03-04T22:00,13.7 +2025-03-04T23:00,12.3 +2025-03-05T00:00,13.7 +2025-03-05T01:00,14.1 +2025-03-05T02:00,16.9 +2025-03-05T03:00,18.2 +2025-03-05T04:00,16.9 +2025-03-05T05:00,21.3 +2025-03-05T06:00,19.8 +2025-03-05T07:00,14.0 +2025-03-05T08:00,19.7 +2025-03-05T09:00,20.2 +2025-03-05T10:00,23.0 +2025-03-05T11:00,23.6 +2025-03-05T12:00,21.9 +2025-03-05T13:00,26.7 +2025-03-05T14:00,18.9 +2025-03-05T15:00,23.1 +2025-03-05T16:00,20.3 +2025-03-05T17:00,21.2 +2025-03-05T18:00,18.6 +2025-03-05T19:00,19.9 +2025-03-05T20:00,16.1 +2025-03-05T21:00,13.4 +2025-03-05T22:00,11.7 +2025-03-05T23:00,15.7 +2025-03-06T00:00,9.1 +2025-03-06T01:00,8.6 +2025-03-06T02:00,15.0 +2025-03-06T03:00,17.9 +2025-03-06T04:00,17.5 +2025-03-06T05:00,13.9 +2025-03-06T06:00,21.0 +2025-03-06T07:00,19.5 +2025-03-06T08:00,23.0 +2025-03-06T09:00,25.9 +2025-03-06T10:00,18.8 +2025-03-06T11:00,23.7 +2025-03-06T12:00,27.1 +2025-03-06T13:00,26.5 +2025-03-06T14:00,19.8 +2025-03-06T15:00,22.8 +2025-03-06T16:00,19.3 +2025-03-06T17:00,15.7 +2025-03-06T18:00,19.2 +2025-03-06T19:00,16.9 +2025-03-06T20:00,14.0 +2025-03-06T21:00,17.1 +2025-03-06T22:00,17.8 +2025-03-06T23:00,9.5 +2025-03-07T00:00,10.7 +2025-03-07T01:00,12.1 +2025-03-07T02:00,18.9 +2025-03-07T03:00,12.8 +2025-03-07T04:00,19.8 +2025-03-07T05:00,20.0 +2025-03-07T06:00,17.7 +2025-03-07T07:00,21.0 +2025-03-07T08:00,22.2 +2025-03-07T09:00,18.5 +2025-03-07T10:00,19.6 +2025-03-07T11:00,15.4 +2025-03-07T12:00,22.5 +2025-03-07T13:00,21.9 +2025-03-07T14:00,21.1 +2025-03-07T15:00,23.0 +2025-03-07T16:00,19.9 +2025-03-07T17:00,20.7 +2025-03-07T18:00,17.8 +2025-03-07T19:00,20.2 +2025-03-07T20:00,16.1 +2025-03-07T21:00,15.0 +2025-03-07T22:00,17.5 +2025-03-07T23:00,19.0 +2025-03-08T00:00,14.7 +2025-03-08T01:00,12.8 +2025-03-08T02:00,15.0 +2025-03-08T03:00,12.4 +2025-03-08T04:00,22.0 +2025-03-08T05:00,14.6 +2025-03-08T06:00,19.0 +2025-03-08T07:00,16.2 +2025-03-08T08:00,24.5 +2025-03-08T09:00,20.8 +2025-03-08T10:00,23.3 +2025-03-08T11:00,22.7 +2025-03-08T12:00,24.0 +2025-03-08T13:00,20.8 +2025-03-08T14:00,24.4 +2025-03-08T15:00,22.7 +2025-03-08T16:00,20.5 +2025-03-08T17:00,17.8 +2025-03-08T18:00,18.3 +2025-03-08T19:00,20.9 +2025-03-08T20:00,14.9 +2025-03-08T21:00,15.7 +2025-03-08T22:00,17.7 +2025-03-08T23:00,15.3 +2025-03-09T00:00,17.2 +2025-03-09T01:00,13.5 +2025-03-09T02:00,17.3 +2025-03-09T03:00,12.8 +2025-03-09T04:00,18.0 +2025-03-09T05:00,16.4 +2025-03-09T06:00,18.6 +2025-03-09T07:00,16.1 +2025-03-09T08:00,20.9 +2025-03-09T09:00,23.3 +2025-03-09T10:00,27.1 +2025-03-09T11:00,23.5 +2025-03-09T12:00,20.7 +2025-03-09T13:00,23.8 +2025-03-09T14:00,21.9 +2025-03-09T15:00,21.5 +2025-03-09T16:00,18.2 +2025-03-09T17:00,19.7 +2025-03-09T18:00,19.0 +2025-03-09T19:00,18.3 +2025-03-09T20:00,11.4 +2025-03-09T21:00,16.1 +2025-03-09T22:00,16.5 +2025-03-09T23:00,12.1 +2025-03-10T00:00,13.4 +2025-03-10T01:00,7.7 +2025-03-10T02:00,9.8 +2025-03-10T03:00,14.9 +2025-03-10T04:00,16.0 +2025-03-10T05:00,13.4 +2025-03-10T06:00,21.6 +2025-03-10T07:00,23.1 +2025-03-10T08:00,21.1 +2025-03-10T09:00,20.4 +2025-03-10T10:00,26.9 +2025-03-10T11:00,19.1 +2025-03-10T12:00,22.2 +2025-03-10T13:00,15.5 +2025-03-10T14:00,23.7 +2025-03-10T15:00,23.7 +2025-03-10T16:00,14.5 +2025-03-10T17:00,20.3 +2025-03-10T18:00,17.4 +2025-03-10T19:00,21.1 +2025-03-10T20:00,13.5 +2025-03-10T21:00,11.2 +2025-03-10T22:00,11.1 +2025-03-10T23:00,11.0 +2025-03-11T00:00,12.3 +2025-03-11T01:00,15.6 +2025-03-11T02:00,13.9 +2025-03-11T03:00,14.2 +2025-03-11T04:00,16.5 +2025-03-11T05:00,16.1 +2025-03-11T06:00,14.9 +2025-03-11T07:00,18.3 +2025-03-11T08:00,17.3 +2025-03-11T09:00,16.0 +2025-03-11T10:00,21.3 +2025-03-11T11:00,21.9 +2025-03-11T12:00,20.2 +2025-03-11T13:00,21.2 +2025-03-11T14:00,20.2 +2025-03-11T15:00,23.3 +2025-03-11T16:00,12.8 +2025-03-11T17:00,19.7 +2025-03-11T18:00,14.4 +2025-03-11T19:00,16.8 +2025-03-11T20:00,14.9 +2025-03-11T21:00,14.9 +2025-03-11T22:00,18.4 +2025-03-11T23:00,15.1 +2025-03-12T00:00,18.1 +2025-03-12T01:00,18.1 +2025-03-12T02:00,10.2 +2025-03-12T03:00,17.2 +2025-03-12T04:00,17.2 +2025-03-12T05:00,20.1 +2025-03-12T06:00,13.7 +2025-03-12T07:00,17.4 +2025-03-12T08:00,23.5 +2025-03-12T09:00,19.7 +2025-03-12T10:00,19.9 +2025-03-12T11:00,24.1 +2025-03-12T12:00,21.0 +2025-03-12T13:00,21.0 +2025-03-12T14:00,24.8 +2025-03-12T15:00,22.1 +2025-03-12T16:00,14.5 +2025-03-12T17:00,15.8 +2025-03-12T18:00,17.0 +2025-03-12T19:00,14.4 +2025-03-12T20:00,17.8 +2025-03-12T21:00,14.5 +2025-03-12T22:00,12.7 +2025-03-12T23:00,13.4 +2025-03-13T00:00,16.0 +2025-03-13T01:00,13.4 +2025-03-13T02:00,14.5 +2025-03-13T03:00,13.4 +2025-03-13T04:00,17.4 +2025-03-13T05:00,18.1 +2025-03-13T06:00,16.5 +2025-03-13T07:00,20.0 +2025-03-13T08:00,21.2 +2025-03-13T09:00,19.9 +2025-03-13T10:00,17.3 +2025-03-13T11:00,24.4 +2025-03-13T12:00,20.1 +2025-03-13T13:00,18.6 +2025-03-13T14:00,19.4 +2025-03-13T15:00,19.8 +2025-03-13T16:00,17.5 +2025-03-13T17:00,20.4 +2025-03-13T18:00,16.1 +2025-03-13T19:00,14.6 +2025-03-13T20:00,17.0 +2025-03-13T21:00,18.3 +2025-03-13T22:00,15.0 +2025-03-13T23:00,13.7 +2025-03-14T00:00,9.9 +2025-03-14T01:00,14.4 +2025-03-14T02:00,14.3 +2025-03-14T03:00,15.5 +2025-03-14T04:00,13.2 +2025-03-14T05:00,15.9 +2025-03-14T06:00,17.8 +2025-03-14T07:00,22.5 +2025-03-14T08:00,14.3 +2025-03-14T09:00,20.0 +2025-03-14T10:00,23.0 +2025-03-14T11:00,24.0 +2025-03-14T12:00,16.8 +2025-03-14T13:00,22.4 +2025-03-14T14:00,23.2 +2025-03-14T15:00,15.3 +2025-03-14T16:00,20.9 +2025-03-14T17:00,21.4 +2025-03-14T18:00,14.4 +2025-03-14T19:00,13.3 +2025-03-14T20:00,19.5 +2025-03-14T21:00,13.9 +2025-03-14T22:00,15.0 +2025-03-14T23:00,10.5 +2025-03-15T00:00,11.7 +2025-03-15T01:00,9.3 +2025-03-15T02:00,13.9 +2025-03-15T03:00,17.6 +2025-03-15T04:00,16.5 +2025-03-15T05:00,16.3 +2025-03-15T06:00,16.8 +2025-03-15T07:00,22.9 +2025-03-15T08:00,18.7 +2025-03-15T09:00,20.7 +2025-03-15T10:00,24.7 +2025-03-15T11:00,22.0 +2025-03-15T12:00,24.9 +2025-03-15T13:00,21.1 +2025-03-15T14:00,24.6 +2025-03-15T15:00,20.2 +2025-03-15T16:00,21.1 +2025-03-15T17:00,13.9 +2025-03-15T18:00,15.4 +2025-03-15T19:00,12.8 +2025-03-15T20:00,12.0 +2025-03-15T21:00,17.3 +2025-03-15T22:00,14.2 +2025-03-15T23:00,11.2 +2025-03-16T00:00,6.8 +2025-03-16T01:00,18.1 +2025-03-16T02:00,7.6 +2025-03-16T03:00,17.6 +2025-03-16T04:00,15.6 +2025-03-16T05:00,14.7 +2025-03-16T06:00,21.7 +2025-03-16T07:00,19.2 +2025-03-16T08:00,20.1 +2025-03-16T09:00,20.0 +2025-03-16T10:00,20.8 +2025-03-16T11:00,22.3 +2025-03-16T12:00,20.3 +2025-03-16T13:00,21.5 +2025-03-16T14:00,21.7 +2025-03-16T15:00,14.3 +2025-03-16T16:00,18.9 +2025-03-16T17:00,13.6 +2025-03-16T18:00,16.1 +2025-03-16T19:00,12.3 +2025-03-16T20:00,17.5 +2025-03-16T21:00,9.7 +2025-03-16T22:00,16.3 +2025-03-16T23:00,10.9 +2025-03-17T00:00,12.4 +2025-03-17T01:00,13.4 +2025-03-17T02:00,14.1 +2025-03-17T03:00,16.7 +2025-03-17T04:00,13.8 +2025-03-17T05:00,15.6 +2025-03-17T06:00,14.1 +2025-03-17T07:00,18.3 +2025-03-17T08:00,18.6 +2025-03-17T09:00,17.1 +2025-03-17T10:00,16.7 +2025-03-17T11:00,19.8 +2025-03-17T12:00,18.9 +2025-03-17T13:00,18.1 +2025-03-17T14:00,23.0 +2025-03-17T15:00,20.4 +2025-03-17T16:00,13.2 +2025-03-17T17:00,14.4 +2025-03-17T18:00,12.4 +2025-03-17T19:00,13.0 +2025-03-17T20:00,9.8 +2025-03-17T21:00,7.9 +2025-03-17T22:00,9.3 +2025-03-17T23:00,18.0 +2025-03-18T00:00,17.1 +2025-03-18T01:00,16.2 +2025-03-18T02:00,8.5 +2025-03-18T03:00,16.1 +2025-03-18T04:00,20.3 +2025-03-18T05:00,16.9 +2025-03-18T06:00,16.5 +2025-03-18T07:00,23.9 +2025-03-18T08:00,19.5 +2025-03-18T09:00,18.2 +2025-03-18T10:00,22.5 +2025-03-18T11:00,22.1 +2025-03-18T12:00,22.6 +2025-03-18T13:00,18.4 +2025-03-18T14:00,20.1 +2025-03-18T15:00,20.5 +2025-03-18T16:00,24.3 +2025-03-18T17:00,18.7 +2025-03-18T18:00,17.8 +2025-03-18T19:00,16.1 +2025-03-18T20:00,12.0 +2025-03-18T21:00,10.8 +2025-03-18T22:00,13.4 +2025-03-18T23:00,8.6 +2025-03-19T00:00,11.3 +2025-03-19T01:00,13.0 +2025-03-19T02:00,9.2 +2025-03-19T03:00,17.7 +2025-03-19T04:00,17.1 +2025-03-19T05:00,18.9 +2025-03-19T06:00,15.0 +2025-03-19T07:00,22.4 +2025-03-19T08:00,13.9 +2025-03-19T09:00,20.0 +2025-03-19T10:00,20.4 +2025-03-19T11:00,20.0 +2025-03-19T12:00,19.4 +2025-03-19T13:00,23.3 +2025-03-19T14:00,22.2 +2025-03-19T15:00,14.6 +2025-03-19T16:00,19.5 +2025-03-19T17:00,15.8 +2025-03-19T18:00,13.8 +2025-03-19T19:00,10.8 +2025-03-19T20:00,14.7 +2025-03-19T21:00,18.0 +2025-03-19T22:00,13.0 +2025-03-19T23:00,10.0 +2025-03-20T00:00,12.6 +2025-03-20T01:00,12.1 +2025-03-20T02:00,11.5 +2025-03-20T03:00,14.3 +2025-03-20T04:00,12.9 +2025-03-20T05:00,11.4 +2025-03-20T06:00,13.3 +2025-03-20T07:00,21.4 +2025-03-20T08:00,23.4 +2025-03-20T09:00,17.6 +2025-03-20T10:00,21.1 +2025-03-20T11:00,20.9 +2025-03-20T12:00,16.0 +2025-03-20T13:00,19.8 +2025-03-20T14:00,22.5 +2025-03-20T15:00,21.1 +2025-03-20T16:00,18.5 +2025-03-20T17:00,16.7 +2025-03-20T18:00,13.1 +2025-03-20T19:00,14.3 +2025-03-20T20:00,16.5 +2025-03-20T21:00,9.3 +2025-03-20T22:00,13.7 +2025-03-20T23:00,11.4 +2025-03-21T00:00,13.2 +2025-03-21T01:00,12.5 +2025-03-21T02:00,13.4 +2025-03-21T03:00,10.1 +2025-03-21T04:00,14.8 +2025-03-21T05:00,14.0 +2025-03-21T06:00,19.3 +2025-03-21T07:00,15.9 +2025-03-21T08:00,13.0 +2025-03-21T09:00,16.3 +2025-03-21T10:00,17.6 +2025-03-21T11:00,19.9 +2025-03-21T12:00,20.8 +2025-03-21T13:00,22.0 +2025-03-21T14:00,19.2 +2025-03-21T15:00,18.2 +2025-03-21T16:00,17.2 +2025-03-21T17:00,15.1 +2025-03-21T18:00,22.6 +2025-03-21T19:00,15.8 +2025-03-21T20:00,12.5 +2025-03-21T21:00,12.5 +2025-03-21T22:00,7.5 +2025-03-21T23:00,15.2 +2025-03-22T00:00,11.4 +2025-03-22T01:00,8.8 +2025-03-22T02:00,9.7 +2025-03-22T03:00,15.0 +2025-03-22T04:00,13.2 +2025-03-22T05:00,15.2 +2025-03-22T06:00,13.8 +2025-03-22T07:00,17.0 +2025-03-22T08:00,18.6 +2025-03-22T09:00,18.3 +2025-03-22T10:00,15.3 +2025-03-22T11:00,20.4 +2025-03-22T12:00,18.5 +2025-03-22T13:00,22.9 +2025-03-22T14:00,18.9 +2025-03-22T15:00,19.3 +2025-03-22T16:00,13.8 +2025-03-22T17:00,18.4 +2025-03-22T18:00,13.8 +2025-03-22T19:00,11.4 +2025-03-22T20:00,13.3 +2025-03-22T21:00,17.9 +2025-03-22T22:00,12.0 +2025-03-22T23:00,11.5 +2025-03-23T00:00,8.3 +2025-03-23T01:00,8.7 +2025-03-23T02:00,17.5 +2025-03-23T03:00,13.6 +2025-03-23T04:00,8.4 +2025-03-23T05:00,12.9 +2025-03-23T06:00,16.1 +2025-03-23T07:00,17.4 +2025-03-23T08:00,19.1 +2025-03-23T09:00,16.2 +2025-03-23T10:00,22.2 +2025-03-23T11:00,21.2 +2025-03-23T12:00,17.0 +2025-03-23T13:00,14.0 +2025-03-23T14:00,18.2 +2025-03-23T15:00,20.2 +2025-03-23T16:00,20.7 +2025-03-23T17:00,14.7 +2025-03-23T18:00,10.4 +2025-03-23T19:00,14.5 +2025-03-23T20:00,18.2 +2025-03-23T21:00,13.6 +2025-03-23T22:00,11.5 +2025-03-23T23:00,15.2 +2025-03-24T00:00,11.2 +2025-03-24T01:00,9.3 +2025-03-24T02:00,7.7 +2025-03-24T03:00,11.9 +2025-03-24T04:00,13.1 +2025-03-24T05:00,15.9 +2025-03-24T06:00,15.1 +2025-03-24T07:00,15.3 +2025-03-24T08:00,16.6 +2025-03-24T09:00,22.5 +2025-03-24T10:00,20.8 +2025-03-24T11:00,21.3 +2025-03-24T12:00,19.4 +2025-03-24T13:00,19.0 +2025-03-24T14:00,20.3 +2025-03-24T15:00,17.1 +2025-03-24T16:00,18.0 +2025-03-24T17:00,12.5 +2025-03-24T18:00,17.4 +2025-03-24T19:00,11.2 +2025-03-24T20:00,19.1 +2025-03-24T21:00,10.9 +2025-03-24T22:00,16.7 +2025-03-24T23:00,17.1 +2025-03-25T00:00,13.9 +2025-03-25T01:00,12.8 +2025-03-25T02:00,15.2 +2025-03-25T03:00,13.0 +2025-03-25T04:00,13.1 +2025-03-25T05:00,15.4 +2025-03-25T06:00,16.5 +2025-03-25T07:00,13.2 +2025-03-25T08:00,18.8 +2025-03-25T09:00,16.9 +2025-03-25T10:00,20.0 +2025-03-25T11:00,18.7 +2025-03-25T12:00,18.0 +2025-03-25T13:00,16.0 +2025-03-25T14:00,16.0 +2025-03-25T15:00,15.1 +2025-03-25T16:00,15.0 +2025-03-25T17:00,21.7 +2025-03-25T18:00,12.2 +2025-03-25T19:00,13.4 +2025-03-25T20:00,13.5 +2025-03-25T21:00,15.2 +2025-03-25T22:00,13.4 +2025-03-25T23:00,16.4 +2025-03-26T00:00,7.0 +2025-03-26T01:00,12.4 +2025-03-26T02:00,12.1 +2025-03-26T03:00,12.3 +2025-03-26T04:00,13.2 +2025-03-26T05:00,11.9 +2025-03-26T06:00,15.8 +2025-03-26T07:00,16.3 +2025-03-26T08:00,15.5 +2025-03-26T09:00,16.4 +2025-03-26T10:00,21.2 +2025-03-26T11:00,11.3 +2025-03-26T12:00,18.4 +2025-03-26T13:00,23.1 +2025-03-26T14:00,17.8 +2025-03-26T15:00,21.1 +2025-03-26T16:00,13.7 +2025-03-26T17:00,21.2 +2025-03-26T18:00,12.5 +2025-03-26T19:00,14.8 +2025-03-26T20:00,13.0 +2025-03-26T21:00,10.5 +2025-03-26T22:00,11.4 +2025-03-26T23:00,12.6 +2025-03-27T00:00,6.0 +2025-03-27T01:00,15.1 +2025-03-27T02:00,13.0 +2025-03-27T03:00,17.1 +2025-03-27T04:00,13.5 +2025-03-27T05:00,16.2 +2025-03-27T06:00,12.6 +2025-03-27T07:00,11.0 +2025-03-27T08:00,21.2 +2025-03-27T09:00,21.9 +2025-03-27T10:00,23.5 +2025-03-27T11:00,19.4 +2025-03-27T12:00,15.2 +2025-03-27T13:00,16.1 +2025-03-27T14:00,20.0 +2025-03-27T15:00,17.1 +2025-03-27T16:00,16.2 +2025-03-27T17:00,21.0 +2025-03-27T18:00,14.4 +2025-03-27T19:00,11.6 +2025-03-27T20:00,15.8 +2025-03-27T21:00,11.1 +2025-03-27T22:00,9.1 +2025-03-27T23:00,14.4 +2025-03-28T00:00,6.4 +2025-03-28T01:00,12.3 +2025-03-28T02:00,10.1 +2025-03-28T03:00,15.3 +2025-03-28T04:00,12.3 +2025-03-28T05:00,13.6 +2025-03-28T06:00,17.2 +2025-03-28T07:00,16.1 +2025-03-28T08:00,16.3 +2025-03-28T09:00,16.1 +2025-03-28T10:00,20.7 +2025-03-28T11:00,18.2 +2025-03-28T12:00,21.3 +2025-03-28T13:00,15.7 +2025-03-28T14:00,20.1 +2025-03-28T15:00,18.2 +2025-03-28T16:00,18.8 +2025-03-28T17:00,19.6 +2025-03-28T18:00,8.7 +2025-03-28T19:00,12.2 +2025-03-28T20:00,13.7 +2025-03-28T21:00,10.1 +2025-03-28T22:00,11.2 +2025-03-28T23:00,11.1 +2025-03-29T00:00,7.0 +2025-03-29T01:00,15.2 +2025-03-29T02:00,16.0 +2025-03-29T03:00,10.7 +2025-03-29T04:00,11.3 +2025-03-29T05:00,11.3 +2025-03-29T06:00,12.3 +2025-03-29T07:00,12.6 +2025-03-29T08:00,18.1 +2025-03-29T09:00,17.2 +2025-03-29T10:00,18.5 +2025-03-29T11:00,20.8 +2025-03-29T12:00,20.7 +2025-03-29T13:00,20.9 +2025-03-29T14:00,22.3 +2025-03-29T15:00,21.7 +2025-03-29T16:00,16.2 +2025-03-29T17:00,19.1 +2025-03-29T18:00,18.3 +2025-03-29T19:00,14.0 +2025-03-29T20:00,13.5 +2025-03-29T21:00,7.1 +2025-03-29T22:00,14.8 +2025-03-29T23:00,11.3 +2025-03-30T00:00,12.6 +2025-03-30T01:00,7.0 +2025-03-30T02:00,9.7 +2025-03-30T03:00,17.2 +2025-03-30T04:00,14.4 +2025-03-30T05:00,11.8 +2025-03-30T06:00,17.4 +2025-03-30T07:00,19.3 +2025-03-30T08:00,17.3 +2025-03-30T09:00,14.8 +2025-03-30T10:00,16.8 +2025-03-30T11:00,16.8 +2025-03-30T12:00,14.0 +2025-03-30T13:00,18.5 +2025-03-30T14:00,14.1 +2025-03-30T15:00,18.5 +2025-03-30T16:00,20.2 +2025-03-30T17:00,15.0 +2025-03-30T18:00,15.2 +2025-03-30T19:00,13.1 +2025-03-30T20:00,14.7 +2025-03-30T21:00,8.5 +2025-03-30T22:00,16.6 +2025-03-30T23:00,11.1 +2025-03-31T00:00,9.4 +2025-03-31T01:00,3.5 +2025-03-31T02:00,13.5 +2025-03-31T03:00,11.6 +2025-03-31T04:00,13.9 +2025-03-31T05:00,14.1 +2025-03-31T06:00,11.0 +2025-03-31T07:00,20.5 +2025-03-31T08:00,16.0 +2025-03-31T09:00,12.3 +2025-03-31T10:00,10.1 +2025-03-31T11:00,16.6 +2025-03-31T12:00,17.5 +2025-03-31T13:00,18.2 +2025-03-31T14:00,20.7 +2025-03-31T15:00,16.0 +2025-03-31T16:00,18.1 +2025-03-31T17:00,13.2 +2025-03-31T18:00,18.0 +2025-03-31T19:00,14.7 +2025-03-31T20:00,11.4 +2025-03-31T21:00,10.6 +2025-03-31T22:00,14.3 +2025-03-31T23:00,11.0 +2025-04-01T00:00,9.4 +2025-04-01T01:00,12.8 +2025-04-01T02:00,12.5 +2025-04-01T03:00,11.8 +2025-04-01T04:00,10.3 +2025-04-01T05:00,12.3 +2025-04-01T06:00,17.0 +2025-04-01T07:00,14.5 +2025-04-01T08:00,21.3 +2025-04-01T09:00,17.5 +2025-04-01T10:00,14.7 +2025-04-01T11:00,17.2 +2025-04-01T12:00,14.0 +2025-04-01T13:00,15.4 +2025-04-01T14:00,12.5 +2025-04-01T15:00,15.6 +2025-04-01T16:00,10.9 +2025-04-01T17:00,12.3 +2025-04-01T18:00,15.2 +2025-04-01T19:00,14.8 +2025-04-01T20:00,12.9 +2025-04-01T21:00,14.1 +2025-04-01T22:00,12.3 +2025-04-01T23:00,7.3 +2025-04-02T00:00,7.9 +2025-04-02T01:00,12.5 +2025-04-02T02:00,12.4 +2025-04-02T03:00,11.6 +2025-04-02T04:00,10.2 +2025-04-02T05:00,10.4 +2025-04-02T06:00,13.9 +2025-04-02T07:00,14.5 +2025-04-02T08:00,19.6 +2025-04-02T09:00,13.3 +2025-04-02T10:00,20.4 +2025-04-02T11:00,16.5 +2025-04-02T12:00,19.4 +2025-04-02T13:00,21.1 +2025-04-02T14:00,21.2 +2025-04-02T15:00,19.4 +2025-04-02T16:00,14.2 +2025-04-02T17:00,19.0 +2025-04-02T18:00,12.0 +2025-04-02T19:00,10.8 +2025-04-02T20:00,13.5 +2025-04-02T21:00,14.0 +2025-04-02T22:00,11.8 +2025-04-02T23:00,10.4 +2025-04-03T00:00,8.5 +2025-04-03T01:00,14.3 +2025-04-03T02:00,12.0 +2025-04-03T03:00,9.0 +2025-04-03T04:00,14.9 +2025-04-03T05:00,10.6 +2025-04-03T06:00,16.5 +2025-04-03T07:00,17.5 +2025-04-03T08:00,11.2 +2025-04-03T09:00,16.3 +2025-04-03T10:00,16.7 +2025-04-03T11:00,16.1 +2025-04-03T12:00,19.4 +2025-04-03T13:00,17.1 +2025-04-03T14:00,21.4 +2025-04-03T15:00,13.5 +2025-04-03T16:00,15.0 +2025-04-03T17:00,15.6 +2025-04-03T18:00,8.9 +2025-04-03T19:00,12.4 +2025-04-03T20:00,15.0 +2025-04-03T21:00,10.8 +2025-04-03T22:00,8.0 +2025-04-03T23:00,13.1 +2025-04-04T00:00,9.1 +2025-04-04T01:00,10.3 +2025-04-04T02:00,9.4 +2025-04-04T03:00,11.0 +2025-04-04T04:00,15.0 +2025-04-04T05:00,11.3 +2025-04-04T06:00,17.6 +2025-04-04T07:00,14.6 +2025-04-04T08:00,16.6 +2025-04-04T09:00,21.1 +2025-04-04T10:00,16.7 +2025-04-04T11:00,16.5 +2025-04-04T12:00,16.5 +2025-04-04T13:00,19.8 +2025-04-04T14:00,19.2 +2025-04-04T15:00,15.3 +2025-04-04T16:00,15.0 +2025-04-04T17:00,15.0 +2025-04-04T18:00,11.9 +2025-04-04T19:00,12.4 +2025-04-04T20:00,9.8 +2025-04-04T21:00,11.1 +2025-04-04T22:00,13.6 +2025-04-04T23:00,8.8 +2025-04-05T00:00,5.9 +2025-04-05T01:00,8.1 +2025-04-05T02:00,15.6 +2025-04-05T03:00,10.5 +2025-04-05T04:00,14.2 +2025-04-05T05:00,14.5 +2025-04-05T06:00,11.0 +2025-04-05T07:00,14.5 +2025-04-05T08:00,12.7 +2025-04-05T09:00,15.0 +2025-04-05T10:00,15.7 +2025-04-05T11:00,15.9 +2025-04-05T12:00,21.0 +2025-04-05T13:00,18.6 +2025-04-05T14:00,18.2 +2025-04-05T15:00,14.1 +2025-04-05T16:00,12.5 +2025-04-05T17:00,15.7 +2025-04-05T18:00,18.1 +2025-04-05T19:00,10.5 +2025-04-05T20:00,6.3 +2025-04-05T21:00,7.8 +2025-04-05T22:00,7.8 +2025-04-05T23:00,11.9 +2025-04-06T00:00,4.2 +2025-04-06T01:00,7.5 +2025-04-06T02:00,10.2 +2025-04-06T03:00,9.1 +2025-04-06T04:00,10.8 +2025-04-06T05:00,12.9 +2025-04-06T06:00,10.9 +2025-04-06T07:00,13.4 +2025-04-06T08:00,12.9 +2025-04-06T09:00,13.2 +2025-04-06T10:00,16.7 +2025-04-06T11:00,14.5 +2025-04-06T12:00,15.8 +2025-04-06T13:00,14.0 +2025-04-06T14:00,15.7 +2025-04-06T15:00,16.7 +2025-04-06T16:00,14.0 +2025-04-06T17:00,16.0 +2025-04-06T18:00,16.7 +2025-04-06T19:00,9.4 +2025-04-06T20:00,9.1 +2025-04-06T21:00,10.3 +2025-04-06T22:00,10.4 +2025-04-06T23:00,8.6 +2025-04-07T00:00,5.5 +2025-04-07T01:00,6.5 +2025-04-07T02:00,6.0 +2025-04-07T03:00,7.5 +2025-04-07T04:00,17.6 +2025-04-07T05:00,12.7 +2025-04-07T06:00,14.5 +2025-04-07T07:00,13.7 +2025-04-07T08:00,12.0 +2025-04-07T09:00,20.4 +2025-04-07T10:00,18.4 +2025-04-07T11:00,16.7 +2025-04-07T12:00,18.1 +2025-04-07T13:00,13.4 +2025-04-07T14:00,16.1 +2025-04-07T15:00,14.8 +2025-04-07T16:00,14.9 +2025-04-07T17:00,13.5 +2025-04-07T18:00,14.9 +2025-04-07T19:00,15.6 +2025-04-07T20:00,9.6 +2025-04-07T21:00,15.9 +2025-04-07T22:00,7.9 +2025-04-07T23:00,6.5 +2025-04-08T00:00,10.0 +2025-04-08T01:00,12.5 +2025-04-08T02:00,8.3 +2025-04-08T03:00,7.1 +2025-04-08T04:00,12.0 +2025-04-08T05:00,15.4 +2025-04-08T06:00,12.5 +2025-04-08T07:00,15.0 +2025-04-08T08:00,14.7 +2025-04-08T09:00,17.5 +2025-04-08T10:00,18.6 +2025-04-08T11:00,20.3 +2025-04-08T12:00,16.3 +2025-04-08T13:00,16.0 +2025-04-08T14:00,14.2 +2025-04-08T15:00,8.2 +2025-04-08T16:00,17.9 +2025-04-08T17:00,10.0 +2025-04-08T18:00,11.0 +2025-04-08T19:00,9.6 +2025-04-08T20:00,9.5 +2025-04-08T21:00,4.3 +2025-04-08T22:00,8.0 +2025-04-08T23:00,7.1 +2025-04-09T00:00,11.2 +2025-04-09T01:00,10.9 +2025-04-09T02:00,11.6 +2025-04-09T03:00,11.0 +2025-04-09T04:00,8.9 +2025-04-09T05:00,9.4 +2025-04-09T06:00,16.1 +2025-04-09T07:00,11.2 +2025-04-09T08:00,16.2 +2025-04-09T09:00,15.5 +2025-04-09T10:00,13.5 +2025-04-09T11:00,18.0 +2025-04-09T12:00,16.8 +2025-04-09T13:00,14.9 +2025-04-09T14:00,18.1 +2025-04-09T15:00,11.8 +2025-04-09T16:00,17.9 +2025-04-09T17:00,13.4 +2025-04-09T18:00,12.0 +2025-04-09T19:00,11.2 +2025-04-09T20:00,7.5 +2025-04-09T21:00,12.0 +2025-04-09T22:00,12.5 +2025-04-09T23:00,4.9 +2025-04-10T00:00,8.9 +2025-04-10T01:00,9.2 +2025-04-10T02:00,7.4 +2025-04-10T03:00,12.7 +2025-04-10T04:00,12.6 +2025-04-10T05:00,12.7 +2025-04-10T06:00,13.7 +2025-04-10T07:00,16.2 +2025-04-10T08:00,14.5 +2025-04-10T09:00,14.2 +2025-04-10T10:00,17.6 +2025-04-10T11:00,11.6 +2025-04-10T12:00,15.3 +2025-04-10T13:00,22.0 +2025-04-10T14:00,13.7 +2025-04-10T15:00,17.7 +2025-04-10T16:00,12.3 +2025-04-10T17:00,10.9 +2025-04-10T18:00,15.5 +2025-04-10T19:00,13.7 +2025-04-10T20:00,7.0 +2025-04-10T21:00,13.1 +2025-04-10T22:00,5.8 +2025-04-10T23:00,6.8 +2025-04-11T00:00,7.8 +2025-04-11T01:00,4.8 +2025-04-11T02:00,9.3 +2025-04-11T03:00,8.3 +2025-04-11T04:00,7.8 +2025-04-11T05:00,11.6 +2025-04-11T06:00,13.8 +2025-04-11T07:00,13.4 +2025-04-11T08:00,18.2 +2025-04-11T09:00,17.3 +2025-04-11T10:00,20.6 +2025-04-11T11:00,19.2 +2025-04-11T12:00,16.5 +2025-04-11T13:00,19.1 +2025-04-11T14:00,15.3 +2025-04-11T15:00,17.4 +2025-04-11T16:00,17.4 +2025-04-11T17:00,13.9 +2025-04-11T18:00,11.6 +2025-04-11T19:00,11.7 +2025-04-11T20:00,10.8 +2025-04-11T21:00,5.8 +2025-04-11T22:00,10.2 +2025-04-11T23:00,6.0 +2025-04-12T00:00,12.2 +2025-04-12T01:00,9.3 +2025-04-12T02:00,12.4 +2025-04-12T03:00,15.4 +2025-04-12T04:00,9.4 +2025-04-12T05:00,13.1 +2025-04-12T06:00,15.8 +2025-04-12T07:00,18.5 +2025-04-12T08:00,18.4 +2025-04-12T09:00,11.9 +2025-04-12T10:00,15.6 +2025-04-12T11:00,21.9 +2025-04-12T12:00,16.3 +2025-04-12T13:00,16.0 +2025-04-12T14:00,15.6 +2025-04-12T15:00,15.6 +2025-04-12T16:00,18.8 +2025-04-12T17:00,10.0 +2025-04-12T18:00,11.5 +2025-04-12T19:00,8.6 +2025-04-12T20:00,9.2 +2025-04-12T21:00,11.0 +2025-04-12T22:00,6.4 +2025-04-12T23:00,6.3 +2025-04-13T00:00,9.2 +2025-04-13T01:00,7.3 +2025-04-13T02:00,10.1 +2025-04-13T03:00,11.3 +2025-04-13T04:00,13.4 +2025-04-13T05:00,10.9 +2025-04-13T06:00,10.9 +2025-04-13T07:00,11.9 +2025-04-13T08:00,16.8 +2025-04-13T09:00,18.3 +2025-04-13T10:00,16.4 +2025-04-13T11:00,11.8 +2025-04-13T12:00,16.4 +2025-04-13T13:00,11.0 +2025-04-13T14:00,14.7 +2025-04-13T15:00,15.0 +2025-04-13T16:00,13.9 +2025-04-13T17:00,13.9 +2025-04-13T18:00,15.7 +2025-04-13T19:00,8.4 +2025-04-13T20:00,16.8 +2025-04-13T21:00,7.9 +2025-04-13T22:00,10.2 +2025-04-13T23:00,11.7 +2025-04-14T00:00,10.2 +2025-04-14T01:00,6.4 +2025-04-14T02:00,10.1 +2025-04-14T03:00,7.2 +2025-04-14T04:00,6.6 +2025-04-14T05:00,12.1 +2025-04-14T06:00,14.8 +2025-04-14T07:00,14.9 +2025-04-14T08:00,14.8 +2025-04-14T09:00,12.0 +2025-04-14T10:00,14.8 +2025-04-14T11:00,16.7 +2025-04-14T12:00,12.4 +2025-04-14T13:00,10.7 +2025-04-14T14:00,16.0 +2025-04-14T15:00,15.6 +2025-04-14T16:00,14.2 +2025-04-14T17:00,15.0 +2025-04-14T18:00,10.4 +2025-04-14T19:00,11.6 +2025-04-14T20:00,9.0 +2025-04-14T21:00,8.7 +2025-04-14T22:00,9.0 +2025-04-14T23:00,6.9 +2025-04-15T00:00,6.6 +2025-04-15T01:00,4.4 +2025-04-15T02:00,5.7 +2025-04-15T03:00,5.9 +2025-04-15T04:00,10.7 +2025-04-15T05:00,7.0 +2025-04-15T06:00,9.2 +2025-04-15T07:00,10.8 +2025-04-15T08:00,11.1 +2025-04-15T09:00,13.3 +2025-04-15T10:00,18.4 +2025-04-15T11:00,12.2 +2025-04-15T12:00,14.8 +2025-04-15T13:00,16.5 +2025-04-15T14:00,15.4 +2025-04-15T15:00,18.2 +2025-04-15T16:00,18.1 +2025-04-15T17:00,16.6 +2025-04-15T18:00,6.5 +2025-04-15T19:00,12.3 +2025-04-15T20:00,4.4 +2025-04-15T21:00,8.7 +2025-04-15T22:00,7.9 +2025-04-15T23:00,5.0 +2025-04-16T00:00,7.8 +2025-04-16T01:00,11.9 +2025-04-16T02:00,16.0 +2025-04-16T03:00,9.5 +2025-04-16T04:00,9.1 +2025-04-16T05:00,13.8 +2025-04-16T06:00,13.3 +2025-04-16T07:00,10.2 +2025-04-16T08:00,16.6 +2025-04-16T09:00,15.9 +2025-04-16T10:00,18.7 +2025-04-16T11:00,14.2 +2025-04-16T12:00,15.9 +2025-04-16T13:00,14.4 +2025-04-16T14:00,18.5 +2025-04-16T15:00,11.0 +2025-04-16T16:00,11.6 +2025-04-16T17:00,10.4 +2025-04-16T18:00,6.2 +2025-04-16T19:00,12.4 +2025-04-16T20:00,13.8 +2025-04-16T21:00,3.0 +2025-04-16T22:00,7.0 +2025-04-16T23:00,10.4 +2025-04-17T00:00,9.4 +2025-04-17T01:00,9.0 +2025-04-17T02:00,6.1 +2025-04-17T03:00,11.0 +2025-04-17T04:00,15.2 +2025-04-17T05:00,11.1 +2025-04-17T06:00,9.8 +2025-04-17T07:00,14.1 +2025-04-17T08:00,15.0 +2025-04-17T09:00,14.4 +2025-04-17T10:00,16.0 +2025-04-17T11:00,17.3 +2025-04-17T12:00,16.2 +2025-04-17T13:00,13.9 +2025-04-17T14:00,9.6 +2025-04-17T15:00,16.5 +2025-04-17T16:00,15.7 +2025-04-17T17:00,10.7 +2025-04-17T18:00,10.4 +2025-04-17T19:00,9.7 +2025-04-17T20:00,12.6 +2025-04-17T21:00,5.0 +2025-04-17T22:00,8.6 +2025-04-17T23:00,5.9 +2025-04-18T00:00,12.3 +2025-04-18T01:00,7.5 +2025-04-18T02:00,4.6 +2025-04-18T03:00,6.1 +2025-04-18T04:00,7.2 +2025-04-18T05:00,11.1 +2025-04-18T06:00,10.8 +2025-04-18T07:00,11.9 +2025-04-18T08:00,18.8 +2025-04-18T09:00,10.9 +2025-04-18T10:00,18.2 +2025-04-18T11:00,15.1 +2025-04-18T12:00,16.8 +2025-04-18T13:00,16.1 +2025-04-18T14:00,14.7 +2025-04-18T15:00,11.0 +2025-04-18T16:00,11.9 +2025-04-18T17:00,14.2 +2025-04-18T18:00,15.6 +2025-04-18T19:00,8.9 +2025-04-18T20:00,10.2 +2025-04-18T21:00,7.5 +2025-04-18T22:00,4.9 +2025-04-18T23:00,7.6 +2025-04-19T00:00,5.4 +2025-04-19T01:00,5.1 +2025-04-19T02:00,8.9 +2025-04-19T03:00,6.7 +2025-04-19T04:00,7.4 +2025-04-19T05:00,8.8 +2025-04-19T06:00,9.0 +2025-04-19T07:00,13.4 +2025-04-19T08:00,14.6 +2025-04-19T09:00,12.8 +2025-04-19T10:00,13.5 +2025-04-19T11:00,11.7 +2025-04-19T12:00,21.7 +2025-04-19T13:00,15.4 +2025-04-19T14:00,17.3 +2025-04-19T15:00,14.6 +2025-04-19T16:00,8.2 +2025-04-19T17:00,9.1 +2025-04-19T18:00,9.4 +2025-04-19T19:00,7.7 +2025-04-19T20:00,5.3 +2025-04-19T21:00,6.8 +2025-04-19T22:00,8.4 +2025-04-19T23:00,7.2 +2025-04-20T00:00,8.1 +2025-04-20T01:00,6.5 +2025-04-20T02:00,10.5 +2025-04-20T03:00,7.7 +2025-04-20T04:00,6.1 +2025-04-20T05:00,7.9 +2025-04-20T06:00,8.9 +2025-04-20T07:00,16.4 +2025-04-20T08:00,10.4 +2025-04-20T09:00,10.7 +2025-04-20T10:00,16.6 +2025-04-20T11:00,9.4 +2025-04-20T12:00,16.9 +2025-04-20T13:00,12.9 +2025-04-20T14:00,10.6 +2025-04-20T15:00,15.1 +2025-04-20T16:00,13.7 +2025-04-20T17:00,11.5 +2025-04-20T18:00,12.7 +2025-04-20T19:00,10.3 +2025-04-20T20:00,7.9 +2025-04-20T21:00,7.4 +2025-04-20T22:00,13.1 +2025-04-20T23:00,6.4 +2025-04-21T00:00,8.0 +2025-04-21T01:00,7.6 +2025-04-21T02:00,4.9 +2025-04-21T03:00,6.2 +2025-04-21T04:00,10.3 +2025-04-21T05:00,12.0 +2025-04-21T06:00,12.5 +2025-04-21T07:00,13.0 +2025-04-21T08:00,13.8 +2025-04-21T09:00,12.5 +2025-04-21T10:00,14.4 +2025-04-21T11:00,13.6 +2025-04-21T12:00,15.0 +2025-04-21T13:00,14.0 +2025-04-21T14:00,8.2 +2025-04-21T15:00,13.0 +2025-04-21T16:00,15.4 +2025-04-21T17:00,8.2 +2025-04-21T18:00,13.8 +2025-04-21T19:00,10.9 +2025-04-21T20:00,9.4 +2025-04-21T21:00,7.9 +2025-04-21T22:00,9.8 +2025-04-21T23:00,3.2 +2025-04-22T00:00,6.0 +2025-04-22T01:00,8.0 +2025-04-22T02:00,11.0 +2025-04-22T03:00,11.3 +2025-04-22T04:00,10.2 +2025-04-22T05:00,9.7 +2025-04-22T06:00,12.4 +2025-04-22T07:00,11.7 +2025-04-22T08:00,16.8 +2025-04-22T09:00,8.9 +2025-04-22T10:00,10.5 +2025-04-22T11:00,14.9 +2025-04-22T12:00,17.1 +2025-04-22T13:00,15.8 +2025-04-22T14:00,14.0 +2025-04-22T15:00,17.2 +2025-04-22T16:00,13.3 +2025-04-22T17:00,12.4 +2025-04-22T18:00,7.5 +2025-04-22T19:00,6.6 +2025-04-22T20:00,15.3 +2025-04-22T21:00,9.5 +2025-04-22T22:00,11.8 +2025-04-22T23:00,6.8 +2025-04-23T00:00,10.5 +2025-04-23T01:00,7.6 +2025-04-23T02:00,6.3 +2025-04-23T03:00,5.4 +2025-04-23T04:00,5.7 +2025-04-23T05:00,4.7 +2025-04-23T06:00,8.8 +2025-04-23T07:00,10.5 +2025-04-23T08:00,14.4 +2025-04-23T09:00,14.5 +2025-04-23T10:00,12.1 +2025-04-23T11:00,13.2 +2025-04-23T12:00,15.9 +2025-04-23T13:00,12.9 +2025-04-23T14:00,14.8 +2025-04-23T15:00,13.0 +2025-04-23T16:00,6.8 +2025-04-23T17:00,9.2 +2025-04-23T18:00,11.8 +2025-04-23T19:00,11.6 +2025-04-23T20:00,6.6 +2025-04-23T21:00,7.7 +2025-04-23T22:00,5.6 +2025-04-23T23:00,3.3 +2025-04-24T00:00,4.4 +2025-04-24T01:00,5.2 +2025-04-24T02:00,4.4 +2025-04-24T03:00,5.9 +2025-04-24T04:00,11.6 +2025-04-24T05:00,5.5 +2025-04-24T06:00,5.1 +2025-04-24T07:00,10.1 +2025-04-24T08:00,8.7 +2025-04-24T09:00,9.5 +2025-04-24T10:00,16.2 +2025-04-24T11:00,9.3 +2025-04-24T12:00,16.4 +2025-04-24T13:00,10.1 +2025-04-24T14:00,14.6 +2025-04-24T15:00,15.3 +2025-04-24T16:00,9.6 +2025-04-24T17:00,1.5 +2025-04-24T18:00,14.5 +2025-04-24T19:00,8.7 +2025-04-24T20:00,5.3 +2025-04-24T21:00,5.4 +2025-04-24T22:00,7.4 +2025-04-24T23:00,7.4 +2025-04-25T00:00,9.8 +2025-04-25T01:00,6.1 +2025-04-25T02:00,6.6 +2025-04-25T03:00,8.1 +2025-04-25T04:00,13.2 +2025-04-25T05:00,5.8 +2025-04-25T06:00,7.5 +2025-04-25T07:00,12.3 +2025-04-25T08:00,11.4 +2025-04-25T09:00,16.2 +2025-04-25T10:00,15.8 +2025-04-25T11:00,11.8 +2025-04-25T12:00,15.4 +2025-04-25T13:00,16.9 +2025-04-25T14:00,11.7 +2025-04-25T15:00,17.4 +2025-04-25T16:00,8.9 +2025-04-25T17:00,8.5 +2025-04-25T18:00,15.4 +2025-04-25T19:00,9.2 +2025-04-25T20:00,7.0 +2025-04-25T21:00,8.3 +2025-04-25T22:00,6.1 +2025-04-25T23:00,3.7 +2025-04-26T00:00,2.9 +2025-04-26T01:00,5.8 +2025-04-26T02:00,8.3 +2025-04-26T03:00,8.6 +2025-04-26T04:00,4.9 +2025-04-26T05:00,12.3 +2025-04-26T06:00,6.0 +2025-04-26T07:00,11.7 +2025-04-26T08:00,8.2 +2025-04-26T09:00,16.4 +2025-04-26T10:00,10.7 +2025-04-26T11:00,12.4 +2025-04-26T12:00,13.4 +2025-04-26T13:00,13.1 +2025-04-26T14:00,14.9 +2025-04-26T15:00,13.5 +2025-04-26T16:00,13.6 +2025-04-26T17:00,10.6 +2025-04-26T18:00,12.9 +2025-04-26T19:00,8.1 +2025-04-26T20:00,7.5 +2025-04-26T21:00,8.9 +2025-04-26T22:00,2.3 +2025-04-26T23:00,6.2 +2025-04-27T00:00,11.0 +2025-04-27T01:00,8.6 +2025-04-27T02:00,8.6 +2025-04-27T03:00,5.7 +2025-04-27T04:00,6.5 +2025-04-27T05:00,12.7 +2025-04-27T06:00,9.2 +2025-04-27T07:00,10.0 +2025-04-27T08:00,11.4 +2025-04-27T09:00,12.4 +2025-04-27T10:00,14.4 +2025-04-27T11:00,11.0 +2025-04-27T12:00,14.6 +2025-04-27T13:00,14.1 +2025-04-27T14:00,15.2 +2025-04-27T15:00,9.4 +2025-04-27T16:00,10.7 +2025-04-27T17:00,11.3 +2025-04-27T18:00,12.9 +2025-04-27T19:00,10.3 +2025-04-27T20:00,6.9 +2025-04-27T21:00,4.7 +2025-04-27T22:00,5.0 +2025-04-27T23:00,3.8 +2025-04-28T00:00,10.2 +2025-04-28T01:00,3.3 +2025-04-28T02:00,8.0 +2025-04-28T03:00,3.2 +2025-04-28T04:00,10.1 +2025-04-28T05:00,8.3 +2025-04-28T06:00,7.5 +2025-04-28T07:00,12.7 +2025-04-28T08:00,9.6 +2025-04-28T09:00,13.9 +2025-04-28T10:00,14.4 +2025-04-28T11:00,10.0 +2025-04-28T12:00,18.4 +2025-04-28T13:00,17.0 +2025-04-28T14:00,12.3 +2025-04-28T15:00,10.4 +2025-04-28T16:00,10.0 +2025-04-28T17:00,9.9 +2025-04-28T18:00,13.8 +2025-04-28T19:00,6.5 +2025-04-28T20:00,5.9 +2025-04-28T21:00,5.4 +2025-04-28T22:00,12.1 +2025-04-28T23:00,5.8 +2025-04-29T00:00,3.1 +2025-04-29T01:00,4.2 +2025-04-29T02:00,4.8 +2025-04-29T03:00,4.8 +2025-04-29T04:00,6.8 +2025-04-29T05:00,7.2 +2025-04-29T06:00,11.5 +2025-04-29T07:00,9.8 +2025-04-29T08:00,8.9 +2025-04-29T09:00,12.6 +2025-04-29T10:00,14.7 +2025-04-29T11:00,14.1 +2025-04-29T12:00,17.0 +2025-04-29T13:00,10.6 +2025-04-29T14:00,12.2 +2025-04-29T15:00,12.6 +2025-04-29T16:00,16.9 +2025-04-29T17:00,9.5 +2025-04-29T18:00,11.6 +2025-04-29T19:00,8.8 +2025-04-29T20:00,7.5 +2025-04-29T21:00,5.8 +2025-04-29T22:00,4.9 +2025-04-29T23:00,4.7 +2025-04-30T00:00,3.4 +2025-04-30T01:00,6.8 +2025-04-30T02:00,6.7 +2025-04-30T03:00,8.5 +2025-04-30T04:00,7.0 +2025-04-30T05:00,9.9 +2025-04-30T06:00,8.3 +2025-04-30T07:00,9.2 +2025-04-30T08:00,13.1 +2025-04-30T09:00,11.9 +2025-04-30T10:00,12.2 +2025-04-30T11:00,14.7 +2025-04-30T12:00,19.1 +2025-04-30T13:00,13.9 +2025-04-30T14:00,16.4 +2025-04-30T15:00,15.7 +2025-04-30T16:00,9.6 +2025-04-30T17:00,13.4 +2025-04-30T18:00,10.4 +2025-04-30T19:00,6.6 +2025-04-30T20:00,2.5 +2025-04-30T21:00,5.9 +2025-04-30T22:00,7.0 +2025-04-30T23:00,5.3 +2025-05-01T00:00,8.7 +2025-05-01T01:00,10.3 +2025-05-01T02:00,3.3 +2025-05-01T03:00,6.3 +2025-05-01T04:00,6.8 +2025-05-01T05:00,12.1 +2025-05-01T06:00,8.5 +2025-05-01T07:00,8.8 +2025-05-01T08:00,11.1 +2025-05-01T09:00,8.6 +2025-05-01T10:00,8.3 +2025-05-01T11:00,10.7 +2025-05-01T12:00,15.3 +2025-05-01T13:00,10.1 +2025-05-01T14:00,16.7 +2025-05-01T15:00,13.8 +2025-05-01T16:00,11.8 +2025-05-01T17:00,6.3 +2025-05-01T18:00,9.4 +2025-05-01T19:00,7.8 +2025-05-01T20:00,7.3 +2025-05-01T21:00,10.1 +2025-05-01T22:00,3.5 +2025-05-01T23:00,2.9 +2025-05-02T00:00,2.6 +2025-05-02T01:00,4.4 +2025-05-02T02:00,8.9 +2025-05-02T03:00,7.0 +2025-05-02T04:00,10.1 +2025-05-02T05:00,9.1 +2025-05-02T06:00,13.1 +2025-05-02T07:00,9.9 +2025-05-02T08:00,12.2 +2025-05-02T09:00,15.2 +2025-05-02T10:00,12.8 +2025-05-02T11:00,15.1 +2025-05-02T12:00,14.2 +2025-05-02T13:00,13.2 +2025-05-02T14:00,13.5 +2025-05-02T15:00,11.0 +2025-05-02T16:00,17.1 +2025-05-02T17:00,9.7 +2025-05-02T18:00,6.8 +2025-05-02T19:00,5.1 +2025-05-02T20:00,9.7 +2025-05-02T21:00,8.7 +2025-05-02T22:00,4.6 +2025-05-02T23:00,1.0 +2025-05-03T00:00,2.7 +2025-05-03T01:00,7.8 +2025-05-03T02:00,5.2 +2025-05-03T03:00,1.1 +2025-05-03T04:00,7.2 +2025-05-03T05:00,8.4 +2025-05-03T06:00,9.7 +2025-05-03T07:00,9.5 +2025-05-03T08:00,11.5 +2025-05-03T09:00,9.8 +2025-05-03T10:00,15.6 +2025-05-03T11:00,7.7 +2025-05-03T12:00,12.0 +2025-05-03T13:00,12.0 +2025-05-03T14:00,17.9 +2025-05-03T15:00,12.0 +2025-05-03T16:00,12.2 +2025-05-03T17:00,9.6 +2025-05-03T18:00,10.0 +2025-05-03T19:00,5.8 +2025-05-03T20:00,11.1 +2025-05-03T21:00,1.8 +2025-05-03T22:00,7.0 +2025-05-03T23:00,4.0 +2025-05-04T00:00,1.0 +2025-05-04T01:00,2.2 +2025-05-04T02:00,3.1 +2025-05-04T03:00,6.2 +2025-05-04T04:00,11.6 +2025-05-04T05:00,9.7 +2025-05-04T06:00,9.4 +2025-05-04T07:00,15.2 +2025-05-04T08:00,13.4 +2025-05-04T09:00,10.5 +2025-05-04T10:00,9.4 +2025-05-04T11:00,13.3 +2025-05-04T12:00,10.5 +2025-05-04T13:00,13.2 +2025-05-04T14:00,10.6 +2025-05-04T15:00,12.7 +2025-05-04T16:00,15.2 +2025-05-04T17:00,9.7 +2025-05-04T18:00,10.1 +2025-05-04T19:00,8.5 +2025-05-04T20:00,5.6 +2025-05-04T21:00,7.6 +2025-05-04T22:00,5.6 +2025-05-04T23:00,7.6 +2025-05-05T00:00,11.9 +2025-05-05T01:00,6.1 +2025-05-05T02:00,9.4 +2025-05-05T03:00,6.6 +2025-05-05T04:00,5.0 +2025-05-05T05:00,5.0 +2025-05-05T06:00,5.8 +2025-05-05T07:00,11.8 +2025-05-05T08:00,13.8 +2025-05-05T09:00,9.1 +2025-05-05T10:00,15.6 +2025-05-05T11:00,15.5 +2025-05-05T12:00,10.7 +2025-05-05T13:00,11.7 +2025-05-05T14:00,8.2 +2025-05-05T15:00,11.0 +2025-05-05T16:00,9.3 +2025-05-05T17:00,10.3 +2025-05-05T18:00,7.9 +2025-05-05T19:00,10.4 +2025-05-05T20:00,6.0 +2025-05-05T21:00,8.3 +2025-05-05T22:00,8.8 +2025-05-05T23:00,4.8 +2025-05-06T00:00,1.1 +2025-05-06T01:00,5.1 +2025-05-06T02:00,2.7 +2025-05-06T03:00,2.4 +2025-05-06T04:00,6.0 +2025-05-06T05:00,5.0 +2025-05-06T06:00,11.6 +2025-05-06T07:00,8.3 +2025-05-06T08:00,13.8 +2025-05-06T09:00,13.7 +2025-05-06T10:00,11.9 +2025-05-06T11:00,11.0 +2025-05-06T12:00,12.3 +2025-05-06T13:00,14.4 +2025-05-06T14:00,16.5 +2025-05-06T15:00,9.0 +2025-05-06T16:00,10.9 +2025-05-06T17:00,12.7 +2025-05-06T18:00,8.4 +2025-05-06T19:00,8.9 +2025-05-06T20:00,6.5 +2025-05-06T21:00,7.0 +2025-05-06T22:00,8.1 +2025-05-06T23:00,4.0 +2025-05-07T00:00,3.4 +2025-05-07T01:00,3.0 +2025-05-07T02:00,7.2 +2025-05-07T03:00,2.0 +2025-05-07T04:00,10.1 +2025-05-07T05:00,8.0 +2025-05-07T06:00,6.0 +2025-05-07T07:00,11.0 +2025-05-07T08:00,9.5 +2025-05-07T09:00,12.7 +2025-05-07T10:00,12.1 +2025-05-07T11:00,14.7 +2025-05-07T12:00,14.3 +2025-05-07T13:00,13.6 +2025-05-07T14:00,16.6 +2025-05-07T15:00,7.9 +2025-05-07T16:00,11.5 +2025-05-07T17:00,6.5 +2025-05-07T18:00,6.9 +2025-05-07T19:00,11.0 +2025-05-07T20:00,9.5 +2025-05-07T21:00,6.0 +2025-05-07T22:00,6.3 +2025-05-07T23:00,6.7 +2025-05-08T00:00,2.3 +2025-05-08T01:00,1.0 +2025-05-08T02:00,4.2 +2025-05-08T03:00,7.7 +2025-05-08T04:00,4.1 +2025-05-08T05:00,9.3 +2025-05-08T06:00,7.4 +2025-05-08T07:00,15.5 +2025-05-08T08:00,12.7 +2025-05-08T09:00,7.9 +2025-05-08T10:00,10.9 +2025-05-08T11:00,11.0 +2025-05-08T12:00,9.2 +2025-05-08T13:00,11.6 +2025-05-08T14:00,12.4 +2025-05-08T15:00,14.2 +2025-05-08T16:00,9.0 +2025-05-08T17:00,12.5 +2025-05-08T18:00,6.6 +2025-05-08T19:00,8.0 +2025-05-08T20:00,6.8 +2025-05-08T21:00,1.0 +2025-05-08T22:00,1.8 +2025-05-08T23:00,6.9 +2025-05-09T00:00,11.2 +2025-05-09T01:00,6.8 +2025-05-09T02:00,5.3 +2025-05-09T03:00,3.6 +2025-05-09T04:00,6.1 +2025-05-09T05:00,8.2 +2025-05-09T06:00,9.3 +2025-05-09T07:00,8.5 +2025-05-09T08:00,7.2 +2025-05-09T09:00,11.7 +2025-05-09T10:00,11.6 +2025-05-09T11:00,15.3 +2025-05-09T12:00,15.4 +2025-05-09T13:00,9.5 +2025-05-09T14:00,10.8 +2025-05-09T15:00,10.5 +2025-05-09T16:00,12.0 +2025-05-09T17:00,5.9 +2025-05-09T18:00,8.9 +2025-05-09T19:00,9.5 +2025-05-09T20:00,8.0 +2025-05-09T21:00,9.8 +2025-05-09T22:00,1.0 +2025-05-09T23:00,5.0 +2025-05-10T00:00,4.6 +2025-05-10T01:00,4.5 +2025-05-10T02:00,8.9 +2025-05-10T03:00,6.3 +2025-05-10T04:00,9.3 +2025-05-10T05:00,7.2 +2025-05-10T06:00,9.8 +2025-05-10T07:00,7.0 +2025-05-10T08:00,13.4 +2025-05-10T09:00,13.5 +2025-05-10T10:00,15.8 +2025-05-10T11:00,13.3 +2025-05-10T12:00,11.5 +2025-05-10T13:00,14.1 +2025-05-10T14:00,12.4 +2025-05-10T15:00,12.4 +2025-05-10T16:00,10.0 +2025-05-10T17:00,7.1 +2025-05-10T18:00,13.2 +2025-05-10T19:00,9.8 +2025-05-10T20:00,11.0 +2025-05-10T21:00,7.0 +2025-05-10T22:00,3.3 +2025-05-10T23:00,1.0 +2025-05-11T00:00,4.6 +2025-05-11T01:00,4.3 +2025-05-11T02:00,4.0 +2025-05-11T03:00,4.9 +2025-05-11T04:00,4.2 +2025-05-11T05:00,8.1 +2025-05-11T06:00,4.8 +2025-05-11T07:00,9.5 +2025-05-11T08:00,12.0 +2025-05-11T09:00,13.1 +2025-05-11T10:00,12.6 +2025-05-11T11:00,13.4 +2025-05-11T12:00,11.8 +2025-05-11T13:00,15.5 +2025-05-11T14:00,13.4 +2025-05-11T15:00,12.0 +2025-05-11T16:00,7.4 +2025-05-11T17:00,8.4 +2025-05-11T18:00,9.7 +2025-05-11T19:00,3.4 +2025-05-11T20:00,9.1 +2025-05-11T21:00,1.5 +2025-05-11T22:00,4.4 +2025-05-11T23:00,3.0 +2025-05-12T00:00,1.0 +2025-05-12T01:00,4.1 +2025-05-12T02:00,2.3 +2025-05-12T03:00,2.9 +2025-05-12T04:00,5.7 +2025-05-12T05:00,11.0 +2025-05-12T06:00,9.5 +2025-05-12T07:00,6.4 +2025-05-12T08:00,13.6 +2025-05-12T09:00,9.0 +2025-05-12T10:00,11.2 +2025-05-12T11:00,15.3 +2025-05-12T12:00,13.7 +2025-05-12T13:00,11.6 +2025-05-12T14:00,11.0 +2025-05-12T15:00,9.9 +2025-05-12T16:00,12.9 +2025-05-12T17:00,12.0 +2025-05-12T18:00,6.3 +2025-05-12T19:00,3.5 +2025-05-12T20:00,2.4 +2025-05-12T21:00,6.0 +2025-05-12T22:00,2.8 +2025-05-12T23:00,1.0 +2025-05-13T00:00,2.7 +2025-05-13T01:00,2.9 +2025-05-13T02:00,5.3 +2025-05-13T03:00,2.0 +2025-05-13T04:00,4.8 +2025-05-13T05:00,2.2 +2025-05-13T06:00,6.3 +2025-05-13T07:00,10.3 +2025-05-13T08:00,8.3 +2025-05-13T09:00,13.5 +2025-05-13T10:00,12.1 +2025-05-13T11:00,15.1 +2025-05-13T12:00,12.6 +2025-05-13T13:00,15.3 +2025-05-13T14:00,14.3 +2025-05-13T15:00,8.8 +2025-05-13T16:00,10.1 +2025-05-13T17:00,9.0 +2025-05-13T18:00,5.5 +2025-05-13T19:00,6.9 +2025-05-13T20:00,5.3 +2025-05-13T21:00,7.0 +2025-05-13T22:00,3.7 +2025-05-13T23:00,6.2 +2025-05-14T00:00,5.9 +2025-05-14T01:00,2.8 +2025-05-14T02:00,2.9 +2025-05-14T03:00,4.2 +2025-05-14T04:00,1.2 +2025-05-14T05:00,12.6 +2025-05-14T06:00,8.8 +2025-05-14T07:00,9.3 +2025-05-14T08:00,10.0 +2025-05-14T09:00,12.1 +2025-05-14T10:00,11.4 +2025-05-14T11:00,12.4 +2025-05-14T12:00,10.0 +2025-05-14T13:00,11.3 +2025-05-14T14:00,13.1 +2025-05-14T15:00,12.2 +2025-05-14T16:00,6.5 +2025-05-14T17:00,5.4 +2025-05-14T18:00,14.2 +2025-05-14T19:00,8.2 +2025-05-14T20:00,6.0 +2025-05-14T21:00,6.6 +2025-05-14T22:00,1.9 +2025-05-14T23:00,1.0 +2025-05-15T00:00,5.2 +2025-05-15T01:00,2.0 +2025-05-15T02:00,8.6 +2025-05-15T03:00,3.7 +2025-05-15T04:00,9.6 +2025-05-15T05:00,1.6 +2025-05-15T06:00,4.4 +2025-05-15T07:00,5.0 +2025-05-15T08:00,10.1 +2025-05-15T09:00,12.0 +2025-05-15T10:00,13.4 +2025-05-15T11:00,18.3 +2025-05-15T12:00,6.8 +2025-05-15T13:00,10.1 +2025-05-15T14:00,8.5 +2025-05-15T15:00,10.4 +2025-05-15T16:00,12.5 +2025-05-15T17:00,3.9 +2025-05-15T18:00,6.5 +2025-05-15T19:00,10.0 +2025-05-15T20:00,6.3 +2025-05-15T21:00,4.0 +2025-05-15T22:00,1.0 +2025-05-15T23:00,4.3 +2025-05-16T00:00,4.6 +2025-05-16T01:00,3.8 +2025-05-16T02:00,4.2 +2025-05-16T03:00,6.4 +2025-05-16T04:00,5.7 +2025-05-16T05:00,7.2 +2025-05-16T06:00,6.4 +2025-05-16T07:00,12.8 +2025-05-16T08:00,10.3 +2025-05-16T09:00,9.8 +2025-05-16T10:00,13.6 +2025-05-16T11:00,13.3 +2025-05-16T12:00,12.1 +2025-05-16T13:00,13.2 +2025-05-16T14:00,9.1 +2025-05-16T15:00,11.3 +2025-05-16T16:00,10.6 +2025-05-16T17:00,3.0 +2025-05-16T18:00,6.5 +2025-05-16T19:00,7.6 +2025-05-16T20:00,7.9 +2025-05-16T21:00,4.2 +2025-05-16T22:00,4.2 +2025-05-16T23:00,5.2 +2025-05-17T00:00,6.1 +2025-05-17T01:00,2.9 +2025-05-17T02:00,6.9 +2025-05-17T03:00,6.5 +2025-05-17T04:00,8.9 +2025-05-17T05:00,4.5 +2025-05-17T06:00,11.8 +2025-05-17T07:00,10.6 +2025-05-17T08:00,8.9 +2025-05-17T09:00,6.5 +2025-05-17T10:00,11.0 +2025-05-17T11:00,11.9 +2025-05-17T12:00,13.3 +2025-05-17T13:00,13.7 +2025-05-17T14:00,13.9 +2025-05-17T15:00,10.2 +2025-05-17T16:00,12.8 +2025-05-17T17:00,8.5 +2025-05-17T18:00,7.6 +2025-05-17T19:00,7.0 +2025-05-17T20:00,8.0 +2025-05-17T21:00,1.9 +2025-05-17T22:00,6.1 +2025-05-17T23:00,2.0 +2025-05-18T00:00,6.2 +2025-05-18T01:00,4.2 +2025-05-18T02:00,4.7 +2025-05-18T03:00,5.0 +2025-05-18T04:00,4.9 +2025-05-18T05:00,8.3 +2025-05-18T06:00,6.5 +2025-05-18T07:00,5.1 +2025-05-18T08:00,8.7 +2025-05-18T09:00,8.6 +2025-05-18T10:00,14.0 +2025-05-18T11:00,12.1 +2025-05-18T12:00,15.0 +2025-05-18T13:00,9.2 +2025-05-18T14:00,9.8 +2025-05-18T15:00,7.0 +2025-05-18T16:00,12.4 +2025-05-18T17:00,7.1 +2025-05-18T18:00,8.9 +2025-05-18T19:00,3.3 +2025-05-18T20:00,4.8 +2025-05-18T21:00,2.1 +2025-05-18T22:00,5.4 +2025-05-18T23:00,4.3 +2025-05-19T00:00,3.0 +2025-05-19T01:00,4.4 +2025-05-19T02:00,9.9 +2025-05-19T03:00,2.9 +2025-05-19T04:00,4.9 +2025-05-19T05:00,8.6 +2025-05-19T06:00,4.7 +2025-05-19T07:00,10.5 +2025-05-19T08:00,6.9 +2025-05-19T09:00,11.9 +2025-05-19T10:00,17.0 +2025-05-19T11:00,8.2 +2025-05-19T12:00,14.3 +2025-05-19T13:00,11.9 +2025-05-19T14:00,12.7 +2025-05-19T15:00,8.1 +2025-05-19T16:00,9.1 +2025-05-19T17:00,9.9 +2025-05-19T18:00,1.0 +2025-05-19T19:00,1.0 +2025-05-19T20:00,2.7 +2025-05-19T21:00,5.7 +2025-05-19T22:00,2.1 +2025-05-19T23:00,4.5 +2025-05-20T00:00,5.2 +2025-05-20T01:00,3.9 +2025-05-20T02:00,1.0 +2025-05-20T03:00,5.6 +2025-05-20T04:00,2.7 +2025-05-20T05:00,9.6 +2025-05-20T06:00,7.5 +2025-05-20T07:00,7.0 +2025-05-20T08:00,3.7 +2025-05-20T09:00,10.1 +2025-05-20T10:00,6.6 +2025-05-20T11:00,7.6 +2025-05-20T12:00,16.0 +2025-05-20T13:00,9.8 +2025-05-20T14:00,10.8 +2025-05-20T15:00,11.3 +2025-05-20T16:00,7.4 +2025-05-20T17:00,7.9 +2025-05-20T18:00,5.3 +2025-05-20T19:00,8.8 +2025-05-20T20:00,4.7 +2025-05-20T21:00,3.1 +2025-05-20T22:00,2.4 +2025-05-20T23:00,4.3 +2025-05-21T00:00,2.6 +2025-05-21T01:00,1.0 +2025-05-21T02:00,4.1 +2025-05-21T03:00,5.2 +2025-05-21T04:00,4.5 +2025-05-21T05:00,2.8 +2025-05-21T06:00,4.3 +2025-05-21T07:00,8.2 +2025-05-21T08:00,7.3 +2025-05-21T09:00,10.2 +2025-05-21T10:00,10.9 +2025-05-21T11:00,11.8 +2025-05-21T12:00,11.7 +2025-05-21T13:00,13.1 +2025-05-21T14:00,13.1 +2025-05-21T15:00,9.3 +2025-05-21T16:00,5.1 +2025-05-21T17:00,7.0 +2025-05-21T18:00,6.8 +2025-05-21T19:00,3.3 +2025-05-21T20:00,7.3 +2025-05-21T21:00,4.5 +2025-05-21T22:00,3.7 +2025-05-21T23:00,3.5 +2025-05-22T00:00,6.5 +2025-05-22T01:00,3.4 +2025-05-22T02:00,7.1 +2025-05-22T03:00,8.8 +2025-05-22T04:00,5.0 +2025-05-22T05:00,7.2 +2025-05-22T06:00,7.8 +2025-05-22T07:00,4.1 +2025-05-22T08:00,10.3 +2025-05-22T09:00,7.4 +2025-05-22T10:00,5.8 +2025-05-22T11:00,6.1 +2025-05-22T12:00,10.5 +2025-05-22T13:00,9.6 +2025-05-22T14:00,11.9 +2025-05-22T15:00,13.7 +2025-05-22T16:00,6.1 +2025-05-22T17:00,3.9 +2025-05-22T18:00,11.7 +2025-05-22T19:00,4.4 +2025-05-22T20:00,5.1 +2025-05-22T21:00,4.7 +2025-05-22T22:00,3.7 +2025-05-22T23:00,6.5 +2025-05-23T00:00,1.0 +2025-05-23T01:00,1.0 +2025-05-23T02:00,8.7 +2025-05-23T03:00,5.2 +2025-05-23T04:00,3.1 +2025-05-23T05:00,4.5 +2025-05-23T06:00,5.2 +2025-05-23T07:00,7.7 +2025-05-23T08:00,7.4 +2025-05-23T09:00,14.2 +2025-05-23T10:00,9.9 +2025-05-23T11:00,10.3 +2025-05-23T12:00,11.4 +2025-05-23T13:00,14.1 +2025-05-23T14:00,8.6 +2025-05-23T15:00,8.4 +2025-05-23T16:00,9.0 +2025-05-23T17:00,8.3 +2025-05-23T18:00,8.5 +2025-05-23T19:00,3.5 +2025-05-23T20:00,2.6 +2025-05-23T21:00,2.0 +2025-05-23T22:00,4.4 +2025-05-23T23:00,3.1 +2025-05-24T00:00,2.3 +2025-05-24T01:00,1.0 +2025-05-24T02:00,7.7 +2025-05-24T03:00,3.2 +2025-05-24T04:00,4.6 +2025-05-24T05:00,4.8 +2025-05-24T06:00,7.6 +2025-05-24T07:00,5.2 +2025-05-24T08:00,9.3 +2025-05-24T09:00,10.6 +2025-05-24T10:00,9.8 +2025-05-24T11:00,9.6 +2025-05-24T12:00,14.9 +2025-05-24T13:00,7.4 +2025-05-24T14:00,11.5 +2025-05-24T15:00,8.5 +2025-05-24T16:00,11.6 +2025-05-24T17:00,6.4 +2025-05-24T18:00,12.7 +2025-05-24T19:00,6.4 +2025-05-24T20:00,5.2 +2025-05-24T21:00,1.7 +2025-05-24T22:00,2.5 +2025-05-24T23:00,2.0 +2025-05-25T00:00,4.0 +2025-05-25T01:00,1.9 +2025-05-25T02:00,4.0 +2025-05-25T03:00,5.4 +2025-05-25T04:00,3.7 +2025-05-25T05:00,4.5 +2025-05-25T06:00,8.1 +2025-05-25T07:00,11.8 +2025-05-25T08:00,9.8 +2025-05-25T09:00,11.7 +2025-05-25T10:00,12.7 +2025-05-25T11:00,8.0 +2025-05-25T12:00,14.3 +2025-05-25T13:00,10.5 +2025-05-25T14:00,9.6 +2025-05-25T15:00,12.2 +2025-05-25T16:00,11.8 +2025-05-25T17:00,8.0 +2025-05-25T18:00,11.6 +2025-05-25T19:00,8.3 +2025-05-25T20:00,3.2 +2025-05-25T21:00,5.6 +2025-05-25T22:00,3.1 +2025-05-25T23:00,3.4 +2025-05-26T00:00,3.2 +2025-05-26T01:00,2.5 +2025-05-26T02:00,5.7 +2025-05-26T03:00,6.8 +2025-05-26T04:00,7.8 +2025-05-26T05:00,3.5 +2025-05-26T06:00,6.2 +2025-05-26T07:00,7.6 +2025-05-26T08:00,12.6 +2025-05-26T09:00,9.2 +2025-05-26T10:00,5.9 +2025-05-26T11:00,9.4 +2025-05-26T12:00,8.9 +2025-05-26T13:00,11.7 +2025-05-26T14:00,9.4 +2025-05-26T15:00,9.5 +2025-05-26T16:00,10.7 +2025-05-26T17:00,9.9 +2025-05-26T18:00,4.8 +2025-05-26T19:00,6.4 +2025-05-26T20:00,7.3 +2025-05-26T21:00,8.6 +2025-05-26T22:00,6.0 +2025-05-26T23:00,6.4 +2025-05-27T00:00,4.5 +2025-05-27T01:00,3.5 +2025-05-27T02:00,6.9 +2025-05-27T03:00,5.3 +2025-05-27T04:00,10.0 +2025-05-27T05:00,8.7 +2025-05-27T06:00,1.0 +2025-05-27T07:00,4.2 +2025-05-27T08:00,9.5 +2025-05-27T09:00,9.2 +2025-05-27T10:00,9.1 +2025-05-27T11:00,15.6 +2025-05-27T12:00,15.5 +2025-05-27T13:00,10.1 +2025-05-27T14:00,8.5 +2025-05-27T15:00,9.0 +2025-05-27T16:00,6.1 +2025-05-27T17:00,7.5 +2025-05-27T18:00,7.3 +2025-05-27T19:00,9.6 +2025-05-27T20:00,7.2 +2025-05-27T21:00,3.3 +2025-05-27T22:00,2.3 +2025-05-27T23:00,3.6 +2025-05-28T00:00,1.0 +2025-05-28T01:00,1.0 +2025-05-28T02:00,2.6 +2025-05-28T03:00,2.5 +2025-05-28T04:00,2.7 +2025-05-28T05:00,3.7 +2025-05-28T06:00,5.4 +2025-05-28T07:00,7.6 +2025-05-28T08:00,5.3 +2025-05-28T09:00,11.4 +2025-05-28T10:00,14.2 +2025-05-28T11:00,14.1 +2025-05-28T12:00,12.6 +2025-05-28T13:00,11.2 +2025-05-28T14:00,9.3 +2025-05-28T15:00,9.9 +2025-05-28T16:00,9.9 +2025-05-28T17:00,13.9 +2025-05-28T18:00,8.2 +2025-05-28T19:00,3.5 +2025-05-28T20:00,1.0 +2025-05-28T21:00,3.9 +2025-05-28T22:00,1.1 +2025-05-28T23:00,1.4 +2025-05-29T00:00,6.4 +2025-05-29T01:00,1.0 +2025-05-29T02:00,4.0 +2025-05-29T03:00,5.4 +2025-05-29T04:00,8.2 +2025-05-29T05:00,7.9 +2025-05-29T06:00,5.3 +2025-05-29T07:00,9.6 +2025-05-29T08:00,11.6 +2025-05-29T09:00,13.3 +2025-05-29T10:00,8.2 +2025-05-29T11:00,10.2 +2025-05-29T12:00,4.5 +2025-05-29T13:00,12.4 +2025-05-29T14:00,10.4 +2025-05-29T15:00,6.2 +2025-05-29T16:00,5.5 +2025-05-29T17:00,4.8 +2025-05-29T18:00,4.8 +2025-05-29T19:00,8.4 +2025-05-29T20:00,5.6 +2025-05-29T21:00,6.3 +2025-05-29T22:00,1.4 +2025-05-29T23:00,3.5 +2025-05-30T00:00,1.0 +2025-05-30T01:00,5.5 +2025-05-30T02:00,4.1 +2025-05-30T03:00,3.2 +2025-05-30T04:00,4.1 +2025-05-30T05:00,3.0 +2025-05-30T06:00,1.0 +2025-05-30T07:00,5.5 +2025-05-30T08:00,9.9 +2025-05-30T09:00,8.7 +2025-05-30T10:00,10.2 +2025-05-30T11:00,12.7 +2025-05-30T12:00,10.2 +2025-05-30T13:00,11.2 +2025-05-30T14:00,13.5 +2025-05-30T15:00,7.4 +2025-05-30T16:00,5.1 +2025-05-30T17:00,9.5 +2025-05-30T18:00,6.5 +2025-05-30T19:00,5.3 +2025-05-30T20:00,3.6 +2025-05-30T21:00,1.9 +2025-05-30T22:00,1.0 +2025-05-30T23:00,2.6 +2025-05-31T00:00,1.0 +2025-05-31T01:00,2.9 +2025-05-31T02:00,1.5 +2025-05-31T03:00,4.6 +2025-05-31T04:00,1.8 +2025-05-31T05:00,7.0 +2025-05-31T06:00,4.4 +2025-05-31T07:00,4.3 +2025-05-31T08:00,6.6 +2025-05-31T09:00,11.6 +2025-05-31T10:00,10.6 +2025-05-31T11:00,4.4 +2025-05-31T12:00,11.6 +2025-05-31T13:00,12.0 +2025-05-31T14:00,11.1 +2025-05-31T15:00,7.1 +2025-05-31T16:00,7.3 +2025-05-31T17:00,4.8 +2025-05-31T18:00,10.3 +2025-05-31T19:00,1.0 +2025-05-31T20:00,4.4 +2025-05-31T21:00,4.6 +2025-05-31T22:00,2.6 +2025-05-31T23:00,4.1 +2025-06-01T00:00,1.0 +2025-06-01T01:00,1.7 +2025-06-01T02:00,3.5 +2025-06-01T03:00,5.5 +2025-06-01T04:00,1.0 +2025-06-01T05:00,3.0 +2025-06-01T06:00,7.6 +2025-06-01T07:00,8.7 +2025-06-01T08:00,11.4 +2025-06-01T09:00,10.5 +2025-06-01T10:00,8.6 +2025-06-01T11:00,10.5 +2025-06-01T12:00,8.4 +2025-06-01T13:00,8.1 +2025-06-01T14:00,6.8 +2025-06-01T15:00,6.4 +2025-06-01T16:00,10.1 +2025-06-01T17:00,10.1 +2025-06-01T18:00,5.8 +2025-06-01T19:00,5.2 +2025-06-01T20:00,7.4 +2025-06-01T21:00,2.9 +2025-06-01T22:00,5.0 +2025-06-01T23:00,1.0 +2025-06-02T00:00,1.0 +2025-06-02T01:00,5.4 +2025-06-02T02:00,3.4 +2025-06-02T03:00,1.0 +2025-06-02T04:00,5.8 +2025-06-02T05:00,3.3 +2025-06-02T06:00,6.8 +2025-06-02T07:00,8.0 +2025-06-02T08:00,10.9 +2025-06-02T09:00,9.9 +2025-06-02T10:00,7.6 +2025-06-02T11:00,8.7 +2025-06-02T12:00,12.2 +2025-06-02T13:00,9.8 +2025-06-02T14:00,7.8 +2025-06-02T15:00,7.0 +2025-06-02T16:00,9.6 +2025-06-02T17:00,12.7 +2025-06-02T18:00,9.5 +2025-06-02T19:00,5.2 +2025-06-02T20:00,2.9 +2025-06-02T21:00,2.1 +2025-06-02T22:00,3.9 +2025-06-02T23:00,1.0 +2025-06-03T00:00,6.2 +2025-06-03T01:00,2.4 +2025-06-03T02:00,1.0 +2025-06-03T03:00,4.1 +2025-06-03T04:00,2.2 +2025-06-03T05:00,1.0 +2025-06-03T06:00,2.0 +2025-06-03T07:00,7.0 +2025-06-03T08:00,3.8 +2025-06-03T09:00,2.0 +2025-06-03T10:00,10.8 +2025-06-03T11:00,7.9 +2025-06-03T12:00,10.2 +2025-06-03T13:00,12.0 +2025-06-03T14:00,7.0 +2025-06-03T15:00,3.9 +2025-06-03T16:00,10.7 +2025-06-03T17:00,10.2 +2025-06-03T18:00,8.7 +2025-06-03T19:00,7.7 +2025-06-03T20:00,3.8 +2025-06-03T21:00,8.1 +2025-06-03T22:00,1.0 +2025-06-03T23:00,4.6 +2025-06-04T00:00,4.8 +2025-06-04T01:00,1.0 +2025-06-04T02:00,5.7 +2025-06-04T03:00,7.0 +2025-06-04T04:00,8.5 +2025-06-04T05:00,3.0 +2025-06-04T06:00,6.5 +2025-06-04T07:00,5.7 +2025-06-04T08:00,8.5 +2025-06-04T09:00,8.9 +2025-06-04T10:00,11.4 +2025-06-04T11:00,8.6 +2025-06-04T12:00,6.6 +2025-06-04T13:00,10.3 +2025-06-04T14:00,9.2 +2025-06-04T15:00,2.4 +2025-06-04T16:00,11.1 +2025-06-04T17:00,8.1 +2025-06-04T18:00,4.0 +2025-06-04T19:00,5.5 +2025-06-04T20:00,6.3 +2025-06-04T21:00,4.3 +2025-06-04T22:00,5.1 +2025-06-04T23:00,5.2 +2025-06-05T00:00,2.8 +2025-06-05T01:00,3.2 +2025-06-05T02:00,6.2 +2025-06-05T03:00,1.0 +2025-06-05T04:00,8.3 +2025-06-05T05:00,6.3 +2025-06-05T06:00,5.5 +2025-06-05T07:00,5.7 +2025-06-05T08:00,5.3 +2025-06-05T09:00,8.8 +2025-06-05T10:00,10.6 +2025-06-05T11:00,12.9 +2025-06-05T12:00,8.5 +2025-06-05T13:00,9.7 +2025-06-05T14:00,5.1 +2025-06-05T15:00,9.0 +2025-06-05T16:00,7.8 +2025-06-05T17:00,13.7 +2025-06-05T18:00,4.5 +2025-06-05T19:00,3.1 +2025-06-05T20:00,1.0 +2025-06-05T21:00,1.0 +2025-06-05T22:00,1.5 +2025-06-05T23:00,1.0 +2025-06-06T00:00,1.0 +2025-06-06T01:00,1.9 +2025-06-06T02:00,4.1 +2025-06-06T03:00,3.9 +2025-06-06T04:00,1.0 +2025-06-06T05:00,1.0 +2025-06-06T06:00,2.7 +2025-06-06T07:00,10.5 +2025-06-06T08:00,8.9 +2025-06-06T09:00,11.8 +2025-06-06T10:00,11.0 +2025-06-06T11:00,7.9 +2025-06-06T12:00,11.1 +2025-06-06T13:00,8.7 +2025-06-06T14:00,6.5 +2025-06-06T15:00,6.0 +2025-06-06T16:00,11.6 +2025-06-06T17:00,8.3 +2025-06-06T18:00,9.3 +2025-06-06T19:00,5.4 +2025-06-06T20:00,1.1 +2025-06-06T21:00,3.6 +2025-06-06T22:00,2.7 +2025-06-06T23:00,1.0 +2025-06-07T00:00,9.4 +2025-06-07T01:00,1.2 +2025-06-07T02:00,1.5 +2025-06-07T03:00,1.6 +2025-06-07T04:00,6.0 +2025-06-07T05:00,5.5 +2025-06-07T06:00,1.0 +2025-06-07T07:00,4.6 +2025-06-07T08:00,7.4 +2025-06-07T09:00,11.7 +2025-06-07T10:00,9.4 +2025-06-07T11:00,10.2 +2025-06-07T12:00,8.9 +2025-06-07T13:00,11.4 +2025-06-07T14:00,9.1 +2025-06-07T15:00,5.1 +2025-06-07T16:00,6.7 +2025-06-07T17:00,6.2 +2025-06-07T18:00,1.0 +2025-06-07T19:00,1.4 +2025-06-07T20:00,3.5 +2025-06-07T21:00,2.4 +2025-06-07T22:00,2.1 +2025-06-07T23:00,1.0 +2025-06-08T00:00,3.3 +2025-06-08T01:00,4.3 +2025-06-08T02:00,1.0 +2025-06-08T03:00,4.3 +2025-06-08T04:00,1.0 +2025-06-08T05:00,5.1 +2025-06-08T06:00,4.7 +2025-06-08T07:00,6.5 +2025-06-08T08:00,4.4 +2025-06-08T09:00,9.3 +2025-06-08T10:00,10.4 +2025-06-08T11:00,12.1 +2025-06-08T12:00,8.8 +2025-06-08T13:00,8.3 +2025-06-08T14:00,9.0 +2025-06-08T15:00,11.3 +2025-06-08T16:00,7.0 +2025-06-08T17:00,10.3 +2025-06-08T18:00,3.1 +2025-06-08T19:00,3.0 +2025-06-08T20:00,5.3 +2025-06-08T21:00,1.0 +2025-06-08T22:00,1.0 +2025-06-08T23:00,2.8 +2025-06-09T00:00,6.5 +2025-06-09T01:00,1.4 +2025-06-09T02:00,2.8 +2025-06-09T03:00,4.3 +2025-06-09T04:00,5.5 +2025-06-09T05:00,2.8 +2025-06-09T06:00,4.5 +2025-06-09T07:00,8.3 +2025-06-09T08:00,9.4 +2025-06-09T09:00,5.0 +2025-06-09T10:00,13.9 +2025-06-09T11:00,10.5 +2025-06-09T12:00,8.8 +2025-06-09T13:00,8.8 +2025-06-09T14:00,7.1 +2025-06-09T15:00,9.5 +2025-06-09T16:00,8.9 +2025-06-09T17:00,1.0 +2025-06-09T18:00,5.2 +2025-06-09T19:00,6.7 +2025-06-09T20:00,1.0 +2025-06-09T21:00,1.0 +2025-06-09T22:00,1.0 +2025-06-09T23:00,1.0 +2025-06-10T00:00,1.0 +2025-06-10T01:00,1.0 +2025-06-10T02:00,4.1 +2025-06-10T03:00,5.2 +2025-06-10T04:00,1.0 +2025-06-10T05:00,5.0 +2025-06-10T06:00,5.7 +2025-06-10T07:00,6.9 +2025-06-10T08:00,8.5 +2025-06-10T09:00,8.8 +2025-06-10T10:00,11.8 +2025-06-10T11:00,8.3 +2025-06-10T12:00,9.5 +2025-06-10T13:00,13.5 +2025-06-10T14:00,7.7 +2025-06-10T15:00,6.1 +2025-06-10T16:00,5.4 +2025-06-10T17:00,4.2 +2025-06-10T18:00,4.7 +2025-06-10T19:00,2.7 +2025-06-10T20:00,7.4 +2025-06-10T21:00,3.3 +2025-06-10T22:00,2.1 +2025-06-10T23:00,1.0 +2025-06-11T00:00,4.1 +2025-06-11T01:00,4.9 +2025-06-11T02:00,1.8 +2025-06-11T03:00,1.0 +2025-06-11T04:00,2.7 +2025-06-11T05:00,4.9 +2025-06-11T06:00,8.2 +2025-06-11T07:00,2.1 +2025-06-11T08:00,10.9 +2025-06-11T09:00,8.6 +2025-06-11T10:00,5.4 +2025-06-11T11:00,12.0 +2025-06-11T12:00,5.4 +2025-06-11T13:00,8.5 +2025-06-11T14:00,11.0 +2025-06-11T15:00,12.6 +2025-06-11T16:00,6.6 +2025-06-11T17:00,5.6 +2025-06-11T18:00,8.7 +2025-06-11T19:00,6.0 +2025-06-11T20:00,1.0 +2025-06-11T21:00,3.6 +2025-06-11T22:00,4.2 +2025-06-11T23:00,1.0 +2025-06-12T00:00,3.9 +2025-06-12T01:00,1.0 +2025-06-12T02:00,1.7 +2025-06-12T03:00,3.9 +2025-06-12T04:00,4.7 +2025-06-12T05:00,1.7 +2025-06-12T06:00,6.7 +2025-06-12T07:00,2.8 +2025-06-12T08:00,3.8 +2025-06-12T09:00,5.9 +2025-06-12T10:00,9.1 +2025-06-12T11:00,8.8 +2025-06-12T12:00,10.6 +2025-06-12T13:00,9.5 +2025-06-12T14:00,9.7 +2025-06-12T15:00,7.8 +2025-06-12T16:00,8.7 +2025-06-12T17:00,4.9 +2025-06-12T18:00,4.8 +2025-06-12T19:00,2.2 +2025-06-12T20:00,4.3 +2025-06-12T21:00,3.4 +2025-06-12T22:00,1.0 +2025-06-12T23:00,5.4 +2025-06-13T00:00,2.4 +2025-06-13T01:00,1.0 +2025-06-13T02:00,1.0 +2025-06-13T03:00,1.0 +2025-06-13T04:00,1.0 +2025-06-13T05:00,3.6 +2025-06-13T06:00,6.7 +2025-06-13T07:00,5.9 +2025-06-13T08:00,14.8 +2025-06-13T09:00,3.9 +2025-06-13T10:00,7.7 +2025-06-13T11:00,6.1 +2025-06-13T12:00,9.8 +2025-06-13T13:00,11.4 +2025-06-13T14:00,8.1 +2025-06-13T15:00,5.9 +2025-06-13T16:00,8.1 +2025-06-13T17:00,11.6 +2025-06-13T18:00,5.6 +2025-06-13T19:00,1.0 +2025-06-13T20:00,1.1 +2025-06-13T21:00,6.9 +2025-06-13T22:00,1.0 +2025-06-13T23:00,3.4 +2025-06-14T00:00,1.4 +2025-06-14T01:00,4.6 +2025-06-14T02:00,3.5 +2025-06-14T03:00,4.3 +2025-06-14T04:00,5.1 +2025-06-14T05:00,8.6 +2025-06-14T06:00,9.7 +2025-06-14T07:00,5.8 +2025-06-14T08:00,11.4 +2025-06-14T09:00,12.6 +2025-06-14T10:00,6.8 +2025-06-14T11:00,9.2 +2025-06-14T12:00,6.6 +2025-06-14T13:00,10.8 +2025-06-14T14:00,4.5 +2025-06-14T15:00,3.7 +2025-06-14T16:00,6.4 +2025-06-14T17:00,7.5 +2025-06-14T18:00,1.0 +2025-06-14T19:00,2.5 +2025-06-14T20:00,2.4 +2025-06-14T21:00,3.4 +2025-06-14T22:00,1.0 +2025-06-14T23:00,4.1 +2025-06-15T00:00,1.0 +2025-06-15T01:00,1.0 +2025-06-15T02:00,1.0 +2025-06-15T03:00,1.2 +2025-06-15T04:00,1.0 +2025-06-15T05:00,5.6 +2025-06-15T06:00,2.2 +2025-06-15T07:00,9.3 +2025-06-15T08:00,7.7 +2025-06-15T09:00,9.8 +2025-06-15T10:00,6.5 +2025-06-15T11:00,11.3 +2025-06-15T12:00,10.5 +2025-06-15T13:00,6.5 +2025-06-15T14:00,10.3 +2025-06-15T15:00,7.4 +2025-06-15T16:00,6.2 +2025-06-15T17:00,3.8 +2025-06-15T18:00,8.2 +2025-06-15T19:00,10.1 +2025-06-15T20:00,1.3 +2025-06-15T21:00,2.2 +2025-06-15T22:00,4.1 +2025-06-15T23:00,6.3 +2025-06-16T00:00,4.0 +2025-06-16T01:00,1.0 +2025-06-16T02:00,2.9 +2025-06-16T03:00,3.1 +2025-06-16T04:00,1.0 +2025-06-16T05:00,5.5 +2025-06-16T06:00,1.0 +2025-06-16T07:00,3.4 +2025-06-16T08:00,5.1 +2025-06-16T09:00,9.5 +2025-06-16T10:00,9.5 +2025-06-16T11:00,9.4 +2025-06-16T12:00,10.4 +2025-06-16T13:00,8.6 +2025-06-16T14:00,12.0 +2025-06-16T15:00,11.6 +2025-06-16T16:00,8.8 +2025-06-16T17:00,3.6 +2025-06-16T18:00,3.2 +2025-06-16T19:00,5.9 +2025-06-16T20:00,1.0 +2025-06-16T21:00,6.8 +2025-06-16T22:00,1.0 +2025-06-16T23:00,5.2 +2025-06-17T00:00,1.0 +2025-06-17T01:00,5.8 +2025-06-17T02:00,1.0 +2025-06-17T03:00,6.0 +2025-06-17T04:00,5.6 +2025-06-17T05:00,3.1 +2025-06-17T06:00,3.7 +2025-06-17T07:00,7.4 +2025-06-17T08:00,8.8 +2025-06-17T09:00,7.6 +2025-06-17T10:00,10.7 +2025-06-17T11:00,8.8 +2025-06-17T12:00,10.5 +2025-06-17T13:00,14.7 +2025-06-17T14:00,9.8 +2025-06-17T15:00,11.9 +2025-06-17T16:00,5.4 +2025-06-17T17:00,5.6 +2025-06-17T18:00,8.6 +2025-06-17T19:00,4.4 +2025-06-17T20:00,3.1 +2025-06-17T21:00,2.8 +2025-06-17T22:00,2.8 +2025-06-17T23:00,2.9 +2025-06-18T00:00,6.1 +2025-06-18T01:00,2.3 +2025-06-18T02:00,1.0 +2025-06-18T03:00,4.0 +2025-06-18T04:00,3.5 +2025-06-18T05:00,2.1 +2025-06-18T06:00,4.8 +2025-06-18T07:00,4.3 +2025-06-18T08:00,8.5 +2025-06-18T09:00,8.4 +2025-06-18T10:00,9.1 +2025-06-18T11:00,8.4 +2025-06-18T12:00,8.0 +2025-06-18T13:00,10.0 +2025-06-18T14:00,9.0 +2025-06-18T15:00,10.1 +2025-06-18T16:00,7.8 +2025-06-18T17:00,1.0 +2025-06-18T18:00,1.0 +2025-06-18T19:00,3.3 +2025-06-18T20:00,1.0 +2025-06-18T21:00,1.9 +2025-06-18T22:00,1.0 +2025-06-18T23:00,1.5 +2025-06-19T00:00,1.2 +2025-06-19T01:00,3.3 +2025-06-19T02:00,2.4 +2025-06-19T03:00,1.0 +2025-06-19T04:00,3.8 +2025-06-19T05:00,4.0 +2025-06-19T06:00,1.9 +2025-06-19T07:00,2.9 +2025-06-19T08:00,5.5 +2025-06-19T09:00,9.9 +2025-06-19T10:00,10.4 +2025-06-19T11:00,11.1 +2025-06-19T12:00,5.4 +2025-06-19T13:00,10.8 +2025-06-19T14:00,10.2 +2025-06-19T15:00,6.2 +2025-06-19T16:00,3.5 +2025-06-19T17:00,8.0 +2025-06-19T18:00,8.6 +2025-06-19T19:00,1.2 +2025-06-19T20:00,3.1 +2025-06-19T21:00,5.2 +2025-06-19T22:00,2.0 +2025-06-19T23:00,2.9 +2025-06-20T00:00,1.0 +2025-06-20T01:00,1.0 +2025-06-20T02:00,2.7 +2025-06-20T03:00,6.1 +2025-06-20T04:00,4.7 +2025-06-20T05:00,8.5 +2025-06-20T06:00,6.1 +2025-06-20T07:00,10.1 +2025-06-20T08:00,9.1 +2025-06-20T09:00,9.3 +2025-06-20T10:00,9.6 +2025-06-20T11:00,6.5 +2025-06-20T12:00,8.0 +2025-06-20T13:00,8.3 +2025-06-20T14:00,7.1 +2025-06-20T15:00,6.2 +2025-06-20T16:00,6.0 +2025-06-20T17:00,6.4 +2025-06-20T18:00,3.8 +2025-06-20T19:00,6.3 +2025-06-20T20:00,5.3 +2025-06-20T21:00,6.2 +2025-06-20T22:00,5.1 +2025-06-20T23:00,1.4 +2025-06-21T00:00,1.0 +2025-06-21T01:00,4.6 +2025-06-21T02:00,3.6 +2025-06-21T03:00,1.6 +2025-06-21T04:00,1.0 +2025-06-21T05:00,4.9 +2025-06-21T06:00,7.0 +2025-06-21T07:00,7.6 +2025-06-21T08:00,7.1 +2025-06-21T09:00,11.2 +2025-06-21T10:00,6.9 +2025-06-21T11:00,5.3 +2025-06-21T12:00,7.4 +2025-06-21T13:00,7.7 +2025-06-21T14:00,7.3 +2025-06-21T15:00,6.5 +2025-06-21T16:00,7.0 +2025-06-21T17:00,2.0 +2025-06-21T18:00,7.6 +2025-06-21T19:00,3.4 +2025-06-21T20:00,3.1 +2025-06-21T21:00,1.0 +2025-06-21T22:00,1.0 +2025-06-21T23:00,1.0 +2025-06-22T00:00,1.0 +2025-06-22T01:00,3.4 +2025-06-22T02:00,4.0 +2025-06-22T03:00,4.0 +2025-06-22T04:00,1.4 +2025-06-22T05:00,4.6 +2025-06-22T06:00,3.3 +2025-06-22T07:00,5.8 +2025-06-22T08:00,9.5 +2025-06-22T09:00,7.6 +2025-06-22T10:00,8.1 +2025-06-22T11:00,6.9 +2025-06-22T12:00,11.4 +2025-06-22T13:00,10.2 +2025-06-22T14:00,10.7 +2025-06-22T15:00,8.8 +2025-06-22T16:00,4.9 +2025-06-22T17:00,7.8 +2025-06-22T18:00,7.8 +2025-06-22T19:00,2.9 +2025-06-22T20:00,3.5 +2025-06-22T21:00,1.0 +2025-06-22T22:00,4.3 +2025-06-22T23:00,1.0 +2025-06-23T00:00,3.3 +2025-06-23T01:00,1.8 +2025-06-23T02:00,1.0 +2025-06-23T03:00,2.4 +2025-06-23T04:00,1.0 +2025-06-23T05:00,2.5 +2025-06-23T06:00,7.2 +2025-06-23T07:00,2.0 +2025-06-23T08:00,9.5 +2025-06-23T09:00,6.2 +2025-06-23T10:00,5.4 +2025-06-23T11:00,9.8 +2025-06-23T12:00,13.1 +2025-06-23T13:00,12.7 +2025-06-23T14:00,10.0 +2025-06-23T15:00,9.0 +2025-06-23T16:00,9.7 +2025-06-23T17:00,3.8 +2025-06-23T18:00,6.1 +2025-06-23T19:00,2.1 +2025-06-23T20:00,2.0 +2025-06-23T21:00,7.0 +2025-06-23T22:00,3.9 +2025-06-23T23:00,2.2 +2025-06-24T00:00,1.0 +2025-06-24T01:00,2.7 +2025-06-24T02:00,5.7 +2025-06-24T03:00,1.0 +2025-06-24T04:00,2.0 +2025-06-24T05:00,3.2 +2025-06-24T06:00,2.8 +2025-06-24T07:00,9.0 +2025-06-24T08:00,9.5 +2025-06-24T09:00,2.1 +2025-06-24T10:00,6.6 +2025-06-24T11:00,12.2 +2025-06-24T12:00,11.2 +2025-06-24T13:00,14.2 +2025-06-24T14:00,8.2 +2025-06-24T15:00,13.3 +2025-06-24T16:00,10.4 +2025-06-24T17:00,6.1 +2025-06-24T18:00,4.6 +2025-06-24T19:00,3.4 +2025-06-24T20:00,10.0 +2025-06-24T21:00,4.2 +2025-06-24T22:00,3.3 +2025-06-24T23:00,1.0 +2025-06-25T00:00,2.3 +2025-06-25T01:00,3.5 +2025-06-25T02:00,1.0 +2025-06-25T03:00,5.3 +2025-06-25T04:00,2.4 +2025-06-25T05:00,7.7 +2025-06-25T06:00,2.9 +2025-06-25T07:00,11.2 +2025-06-25T08:00,2.2 +2025-06-25T09:00,11.1 +2025-06-25T10:00,10.5 +2025-06-25T11:00,6.8 +2025-06-25T12:00,11.3 +2025-06-25T13:00,6.7 +2025-06-25T14:00,8.3 +2025-06-25T15:00,5.9 +2025-06-25T16:00,7.1 +2025-06-25T17:00,5.2 +2025-06-25T18:00,8.0 +2025-06-25T19:00,5.0 +2025-06-25T20:00,4.4 +2025-06-25T21:00,1.1 +2025-06-25T22:00,2.7 +2025-06-25T23:00,1.0 +2025-06-26T00:00,1.5 +2025-06-26T01:00,1.0 +2025-06-26T02:00,1.3 +2025-06-26T03:00,1.0 +2025-06-26T04:00,2.9 +2025-06-26T05:00,4.7 +2025-06-26T06:00,4.8 +2025-06-26T07:00,6.2 +2025-06-26T08:00,9.2 +2025-06-26T09:00,4.8 +2025-06-26T10:00,7.1 +2025-06-26T11:00,7.0 +2025-06-26T12:00,7.8 +2025-06-26T13:00,12.8 +2025-06-26T14:00,7.6 +2025-06-26T15:00,9.8 +2025-06-26T16:00,4.1 +2025-06-26T17:00,5.5 +2025-06-26T18:00,8.8 +2025-06-26T19:00,3.7 +2025-06-26T20:00,2.2 +2025-06-26T21:00,1.4 +2025-06-26T22:00,2.6 +2025-06-26T23:00,2.9 +2025-06-27T00:00,1.0 +2025-06-27T01:00,1.2 +2025-06-27T02:00,4.2 +2025-06-27T03:00,2.2 +2025-06-27T04:00,2.4 +2025-06-27T05:00,4.5 +2025-06-27T06:00,6.5 +2025-06-27T07:00,7.2 +2025-06-27T08:00,4.3 +2025-06-27T09:00,10.4 +2025-06-27T10:00,8.7 +2025-06-27T11:00,6.6 +2025-06-27T12:00,10.5 +2025-06-27T13:00,11.0 +2025-06-27T14:00,10.0 +2025-06-27T15:00,8.9 +2025-06-27T16:00,4.6 +2025-06-27T17:00,9.4 +2025-06-27T18:00,5.3 +2025-06-27T19:00,6.5 +2025-06-27T20:00,1.0 +2025-06-27T21:00,1.4 +2025-06-27T22:00,2.6 +2025-06-27T23:00,3.5 +2025-06-28T00:00,2.9 +2025-06-28T01:00,1.0 +2025-06-28T02:00,1.0 +2025-06-28T03:00,2.4 +2025-06-28T04:00,2.8 +2025-06-28T05:00,9.1 +2025-06-28T06:00,9.1 +2025-06-28T07:00,9.1 +2025-06-28T08:00,4.6 +2025-06-28T09:00,7.2 +2025-06-28T10:00,8.8 +2025-06-28T11:00,9.3 +2025-06-28T12:00,9.7 +2025-06-28T13:00,7.2 +2025-06-28T14:00,5.9 +2025-06-28T15:00,5.3 +2025-06-28T16:00,2.8 +2025-06-28T17:00,5.6 +2025-06-28T18:00,4.7 +2025-06-28T19:00,5.1 +2025-06-28T20:00,3.6 +2025-06-28T21:00,2.5 +2025-06-28T22:00,1.0 +2025-06-28T23:00,3.0 +2025-06-29T00:00,1.3 +2025-06-29T01:00,1.0 +2025-06-29T02:00,8.4 +2025-06-29T03:00,3.4 +2025-06-29T04:00,1.0 +2025-06-29T05:00,4.3 +2025-06-29T06:00,7.2 +2025-06-29T07:00,2.8 +2025-06-29T08:00,7.8 +2025-06-29T09:00,7.9 +2025-06-29T10:00,10.9 +2025-06-29T11:00,6.8 +2025-06-29T12:00,8.1 +2025-06-29T13:00,12.2 +2025-06-29T14:00,7.2 +2025-06-29T15:00,2.8 +2025-06-29T16:00,10.1 +2025-06-29T17:00,7.8 +2025-06-29T18:00,7.7 +2025-06-29T19:00,4.9 +2025-06-29T20:00,4.0 +2025-06-29T21:00,1.1 +2025-06-29T22:00,1.0 +2025-06-29T23:00,3.3 +2025-06-30T00:00,1.0 +2025-06-30T01:00,3.0 +2025-06-30T02:00,4.7 +2025-06-30T03:00,2.0 +2025-06-30T04:00,1.4 +2025-06-30T05:00,3.1 +2025-06-30T06:00,4.0 +2025-06-30T07:00,3.1 +2025-06-30T08:00,3.0 +2025-06-30T09:00,9.2 +2025-06-30T10:00,9.0 +2025-06-30T11:00,4.8 +2025-06-30T12:00,7.4 +2025-06-30T13:00,3.1 +2025-06-30T14:00,5.5 +2025-06-30T15:00,8.4 +2025-06-30T16:00,2.7 +2025-06-30T17:00,6.3 +2025-06-30T18:00,4.2 +2025-06-30T19:00,2.5 +2025-06-30T20:00,3.0 +2025-06-30T21:00,4.4 +2025-06-30T22:00,2.5 +2025-06-30T23:00,2.9 +2025-07-01T00:00,1.0 +2025-07-01T01:00,2.8 +2025-07-01T02:00,1.0 +2025-07-01T03:00,2.6 +2025-07-01T04:00,3.7 +2025-07-01T05:00,2.8 +2025-07-01T06:00,9.1 +2025-07-01T07:00,3.5 +2025-07-01T08:00,4.1 +2025-07-01T09:00,6.6 +2025-07-01T10:00,7.3 +2025-07-01T11:00,14.8 +2025-07-01T12:00,8.3 +2025-07-01T13:00,10.7 +2025-07-01T14:00,10.2 +2025-07-01T15:00,10.4 +2025-07-01T16:00,9.3 +2025-07-01T17:00,8.9 +2025-07-01T18:00,8.0 +2025-07-01T19:00,8.3 +2025-07-01T20:00,3.1 +2025-07-01T21:00,4.4 +2025-07-01T22:00,4.4 +2025-07-01T23:00,1.9 +2025-07-02T00:00,1.0 +2025-07-02T01:00,1.8 +2025-07-02T02:00,1.0 +2025-07-02T03:00,3.1 +2025-07-02T04:00,4.7 +2025-07-02T05:00,1.7 +2025-07-02T06:00,5.6 +2025-07-02T07:00,5.7 +2025-07-02T08:00,9.0 +2025-07-02T09:00,7.5 +2025-07-02T10:00,12.4 +2025-07-02T11:00,8.4 +2025-07-02T12:00,7.9 +2025-07-02T13:00,9.0 +2025-07-02T14:00,7.1 +2025-07-02T15:00,6.0 +2025-07-02T16:00,6.8 +2025-07-02T17:00,2.8 +2025-07-02T18:00,9.4 +2025-07-02T19:00,1.0 +2025-07-02T20:00,2.5 +2025-07-02T21:00,2.0 +2025-07-02T22:00,1.5 +2025-07-02T23:00,1.0 +2025-07-03T00:00,1.2 +2025-07-03T01:00,7.2 +2025-07-03T02:00,1.4 +2025-07-03T03:00,1.9 +2025-07-03T04:00,10.5 +2025-07-03T05:00,3.5 +2025-07-03T06:00,3.6 +2025-07-03T07:00,5.1 +2025-07-03T08:00,6.5 +2025-07-03T09:00,5.8 +2025-07-03T10:00,5.7 +2025-07-03T11:00,8.9 +2025-07-03T12:00,6.5 +2025-07-03T13:00,10.1 +2025-07-03T14:00,5.1 +2025-07-03T15:00,7.6 +2025-07-03T16:00,9.4 +2025-07-03T17:00,7.7 +2025-07-03T18:00,6.3 +2025-07-03T19:00,1.6 +2025-07-03T20:00,2.9 +2025-07-03T21:00,1.0 +2025-07-03T22:00,1.0 +2025-07-03T23:00,4.2 +2025-07-04T00:00,1.0 +2025-07-04T01:00,1.5 +2025-07-04T02:00,3.8 +2025-07-04T03:00,2.6 +2025-07-04T04:00,7.4 +2025-07-04T05:00,5.5 +2025-07-04T06:00,3.6 +2025-07-04T07:00,3.6 +2025-07-04T08:00,8.4 +2025-07-04T09:00,8.4 +2025-07-04T10:00,8.2 +2025-07-04T11:00,5.1 +2025-07-04T12:00,6.3 +2025-07-04T13:00,8.9 +2025-07-04T14:00,10.2 +2025-07-04T15:00,8.7 +2025-07-04T16:00,9.3 +2025-07-04T17:00,5.7 +2025-07-04T18:00,2.4 +2025-07-04T19:00,9.4 +2025-07-04T20:00,1.0 +2025-07-04T21:00,2.3 +2025-07-04T22:00,1.0 +2025-07-04T23:00,6.1 +2025-07-05T00:00,4.0 +2025-07-05T01:00,1.0 +2025-07-05T02:00,5.0 +2025-07-05T03:00,2.5 +2025-07-05T04:00,1.0 +2025-07-05T05:00,6.1 +2025-07-05T06:00,2.3 +2025-07-05T07:00,4.7 +2025-07-05T08:00,9.8 +2025-07-05T09:00,10.6 +2025-07-05T10:00,7.3 +2025-07-05T11:00,11.0 +2025-07-05T12:00,9.6 +2025-07-05T13:00,8.5 +2025-07-05T14:00,7.6 +2025-07-05T15:00,9.2 +2025-07-05T16:00,8.6 +2025-07-05T17:00,5.0 +2025-07-05T18:00,1.1 +2025-07-05T19:00,1.0 +2025-07-05T20:00,1.9 +2025-07-05T21:00,6.1 +2025-07-05T22:00,1.0 +2025-07-05T23:00,1.0 +2025-07-06T00:00,5.9 +2025-07-06T01:00,1.0 +2025-07-06T02:00,5.9 +2025-07-06T03:00,6.0 +2025-07-06T04:00,1.0 +2025-07-06T05:00,3.7 +2025-07-06T06:00,5.0 +2025-07-06T07:00,4.1 +2025-07-06T08:00,8.3 +2025-07-06T09:00,9.3 +2025-07-06T10:00,7.6 +2025-07-06T11:00,4.8 +2025-07-06T12:00,9.6 +2025-07-06T13:00,10.3 +2025-07-06T14:00,5.0 +2025-07-06T15:00,9.3 +2025-07-06T16:00,5.6 +2025-07-06T17:00,7.9 +2025-07-06T18:00,3.4 +2025-07-06T19:00,1.0 +2025-07-06T20:00,4.0 +2025-07-06T21:00,1.0 +2025-07-06T22:00,1.0 +2025-07-06T23:00,1.0 +2025-07-07T00:00,1.0 +2025-07-07T01:00,1.6 +2025-07-07T02:00,1.1 +2025-07-07T03:00,8.1 +2025-07-07T04:00,1.0 +2025-07-07T05:00,1.5 +2025-07-07T06:00,6.8 +2025-07-07T07:00,8.1 +2025-07-07T08:00,1.8 +2025-07-07T09:00,8.3 +2025-07-07T10:00,9.1 +2025-07-07T11:00,10.5 +2025-07-07T12:00,9.3 +2025-07-07T13:00,4.6 +2025-07-07T14:00,4.7 +2025-07-07T15:00,5.9 +2025-07-07T16:00,5.1 +2025-07-07T17:00,6.1 +2025-07-07T18:00,1.9 +2025-07-07T19:00,5.9 +2025-07-07T20:00,2.5 +2025-07-07T21:00,5.9 +2025-07-07T22:00,1.0 +2025-07-07T23:00,3.1 +2025-07-08T00:00,1.0 +2025-07-08T01:00,2.6 +2025-07-08T02:00,1.0 +2025-07-08T03:00,6.8 +2025-07-08T04:00,1.0 +2025-07-08T05:00,5.5 +2025-07-08T06:00,9.4 +2025-07-08T07:00,10.5 +2025-07-08T08:00,6.4 +2025-07-08T09:00,5.6 +2025-07-08T10:00,5.4 +2025-07-08T11:00,12.1 +2025-07-08T12:00,6.3 +2025-07-08T13:00,10.7 +2025-07-08T14:00,11.3 +2025-07-08T15:00,8.2 +2025-07-08T16:00,10.7 +2025-07-08T17:00,8.0 +2025-07-08T18:00,6.3 +2025-07-08T19:00,1.0 +2025-07-08T20:00,5.0 +2025-07-08T21:00,3.1 +2025-07-08T22:00,1.0 +2025-07-08T23:00,1.0 +2025-07-09T00:00,1.0 +2025-07-09T01:00,1.0 +2025-07-09T02:00,1.7 +2025-07-09T03:00,4.2 +2025-07-09T04:00,5.8 +2025-07-09T05:00,5.8 +2025-07-09T06:00,9.0 +2025-07-09T07:00,9.0 +2025-07-09T08:00,7.9 +2025-07-09T09:00,11.1 +2025-07-09T10:00,8.2 +2025-07-09T11:00,7.5 +2025-07-09T12:00,7.2 +2025-07-09T13:00,10.3 +2025-07-09T14:00,3.3 +2025-07-09T15:00,8.8 +2025-07-09T16:00,5.0 +2025-07-09T17:00,7.8 +2025-07-09T18:00,3.1 +2025-07-09T19:00,5.6 +2025-07-09T20:00,5.7 +2025-07-09T21:00,4.0 +2025-07-09T22:00,2.0 +2025-07-09T23:00,2.7 +2025-07-10T00:00,1.4 +2025-07-10T01:00,5.0 +2025-07-10T02:00,2.2 +2025-07-10T03:00,4.5 +2025-07-10T04:00,1.0 +2025-07-10T05:00,1.0 +2025-07-10T06:00,5.5 +2025-07-10T07:00,11.1 +2025-07-10T08:00,3.5 +2025-07-10T09:00,10.6 +2025-07-10T10:00,3.5 +2025-07-10T11:00,7.0 +2025-07-10T12:00,10.4 +2025-07-10T13:00,6.7 +2025-07-10T14:00,10.2 +2025-07-10T15:00,5.3 +2025-07-10T16:00,2.1 +2025-07-10T17:00,6.4 +2025-07-10T18:00,4.2 +2025-07-10T19:00,1.0 +2025-07-10T20:00,2.2 +2025-07-10T21:00,4.1 +2025-07-10T22:00,1.0 +2025-07-10T23:00,1.0 +2025-07-11T00:00,3.1 +2025-07-11T01:00,2.9 +2025-07-11T02:00,1.0 +2025-07-11T03:00,1.3 +2025-07-11T04:00,3.8 +2025-07-11T05:00,2.7 +2025-07-11T06:00,3.6 +2025-07-11T07:00,8.5 +2025-07-11T08:00,2.8 +2025-07-11T09:00,12.8 +2025-07-11T10:00,9.0 +2025-07-11T11:00,7.4 +2025-07-11T12:00,12.8 +2025-07-11T13:00,12.3 +2025-07-11T14:00,11.7 +2025-07-11T15:00,5.6 +2025-07-11T16:00,7.0 +2025-07-11T17:00,4.6 +2025-07-11T18:00,5.2 +2025-07-11T19:00,6.6 +2025-07-11T20:00,8.0 +2025-07-11T21:00,1.0 +2025-07-11T22:00,5.7 +2025-07-11T23:00,1.0 +2025-07-12T00:00,1.0 +2025-07-12T01:00,1.0 +2025-07-12T02:00,1.0 +2025-07-12T03:00,1.6 +2025-07-12T04:00,9.4 +2025-07-12T05:00,3.0 +2025-07-12T06:00,7.3 +2025-07-12T07:00,6.6 +2025-07-12T08:00,4.6 +2025-07-12T09:00,9.0 +2025-07-12T10:00,5.4 +2025-07-12T11:00,10.5 +2025-07-12T12:00,10.0 +2025-07-12T13:00,7.6 +2025-07-12T14:00,10.3 +2025-07-12T15:00,6.9 +2025-07-12T16:00,8.6 +2025-07-12T17:00,2.9 +2025-07-12T18:00,1.0 +2025-07-12T19:00,2.8 +2025-07-12T20:00,1.7 +2025-07-12T21:00,1.0 +2025-07-12T22:00,1.7 +2025-07-12T23:00,1.0 +2025-07-13T00:00,4.5 +2025-07-13T01:00,1.0 +2025-07-13T02:00,2.8 +2025-07-13T03:00,1.0 +2025-07-13T04:00,2.3 +2025-07-13T05:00,4.1 +2025-07-13T06:00,8.1 +2025-07-13T07:00,3.2 +2025-07-13T08:00,8.8 +2025-07-13T09:00,8.9 +2025-07-13T10:00,8.9 +2025-07-13T11:00,4.2 +2025-07-13T12:00,10.9 +2025-07-13T13:00,10.2 +2025-07-13T14:00,5.9 +2025-07-13T15:00,7.7 +2025-07-13T16:00,5.7 +2025-07-13T17:00,11.5 +2025-07-13T18:00,4.2 +2025-07-13T19:00,5.6 +2025-07-13T20:00,2.6 +2025-07-13T21:00,1.0 +2025-07-13T22:00,2.7 +2025-07-13T23:00,1.0 +2025-07-14T00:00,1.0 +2025-07-14T01:00,3.2 +2025-07-14T02:00,1.3 +2025-07-14T03:00,1.0 +2025-07-14T04:00,2.7 +2025-07-14T05:00,4.4 +2025-07-14T06:00,4.4 +2025-07-14T07:00,7.3 +2025-07-14T08:00,6.3 +2025-07-14T09:00,9.8 +2025-07-14T10:00,7.6 +2025-07-14T11:00,8.2 +2025-07-14T12:00,10.3 +2025-07-14T13:00,11.7 +2025-07-14T14:00,8.3 +2025-07-14T15:00,7.0 +2025-07-14T16:00,3.6 +2025-07-14T17:00,6.9 +2025-07-14T18:00,4.6 +2025-07-14T19:00,2.8 +2025-07-14T20:00,4.2 +2025-07-14T21:00,5.4 +2025-07-14T22:00,7.6 +2025-07-14T23:00,1.0 +2025-07-15T00:00,1.0 +2025-07-15T01:00,3.8 +2025-07-15T02:00,1.0 +2025-07-15T03:00,5.9 +2025-07-15T04:00,4.1 +2025-07-15T05:00,5.8 +2025-07-15T06:00,3.2 +2025-07-15T07:00,6.0 +2025-07-15T08:00,7.8 +2025-07-15T09:00,2.9 +2025-07-15T10:00,9.2 +2025-07-15T11:00,10.7 +2025-07-15T12:00,10.0 +2025-07-15T13:00,9.7 +2025-07-15T14:00,9.1 +2025-07-15T15:00,7.8 +2025-07-15T16:00,9.0 +2025-07-15T17:00,3.8 +2025-07-15T18:00,6.5 +2025-07-15T19:00,3.1 +2025-07-15T20:00,2.1 +2025-07-15T21:00,1.0 +2025-07-15T22:00,1.0 +2025-07-15T23:00,1.6 +2025-07-16T00:00,1.0 +2025-07-16T01:00,1.0 +2025-07-16T02:00,1.6 +2025-07-16T03:00,1.0 +2025-07-16T04:00,4.4 +2025-07-16T05:00,8.2 +2025-07-16T06:00,4.0 +2025-07-16T07:00,4.7 +2025-07-16T08:00,9.7 +2025-07-16T09:00,4.8 +2025-07-16T10:00,8.4 +2025-07-16T11:00,10.1 +2025-07-16T12:00,6.7 +2025-07-16T13:00,6.7 +2025-07-16T14:00,7.5 +2025-07-16T15:00,8.8 +2025-07-16T16:00,4.5 +2025-07-16T17:00,5.7 +2025-07-16T18:00,2.4 +2025-07-16T19:00,4.5 +2025-07-16T20:00,9.0 +2025-07-16T21:00,5.3 +2025-07-16T22:00,3.0 +2025-07-16T23:00,1.6 +2025-07-17T00:00,1.0 +2025-07-17T01:00,1.0 +2025-07-17T02:00,6.8 +2025-07-17T03:00,1.0 +2025-07-17T04:00,5.5 +2025-07-17T05:00,2.6 +2025-07-17T06:00,8.8 +2025-07-17T07:00,7.1 +2025-07-17T08:00,12.6 +2025-07-17T09:00,13.3 +2025-07-17T10:00,9.7 +2025-07-17T11:00,9.5 +2025-07-17T12:00,12.9 +2025-07-17T13:00,6.9 +2025-07-17T14:00,8.8 +2025-07-17T15:00,9.1 +2025-07-17T16:00,4.4 +2025-07-17T17:00,7.9 +2025-07-17T18:00,6.0 +2025-07-17T19:00,1.0 +2025-07-17T20:00,4.5 +2025-07-17T21:00,1.0 +2025-07-17T22:00,1.0 +2025-07-17T23:00,1.0 +2025-07-18T00:00,1.0 +2025-07-18T01:00,1.0 +2025-07-18T02:00,1.9 +2025-07-18T03:00,4.7 +2025-07-18T04:00,1.4 +2025-07-18T05:00,3.8 +2025-07-18T06:00,5.1 +2025-07-18T07:00,7.6 +2025-07-18T08:00,4.7 +2025-07-18T09:00,9.6 +2025-07-18T10:00,4.8 +2025-07-18T11:00,9.6 +2025-07-18T12:00,7.6 +2025-07-18T13:00,6.8 +2025-07-18T14:00,10.0 +2025-07-18T15:00,12.1 +2025-07-18T16:00,8.9 +2025-07-18T17:00,6.4 +2025-07-18T18:00,9.0 +2025-07-18T19:00,1.0 +2025-07-18T20:00,3.6 +2025-07-18T21:00,6.8 +2025-07-18T22:00,1.7 +2025-07-18T23:00,2.6 +2025-07-19T00:00,4.3 +2025-07-19T01:00,1.0 +2025-07-19T02:00,5.4 +2025-07-19T03:00,6.1 +2025-07-19T04:00,1.5 +2025-07-19T05:00,3.2 +2025-07-19T06:00,10.0 +2025-07-19T07:00,7.5 +2025-07-19T08:00,8.9 +2025-07-19T09:00,7.7 +2025-07-19T10:00,9.5 +2025-07-19T11:00,10.4 +2025-07-19T12:00,9.8 +2025-07-19T13:00,13.2 +2025-07-19T14:00,9.7 +2025-07-19T15:00,3.4 +2025-07-19T16:00,8.1 +2025-07-19T17:00,1.8 +2025-07-19T18:00,5.3 +2025-07-19T19:00,1.8 +2025-07-19T20:00,5.8 +2025-07-19T21:00,1.1 +2025-07-19T22:00,4.2 +2025-07-19T23:00,3.4 +2025-07-20T00:00,1.0 +2025-07-20T01:00,3.6 +2025-07-20T02:00,3.8 +2025-07-20T03:00,1.0 +2025-07-20T04:00,1.0 +2025-07-20T05:00,4.6 +2025-07-20T06:00,7.2 +2025-07-20T07:00,7.0 +2025-07-20T08:00,11.5 +2025-07-20T09:00,8.3 +2025-07-20T10:00,8.9 +2025-07-20T11:00,11.3 +2025-07-20T12:00,11.7 +2025-07-20T13:00,7.9 +2025-07-20T14:00,11.4 +2025-07-20T15:00,12.4 +2025-07-20T16:00,10.8 +2025-07-20T17:00,11.8 +2025-07-20T18:00,5.6 +2025-07-20T19:00,2.3 +2025-07-20T20:00,8.5 +2025-07-20T21:00,4.3 +2025-07-20T22:00,5.4 +2025-07-20T23:00,1.3 +2025-07-21T00:00,2.4 +2025-07-21T01:00,3.8 +2025-07-21T02:00,4.2 +2025-07-21T03:00,2.4 +2025-07-21T04:00,3.0 +2025-07-21T05:00,4.4 +2025-07-21T06:00,7.9 +2025-07-21T07:00,5.4 +2025-07-21T08:00,8.4 +2025-07-21T09:00,5.1 +2025-07-21T10:00,8.2 +2025-07-21T11:00,11.9 +2025-07-21T12:00,10.2 +2025-07-21T13:00,8.5 +2025-07-21T14:00,7.3 +2025-07-21T15:00,9.6 +2025-07-21T16:00,4.6 +2025-07-21T17:00,4.8 +2025-07-21T18:00,8.9 +2025-07-21T19:00,4.3 +2025-07-21T20:00,4.4 +2025-07-21T21:00,2.4 +2025-07-21T22:00,3.5 +2025-07-21T23:00,1.0 +2025-07-22T00:00,1.0 +2025-07-22T01:00,2.7 +2025-07-22T02:00,1.0 +2025-07-22T03:00,1.0 +2025-07-22T04:00,4.8 +2025-07-22T05:00,3.6 +2025-07-22T06:00,6.5 +2025-07-22T07:00,8.0 +2025-07-22T08:00,4.3 +2025-07-22T09:00,8.1 +2025-07-22T10:00,6.8 +2025-07-22T11:00,10.2 +2025-07-22T12:00,14.2 +2025-07-22T13:00,14.6 +2025-07-22T14:00,9.7 +2025-07-22T15:00,6.9 +2025-07-22T16:00,4.8 +2025-07-22T17:00,4.3 +2025-07-22T18:00,6.5 +2025-07-22T19:00,2.0 +2025-07-22T20:00,3.2 +2025-07-22T21:00,1.5 +2025-07-22T22:00,2.9 +2025-07-22T23:00,1.0 +2025-07-23T00:00,1.0 +2025-07-23T01:00,3.7 +2025-07-23T02:00,2.6 +2025-07-23T03:00,3.2 +2025-07-23T04:00,5.4 +2025-07-23T05:00,6.8 +2025-07-23T06:00,6.7 +2025-07-23T07:00,5.9 +2025-07-23T08:00,8.1 +2025-07-23T09:00,7.3 +2025-07-23T10:00,5.9 +2025-07-23T11:00,8.2 +2025-07-23T12:00,7.7 +2025-07-23T13:00,15.5 +2025-07-23T14:00,13.0 +2025-07-23T15:00,10.1 +2025-07-23T16:00,9.1 +2025-07-23T17:00,9.6 +2025-07-23T18:00,3.8 +2025-07-23T19:00,6.9 +2025-07-23T20:00,4.3 +2025-07-23T21:00,2.5 +2025-07-23T22:00,1.0 +2025-07-23T23:00,1.0 +2025-07-24T00:00,1.0 +2025-07-24T01:00,6.3 +2025-07-24T02:00,4.0 +2025-07-24T03:00,2.0 +2025-07-24T04:00,4.6 +2025-07-24T05:00,5.6 +2025-07-24T06:00,8.7 +2025-07-24T07:00,9.8 +2025-07-24T08:00,6.6 +2025-07-24T09:00,8.1 +2025-07-24T10:00,7.8 +2025-07-24T11:00,7.7 +2025-07-24T12:00,7.4 +2025-07-24T13:00,7.2 +2025-07-24T14:00,8.3 +2025-07-24T15:00,5.4 +2025-07-24T16:00,10.2 +2025-07-24T17:00,5.8 +2025-07-24T18:00,2.6 +2025-07-24T19:00,4.7 +2025-07-24T20:00,5.5 +2025-07-24T21:00,4.4 +2025-07-24T22:00,1.0 +2025-07-24T23:00,1.0 +2025-07-25T00:00,1.0 +2025-07-25T01:00,1.0 +2025-07-25T02:00,5.6 +2025-07-25T03:00,1.0 +2025-07-25T04:00,3.9 +2025-07-25T05:00,5.8 +2025-07-25T06:00,2.8 +2025-07-25T07:00,4.7 +2025-07-25T08:00,7.2 +2025-07-25T09:00,8.3 +2025-07-25T10:00,6.0 +2025-07-25T11:00,9.6 +2025-07-25T12:00,8.9 +2025-07-25T13:00,9.3 +2025-07-25T14:00,9.9 +2025-07-25T15:00,13.0 +2025-07-25T16:00,8.5 +2025-07-25T17:00,3.8 +2025-07-25T18:00,6.2 +2025-07-25T19:00,2.6 +2025-07-25T20:00,5.8 +2025-07-25T21:00,1.5 +2025-07-25T22:00,1.0 +2025-07-25T23:00,3.2 +2025-07-26T00:00,3.6 +2025-07-26T01:00,1.0 +2025-07-26T02:00,4.8 +2025-07-26T03:00,2.8 +2025-07-26T04:00,3.1 +2025-07-26T05:00,6.3 +2025-07-26T06:00,4.2 +2025-07-26T07:00,4.6 +2025-07-26T08:00,11.2 +2025-07-26T09:00,8.0 +2025-07-26T10:00,5.3 +2025-07-26T11:00,10.6 +2025-07-26T12:00,7.4 +2025-07-26T13:00,12.4 +2025-07-26T14:00,10.0 +2025-07-26T15:00,7.8 +2025-07-26T16:00,7.9 +2025-07-26T17:00,8.4 +2025-07-26T18:00,7.5 +2025-07-26T19:00,6.7 +2025-07-26T20:00,4.1 +2025-07-26T21:00,1.0 +2025-07-26T22:00,1.8 +2025-07-26T23:00,1.0 +2025-07-27T00:00,3.5 +2025-07-27T01:00,3.2 +2025-07-27T02:00,1.0 +2025-07-27T03:00,1.8 +2025-07-27T04:00,2.2 +2025-07-27T05:00,1.4 +2025-07-27T06:00,1.1 +2025-07-27T07:00,6.9 +2025-07-27T08:00,9.5 +2025-07-27T09:00,8.9 +2025-07-27T10:00,12.9 +2025-07-27T11:00,12.6 +2025-07-27T12:00,16.7 +2025-07-27T13:00,8.8 +2025-07-27T14:00,10.4 +2025-07-27T15:00,12.5 +2025-07-27T16:00,5.4 +2025-07-27T17:00,8.2 +2025-07-27T18:00,8.4 +2025-07-27T19:00,3.8 +2025-07-27T20:00,1.0 +2025-07-27T21:00,1.0 +2025-07-27T22:00,2.4 +2025-07-27T23:00,5.6 +2025-07-28T00:00,4.2 +2025-07-28T01:00,1.0 +2025-07-28T02:00,2.6 +2025-07-28T03:00,4.8 +2025-07-28T04:00,6.4 +2025-07-28T05:00,6.4 +2025-07-28T06:00,4.1 +2025-07-28T07:00,3.3 diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-renamed/case.json b/agents/evals/fixtures/cases/line-timeseries-letsplot-renamed/case.json new file mode 100644 index 00000000000..6dcf7fc5e7d --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-renamed/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "line-timeseries", + "library": "letsplot", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "date", + "column": "Messdatum" + }, + { + "role": "value", + "column": "Feinstaub PM2,5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "renamed", + "synthetic", + "renamed-headers", + "non-ascii-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, renamed)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-renamed/data.csv b/agents/evals/fixtures/cases/line-timeseries-letsplot-renamed/data.csv new file mode 100644 index 00000000000..1acececa252 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-renamed/data.csv @@ -0,0 +1,366 @@ +Messdatum,"Feinstaub PM2,5 (µg/m³)" +2025-01-01,17.9 +2025-01-02,24.6 +2025-01-03,22.3 +2025-01-04,19.7 +2025-01-05,24.6 +2025-01-06,18.5 +2025-01-07,24.3 +2025-01-08,27.0 +2025-01-09,19.5 +2025-01-10,23.5 +2025-01-11,22.1 +2025-01-12,18.0 +2025-01-13,23.4 +2025-01-14,17.7 +2025-01-15,23.4 +2025-01-16,27.7 +2025-01-17,25.0 +2025-01-18,25.4 +2025-01-19,27.6 +2025-01-20,21.4 +2025-01-21,27.6 +2025-01-22,23.7 +2025-01-23,15.1 +2025-01-24,21.3 +2025-01-25,19.2 +2025-01-26,20.5 +2025-01-27,22.6 +2025-01-28,19.9 +2025-01-29,19.4 +2025-01-30,22.3 +2025-01-31,23.3 +2025-02-01,16.0 +2025-02-02,23.0 +2025-02-03,24.3 +2025-02-04,19.1 +2025-02-05,24.0 +2025-02-06,26.4 +2025-02-07,21.2 +2025-02-08,21.2 +2025-02-09,19.0 +2025-02-10,19.3 +2025-02-11,22.2 +2025-02-12,17.0 +2025-02-13,21.7 +2025-02-14,22.9 +2025-02-15,23.2 +2025-02-16,17.4 +2025-02-17,15.9 +2025-02-18,24.8 +2025-02-19,15.1 +2025-02-20,18.2 +2025-02-21,18.8 +2025-02-22,20.0 +2025-02-23,19.5 +2025-02-24,16.1 +2025-02-25,19.4 +2025-02-26,14.9 +2025-02-27,16.9 +2025-02-28,13.7 +2025-03-01,16.2 +2025-03-02,17.4 +2025-03-03,17.6 +2025-03-04,18.8 +2025-03-05,18.1 +2025-03-06,14.9 +2025-03-07,21.0 +2025-03-08,18.6 +2025-03-09,19.7 +2025-03-10,21.0 +2025-03-11,18.8 +2025-03-12,15.6 +2025-03-13,21.5 +2025-03-14,19.8 +2025-03-15,20.0 +2025-03-16,13.3 +2025-03-17,18.1 +2025-03-18,19.4 +2025-03-19,18.5 +2025-03-20,11.2 +2025-03-21,13.9 +2025-03-22,14.1 +2025-03-23,17.1 +2025-03-24,17.4 +2025-03-25,16.5 +2025-03-26,12.9 +2025-03-27,17.8 +2025-03-28,12.5 +2025-03-29,13.4 +2025-03-30,17.2 +2025-03-31,14.9 +2025-04-01,13.2 +2025-04-02,11.7 +2025-04-03,12.6 +2025-04-04,13.2 +2025-04-05,13.4 +2025-04-06,13.9 +2025-04-07,12.0 +2025-04-08,12.9 +2025-04-09,14.9 +2025-04-10,14.9 +2025-04-11,14.0 +2025-04-12,11.7 +2025-04-13,17.6 +2025-04-14,13.3 +2025-04-15,13.7 +2025-04-16,14.3 +2025-04-17,12.6 +2025-04-18,6.9 +2025-04-19,15.9 +2025-04-20,9.3 +2025-04-21,12.4 +2025-04-22,11.9 +2025-04-23,9.2 +2025-04-24,14.0 +2025-04-25,10.5 +2025-04-26,3.5 +2025-04-27,13.9 +2025-04-28,9.8 +2025-04-29,12.6 +2025-04-30,10.1 +2025-05-01,8.7 +2025-05-02,8.4 +2025-05-03,7.9 +2025-05-04,11.6 +2025-05-05,10.4 +2025-05-06,8.5 +2025-05-07,4.8 +2025-05-08,6.6 +2025-05-09,5.8 +2025-05-10,8.1 +2025-05-11,7.7 +2025-05-12,3.0 +2025-05-13,11.8 +2025-05-14,2.0 +2025-05-15,4.9 +2025-05-16,5.6 +2025-05-17,13.2 +2025-05-18,5.6 +2025-05-19,8.5 +2025-05-20,10.2 +2025-05-21,8.9 +2025-05-22,13.2 +2025-05-23,9.8 +2025-05-24,11.2 +2025-05-25,10.2 +2025-05-26,11.0 +2025-05-27,2.7 +2025-05-28,8.0 +2025-05-29,4.9 +2025-05-30,6.1 +2025-05-31,8.3 +2025-06-01,5.0 +2025-06-02,5.5 +2025-06-03,1.0 +2025-06-04,5.8 +2025-06-05,13.9 +2025-06-06,1.0 +2025-06-07,6.7 +2025-06-08,2.8 +2025-06-09,6.8 +2025-06-10,7.7 +2025-06-11,1.8 +2025-06-12,5.2 +2025-06-13,6.9 +2025-06-14,9.8 +2025-06-15,3.7 +2025-06-16,5.5 +2025-06-17,9.5 +2025-06-18,7.0 +2025-06-19,2.0 +2025-06-20,10.5 +2025-06-21,5.8 +2025-06-22,9.9 +2025-06-23,8.1 +2025-06-24,9.7 +2025-06-25,6.0 +2025-06-26,1.0 +2025-06-27,10.1 +2025-06-28,5.7 +2025-06-29,5.4 +2025-06-30,1.7 +2025-07-01,1.0 +2025-07-02,4.1 +2025-07-03,9.5 +2025-07-04,6.5 +2025-07-05,6.7 +2025-07-06,6.0 +2025-07-07,6.6 +2025-07-08,6.2 +2025-07-09,1.0 +2025-07-10,3.9 +2025-07-11,3.2 +2025-07-12,7.3 +2025-07-13,8.5 +2025-07-14,5.7 +2025-07-15,1.0 +2025-07-16,5.3 +2025-07-17,2.0 +2025-07-18,5.3 +2025-07-19,11.1 +2025-07-20,1.0 +2025-07-21,5.9 +2025-07-22,7.5 +2025-07-23,10.8 +2025-07-24,4.7 +2025-07-25,3.9 +2025-07-26,5.6 +2025-07-27,4.3 +2025-07-28,6.9 +2025-07-29,7.3 +2025-07-30,11.5 +2025-07-31,6.4 +2025-08-01,3.3 +2025-08-02,4.5 +2025-08-03,5.9 +2025-08-04,8.8 +2025-08-05,4.1 +2025-08-06,1.0 +2025-08-07,4.9 +2025-08-08,6.5 +2025-08-09,2.7 +2025-08-10,7.3 +2025-08-11,14.3 +2025-08-12,4.8 +2025-08-13,9.0 +2025-08-14,7.6 +2025-08-15,9.1 +2025-08-16,9.1 +2025-08-17,1.0 +2025-08-18,5.4 +2025-08-19,10.8 +2025-08-20,11.0 +2025-08-21,5.4 +2025-08-22,7.8 +2025-08-23,4.6 +2025-08-24,7.1 +2025-08-25,10.3 +2025-08-26,10.0 +2025-08-27,8.1 +2025-08-28,10.8 +2025-08-29,6.1 +2025-08-30,12.0 +2025-08-31,12.1 +2025-09-01,10.2 +2025-09-02,8.0 +2025-09-03,8.6 +2025-09-04,6.4 +2025-09-05,10.7 +2025-09-06,9.6 +2025-09-07,16.1 +2025-09-08,15.1 +2025-09-09,10.9 +2025-09-10,12.6 +2025-09-11,8.1 +2025-09-12,9.8 +2025-09-13,10.3 +2025-09-14,15.2 +2025-09-15,6.7 +2025-09-16,13.8 +2025-09-17,15.9 +2025-09-18,15.9 +2025-09-19,12.7 +2025-09-20,11.9 +2025-09-21,11.2 +2025-09-22,12.6 +2025-09-23,10.3 +2025-09-24,15.6 +2025-09-25,15.9 +2025-09-26,16.0 +2025-09-27,15.7 +2025-09-28,16.3 +2025-09-29,17.1 +2025-09-30,13.0 +2025-10-01,9.4 +2025-10-02,13.8 +2025-10-03,15.5 +2025-10-04,16.7 +2025-10-05,7.5 +2025-10-06,15.5 +2025-10-07,14.6 +2025-10-08,8.4 +2025-10-09,12.4 +2025-10-10,14.0 +2025-10-11,19.5 +2025-10-12,16.5 +2025-10-13,16.2 +2025-10-14,20.3 +2025-10-15,13.1 +2025-10-16,11.8 +2025-10-17,16.5 +2025-10-18,17.6 +2025-10-19,14.6 +2025-10-20,17.0 +2025-10-21,23.6 +2025-10-22,13.7 +2025-10-23,22.0 +2025-10-24,20.6 +2025-10-25,19.7 +2025-10-26,16.0 +2025-10-27,16.8 +2025-10-28,20.3 +2025-10-29,22.0 +2025-10-30,12.7 +2025-10-31,22.1 +2025-11-01,15.8 +2025-11-02,14.0 +2025-11-03,18.2 +2025-11-04,22.0 +2025-11-05,19.9 +2025-11-06,14.6 +2025-11-07,18.6 +2025-11-08,23.5 +2025-11-09,18.2 +2025-11-10,21.3 +2025-11-11,19.6 +2025-11-12,21.4 +2025-11-13,24.2 +2025-11-14,23.5 +2025-11-15,24.8 +2025-11-16,20.7 +2025-11-17,15.9 +2025-11-18,22.3 +2025-11-19,18.0 +2025-11-20,19.9 +2025-11-21,27.6 +2025-11-22,20.2 +2025-11-23,21.4 +2025-11-24,19.1 +2025-11-25,24.8 +2025-11-26,26.6 +2025-11-27,20.4 +2025-11-28,18.0 +2025-11-29,22.4 +2025-11-30,22.0 +2025-12-01,26.8 +2025-12-02,23.8 +2025-12-03,25.2 +2025-12-04,19.9 +2025-12-05,25.3 +2025-12-06,27.0 +2025-12-07,22.7 +2025-12-08,27.2 +2025-12-09,21.1 +2025-12-10,26.7 +2025-12-11,20.8 +2025-12-12,23.9 +2025-12-13,25.4 +2025-12-14,26.1 +2025-12-15,22.2 +2025-12-16,22.4 +2025-12-17,28.7 +2025-12-18,26.0 +2025-12-19,19.5 +2025-12-20,25.6 +2025-12-21,20.2 +2025-12-22,16.5 +2025-12-23,23.7 +2025-12-24,21.2 +2025-12-25,20.3 +2025-12-26,21.8 +2025-12-27,20.9 +2025-12-28,33.7 +2025-12-29,24.7 +2025-12-30,19.7 +2025-12-31,20.3 diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-x10/case.json b/agents/evals/fixtures/cases/line-timeseries-letsplot-x10/case.json new file mode 100644 index 00000000000..e8ca0654187 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-timeseries", + "library": "letsplot", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "date", + "column": "Date" + }, + { + "role": "value", + "column": "PM2.5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, x10)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-letsplot-x10/data.csv b/agents/evals/fixtures/cases/line-timeseries-letsplot-x10/data.csv new file mode 100644 index 00000000000..d69098f1840 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-letsplot-x10/data.csv @@ -0,0 +1,366 @@ +Date,PM2.5 (µg/m³) +2025-01-01,179.0 +2025-01-02,246.1 +2025-01-03,223.2 +2025-01-04,197.2 +2025-01-05,246.4 +2025-01-06,184.6 +2025-01-07,242.9 +2025-01-08,269.7 +2025-01-09,195.4 +2025-01-10,235.3 +2025-01-11,221.1 +2025-01-12,180.4 +2025-01-13,233.7 +2025-01-14,176.8 +2025-01-15,233.5 +2025-01-16,277.1 +2025-01-17,249.7 +2025-01-18,253.6 +2025-01-19,276.5 +2025-01-20,214.0 +2025-01-21,275.9 +2025-01-22,237.2 +2025-01-23,150.9 +2025-01-24,213.1 +2025-01-25,192.2 +2025-01-26,204.9 +2025-01-27,225.5 +2025-01-28,198.6 +2025-01-29,193.8 +2025-01-30,222.6 +2025-01-31,232.6 +2025-02-01,159.6 +2025-02-02,229.7 +2025-02-03,242.6 +2025-02-04,191.1 +2025-02-05,239.6 +2025-02-06,264.2 +2025-02-07,211.6 +2025-02-08,211.5 +2025-02-09,190.3 +2025-02-10,193.0 +2025-02-11,222.4 +2025-02-12,170.5 +2025-02-13,216.9 +2025-02-14,229.4 +2025-02-15,232.5 +2025-02-16,173.6 +2025-02-17,158.6 +2025-02-18,247.5 +2025-02-19,150.8 +2025-02-20,181.6 +2025-02-21,188.4 +2025-02-22,200.1 +2025-02-23,194.6 +2025-02-24,161.2 +2025-02-25,193.6 +2025-02-26,149.2 +2025-02-27,169.4 +2025-02-28,136.7 +2025-03-01,161.8 +2025-03-02,173.7 +2025-03-03,176.3 +2025-03-04,187.9 +2025-03-05,181.3 +2025-03-06,149.2 +2025-03-07,210.2 +2025-03-08,186.1 +2025-03-09,196.5 +2025-03-10,209.8 +2025-03-11,187.5 +2025-03-12,155.9 +2025-03-13,215.2 +2025-03-14,198.3 +2025-03-15,199.9 +2025-03-16,133.0 +2025-03-17,181.2 +2025-03-18,194.2 +2025-03-19,184.7 +2025-03-20,112.3 +2025-03-21,139.4 +2025-03-22,141.1 +2025-03-23,170.6 +2025-03-24,173.6 +2025-03-25,164.8 +2025-03-26,129.1 +2025-03-27,177.8 +2025-03-28,125.2 +2025-03-29,134.4 +2025-03-30,172.4 +2025-03-31,149.0 +2025-04-01,132.3 +2025-04-02,117.2 +2025-04-03,125.5 +2025-04-04,132.0 +2025-04-05,134.3 +2025-04-06,138.8 +2025-04-07,119.8 +2025-04-08,129.4 +2025-04-09,149.4 +2025-04-10,148.6 +2025-04-11,139.6 +2025-04-12,117.2 +2025-04-13,176.2 +2025-04-14,132.7 +2025-04-15,136.6 +2025-04-16,142.8 +2025-04-17,125.7 +2025-04-18,69.5 +2025-04-19,159.4 +2025-04-20,93.1 +2025-04-21,123.7 +2025-04-22,118.5 +2025-04-23,91.6 +2025-04-24,139.6 +2025-04-25,104.9 +2025-04-26,35.3 +2025-04-27,139.0 +2025-04-28,98.0 +2025-04-29,125.8 +2025-04-30,101.2 +2025-05-01,87.1 +2025-05-02,84.3 +2025-05-03,79.1 +2025-05-04,115.6 +2025-05-05,103.8 +2025-05-06,85.3 +2025-05-07,48.1 +2025-05-08,66.0 +2025-05-09,58.0 +2025-05-10,80.6 +2025-05-11,76.7 +2025-05-12,29.9 +2025-05-13,117.9 +2025-05-14,19.5 +2025-05-15,49.1 +2025-05-16,56.2 +2025-05-17,132.2 +2025-05-18,56.4 +2025-05-19,85.2 +2025-05-20,101.8 +2025-05-21,89.2 +2025-05-22,131.5 +2025-05-23,98.2 +2025-05-24,112.2 +2025-05-25,101.7 +2025-05-26,110.4 +2025-05-27,26.9 +2025-05-28,80.0 +2025-05-29,49.5 +2025-05-30,61.1 +2025-05-31,83.2 +2025-06-01,50.0 +2025-06-02,54.5 +2025-06-03,10.0 +2025-06-04,58.3 +2025-06-05,138.9 +2025-06-06,10.0 +2025-06-07,66.6 +2025-06-08,28.5 +2025-06-09,67.7 +2025-06-10,76.6 +2025-06-11,18.3 +2025-06-12,51.6 +2025-06-13,68.6 +2025-06-14,98.0 +2025-06-15,37.1 +2025-06-16,54.6 +2025-06-17,94.7 +2025-06-18,70.2 +2025-06-19,19.5 +2025-06-20,104.6 +2025-06-21,57.7 +2025-06-22,99.1 +2025-06-23,81.2 +2025-06-24,96.8 +2025-06-25,59.9 +2025-06-26,10.0 +2025-06-27,101.3 +2025-06-28,57.2 +2025-06-29,54.3 +2025-06-30,17.4 +2025-07-01,10.0 +2025-07-02,40.9 +2025-07-03,94.6 +2025-07-04,64.7 +2025-07-05,67.4 +2025-07-06,59.6 +2025-07-07,66.4 +2025-07-08,61.8 +2025-07-09,10.0 +2025-07-10,39.3 +2025-07-11,31.6 +2025-07-12,73.1 +2025-07-13,84.7 +2025-07-14,57.3 +2025-07-15,10.0 +2025-07-16,52.8 +2025-07-17,20.4 +2025-07-18,53.1 +2025-07-19,110.5 +2025-07-20,10.0 +2025-07-21,58.9 +2025-07-22,75.3 +2025-07-23,108.3 +2025-07-24,46.7 +2025-07-25,39.4 +2025-07-26,56.4 +2025-07-27,43.1 +2025-07-28,68.7 +2025-07-29,73.1 +2025-07-30,115.3 +2025-07-31,64.3 +2025-08-01,33.0 +2025-08-02,45.4 +2025-08-03,58.8 +2025-08-04,87.6 +2025-08-05,40.9 +2025-08-06,10.0 +2025-08-07,48.8 +2025-08-08,65.4 +2025-08-09,26.8 +2025-08-10,72.6 +2025-08-11,142.5 +2025-08-12,47.6 +2025-08-13,90.2 +2025-08-14,75.6 +2025-08-15,90.9 +2025-08-16,90.8 +2025-08-17,10.0 +2025-08-18,53.7 +2025-08-19,107.8 +2025-08-20,109.7 +2025-08-21,53.8 +2025-08-22,77.6 +2025-08-23,45.9 +2025-08-24,71.1 +2025-08-25,102.7 +2025-08-26,99.7 +2025-08-27,81.4 +2025-08-28,108.3 +2025-08-29,60.8 +2025-08-30,119.9 +2025-08-31,121.0 +2025-09-01,101.8 +2025-09-02,79.5 +2025-09-03,85.9 +2025-09-04,64.1 +2025-09-05,107.1 +2025-09-06,96.4 +2025-09-07,160.7 +2025-09-08,150.6 +2025-09-09,109.3 +2025-09-10,126.2 +2025-09-11,80.5 +2025-09-12,98.0 +2025-09-13,102.9 +2025-09-14,151.9 +2025-09-15,67.2 +2025-09-16,137.7 +2025-09-17,159.1 +2025-09-18,159.2 +2025-09-19,126.9 +2025-09-20,119.1 +2025-09-21,111.9 +2025-09-22,125.6 +2025-09-23,103.0 +2025-09-24,155.7 +2025-09-25,159.4 +2025-09-26,159.9 +2025-09-27,157.2 +2025-09-28,162.9 +2025-09-29,171.0 +2025-09-30,129.9 +2025-10-01,94.1 +2025-10-02,137.8 +2025-10-03,155.3 +2025-10-04,167.5 +2025-10-05,74.5 +2025-10-06,154.8 +2025-10-07,146.0 +2025-10-08,84.2 +2025-10-09,124.1 +2025-10-10,140.0 +2025-10-11,194.7 +2025-10-12,165.4 +2025-10-13,161.8 +2025-10-14,202.7 +2025-10-15,131.1 +2025-10-16,118.3 +2025-10-17,165.4 +2025-10-18,175.5 +2025-10-19,145.6 +2025-10-20,170.0 +2025-10-21,235.5 +2025-10-22,137.0 +2025-10-23,219.8 +2025-10-24,205.5 +2025-10-25,197.4 +2025-10-26,160.3 +2025-10-27,168.2 +2025-10-28,203.4 +2025-10-29,219.9 +2025-10-30,127.5 +2025-10-31,221.2 +2025-11-01,157.8 +2025-11-02,140.4 +2025-11-03,181.8 +2025-11-04,219.6 +2025-11-05,198.9 +2025-11-06,146.4 +2025-11-07,185.6 +2025-11-08,234.7 +2025-11-09,181.6 +2025-11-10,213.1 +2025-11-11,195.7 +2025-11-12,214.2 +2025-11-13,241.9 +2025-11-14,234.8 +2025-11-15,247.8 +2025-11-16,207.2 +2025-11-17,159.5 +2025-11-18,223.2 +2025-11-19,179.9 +2025-11-20,199.2 +2025-11-21,275.8 +2025-11-22,202.0 +2025-11-23,214.3 +2025-11-24,191.3 +2025-11-25,248.5 +2025-11-26,265.6 +2025-11-27,203.9 +2025-11-28,179.6 +2025-11-29,223.6 +2025-11-30,220.3 +2025-12-01,268.2 +2025-12-02,238.3 +2025-12-03,252.4 +2025-12-04,198.7 +2025-12-05,252.7 +2025-12-06,270.2 +2025-12-07,226.7 +2025-12-08,271.8 +2025-12-09,210.9 +2025-12-10,266.6 +2025-12-11,207.8 +2025-12-12,239.0 +2025-12-13,254.4 +2025-12-14,260.7 +2025-12-15,221.9 +2025-12-16,223.7 +2025-12-17,286.5 +2025-12-18,259.7 +2025-12-19,194.6 +2025-12-20,256.0 +2025-12-21,202.3 +2025-12-22,165.2 +2025-12-23,237.0 +2025-12-24,211.8 +2025-12-25,203.4 +2025-12-26,218.4 +2025-12-27,209.3 +2025-12-28,336.9 +2025-12-29,247.4 +2025-12-30,196.6 +2025-12-31,202.6 diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-date/case.json b/agents/evals/fixtures/cases/line-timeseries-pygal-date/case.json new file mode 100644 index 00000000000..753440d3e09 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "line-timeseries", + "library": "pygal", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "date", + "column": "Date" + }, + { + "role": "value", + "column": "PM2.5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "date-axis" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, date)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-date/data.csv b/agents/evals/fixtures/cases/line-timeseries-pygal-date/data.csv new file mode 100644 index 00000000000..47cb7354f58 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-date/data.csv @@ -0,0 +1,366 @@ +Date,Validated On,PM2.5 (µg/m³) +01.01.2025,2025-01-03,17.9 +02.01.2025,2025-01-04,24.6 +03.01.2025,2025-01-05,22.3 +04.01.2025,2025-01-06,19.7 +05.01.2025,2025-01-07,24.6 +06.01.2025,2025-01-08,18.5 +07.01.2025,2025-01-09,24.3 +08.01.2025,2025-01-10,27.0 +09.01.2025,2025-01-11,19.5 +10.01.2025,2025-01-12,23.5 +11.01.2025,2025-01-13,22.1 +12.01.2025,2025-01-14,18.0 +13.01.2025,2025-01-15,23.4 +14.01.2025,2025-01-16,17.7 +15.01.2025,2025-01-17,23.4 +16.01.2025,2025-01-18,27.7 +17.01.2025,2025-01-19,25.0 +18.01.2025,2025-01-20,25.4 +19.01.2025,2025-01-21,27.6 +20.01.2025,2025-01-22,21.4 +21.01.2025,2025-01-23,27.6 +22.01.2025,2025-01-24,23.7 +23.01.2025,2025-01-25,15.1 +24.01.2025,2025-01-26,21.3 +25.01.2025,2025-01-27,19.2 +26.01.2025,2025-01-28,20.5 +27.01.2025,2025-01-29,22.6 +28.01.2025,2025-01-30,19.9 +29.01.2025,2025-01-31,19.4 +30.01.2025,2025-02-01,22.3 +31.01.2025,2025-02-02,23.3 +01.02.2025,2025-02-03,16.0 +02.02.2025,2025-02-04,23.0 +03.02.2025,2025-02-05,24.3 +04.02.2025,2025-02-06,19.1 +05.02.2025,2025-02-07,24.0 +06.02.2025,2025-02-08,26.4 +07.02.2025,2025-02-09,21.2 +08.02.2025,2025-02-10,21.2 +09.02.2025,2025-02-11,19.0 +10.02.2025,2025-02-12,19.3 +11.02.2025,2025-02-13,22.2 +12.02.2025,2025-02-14,17.0 +13.02.2025,2025-02-15,21.7 +14.02.2025,2025-02-16,22.9 +15.02.2025,2025-02-17,23.2 +16.02.2025,2025-02-18,17.4 +17.02.2025,2025-02-19,15.9 +18.02.2025,2025-02-20,24.8 +19.02.2025,2025-02-21,15.1 +20.02.2025,2025-02-22,18.2 +21.02.2025,2025-02-23,18.8 +22.02.2025,2025-02-24,20.0 +23.02.2025,2025-02-25,19.5 +24.02.2025,2025-02-26,16.1 +25.02.2025,2025-02-27,19.4 +26.02.2025,2025-02-28,14.9 +27.02.2025,2025-03-01,16.9 +28.02.2025,2025-03-02,13.7 +01.03.2025,2025-03-03,16.2 +02.03.2025,2025-03-04,17.4 +03.03.2025,2025-03-05,17.6 +04.03.2025,2025-03-06,18.8 +05.03.2025,2025-03-07,18.1 +06.03.2025,2025-03-08,14.9 +07.03.2025,2025-03-09,21.0 +08.03.2025,2025-03-10,18.6 +09.03.2025,2025-03-11,19.7 +10.03.2025,2025-03-12,21.0 +11.03.2025,2025-03-13,18.8 +12.03.2025,2025-03-14,15.6 +13.03.2025,2025-03-15,21.5 +14.03.2025,2025-03-16,19.8 +15.03.2025,2025-03-17,20.0 +16.03.2025,2025-03-18,13.3 +17.03.2025,2025-03-19,18.1 +18.03.2025,2025-03-20,19.4 +19.03.2025,2025-03-21,18.5 +20.03.2025,2025-03-22,11.2 +21.03.2025,2025-03-23,13.9 +22.03.2025,2025-03-24,14.1 +23.03.2025,2025-03-25,17.1 +24.03.2025,2025-03-26,17.4 +25.03.2025,2025-03-27,16.5 +26.03.2025,2025-03-28,12.9 +27.03.2025,2025-03-29,17.8 +28.03.2025,2025-03-30,12.5 +29.03.2025,2025-03-31,13.4 +30.03.2025,2025-04-01,17.2 +31.03.2025,2025-04-02,14.9 +01.04.2025,2025-04-03,13.2 +02.04.2025,2025-04-04,11.7 +03.04.2025,2025-04-05,12.6 +04.04.2025,2025-04-06,13.2 +05.04.2025,2025-04-07,13.4 +06.04.2025,2025-04-08,13.9 +07.04.2025,2025-04-09,12.0 +08.04.2025,2025-04-10,12.9 +09.04.2025,2025-04-11,14.9 +10.04.2025,2025-04-12,14.9 +11.04.2025,2025-04-13,14.0 +12.04.2025,2025-04-14,11.7 +13.04.2025,2025-04-15,17.6 +14.04.2025,2025-04-16,13.3 +15.04.2025,2025-04-17,13.7 +16.04.2025,2025-04-18,14.3 +17.04.2025,2025-04-19,12.6 +18.04.2025,2025-04-20,6.9 +19.04.2025,2025-04-21,15.9 +20.04.2025,2025-04-22,9.3 +21.04.2025,2025-04-23,12.4 +22.04.2025,2025-04-24,11.9 +23.04.2025,2025-04-25,9.2 +24.04.2025,2025-04-26,14.0 +25.04.2025,2025-04-27,10.5 +26.04.2025,2025-04-28,3.5 +27.04.2025,2025-04-29,13.9 +28.04.2025,2025-04-30,9.8 +29.04.2025,2025-05-01,12.6 +30.04.2025,2025-05-02,10.1 +01.05.2025,2025-05-03,8.7 +02.05.2025,2025-05-04,8.4 +03.05.2025,2025-05-05,7.9 +04.05.2025,2025-05-06,11.6 +05.05.2025,2025-05-07,10.4 +06.05.2025,2025-05-08,8.5 +07.05.2025,2025-05-09,4.8 +08.05.2025,2025-05-10,6.6 +09.05.2025,2025-05-11,5.8 +10.05.2025,2025-05-12,8.1 +11.05.2025,2025-05-13,7.7 +12.05.2025,2025-05-14,3.0 +13.05.2025,2025-05-15,11.8 +14.05.2025,2025-05-16,2.0 +15.05.2025,2025-05-17,4.9 +16.05.2025,2025-05-18,5.6 +17.05.2025,2025-05-19,13.2 +18.05.2025,2025-05-20,5.6 +19.05.2025,2025-05-21,8.5 +20.05.2025,2025-05-22,10.2 +21.05.2025,2025-05-23,8.9 +22.05.2025,2025-05-24,13.2 +23.05.2025,2025-05-25,9.8 +24.05.2025,2025-05-26,11.2 +25.05.2025,2025-05-27,10.2 +26.05.2025,2025-05-28,11.0 +27.05.2025,2025-05-29,2.7 +28.05.2025,2025-05-30,8.0 +29.05.2025,2025-05-31,4.9 +30.05.2025,2025-06-01,6.1 +31.05.2025,2025-06-02,8.3 +01.06.2025,2025-06-03,5.0 +02.06.2025,2025-06-04,5.5 +03.06.2025,2025-06-05,1.0 +04.06.2025,2025-06-06,5.8 +05.06.2025,2025-06-07,13.9 +06.06.2025,2025-06-08,1.0 +07.06.2025,2025-06-09,6.7 +08.06.2025,2025-06-10,2.8 +09.06.2025,2025-06-11,6.8 +10.06.2025,2025-06-12,7.7 +11.06.2025,2025-06-13,1.8 +12.06.2025,2025-06-14,5.2 +13.06.2025,2025-06-15,6.9 +14.06.2025,2025-06-16,9.8 +15.06.2025,2025-06-17,3.7 +16.06.2025,2025-06-18,5.5 +17.06.2025,2025-06-19,9.5 +18.06.2025,2025-06-20,7.0 +19.06.2025,2025-06-21,2.0 +20.06.2025,2025-06-22,10.5 +21.06.2025,2025-06-23,5.8 +22.06.2025,2025-06-24,9.9 +23.06.2025,2025-06-25,8.1 +24.06.2025,2025-06-26,9.7 +25.06.2025,2025-06-27,6.0 +26.06.2025,2025-06-28,1.0 +27.06.2025,2025-06-29,10.1 +28.06.2025,2025-06-30,5.7 +29.06.2025,2025-07-01,5.4 +30.06.2025,2025-07-02,1.7 +01.07.2025,2025-07-03,1.0 +02.07.2025,2025-07-04,4.1 +03.07.2025,2025-07-05,9.5 +04.07.2025,2025-07-06,6.5 +05.07.2025,2025-07-07,6.7 +06.07.2025,2025-07-08,6.0 +07.07.2025,2025-07-09,6.6 +08.07.2025,2025-07-10,6.2 +09.07.2025,2025-07-11,1.0 +10.07.2025,2025-07-12,3.9 +11.07.2025,2025-07-13,3.2 +12.07.2025,2025-07-14,7.3 +13.07.2025,2025-07-15,8.5 +14.07.2025,2025-07-16,5.7 +15.07.2025,2025-07-17,1.0 +16.07.2025,2025-07-18,5.3 +17.07.2025,2025-07-19,2.0 +18.07.2025,2025-07-20,5.3 +19.07.2025,2025-07-21,11.1 +20.07.2025,2025-07-22,1.0 +21.07.2025,2025-07-23,5.9 +22.07.2025,2025-07-24,7.5 +23.07.2025,2025-07-25,10.8 +24.07.2025,2025-07-26,4.7 +25.07.2025,2025-07-27,3.9 +26.07.2025,2025-07-28,5.6 +27.07.2025,2025-07-29,4.3 +28.07.2025,2025-07-30,6.9 +29.07.2025,2025-07-31,7.3 +30.07.2025,2025-08-01,11.5 +31.07.2025,2025-08-02,6.4 +01.08.2025,2025-08-03,3.3 +02.08.2025,2025-08-04,4.5 +03.08.2025,2025-08-05,5.9 +04.08.2025,2025-08-06,8.8 +05.08.2025,2025-08-07,4.1 +06.08.2025,2025-08-08,1.0 +07.08.2025,2025-08-09,4.9 +08.08.2025,2025-08-10,6.5 +09.08.2025,2025-08-11,2.7 +10.08.2025,2025-08-12,7.3 +11.08.2025,2025-08-13,14.3 +12.08.2025,2025-08-14,4.8 +13.08.2025,2025-08-15,9.0 +14.08.2025,2025-08-16,7.6 +15.08.2025,2025-08-17,9.1 +16.08.2025,2025-08-18,9.1 +17.08.2025,2025-08-19,1.0 +18.08.2025,2025-08-20,5.4 +19.08.2025,2025-08-21,10.8 +20.08.2025,2025-08-22,11.0 +21.08.2025,2025-08-23,5.4 +22.08.2025,2025-08-24,7.8 +23.08.2025,2025-08-25,4.6 +24.08.2025,2025-08-26,7.1 +25.08.2025,2025-08-27,10.3 +26.08.2025,2025-08-28,10.0 +27.08.2025,2025-08-29,8.1 +28.08.2025,2025-08-30,10.8 +29.08.2025,2025-08-31,6.1 +30.08.2025,2025-09-01,12.0 +31.08.2025,2025-09-02,12.1 +01.09.2025,2025-09-03,10.2 +02.09.2025,2025-09-04,8.0 +03.09.2025,2025-09-05,8.6 +04.09.2025,2025-09-06,6.4 +05.09.2025,2025-09-07,10.7 +06.09.2025,2025-09-08,9.6 +07.09.2025,2025-09-09,16.1 +08.09.2025,2025-09-10,15.1 +09.09.2025,2025-09-11,10.9 +10.09.2025,2025-09-12,12.6 +11.09.2025,2025-09-13,8.1 +12.09.2025,2025-09-14,9.8 +13.09.2025,2025-09-15,10.3 +14.09.2025,2025-09-16,15.2 +15.09.2025,2025-09-17,6.7 +16.09.2025,2025-09-18,13.8 +17.09.2025,2025-09-19,15.9 +18.09.2025,2025-09-20,15.9 +19.09.2025,2025-09-21,12.7 +20.09.2025,2025-09-22,11.9 +21.09.2025,2025-09-23,11.2 +22.09.2025,2025-09-24,12.6 +23.09.2025,2025-09-25,10.3 +24.09.2025,2025-09-26,15.6 +25.09.2025,2025-09-27,15.9 +26.09.2025,2025-09-28,16.0 +27.09.2025,2025-09-29,15.7 +28.09.2025,2025-09-30,16.3 +29.09.2025,2025-10-01,17.1 +30.09.2025,2025-10-02,13.0 +01.10.2025,2025-10-03,9.4 +02.10.2025,2025-10-04,13.8 +03.10.2025,2025-10-05,15.5 +04.10.2025,2025-10-06,16.7 +05.10.2025,2025-10-07,7.5 +06.10.2025,2025-10-08,15.5 +07.10.2025,2025-10-09,14.6 +08.10.2025,2025-10-10,8.4 +09.10.2025,2025-10-11,12.4 +10.10.2025,2025-10-12,14.0 +11.10.2025,2025-10-13,19.5 +12.10.2025,2025-10-14,16.5 +13.10.2025,2025-10-15,16.2 +14.10.2025,2025-10-16,20.3 +15.10.2025,2025-10-17,13.1 +16.10.2025,2025-10-18,11.8 +17.10.2025,2025-10-19,16.5 +18.10.2025,2025-10-20,17.6 +19.10.2025,2025-10-21,14.6 +20.10.2025,2025-10-22,17.0 +21.10.2025,2025-10-23,23.6 +22.10.2025,2025-10-24,13.7 +23.10.2025,2025-10-25,22.0 +24.10.2025,2025-10-26,20.6 +25.10.2025,2025-10-27,19.7 +26.10.2025,2025-10-28,16.0 +27.10.2025,2025-10-29,16.8 +28.10.2025,2025-10-30,20.3 +29.10.2025,2025-10-31,22.0 +30.10.2025,2025-11-01,12.7 +31.10.2025,2025-11-02,22.1 +01.11.2025,2025-11-03,15.8 +02.11.2025,2025-11-04,14.0 +03.11.2025,2025-11-05,18.2 +04.11.2025,2025-11-06,22.0 +05.11.2025,2025-11-07,19.9 +06.11.2025,2025-11-08,14.6 +07.11.2025,2025-11-09,18.6 +08.11.2025,2025-11-10,23.5 +09.11.2025,2025-11-11,18.2 +10.11.2025,2025-11-12,21.3 +11.11.2025,2025-11-13,19.6 +12.11.2025,2025-11-14,21.4 +13.11.2025,2025-11-15,24.2 +14.11.2025,2025-11-16,23.5 +15.11.2025,2025-11-17,24.8 +16.11.2025,2025-11-18,20.7 +17.11.2025,2025-11-19,15.9 +18.11.2025,2025-11-20,22.3 +19.11.2025,2025-11-21,18.0 +20.11.2025,2025-11-22,19.9 +21.11.2025,2025-11-23,27.6 +22.11.2025,2025-11-24,20.2 +23.11.2025,2025-11-25,21.4 +24.11.2025,2025-11-26,19.1 +25.11.2025,2025-11-27,24.8 +26.11.2025,2025-11-28,26.6 +27.11.2025,2025-11-29,20.4 +28.11.2025,2025-11-30,18.0 +29.11.2025,2025-12-01,22.4 +30.11.2025,2025-12-02,22.0 +01.12.2025,2025-12-03,26.8 +02.12.2025,2025-12-04,23.8 +03.12.2025,2025-12-05,25.2 +04.12.2025,2025-12-06,19.9 +05.12.2025,2025-12-07,25.3 +06.12.2025,2025-12-08,27.0 +07.12.2025,2025-12-09,22.7 +08.12.2025,2025-12-10,27.2 +09.12.2025,2025-12-11,21.1 +10.12.2025,2025-12-12,26.7 +11.12.2025,2025-12-13,20.8 +12.12.2025,2025-12-14,23.9 +13.12.2025,2025-12-15,25.4 +14.12.2025,2025-12-16,26.1 +15.12.2025,2025-12-17,22.2 +16.12.2025,2025-12-18,22.4 +17.12.2025,2025-12-19,28.7 +18.12.2025,2025-12-20,26.0 +19.12.2025,2025-12-21,19.5 +20.12.2025,2025-12-22,25.6 +21.12.2025,2025-12-23,20.2 +22.12.2025,2025-12-24,16.5 +23.12.2025,2025-12-25,23.7 +24.12.2025,2025-12-26,21.2 +25.12.2025,2025-12-27,20.3 +26.12.2025,2025-12-28,21.8 +27.12.2025,2025-12-29,20.9 +28.12.2025,2025-12-30,33.7 +29.12.2025,2025-12-31,24.7 +30.12.2025,2026-01-01,19.7 +31.12.2025,2026-01-02,20.3 diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-decimal-comma/case.json b/agents/evals/fixtures/cases/line-timeseries-pygal-decimal-comma/case.json new file mode 100644 index 00000000000..6d93f193adc --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-decimal-comma/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "line-timeseries", + "library": "pygal", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "date", + "column": "Date" + }, + { + "role": "value", + "column": "PM2.5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "decimal-comma", + "synthetic", + "semicolon", + "dd.mm.yyyy" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-decimal-comma/data.csv b/agents/evals/fixtures/cases/line-timeseries-pygal-decimal-comma/data.csv new file mode 100644 index 00000000000..df75a07f5c2 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-decimal-comma/data.csv @@ -0,0 +1,366 @@ +Date;PM2.5 (µg/m³) +01.01.2025;17,9 +02.01.2025;24,6 +03.01.2025;22,3 +04.01.2025;19,7 +05.01.2025;24,6 +06.01.2025;18,5 +07.01.2025;24,3 +08.01.2025;27,0 +09.01.2025;19,5 +10.01.2025;23,5 +11.01.2025;22,1 +12.01.2025;18,0 +13.01.2025;23,4 +14.01.2025;17,7 +15.01.2025;23,4 +16.01.2025;27,7 +17.01.2025;25,0 +18.01.2025;25,4 +19.01.2025;27,6 +20.01.2025;21,4 +21.01.2025;27,6 +22.01.2025;23,7 +23.01.2025;15,1 +24.01.2025;21,3 +25.01.2025;19,2 +26.01.2025;20,5 +27.01.2025;22,6 +28.01.2025;19,9 +29.01.2025;19,4 +30.01.2025;22,3 +31.01.2025;23,3 +01.02.2025;16,0 +02.02.2025;23,0 +03.02.2025;24,3 +04.02.2025;19,1 +05.02.2025;24,0 +06.02.2025;26,4 +07.02.2025;21,2 +08.02.2025;21,2 +09.02.2025;19,0 +10.02.2025;19,3 +11.02.2025;22,2 +12.02.2025;17,0 +13.02.2025;21,7 +14.02.2025;22,9 +15.02.2025;23,2 +16.02.2025;17,4 +17.02.2025;15,9 +18.02.2025;24,8 +19.02.2025;15,1 +20.02.2025;18,2 +21.02.2025;18,8 +22.02.2025;20,0 +23.02.2025;19,5 +24.02.2025;16,1 +25.02.2025;19,4 +26.02.2025;14,9 +27.02.2025;16,9 +28.02.2025;13,7 +01.03.2025;16,2 +02.03.2025;17,4 +03.03.2025;17,6 +04.03.2025;18,8 +05.03.2025;18,1 +06.03.2025;14,9 +07.03.2025;21,0 +08.03.2025;18,6 +09.03.2025;19,7 +10.03.2025;21,0 +11.03.2025;18,8 +12.03.2025;15,6 +13.03.2025;21,5 +14.03.2025;19,8 +15.03.2025;20,0 +16.03.2025;13,3 +17.03.2025;18,1 +18.03.2025;19,4 +19.03.2025;18,5 +20.03.2025;11,2 +21.03.2025;13,9 +22.03.2025;14,1 +23.03.2025;17,1 +24.03.2025;17,4 +25.03.2025;16,5 +26.03.2025;12,9 +27.03.2025;17,8 +28.03.2025;12,5 +29.03.2025;13,4 +30.03.2025;17,2 +31.03.2025;14,9 +01.04.2025;13,2 +02.04.2025;11,7 +03.04.2025;12,6 +04.04.2025;13,2 +05.04.2025;13,4 +06.04.2025;13,9 +07.04.2025;12,0 +08.04.2025;12,9 +09.04.2025;14,9 +10.04.2025;14,9 +11.04.2025;14,0 +12.04.2025;11,7 +13.04.2025;17,6 +14.04.2025;13,3 +15.04.2025;13,7 +16.04.2025;14,3 +17.04.2025;12,6 +18.04.2025;6,9 +19.04.2025;15,9 +20.04.2025;9,3 +21.04.2025;12,4 +22.04.2025;11,9 +23.04.2025;9,2 +24.04.2025;14,0 +25.04.2025;10,5 +26.04.2025;3,5 +27.04.2025;13,9 +28.04.2025;9,8 +29.04.2025;12,6 +30.04.2025;10,1 +01.05.2025;8,7 +02.05.2025;8,4 +03.05.2025;7,9 +04.05.2025;11,6 +05.05.2025;10,4 +06.05.2025;8,5 +07.05.2025;4,8 +08.05.2025;6,6 +09.05.2025;5,8 +10.05.2025;8,1 +11.05.2025;7,7 +12.05.2025;3,0 +13.05.2025;11,8 +14.05.2025;2,0 +15.05.2025;4,9 +16.05.2025;5,6 +17.05.2025;13,2 +18.05.2025;5,6 +19.05.2025;8,5 +20.05.2025;10,2 +21.05.2025;8,9 +22.05.2025;13,2 +23.05.2025;9,8 +24.05.2025;11,2 +25.05.2025;10,2 +26.05.2025;11,0 +27.05.2025;2,7 +28.05.2025;8,0 +29.05.2025;4,9 +30.05.2025;6,1 +31.05.2025;8,3 +01.06.2025;5,0 +02.06.2025;5,5 +03.06.2025;1,0 +04.06.2025;5,8 +05.06.2025;13,9 +06.06.2025;1,0 +07.06.2025;6,7 +08.06.2025;2,8 +09.06.2025;6,8 +10.06.2025;7,7 +11.06.2025;1,8 +12.06.2025;5,2 +13.06.2025;6,9 +14.06.2025;9,8 +15.06.2025;3,7 +16.06.2025;5,5 +17.06.2025;9,5 +18.06.2025;7,0 +19.06.2025;2,0 +20.06.2025;10,5 +21.06.2025;5,8 +22.06.2025;9,9 +23.06.2025;8,1 +24.06.2025;9,7 +25.06.2025;6,0 +26.06.2025;1,0 +27.06.2025;10,1 +28.06.2025;5,7 +29.06.2025;5,4 +30.06.2025;1,7 +01.07.2025;1,0 +02.07.2025;4,1 +03.07.2025;9,5 +04.07.2025;6,5 +05.07.2025;6,7 +06.07.2025;6,0 +07.07.2025;6,6 +08.07.2025;6,2 +09.07.2025;1,0 +10.07.2025;3,9 +11.07.2025;3,2 +12.07.2025;7,3 +13.07.2025;8,5 +14.07.2025;5,7 +15.07.2025;1,0 +16.07.2025;5,3 +17.07.2025;2,0 +18.07.2025;5,3 +19.07.2025;11,1 +20.07.2025;1,0 +21.07.2025;5,9 +22.07.2025;7,5 +23.07.2025;10,8 +24.07.2025;4,7 +25.07.2025;3,9 +26.07.2025;5,6 +27.07.2025;4,3 +28.07.2025;6,9 +29.07.2025;7,3 +30.07.2025;11,5 +31.07.2025;6,4 +01.08.2025;3,3 +02.08.2025;4,5 +03.08.2025;5,9 +04.08.2025;8,8 +05.08.2025;4,1 +06.08.2025;1,0 +07.08.2025;4,9 +08.08.2025;6,5 +09.08.2025;2,7 +10.08.2025;7,3 +11.08.2025;14,3 +12.08.2025;4,8 +13.08.2025;9,0 +14.08.2025;7,6 +15.08.2025;9,1 +16.08.2025;9,1 +17.08.2025;1,0 +18.08.2025;5,4 +19.08.2025;10,8 +20.08.2025;11,0 +21.08.2025;5,4 +22.08.2025;7,8 +23.08.2025;4,6 +24.08.2025;7,1 +25.08.2025;10,3 +26.08.2025;10,0 +27.08.2025;8,1 +28.08.2025;10,8 +29.08.2025;6,1 +30.08.2025;12,0 +31.08.2025;12,1 +01.09.2025;10,2 +02.09.2025;8,0 +03.09.2025;8,6 +04.09.2025;6,4 +05.09.2025;10,7 +06.09.2025;9,6 +07.09.2025;16,1 +08.09.2025;15,1 +09.09.2025;10,9 +10.09.2025;12,6 +11.09.2025;8,1 +12.09.2025;9,8 +13.09.2025;10,3 +14.09.2025;15,2 +15.09.2025;6,7 +16.09.2025;13,8 +17.09.2025;15,9 +18.09.2025;15,9 +19.09.2025;12,7 +20.09.2025;11,9 +21.09.2025;11,2 +22.09.2025;12,6 +23.09.2025;10,3 +24.09.2025;15,6 +25.09.2025;15,9 +26.09.2025;16,0 +27.09.2025;15,7 +28.09.2025;16,3 +29.09.2025;17,1 +30.09.2025;13,0 +01.10.2025;9,4 +02.10.2025;13,8 +03.10.2025;15,5 +04.10.2025;16,7 +05.10.2025;7,5 +06.10.2025;15,5 +07.10.2025;14,6 +08.10.2025;8,4 +09.10.2025;12,4 +10.10.2025;14,0 +11.10.2025;19,5 +12.10.2025;16,5 +13.10.2025;16,2 +14.10.2025;20,3 +15.10.2025;13,1 +16.10.2025;11,8 +17.10.2025;16,5 +18.10.2025;17,6 +19.10.2025;14,6 +20.10.2025;17,0 +21.10.2025;23,6 +22.10.2025;13,7 +23.10.2025;22,0 +24.10.2025;20,6 +25.10.2025;19,7 +26.10.2025;16,0 +27.10.2025;16,8 +28.10.2025;20,3 +29.10.2025;22,0 +30.10.2025;12,7 +31.10.2025;22,1 +01.11.2025;15,8 +02.11.2025;14,0 +03.11.2025;18,2 +04.11.2025;22,0 +05.11.2025;19,9 +06.11.2025;14,6 +07.11.2025;18,6 +08.11.2025;23,5 +09.11.2025;18,2 +10.11.2025;21,3 +11.11.2025;19,6 +12.11.2025;21,4 +13.11.2025;24,2 +14.11.2025;23,5 +15.11.2025;24,8 +16.11.2025;20,7 +17.11.2025;15,9 +18.11.2025;22,3 +19.11.2025;18,0 +20.11.2025;19,9 +21.11.2025;27,6 +22.11.2025;20,2 +23.11.2025;21,4 +24.11.2025;19,1 +25.11.2025;24,8 +26.11.2025;26,6 +27.11.2025;20,4 +28.11.2025;18,0 +29.11.2025;22,4 +30.11.2025;22,0 +01.12.2025;26,8 +02.12.2025;23,8 +03.12.2025;25,2 +04.12.2025;19,9 +05.12.2025;25,3 +06.12.2025;27,0 +07.12.2025;22,7 +08.12.2025;27,2 +09.12.2025;21,1 +10.12.2025;26,7 +11.12.2025;20,8 +12.12.2025;23,9 +13.12.2025;25,4 +14.12.2025;26,1 +15.12.2025;22,2 +16.12.2025;22,4 +17.12.2025;28,7 +18.12.2025;26,0 +19.12.2025;19,5 +20.12.2025;25,6 +21.12.2025;20,2 +22.12.2025;16,5 +23.12.2025;23,7 +24.12.2025;21,2 +25.12.2025;20,3 +26.12.2025;21,8 +27.12.2025;20,9 +28.12.2025;33,7 +29.12.2025;24,7 +30.12.2025;19,7 +31.12.2025;20,3 diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-n12/case.json b/agents/evals/fixtures/cases/line-timeseries-pygal-n12/case.json new file mode 100644 index 00000000000..226ad17f4f3 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-timeseries", + "library": "pygal", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "date", + "column": "Date" + }, + { + "role": "value", + "column": "PM2.5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, n12)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-n12/data.csv b/agents/evals/fixtures/cases/line-timeseries-pygal-n12/data.csv new file mode 100644 index 00000000000..d71bc31879f --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-n12/data.csv @@ -0,0 +1,13 @@ +Date,PM2.5 (µg/m³) +2025-01-01,18.7 +2025-01-02,20.3 +2025-01-03,22.9 +2025-01-04,21.5 +2025-01-05,19.6 +2025-01-06,26.1 +2025-01-07,18.5 +2025-01-08,25.4 +2025-01-09,20.1 +2025-01-10,27.9 +2025-01-11,22.7 +2025-01-12,24.6 diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-n5000/case.json b/agents/evals/fixtures/cases/line-timeseries-pygal-n5000/case.json new file mode 100644 index 00000000000..af2af8b64b6 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-timeseries", + "library": "pygal", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "date", + "column": "Date" + }, + { + "role": "value", + "column": "PM2.5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, n5000)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-n5000/data.csv b/agents/evals/fixtures/cases/line-timeseries-pygal-n5000/data.csv new file mode 100644 index 00000000000..9b339924b86 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-n5000/data.csv @@ -0,0 +1,5001 @@ +Date,PM2.5 (µg/m³) +2025-01-01T00:00,16.6 +2025-01-01T01:00,22.5 +2025-01-01T02:00,19.2 +2025-01-01T03:00,20.8 +2025-01-01T04:00,23.7 +2025-01-01T05:00,21.5 +2025-01-01T06:00,23.7 +2025-01-01T07:00,21.9 +2025-01-01T08:00,26.5 +2025-01-01T09:00,26.8 +2025-01-01T10:00,29.7 +2025-01-01T11:00,27.3 +2025-01-01T12:00,27.1 +2025-01-01T13:00,23.3 +2025-01-01T14:00,31.7 +2025-01-01T15:00,28.3 +2025-01-01T16:00,24.5 +2025-01-01T17:00,21.8 +2025-01-01T18:00,20.5 +2025-01-01T19:00,20.9 +2025-01-01T20:00,22.5 +2025-01-01T21:00,20.7 +2025-01-01T22:00,19.7 +2025-01-01T23:00,15.8 +2025-01-02T00:00,21.1 +2025-01-02T01:00,19.2 +2025-01-02T02:00,21.2 +2025-01-02T03:00,20.0 +2025-01-02T04:00,23.1 +2025-01-02T05:00,22.8 +2025-01-02T06:00,18.6 +2025-01-02T07:00,23.9 +2025-01-02T08:00,25.1 +2025-01-02T09:00,29.1 +2025-01-02T10:00,28.4 +2025-01-02T11:00,22.5 +2025-01-02T12:00,27.4 +2025-01-02T13:00,22.6 +2025-01-02T14:00,28.5 +2025-01-02T15:00,29.7 +2025-01-02T16:00,26.8 +2025-01-02T17:00,28.3 +2025-01-02T18:00,18.6 +2025-01-02T19:00,21.4 +2025-01-02T20:00,18.0 +2025-01-02T21:00,21.2 +2025-01-02T22:00,16.6 +2025-01-02T23:00,19.8 +2025-01-03T00:00,16.6 +2025-01-03T01:00,20.8 +2025-01-03T02:00,22.8 +2025-01-03T03:00,22.4 +2025-01-03T04:00,15.4 +2025-01-03T05:00,22.6 +2025-01-03T06:00,24.8 +2025-01-03T07:00,23.8 +2025-01-03T08:00,26.5 +2025-01-03T09:00,25.1 +2025-01-03T10:00,26.5 +2025-01-03T11:00,27.0 +2025-01-03T12:00,23.2 +2025-01-03T13:00,28.1 +2025-01-03T14:00,21.1 +2025-01-03T15:00,28.5 +2025-01-03T16:00,25.2 +2025-01-03T17:00,22.9 +2025-01-03T18:00,23.5 +2025-01-03T19:00,24.8 +2025-01-03T20:00,21.9 +2025-01-03T21:00,20.4 +2025-01-03T22:00,20.6 +2025-01-03T23:00,15.9 +2025-01-04T00:00,15.6 +2025-01-04T01:00,19.6 +2025-01-04T02:00,18.9 +2025-01-04T03:00,15.7 +2025-01-04T04:00,19.6 +2025-01-04T05:00,17.5 +2025-01-04T06:00,20.6 +2025-01-04T07:00,21.3 +2025-01-04T08:00,28.0 +2025-01-04T09:00,24.2 +2025-01-04T10:00,25.1 +2025-01-04T11:00,26.8 +2025-01-04T12:00,27.4 +2025-01-04T13:00,27.9 +2025-01-04T14:00,25.9 +2025-01-04T15:00,28.1 +2025-01-04T16:00,26.0 +2025-01-04T17:00,23.5 +2025-01-04T18:00,22.4 +2025-01-04T19:00,23.4 +2025-01-04T20:00,19.4 +2025-01-04T21:00,20.4 +2025-01-04T22:00,17.9 +2025-01-04T23:00,19.7 +2025-01-05T00:00,18.1 +2025-01-05T01:00,18.6 +2025-01-05T02:00,21.4 +2025-01-05T03:00,20.6 +2025-01-05T04:00,20.6 +2025-01-05T05:00,19.6 +2025-01-05T06:00,24.6 +2025-01-05T07:00,26.3 +2025-01-05T08:00,23.5 +2025-01-05T09:00,20.3 +2025-01-05T10:00,21.9 +2025-01-05T11:00,23.9 +2025-01-05T12:00,30.3 +2025-01-05T13:00,23.6 +2025-01-05T14:00,29.7 +2025-01-05T15:00,28.8 +2025-01-05T16:00,24.9 +2025-01-05T17:00,23.5 +2025-01-05T18:00,23.4 +2025-01-05T19:00,21.6 +2025-01-05T20:00,16.3 +2025-01-05T21:00,19.0 +2025-01-05T22:00,21.5 +2025-01-05T23:00,21.1 +2025-01-06T00:00,22.4 +2025-01-06T01:00,18.8 +2025-01-06T02:00,22.3 +2025-01-06T03:00,18.7 +2025-01-06T04:00,16.7 +2025-01-06T05:00,19.0 +2025-01-06T06:00,22.9 +2025-01-06T07:00,24.7 +2025-01-06T08:00,24.2 +2025-01-06T09:00,26.7 +2025-01-06T10:00,27.9 +2025-01-06T11:00,26.1 +2025-01-06T12:00,28.9 +2025-01-06T13:00,26.2 +2025-01-06T14:00,27.5 +2025-01-06T15:00,25.4 +2025-01-06T16:00,26.4 +2025-01-06T17:00,23.7 +2025-01-06T18:00,23.5 +2025-01-06T19:00,18.8 +2025-01-06T20:00,20.2 +2025-01-06T21:00,18.2 +2025-01-06T22:00,16.1 +2025-01-06T23:00,17.4 +2025-01-07T00:00,25.8 +2025-01-07T01:00,19.2 +2025-01-07T02:00,17.2 +2025-01-07T03:00,19.3 +2025-01-07T04:00,22.7 +2025-01-07T05:00,19.5 +2025-01-07T06:00,26.4 +2025-01-07T07:00,25.6 +2025-01-07T08:00,27.3 +2025-01-07T09:00,21.9 +2025-01-07T10:00,28.4 +2025-01-07T11:00,28.6 +2025-01-07T12:00,32.7 +2025-01-07T13:00,30.1 +2025-01-07T14:00,23.3 +2025-01-07T15:00,24.2 +2025-01-07T16:00,23.3 +2025-01-07T17:00,25.9 +2025-01-07T18:00,27.7 +2025-01-07T19:00,21.7 +2025-01-07T20:00,20.8 +2025-01-07T21:00,21.4 +2025-01-07T22:00,16.2 +2025-01-07T23:00,14.6 +2025-01-08T00:00,17.5 +2025-01-08T01:00,16.8 +2025-01-08T02:00,15.0 +2025-01-08T03:00,18.4 +2025-01-08T04:00,22.6 +2025-01-08T05:00,20.4 +2025-01-08T06:00,19.9 +2025-01-08T07:00,28.4 +2025-01-08T08:00,25.6 +2025-01-08T09:00,29.5 +2025-01-08T10:00,26.3 +2025-01-08T11:00,24.4 +2025-01-08T12:00,25.3 +2025-01-08T13:00,30.8 +2025-01-08T14:00,28.3 +2025-01-08T15:00,27.7 +2025-01-08T16:00,24.2 +2025-01-08T17:00,20.7 +2025-01-08T18:00,23.5 +2025-01-08T19:00,20.8 +2025-01-08T20:00,24.8 +2025-01-08T21:00,19.4 +2025-01-08T22:00,15.6 +2025-01-08T23:00,21.9 +2025-01-09T00:00,15.4 +2025-01-09T01:00,23.2 +2025-01-09T02:00,17.4 +2025-01-09T03:00,19.9 +2025-01-09T04:00,21.5 +2025-01-09T05:00,18.1 +2025-01-09T06:00,22.3 +2025-01-09T07:00,31.2 +2025-01-09T08:00,24.5 +2025-01-09T09:00,23.2 +2025-01-09T10:00,27.8 +2025-01-09T11:00,24.5 +2025-01-09T12:00,25.6 +2025-01-09T13:00,21.3 +2025-01-09T14:00,21.4 +2025-01-09T15:00,27.2 +2025-01-09T16:00,22.9 +2025-01-09T17:00,27.8 +2025-01-09T18:00,18.9 +2025-01-09T19:00,17.0 +2025-01-09T20:00,25.1 +2025-01-09T21:00,17.7 +2025-01-09T22:00,20.0 +2025-01-09T23:00,19.3 +2025-01-10T00:00,18.8 +2025-01-10T01:00,20.5 +2025-01-10T02:00,20.4 +2025-01-10T03:00,21.6 +2025-01-10T04:00,17.8 +2025-01-10T05:00,22.4 +2025-01-10T06:00,24.1 +2025-01-10T07:00,25.8 +2025-01-10T08:00,25.9 +2025-01-10T09:00,26.9 +2025-01-10T10:00,28.9 +2025-01-10T11:00,27.6 +2025-01-10T12:00,27.7 +2025-01-10T13:00,25.8 +2025-01-10T14:00,23.3 +2025-01-10T15:00,28.0 +2025-01-10T16:00,22.5 +2025-01-10T17:00,26.7 +2025-01-10T18:00,23.4 +2025-01-10T19:00,22.8 +2025-01-10T20:00,18.1 +2025-01-10T21:00,15.2 +2025-01-10T22:00,20.8 +2025-01-10T23:00,18.0 +2025-01-11T00:00,22.0 +2025-01-11T01:00,16.4 +2025-01-11T02:00,18.4 +2025-01-11T03:00,16.6 +2025-01-11T04:00,21.2 +2025-01-11T05:00,28.4 +2025-01-11T06:00,21.5 +2025-01-11T07:00,27.3 +2025-01-11T08:00,23.3 +2025-01-11T09:00,26.5 +2025-01-11T10:00,27.1 +2025-01-11T11:00,28.4 +2025-01-11T12:00,29.1 +2025-01-11T13:00,25.0 +2025-01-11T14:00,26.1 +2025-01-11T15:00,23.1 +2025-01-11T16:00,25.4 +2025-01-11T17:00,23.4 +2025-01-11T18:00,26.8 +2025-01-11T19:00,21.1 +2025-01-11T20:00,18.6 +2025-01-11T21:00,22.6 +2025-01-11T22:00,20.4 +2025-01-11T23:00,20.2 +2025-01-12T00:00,17.0 +2025-01-12T01:00,23.3 +2025-01-12T02:00,22.6 +2025-01-12T03:00,17.7 +2025-01-12T04:00,22.9 +2025-01-12T05:00,22.0 +2025-01-12T06:00,25.8 +2025-01-12T07:00,19.5 +2025-01-12T08:00,27.4 +2025-01-12T09:00,25.2 +2025-01-12T10:00,24.3 +2025-01-12T11:00,22.1 +2025-01-12T12:00,27.1 +2025-01-12T13:00,28.6 +2025-01-12T14:00,28.8 +2025-01-12T15:00,29.4 +2025-01-12T16:00,24.4 +2025-01-12T17:00,24.0 +2025-01-12T18:00,20.9 +2025-01-12T19:00,22.8 +2025-01-12T20:00,21.0 +2025-01-12T21:00,18.3 +2025-01-12T22:00,20.7 +2025-01-12T23:00,20.1 +2025-01-13T00:00,21.5 +2025-01-13T01:00,21.4 +2025-01-13T02:00,18.1 +2025-01-13T03:00,21.5 +2025-01-13T04:00,20.6 +2025-01-13T05:00,23.6 +2025-01-13T06:00,20.1 +2025-01-13T07:00,27.2 +2025-01-13T08:00,25.3 +2025-01-13T09:00,26.4 +2025-01-13T10:00,24.8 +2025-01-13T11:00,29.1 +2025-01-13T12:00,26.6 +2025-01-13T13:00,25.4 +2025-01-13T14:00,22.2 +2025-01-13T15:00,25.3 +2025-01-13T16:00,23.5 +2025-01-13T17:00,25.9 +2025-01-13T18:00,23.6 +2025-01-13T19:00,19.1 +2025-01-13T20:00,23.8 +2025-01-13T21:00,21.5 +2025-01-13T22:00,23.2 +2025-01-13T23:00,18.5 +2025-01-14T00:00,12.9 +2025-01-14T01:00,21.5 +2025-01-14T02:00,19.4 +2025-01-14T03:00,19.5 +2025-01-14T04:00,22.9 +2025-01-14T05:00,19.5 +2025-01-14T06:00,23.8 +2025-01-14T07:00,21.4 +2025-01-14T08:00,24.5 +2025-01-14T09:00,25.3 +2025-01-14T10:00,27.2 +2025-01-14T11:00,27.0 +2025-01-14T12:00,24.6 +2025-01-14T13:00,27.2 +2025-01-14T14:00,29.6 +2025-01-14T15:00,23.1 +2025-01-14T16:00,25.0 +2025-01-14T17:00,21.2 +2025-01-14T18:00,23.2 +2025-01-14T19:00,22.5 +2025-01-14T20:00,23.0 +2025-01-14T21:00,20.5 +2025-01-14T22:00,17.4 +2025-01-14T23:00,15.6 +2025-01-15T00:00,19.9 +2025-01-15T01:00,15.3 +2025-01-15T02:00,22.5 +2025-01-15T03:00,20.4 +2025-01-15T04:00,20.0 +2025-01-15T05:00,21.0 +2025-01-15T06:00,23.0 +2025-01-15T07:00,21.9 +2025-01-15T08:00,24.7 +2025-01-15T09:00,23.8 +2025-01-15T10:00,26.8 +2025-01-15T11:00,27.0 +2025-01-15T12:00,28.4 +2025-01-15T13:00,29.3 +2025-01-15T14:00,25.9 +2025-01-15T15:00,24.3 +2025-01-15T16:00,20.0 +2025-01-15T17:00,24.0 +2025-01-15T18:00,25.9 +2025-01-15T19:00,18.7 +2025-01-15T20:00,26.1 +2025-01-15T21:00,16.9 +2025-01-15T22:00,19.9 +2025-01-15T23:00,16.4 +2025-01-16T00:00,17.2 +2025-01-16T01:00,21.6 +2025-01-16T02:00,20.8 +2025-01-16T03:00,19.7 +2025-01-16T04:00,24.4 +2025-01-16T05:00,20.5 +2025-01-16T06:00,27.4 +2025-01-16T07:00,22.2 +2025-01-16T08:00,26.4 +2025-01-16T09:00,23.0 +2025-01-16T10:00,27.3 +2025-01-16T11:00,27.1 +2025-01-16T12:00,25.8 +2025-01-16T13:00,24.5 +2025-01-16T14:00,28.2 +2025-01-16T15:00,23.5 +2025-01-16T16:00,29.6 +2025-01-16T17:00,24.2 +2025-01-16T18:00,25.6 +2025-01-16T19:00,21.6 +2025-01-16T20:00,20.7 +2025-01-16T21:00,16.7 +2025-01-16T22:00,17.9 +2025-01-16T23:00,14.4 +2025-01-17T00:00,21.0 +2025-01-17T01:00,14.0 +2025-01-17T02:00,23.3 +2025-01-17T03:00,21.5 +2025-01-17T04:00,19.5 +2025-01-17T05:00,20.5 +2025-01-17T06:00,22.9 +2025-01-17T07:00,21.7 +2025-01-17T08:00,26.2 +2025-01-17T09:00,26.0 +2025-01-17T10:00,26.9 +2025-01-17T11:00,33.9 +2025-01-17T12:00,28.2 +2025-01-17T13:00,28.7 +2025-01-17T14:00,25.3 +2025-01-17T15:00,23.2 +2025-01-17T16:00,21.7 +2025-01-17T17:00,24.8 +2025-01-17T18:00,23.6 +2025-01-17T19:00,21.9 +2025-01-17T20:00,20.4 +2025-01-17T21:00,23.1 +2025-01-17T22:00,18.4 +2025-01-17T23:00,16.4 +2025-01-18T00:00,20.6 +2025-01-18T01:00,20.2 +2025-01-18T02:00,19.4 +2025-01-18T03:00,17.6 +2025-01-18T04:00,19.8 +2025-01-18T05:00,16.4 +2025-01-18T06:00,25.2 +2025-01-18T07:00,23.7 +2025-01-18T08:00,25.0 +2025-01-18T09:00,27.1 +2025-01-18T10:00,30.0 +2025-01-18T11:00,29.0 +2025-01-18T12:00,24.8 +2025-01-18T13:00,22.3 +2025-01-18T14:00,23.3 +2025-01-18T15:00,28.0 +2025-01-18T16:00,26.1 +2025-01-18T17:00,26.9 +2025-01-18T18:00,24.6 +2025-01-18T19:00,25.6 +2025-01-18T20:00,23.2 +2025-01-18T21:00,24.9 +2025-01-18T22:00,18.3 +2025-01-18T23:00,17.7 +2025-01-19T00:00,18.2 +2025-01-19T01:00,19.5 +2025-01-19T02:00,13.9 +2025-01-19T03:00,20.6 +2025-01-19T04:00,18.8 +2025-01-19T05:00,23.1 +2025-01-19T06:00,20.3 +2025-01-19T07:00,22.8 +2025-01-19T08:00,21.7 +2025-01-19T09:00,28.0 +2025-01-19T10:00,25.3 +2025-01-19T11:00,28.8 +2025-01-19T12:00,22.9 +2025-01-19T13:00,29.2 +2025-01-19T14:00,27.0 +2025-01-19T15:00,25.6 +2025-01-19T16:00,28.1 +2025-01-19T17:00,25.6 +2025-01-19T18:00,24.0 +2025-01-19T19:00,23.0 +2025-01-19T20:00,20.1 +2025-01-19T21:00,18.7 +2025-01-19T22:00,19.6 +2025-01-19T23:00,22.4 +2025-01-20T00:00,15.0 +2025-01-20T01:00,22.1 +2025-01-20T02:00,21.2 +2025-01-20T03:00,22.0 +2025-01-20T04:00,21.1 +2025-01-20T05:00,24.1 +2025-01-20T06:00,20.5 +2025-01-20T07:00,22.1 +2025-01-20T08:00,25.7 +2025-01-20T09:00,28.3 +2025-01-20T10:00,28.5 +2025-01-20T11:00,28.4 +2025-01-20T12:00,29.9 +2025-01-20T13:00,25.8 +2025-01-20T14:00,27.0 +2025-01-20T15:00,29.1 +2025-01-20T16:00,28.5 +2025-01-20T17:00,23.6 +2025-01-20T18:00,25.3 +2025-01-20T19:00,24.5 +2025-01-20T20:00,22.7 +2025-01-20T21:00,18.0 +2025-01-20T22:00,19.4 +2025-01-20T23:00,21.2 +2025-01-21T00:00,18.6 +2025-01-21T01:00,15.9 +2025-01-21T02:00,21.7 +2025-01-21T03:00,17.4 +2025-01-21T04:00,19.8 +2025-01-21T05:00,23.6 +2025-01-21T06:00,24.4 +2025-01-21T07:00,20.3 +2025-01-21T08:00,26.8 +2025-01-21T09:00,25.9 +2025-01-21T10:00,23.2 +2025-01-21T11:00,26.1 +2025-01-21T12:00,29.0 +2025-01-21T13:00,23.8 +2025-01-21T14:00,28.3 +2025-01-21T15:00,28.0 +2025-01-21T16:00,23.9 +2025-01-21T17:00,26.7 +2025-01-21T18:00,22.7 +2025-01-21T19:00,24.2 +2025-01-21T20:00,20.0 +2025-01-21T21:00,15.2 +2025-01-21T22:00,16.4 +2025-01-21T23:00,21.5 +2025-01-22T00:00,21.5 +2025-01-22T01:00,20.0 +2025-01-22T02:00,18.0 +2025-01-22T03:00,17.2 +2025-01-22T04:00,18.3 +2025-01-22T05:00,23.9 +2025-01-22T06:00,23.1 +2025-01-22T07:00,21.7 +2025-01-22T08:00,30.4 +2025-01-22T09:00,27.1 +2025-01-22T10:00,28.1 +2025-01-22T11:00,26.2 +2025-01-22T12:00,27.7 +2025-01-22T13:00,19.5 +2025-01-22T14:00,25.5 +2025-01-22T15:00,34.3 +2025-01-22T16:00,24.0 +2025-01-22T17:00,23.0 +2025-01-22T18:00,19.0 +2025-01-22T19:00,19.9 +2025-01-22T20:00,19.3 +2025-01-22T21:00,17.8 +2025-01-22T22:00,19.4 +2025-01-22T23:00,23.2 +2025-01-23T00:00,20.8 +2025-01-23T01:00,21.7 +2025-01-23T02:00,13.8 +2025-01-23T03:00,19.3 +2025-01-23T04:00,17.5 +2025-01-23T05:00,21.9 +2025-01-23T06:00,25.3 +2025-01-23T07:00,21.4 +2025-01-23T08:00,28.9 +2025-01-23T09:00,25.2 +2025-01-23T10:00,26.1 +2025-01-23T11:00,23.3 +2025-01-23T12:00,30.2 +2025-01-23T13:00,24.1 +2025-01-23T14:00,26.0 +2025-01-23T15:00,27.5 +2025-01-23T16:00,24.8 +2025-01-23T17:00,21.3 +2025-01-23T18:00,22.1 +2025-01-23T19:00,23.0 +2025-01-23T20:00,19.2 +2025-01-23T21:00,21.1 +2025-01-23T22:00,21.0 +2025-01-23T23:00,13.0 +2025-01-24T00:00,21.2 +2025-01-24T01:00,17.8 +2025-01-24T02:00,19.4 +2025-01-24T03:00,16.4 +2025-01-24T04:00,18.4 +2025-01-24T05:00,20.9 +2025-01-24T06:00,26.9 +2025-01-24T07:00,26.7 +2025-01-24T08:00,26.2 +2025-01-24T09:00,23.0 +2025-01-24T10:00,22.5 +2025-01-24T11:00,29.7 +2025-01-24T12:00,29.6 +2025-01-24T13:00,25.3 +2025-01-24T14:00,19.6 +2025-01-24T15:00,23.8 +2025-01-24T16:00,24.8 +2025-01-24T17:00,18.4 +2025-01-24T18:00,20.0 +2025-01-24T19:00,22.7 +2025-01-24T20:00,21.4 +2025-01-24T21:00,17.9 +2025-01-24T22:00,24.0 +2025-01-24T23:00,19.6 +2025-01-25T00:00,20.7 +2025-01-25T01:00,18.2 +2025-01-25T02:00,17.0 +2025-01-25T03:00,18.7 +2025-01-25T04:00,21.5 +2025-01-25T05:00,23.5 +2025-01-25T06:00,21.6 +2025-01-25T07:00,19.6 +2025-01-25T08:00,24.8 +2025-01-25T09:00,21.9 +2025-01-25T10:00,26.4 +2025-01-25T11:00,21.9 +2025-01-25T12:00,24.0 +2025-01-25T13:00,30.2 +2025-01-25T14:00,25.3 +2025-01-25T15:00,22.2 +2025-01-25T16:00,21.5 +2025-01-25T17:00,19.9 +2025-01-25T18:00,21.5 +2025-01-25T19:00,23.7 +2025-01-25T20:00,20.6 +2025-01-25T21:00,15.7 +2025-01-25T22:00,20.1 +2025-01-25T23:00,18.8 +2025-01-26T00:00,19.3 +2025-01-26T01:00,18.6 +2025-01-26T02:00,18.9 +2025-01-26T03:00,18.1 +2025-01-26T04:00,22.6 +2025-01-26T05:00,20.9 +2025-01-26T06:00,24.9 +2025-01-26T07:00,25.0 +2025-01-26T08:00,21.8 +2025-01-26T09:00,22.3 +2025-01-26T10:00,22.5 +2025-01-26T11:00,26.0 +2025-01-26T12:00,26.7 +2025-01-26T13:00,26.7 +2025-01-26T14:00,25.3 +2025-01-26T15:00,24.6 +2025-01-26T16:00,26.8 +2025-01-26T17:00,20.7 +2025-01-26T18:00,23.5 +2025-01-26T19:00,21.4 +2025-01-26T20:00,22.7 +2025-01-26T21:00,18.2 +2025-01-26T22:00,19.2 +2025-01-26T23:00,17.7 +2025-01-27T00:00,22.9 +2025-01-27T01:00,16.4 +2025-01-27T02:00,20.3 +2025-01-27T03:00,25.2 +2025-01-27T04:00,23.1 +2025-01-27T05:00,19.2 +2025-01-27T06:00,23.4 +2025-01-27T07:00,20.6 +2025-01-27T08:00,29.0 +2025-01-27T09:00,26.1 +2025-01-27T10:00,25.4 +2025-01-27T11:00,28.4 +2025-01-27T12:00,25.6 +2025-01-27T13:00,27.4 +2025-01-27T14:00,28.0 +2025-01-27T15:00,25.0 +2025-01-27T16:00,22.7 +2025-01-27T17:00,24.5 +2025-01-27T18:00,24.3 +2025-01-27T19:00,22.6 +2025-01-27T20:00,23.7 +2025-01-27T21:00,17.1 +2025-01-27T22:00,22.9 +2025-01-27T23:00,18.0 +2025-01-28T00:00,20.0 +2025-01-28T01:00,16.2 +2025-01-28T02:00,18.9 +2025-01-28T03:00,19.4 +2025-01-28T04:00,15.2 +2025-01-28T05:00,21.8 +2025-01-28T06:00,20.9 +2025-01-28T07:00,25.1 +2025-01-28T08:00,27.1 +2025-01-28T09:00,24.4 +2025-01-28T10:00,28.8 +2025-01-28T11:00,24.2 +2025-01-28T12:00,26.7 +2025-01-28T13:00,27.6 +2025-01-28T14:00,29.6 +2025-01-28T15:00,25.7 +2025-01-28T16:00,15.6 +2025-01-28T17:00,23.6 +2025-01-28T18:00,22.4 +2025-01-28T19:00,23.2 +2025-01-28T20:00,21.4 +2025-01-28T21:00,19.5 +2025-01-28T22:00,22.0 +2025-01-28T23:00,17.2 +2025-01-29T00:00,16.0 +2025-01-29T01:00,20.9 +2025-01-29T02:00,18.1 +2025-01-29T03:00,20.7 +2025-01-29T04:00,18.3 +2025-01-29T05:00,24.3 +2025-01-29T06:00,26.4 +2025-01-29T07:00,24.1 +2025-01-29T08:00,23.3 +2025-01-29T09:00,33.5 +2025-01-29T10:00,22.9 +2025-01-29T11:00,27.3 +2025-01-29T12:00,27.6 +2025-01-29T13:00,27.2 +2025-01-29T14:00,23.8 +2025-01-29T15:00,28.5 +2025-01-29T16:00,22.3 +2025-01-29T17:00,23.7 +2025-01-29T18:00,23.4 +2025-01-29T19:00,21.9 +2025-01-29T20:00,19.8 +2025-01-29T21:00,22.3 +2025-01-29T22:00,17.9 +2025-01-29T23:00,17.9 +2025-01-30T00:00,17.4 +2025-01-30T01:00,25.8 +2025-01-30T02:00,18.9 +2025-01-30T03:00,16.9 +2025-01-30T04:00,22.6 +2025-01-30T05:00,20.3 +2025-01-30T06:00,21.1 +2025-01-30T07:00,26.1 +2025-01-30T08:00,25.2 +2025-01-30T09:00,29.2 +2025-01-30T10:00,18.6 +2025-01-30T11:00,22.6 +2025-01-30T12:00,27.2 +2025-01-30T13:00,28.2 +2025-01-30T14:00,32.1 +2025-01-30T15:00,25.6 +2025-01-30T16:00,22.5 +2025-01-30T17:00,22.4 +2025-01-30T18:00,19.2 +2025-01-30T19:00,18.5 +2025-01-30T20:00,23.1 +2025-01-30T21:00,18.6 +2025-01-30T22:00,16.6 +2025-01-30T23:00,19.7 +2025-01-31T00:00,18.9 +2025-01-31T01:00,17.4 +2025-01-31T02:00,19.2 +2025-01-31T03:00,15.2 +2025-01-31T04:00,25.9 +2025-01-31T05:00,18.7 +2025-01-31T06:00,28.0 +2025-01-31T07:00,23.0 +2025-01-31T08:00,21.8 +2025-01-31T09:00,19.9 +2025-01-31T10:00,22.6 +2025-01-31T11:00,22.1 +2025-01-31T12:00,24.0 +2025-01-31T13:00,28.4 +2025-01-31T14:00,27.5 +2025-01-31T15:00,22.0 +2025-01-31T16:00,24.2 +2025-01-31T17:00,22.3 +2025-01-31T18:00,22.0 +2025-01-31T19:00,24.5 +2025-01-31T20:00,18.8 +2025-01-31T21:00,15.1 +2025-01-31T22:00,16.6 +2025-01-31T23:00,18.8 +2025-02-01T00:00,19.9 +2025-02-01T01:00,23.0 +2025-02-01T02:00,17.9 +2025-02-01T03:00,18.3 +2025-02-01T04:00,20.5 +2025-02-01T05:00,19.6 +2025-02-01T06:00,24.5 +2025-02-01T07:00,24.6 +2025-02-01T08:00,26.0 +2025-02-01T09:00,25.7 +2025-02-01T10:00,27.5 +2025-02-01T11:00,26.4 +2025-02-01T12:00,26.8 +2025-02-01T13:00,27.1 +2025-02-01T14:00,23.1 +2025-02-01T15:00,25.3 +2025-02-01T16:00,16.7 +2025-02-01T17:00,27.4 +2025-02-01T18:00,27.1 +2025-02-01T19:00,24.4 +2025-02-01T20:00,20.4 +2025-02-01T21:00,20.4 +2025-02-01T22:00,16.1 +2025-02-01T23:00,13.2 +2025-02-02T00:00,17.1 +2025-02-02T01:00,15.3 +2025-02-02T02:00,21.4 +2025-02-02T03:00,20.7 +2025-02-02T04:00,19.3 +2025-02-02T05:00,16.9 +2025-02-02T06:00,18.3 +2025-02-02T07:00,23.0 +2025-02-02T08:00,21.5 +2025-02-02T09:00,29.0 +2025-02-02T10:00,23.6 +2025-02-02T11:00,31.2 +2025-02-02T12:00,27.7 +2025-02-02T13:00,24.2 +2025-02-02T14:00,21.9 +2025-02-02T15:00,25.8 +2025-02-02T16:00,24.7 +2025-02-02T17:00,20.1 +2025-02-02T18:00,21.6 +2025-02-02T19:00,16.4 +2025-02-02T20:00,23.6 +2025-02-02T21:00,16.8 +2025-02-02T22:00,13.9 +2025-02-02T23:00,19.2 +2025-02-03T00:00,17.0 +2025-02-03T01:00,15.6 +2025-02-03T02:00,19.6 +2025-02-03T03:00,19.2 +2025-02-03T04:00,15.7 +2025-02-03T05:00,22.1 +2025-02-03T06:00,20.3 +2025-02-03T07:00,21.7 +2025-02-03T08:00,24.0 +2025-02-03T09:00,22.1 +2025-02-03T10:00,27.9 +2025-02-03T11:00,31.0 +2025-02-03T12:00,26.3 +2025-02-03T13:00,26.7 +2025-02-03T14:00,22.5 +2025-02-03T15:00,22.0 +2025-02-03T16:00,23.5 +2025-02-03T17:00,21.9 +2025-02-03T18:00,18.7 +2025-02-03T19:00,20.7 +2025-02-03T20:00,19.5 +2025-02-03T21:00,16.0 +2025-02-03T22:00,17.8 +2025-02-03T23:00,18.8 +2025-02-04T00:00,15.8 +2025-02-04T01:00,20.6 +2025-02-04T02:00,19.2 +2025-02-04T03:00,18.0 +2025-02-04T04:00,20.3 +2025-02-04T05:00,21.0 +2025-02-04T06:00,19.4 +2025-02-04T07:00,25.7 +2025-02-04T08:00,22.9 +2025-02-04T09:00,25.4 +2025-02-04T10:00,32.3 +2025-02-04T11:00,26.1 +2025-02-04T12:00,31.1 +2025-02-04T13:00,26.2 +2025-02-04T14:00,24.4 +2025-02-04T15:00,27.5 +2025-02-04T16:00,25.8 +2025-02-04T17:00,23.1 +2025-02-04T18:00,18.9 +2025-02-04T19:00,20.4 +2025-02-04T20:00,18.8 +2025-02-04T21:00,18.3 +2025-02-04T22:00,19.4 +2025-02-04T23:00,17.8 +2025-02-05T00:00,16.1 +2025-02-05T01:00,16.4 +2025-02-05T02:00,20.2 +2025-02-05T03:00,13.7 +2025-02-05T04:00,19.4 +2025-02-05T05:00,19.8 +2025-02-05T06:00,23.2 +2025-02-05T07:00,27.1 +2025-02-05T08:00,26.0 +2025-02-05T09:00,26.5 +2025-02-05T10:00,20.4 +2025-02-05T11:00,26.1 +2025-02-05T12:00,27.5 +2025-02-05T13:00,28.4 +2025-02-05T14:00,27.0 +2025-02-05T15:00,25.9 +2025-02-05T16:00,24.3 +2025-02-05T17:00,20.1 +2025-02-05T18:00,20.0 +2025-02-05T19:00,21.2 +2025-02-05T20:00,24.0 +2025-02-05T21:00,23.0 +2025-02-05T22:00,20.6 +2025-02-05T23:00,15.4 +2025-02-06T00:00,17.4 +2025-02-06T01:00,21.6 +2025-02-06T02:00,18.3 +2025-02-06T03:00,19.8 +2025-02-06T04:00,20.8 +2025-02-06T05:00,20.4 +2025-02-06T06:00,21.1 +2025-02-06T07:00,25.4 +2025-02-06T08:00,28.2 +2025-02-06T09:00,25.5 +2025-02-06T10:00,24.5 +2025-02-06T11:00,28.0 +2025-02-06T12:00,21.3 +2025-02-06T13:00,21.2 +2025-02-06T14:00,27.2 +2025-02-06T15:00,28.4 +2025-02-06T16:00,20.6 +2025-02-06T17:00,20.0 +2025-02-06T18:00,19.1 +2025-02-06T19:00,19.2 +2025-02-06T20:00,22.1 +2025-02-06T21:00,18.8 +2025-02-06T22:00,16.9 +2025-02-06T23:00,15.0 +2025-02-07T00:00,15.9 +2025-02-07T01:00,18.3 +2025-02-07T02:00,15.1 +2025-02-07T03:00,22.0 +2025-02-07T04:00,21.2 +2025-02-07T05:00,24.9 +2025-02-07T06:00,20.8 +2025-02-07T07:00,20.4 +2025-02-07T08:00,21.3 +2025-02-07T09:00,24.8 +2025-02-07T10:00,23.0 +2025-02-07T11:00,24.5 +2025-02-07T12:00,18.2 +2025-02-07T13:00,29.7 +2025-02-07T14:00,25.9 +2025-02-07T15:00,23.3 +2025-02-07T16:00,23.0 +2025-02-07T17:00,23.6 +2025-02-07T18:00,20.9 +2025-02-07T19:00,25.7 +2025-02-07T20:00,21.1 +2025-02-07T21:00,20.6 +2025-02-07T22:00,21.1 +2025-02-07T23:00,22.1 +2025-02-08T00:00,18.5 +2025-02-08T01:00,19.0 +2025-02-08T02:00,15.0 +2025-02-08T03:00,16.2 +2025-02-08T04:00,20.1 +2025-02-08T05:00,16.6 +2025-02-08T06:00,19.1 +2025-02-08T07:00,26.2 +2025-02-08T08:00,23.0 +2025-02-08T09:00,21.8 +2025-02-08T10:00,28.9 +2025-02-08T11:00,27.0 +2025-02-08T12:00,25.3 +2025-02-08T13:00,24.7 +2025-02-08T14:00,25.1 +2025-02-08T15:00,26.8 +2025-02-08T16:00,18.8 +2025-02-08T17:00,19.9 +2025-02-08T18:00,21.3 +2025-02-08T19:00,26.8 +2025-02-08T20:00,20.5 +2025-02-08T21:00,15.2 +2025-02-08T22:00,17.8 +2025-02-08T23:00,19.3 +2025-02-09T00:00,13.6 +2025-02-09T01:00,18.3 +2025-02-09T02:00,18.2 +2025-02-09T03:00,18.9 +2025-02-09T04:00,17.7 +2025-02-09T05:00,22.3 +2025-02-09T06:00,22.9 +2025-02-09T07:00,23.0 +2025-02-09T08:00,25.4 +2025-02-09T09:00,21.6 +2025-02-09T10:00,22.6 +2025-02-09T11:00,29.6 +2025-02-09T12:00,22.4 +2025-02-09T13:00,25.8 +2025-02-09T14:00,25.7 +2025-02-09T15:00,20.2 +2025-02-09T16:00,25.3 +2025-02-09T17:00,25.3 +2025-02-09T18:00,18.9 +2025-02-09T19:00,21.4 +2025-02-09T20:00,13.6 +2025-02-09T21:00,14.9 +2025-02-09T22:00,17.7 +2025-02-09T23:00,17.3 +2025-02-10T00:00,18.3 +2025-02-10T01:00,19.3 +2025-02-10T02:00,16.1 +2025-02-10T03:00,12.1 +2025-02-10T04:00,19.3 +2025-02-10T05:00,21.2 +2025-02-10T06:00,20.8 +2025-02-10T07:00,22.5 +2025-02-10T08:00,27.1 +2025-02-10T09:00,24.8 +2025-02-10T10:00,26.9 +2025-02-10T11:00,24.7 +2025-02-10T12:00,28.9 +2025-02-10T13:00,27.3 +2025-02-10T14:00,21.4 +2025-02-10T15:00,20.9 +2025-02-10T16:00,21.6 +2025-02-10T17:00,18.7 +2025-02-10T18:00,18.9 +2025-02-10T19:00,19.7 +2025-02-10T20:00,19.6 +2025-02-10T21:00,20.9 +2025-02-10T22:00,13.6 +2025-02-10T23:00,17.4 +2025-02-11T00:00,19.1 +2025-02-11T01:00,11.9 +2025-02-11T02:00,17.8 +2025-02-11T03:00,15.3 +2025-02-11T04:00,18.4 +2025-02-11T05:00,17.4 +2025-02-11T06:00,16.4 +2025-02-11T07:00,21.9 +2025-02-11T08:00,22.6 +2025-02-11T09:00,26.5 +2025-02-11T10:00,27.7 +2025-02-11T11:00,25.2 +2025-02-11T12:00,27.0 +2025-02-11T13:00,21.3 +2025-02-11T14:00,22.9 +2025-02-11T15:00,24.2 +2025-02-11T16:00,20.4 +2025-02-11T17:00,16.6 +2025-02-11T18:00,20.9 +2025-02-11T19:00,22.1 +2025-02-11T20:00,19.2 +2025-02-11T21:00,18.0 +2025-02-11T22:00,17.3 +2025-02-11T23:00,16.5 +2025-02-12T00:00,12.9 +2025-02-12T01:00,17.3 +2025-02-12T02:00,15.9 +2025-02-12T03:00,18.9 +2025-02-12T04:00,18.1 +2025-02-12T05:00,18.8 +2025-02-12T06:00,19.2 +2025-02-12T07:00,19.0 +2025-02-12T08:00,23.2 +2025-02-12T09:00,21.2 +2025-02-12T10:00,22.1 +2025-02-12T11:00,21.8 +2025-02-12T12:00,24.5 +2025-02-12T13:00,25.5 +2025-02-12T14:00,22.4 +2025-02-12T15:00,22.2 +2025-02-12T16:00,23.4 +2025-02-12T17:00,30.6 +2025-02-12T18:00,20.2 +2025-02-12T19:00,17.2 +2025-02-12T20:00,18.1 +2025-02-12T21:00,16.4 +2025-02-12T22:00,16.2 +2025-02-12T23:00,13.8 +2025-02-13T00:00,19.4 +2025-02-13T01:00,20.2 +2025-02-13T02:00,16.8 +2025-02-13T03:00,18.5 +2025-02-13T04:00,18.7 +2025-02-13T05:00,17.4 +2025-02-13T06:00,18.6 +2025-02-13T07:00,24.8 +2025-02-13T08:00,21.0 +2025-02-13T09:00,22.7 +2025-02-13T10:00,23.4 +2025-02-13T11:00,20.2 +2025-02-13T12:00,25.3 +2025-02-13T13:00,27.7 +2025-02-13T14:00,22.3 +2025-02-13T15:00,22.7 +2025-02-13T16:00,25.3 +2025-02-13T17:00,19.8 +2025-02-13T18:00,22.6 +2025-02-13T19:00,17.6 +2025-02-13T20:00,15.4 +2025-02-13T21:00,14.6 +2025-02-13T22:00,17.7 +2025-02-13T23:00,14.6 +2025-02-14T00:00,15.7 +2025-02-14T01:00,19.6 +2025-02-14T02:00,9.6 +2025-02-14T03:00,16.9 +2025-02-14T04:00,21.8 +2025-02-14T05:00,13.8 +2025-02-14T06:00,20.1 +2025-02-14T07:00,19.6 +2025-02-14T08:00,24.7 +2025-02-14T09:00,21.7 +2025-02-14T10:00,24.0 +2025-02-14T11:00,21.9 +2025-02-14T12:00,24.8 +2025-02-14T13:00,22.6 +2025-02-14T14:00,24.8 +2025-02-14T15:00,24.5 +2025-02-14T16:00,25.6 +2025-02-14T17:00,23.0 +2025-02-14T18:00,19.7 +2025-02-14T19:00,19.7 +2025-02-14T20:00,14.5 +2025-02-14T21:00,21.4 +2025-02-14T22:00,15.4 +2025-02-14T23:00,14.4 +2025-02-15T00:00,16.5 +2025-02-15T01:00,16.6 +2025-02-15T02:00,17.9 +2025-02-15T03:00,20.8 +2025-02-15T04:00,17.4 +2025-02-15T05:00,21.5 +2025-02-15T06:00,19.6 +2025-02-15T07:00,19.8 +2025-02-15T08:00,24.1 +2025-02-15T09:00,24.3 +2025-02-15T10:00,22.5 +2025-02-15T11:00,24.8 +2025-02-15T12:00,23.0 +2025-02-15T13:00,23.9 +2025-02-15T14:00,24.8 +2025-02-15T15:00,22.2 +2025-02-15T16:00,18.3 +2025-02-15T17:00,18.8 +2025-02-15T18:00,17.9 +2025-02-15T19:00,20.2 +2025-02-15T20:00,17.3 +2025-02-15T21:00,15.5 +2025-02-15T22:00,20.7 +2025-02-15T23:00,18.0 +2025-02-16T00:00,20.2 +2025-02-16T01:00,21.1 +2025-02-16T02:00,15.7 +2025-02-16T03:00,20.6 +2025-02-16T04:00,24.0 +2025-02-16T05:00,21.4 +2025-02-16T06:00,21.1 +2025-02-16T07:00,17.4 +2025-02-16T08:00,22.6 +2025-02-16T09:00,24.1 +2025-02-16T10:00,28.3 +2025-02-16T11:00,27.9 +2025-02-16T12:00,23.0 +2025-02-16T13:00,20.8 +2025-02-16T14:00,22.3 +2025-02-16T15:00,23.0 +2025-02-16T16:00,23.4 +2025-02-16T17:00,18.2 +2025-02-16T18:00,18.0 +2025-02-16T19:00,20.1 +2025-02-16T20:00,18.2 +2025-02-16T21:00,14.6 +2025-02-16T22:00,17.6 +2025-02-16T23:00,17.8 +2025-02-17T00:00,14.4 +2025-02-17T01:00,10.4 +2025-02-17T02:00,19.7 +2025-02-17T03:00,14.2 +2025-02-17T04:00,18.2 +2025-02-17T05:00,17.3 +2025-02-17T06:00,19.4 +2025-02-17T07:00,22.9 +2025-02-17T08:00,22.6 +2025-02-17T09:00,24.1 +2025-02-17T10:00,20.6 +2025-02-17T11:00,23.8 +2025-02-17T12:00,23.2 +2025-02-17T13:00,22.5 +2025-02-17T14:00,25.0 +2025-02-17T15:00,20.9 +2025-02-17T16:00,19.8 +2025-02-17T17:00,18.9 +2025-02-17T18:00,19.1 +2025-02-17T19:00,23.3 +2025-02-17T20:00,18.2 +2025-02-17T21:00,16.1 +2025-02-17T22:00,15.8 +2025-02-17T23:00,17.5 +2025-02-18T00:00,15.5 +2025-02-18T01:00,14.5 +2025-02-18T02:00,17.1 +2025-02-18T03:00,17.1 +2025-02-18T04:00,19.5 +2025-02-18T05:00,17.5 +2025-02-18T06:00,18.3 +2025-02-18T07:00,23.1 +2025-02-18T08:00,26.8 +2025-02-18T09:00,19.9 +2025-02-18T10:00,25.0 +2025-02-18T11:00,25.7 +2025-02-18T12:00,21.9 +2025-02-18T13:00,28.6 +2025-02-18T14:00,25.6 +2025-02-18T15:00,26.6 +2025-02-18T16:00,24.5 +2025-02-18T17:00,21.3 +2025-02-18T18:00,20.8 +2025-02-18T19:00,17.4 +2025-02-18T20:00,16.4 +2025-02-18T21:00,16.8 +2025-02-18T22:00,16.7 +2025-02-18T23:00,18.3 +2025-02-19T00:00,17.9 +2025-02-19T01:00,15.4 +2025-02-19T02:00,16.9 +2025-02-19T03:00,19.1 +2025-02-19T04:00,24.8 +2025-02-19T05:00,19.9 +2025-02-19T06:00,23.2 +2025-02-19T07:00,23.0 +2025-02-19T08:00,22.5 +2025-02-19T09:00,22.8 +2025-02-19T10:00,22.0 +2025-02-19T11:00,23.8 +2025-02-19T12:00,22.7 +2025-02-19T13:00,25.0 +2025-02-19T14:00,23.3 +2025-02-19T15:00,19.4 +2025-02-19T16:00,24.1 +2025-02-19T17:00,26.2 +2025-02-19T18:00,22.9 +2025-02-19T19:00,20.0 +2025-02-19T20:00,12.4 +2025-02-19T21:00,17.5 +2025-02-19T22:00,19.9 +2025-02-19T23:00,18.6 +2025-02-20T00:00,14.3 +2025-02-20T01:00,18.0 +2025-02-20T02:00,17.7 +2025-02-20T03:00,16.4 +2025-02-20T04:00,18.5 +2025-02-20T05:00,21.4 +2025-02-20T06:00,21.9 +2025-02-20T07:00,19.1 +2025-02-20T08:00,22.3 +2025-02-20T09:00,19.6 +2025-02-20T10:00,23.1 +2025-02-20T11:00,20.9 +2025-02-20T12:00,27.0 +2025-02-20T13:00,26.8 +2025-02-20T14:00,25.3 +2025-02-20T15:00,22.7 +2025-02-20T16:00,21.5 +2025-02-20T17:00,22.4 +2025-02-20T18:00,17.5 +2025-02-20T19:00,24.5 +2025-02-20T20:00,17.2 +2025-02-20T21:00,16.2 +2025-02-20T22:00,20.0 +2025-02-20T23:00,15.7 +2025-02-21T00:00,16.4 +2025-02-21T01:00,15.7 +2025-02-21T02:00,12.7 +2025-02-21T03:00,19.3 +2025-02-21T04:00,17.0 +2025-02-21T05:00,18.1 +2025-02-21T06:00,22.2 +2025-02-21T07:00,20.2 +2025-02-21T08:00,24.5 +2025-02-21T09:00,19.3 +2025-02-21T10:00,20.9 +2025-02-21T11:00,20.3 +2025-02-21T12:00,24.6 +2025-02-21T13:00,26.3 +2025-02-21T14:00,24.5 +2025-02-21T15:00,22.9 +2025-02-21T16:00,22.7 +2025-02-21T17:00,18.9 +2025-02-21T18:00,22.3 +2025-02-21T19:00,20.4 +2025-02-21T20:00,23.9 +2025-02-21T21:00,17.5 +2025-02-21T22:00,20.4 +2025-02-21T23:00,17.6 +2025-02-22T00:00,16.1 +2025-02-22T01:00,19.5 +2025-02-22T02:00,12.3 +2025-02-22T03:00,14.5 +2025-02-22T04:00,15.3 +2025-02-22T05:00,17.9 +2025-02-22T06:00,18.1 +2025-02-22T07:00,21.7 +2025-02-22T08:00,21.1 +2025-02-22T09:00,20.1 +2025-02-22T10:00,25.5 +2025-02-22T11:00,27.3 +2025-02-22T12:00,25.5 +2025-02-22T13:00,23.5 +2025-02-22T14:00,26.4 +2025-02-22T15:00,23.9 +2025-02-22T16:00,18.8 +2025-02-22T17:00,19.0 +2025-02-22T18:00,17.6 +2025-02-22T19:00,16.9 +2025-02-22T20:00,14.6 +2025-02-22T21:00,12.5 +2025-02-22T22:00,12.7 +2025-02-22T23:00,21.0 +2025-02-23T00:00,15.1 +2025-02-23T01:00,13.1 +2025-02-23T02:00,16.0 +2025-02-23T03:00,16.8 +2025-02-23T04:00,17.5 +2025-02-23T05:00,18.9 +2025-02-23T06:00,19.1 +2025-02-23T07:00,26.2 +2025-02-23T08:00,22.4 +2025-02-23T09:00,23.8 +2025-02-23T10:00,22.7 +2025-02-23T11:00,22.5 +2025-02-23T12:00,23.3 +2025-02-23T13:00,21.4 +2025-02-23T14:00,20.8 +2025-02-23T15:00,23.9 +2025-02-23T16:00,16.4 +2025-02-23T17:00,22.7 +2025-02-23T18:00,22.4 +2025-02-23T19:00,16.2 +2025-02-23T20:00,16.9 +2025-02-23T21:00,15.5 +2025-02-23T22:00,16.7 +2025-02-23T23:00,15.6 +2025-02-24T00:00,12.9 +2025-02-24T01:00,17.9 +2025-02-24T02:00,15.5 +2025-02-24T03:00,15.4 +2025-02-24T04:00,18.3 +2025-02-24T05:00,16.5 +2025-02-24T06:00,16.6 +2025-02-24T07:00,23.2 +2025-02-24T08:00,21.0 +2025-02-24T09:00,26.9 +2025-02-24T10:00,21.1 +2025-02-24T11:00,27.0 +2025-02-24T12:00,23.6 +2025-02-24T13:00,19.5 +2025-02-24T14:00,24.1 +2025-02-24T15:00,24.6 +2025-02-24T16:00,23.8 +2025-02-24T17:00,17.9 +2025-02-24T18:00,21.9 +2025-02-24T19:00,13.6 +2025-02-24T20:00,18.5 +2025-02-24T21:00,17.2 +2025-02-24T22:00,22.3 +2025-02-24T23:00,16.8 +2025-02-25T00:00,11.2 +2025-02-25T01:00,15.0 +2025-02-25T02:00,15.5 +2025-02-25T03:00,14.4 +2025-02-25T04:00,16.2 +2025-02-25T05:00,20.0 +2025-02-25T06:00,17.5 +2025-02-25T07:00,21.0 +2025-02-25T08:00,21.1 +2025-02-25T09:00,22.7 +2025-02-25T10:00,18.8 +2025-02-25T11:00,22.3 +2025-02-25T12:00,22.7 +2025-02-25T13:00,23.2 +2025-02-25T14:00,21.7 +2025-02-25T15:00,18.2 +2025-02-25T16:00,15.4 +2025-02-25T17:00,22.0 +2025-02-25T18:00,15.4 +2025-02-25T19:00,16.0 +2025-02-25T20:00,17.7 +2025-02-25T21:00,18.9 +2025-02-25T22:00,11.4 +2025-02-25T23:00,10.9 +2025-02-26T00:00,18.5 +2025-02-26T01:00,13.5 +2025-02-26T02:00,13.0 +2025-02-26T03:00,15.9 +2025-02-26T04:00,17.0 +2025-02-26T05:00,18.8 +2025-02-26T06:00,18.0 +2025-02-26T07:00,19.8 +2025-02-26T08:00,23.4 +2025-02-26T09:00,23.0 +2025-02-26T10:00,18.7 +2025-02-26T11:00,26.8 +2025-02-26T12:00,25.0 +2025-02-26T13:00,25.5 +2025-02-26T14:00,25.5 +2025-02-26T15:00,22.7 +2025-02-26T16:00,19.3 +2025-02-26T17:00,19.3 +2025-02-26T18:00,21.9 +2025-02-26T19:00,17.8 +2025-02-26T20:00,16.9 +2025-02-26T21:00,16.0 +2025-02-26T22:00,16.7 +2025-02-26T23:00,13.8 +2025-02-27T00:00,16.6 +2025-02-27T01:00,15.8 +2025-02-27T02:00,18.1 +2025-02-27T03:00,16.6 +2025-02-27T04:00,16.0 +2025-02-27T05:00,16.5 +2025-02-27T06:00,17.5 +2025-02-27T07:00,20.3 +2025-02-27T08:00,23.6 +2025-02-27T09:00,21.8 +2025-02-27T10:00,19.7 +2025-02-27T11:00,27.6 +2025-02-27T12:00,18.9 +2025-02-27T13:00,21.1 +2025-02-27T14:00,25.8 +2025-02-27T15:00,17.3 +2025-02-27T16:00,18.9 +2025-02-27T17:00,17.3 +2025-02-27T18:00,17.5 +2025-02-27T19:00,15.3 +2025-02-27T20:00,16.9 +2025-02-27T21:00,20.7 +2025-02-27T22:00,12.2 +2025-02-27T23:00,12.5 +2025-02-28T00:00,15.3 +2025-02-28T01:00,16.4 +2025-02-28T02:00,14.4 +2025-02-28T03:00,21.4 +2025-02-28T04:00,21.0 +2025-02-28T05:00,16.7 +2025-02-28T06:00,23.1 +2025-02-28T07:00,22.6 +2025-02-28T08:00,22.4 +2025-02-28T09:00,19.8 +2025-02-28T10:00,19.4 +2025-02-28T11:00,22.9 +2025-02-28T12:00,22.9 +2025-02-28T13:00,18.3 +2025-02-28T14:00,23.8 +2025-02-28T15:00,22.8 +2025-02-28T16:00,23.0 +2025-02-28T17:00,15.3 +2025-02-28T18:00,14.6 +2025-02-28T19:00,14.9 +2025-02-28T20:00,22.3 +2025-02-28T21:00,16.7 +2025-02-28T22:00,17.5 +2025-02-28T23:00,15.5 +2025-03-01T00:00,13.6 +2025-03-01T01:00,16.9 +2025-03-01T02:00,14.3 +2025-03-01T03:00,15.6 +2025-03-01T04:00,19.9 +2025-03-01T05:00,16.9 +2025-03-01T06:00,22.9 +2025-03-01T07:00,18.3 +2025-03-01T08:00,17.3 +2025-03-01T09:00,22.6 +2025-03-01T10:00,22.7 +2025-03-01T11:00,21.7 +2025-03-01T12:00,20.6 +2025-03-01T13:00,24.7 +2025-03-01T14:00,22.8 +2025-03-01T15:00,22.4 +2025-03-01T16:00,24.9 +2025-03-01T17:00,18.2 +2025-03-01T18:00,19.6 +2025-03-01T19:00,18.8 +2025-03-01T20:00,15.3 +2025-03-01T21:00,16.0 +2025-03-01T22:00,16.1 +2025-03-01T23:00,15.2 +2025-03-02T00:00,14.0 +2025-03-02T01:00,14.1 +2025-03-02T02:00,17.5 +2025-03-02T03:00,15.7 +2025-03-02T04:00,19.5 +2025-03-02T05:00,19.0 +2025-03-02T06:00,16.7 +2025-03-02T07:00,19.9 +2025-03-02T08:00,22.0 +2025-03-02T09:00,24.9 +2025-03-02T10:00,23.3 +2025-03-02T11:00,22.8 +2025-03-02T12:00,24.0 +2025-03-02T13:00,22.9 +2025-03-02T14:00,23.3 +2025-03-02T15:00,20.3 +2025-03-02T16:00,18.5 +2025-03-02T17:00,19.6 +2025-03-02T18:00,16.0 +2025-03-02T19:00,13.7 +2025-03-02T20:00,14.0 +2025-03-02T21:00,17.6 +2025-03-02T22:00,20.2 +2025-03-02T23:00,13.1 +2025-03-03T00:00,14.3 +2025-03-03T01:00,21.0 +2025-03-03T02:00,15.9 +2025-03-03T03:00,17.6 +2025-03-03T04:00,15.3 +2025-03-03T05:00,19.8 +2025-03-03T06:00,21.8 +2025-03-03T07:00,16.9 +2025-03-03T08:00,19.1 +2025-03-03T09:00,17.9 +2025-03-03T10:00,21.5 +2025-03-03T11:00,21.4 +2025-03-03T12:00,24.8 +2025-03-03T13:00,22.7 +2025-03-03T14:00,20.6 +2025-03-03T15:00,16.6 +2025-03-03T16:00,21.4 +2025-03-03T17:00,17.7 +2025-03-03T18:00,17.2 +2025-03-03T19:00,16.2 +2025-03-03T20:00,17.3 +2025-03-03T21:00,14.6 +2025-03-03T22:00,14.9 +2025-03-03T23:00,12.7 +2025-03-04T00:00,12.6 +2025-03-04T01:00,13.5 +2025-03-04T02:00,12.9 +2025-03-04T03:00,19.5 +2025-03-04T04:00,15.9 +2025-03-04T05:00,15.6 +2025-03-04T06:00,14.5 +2025-03-04T07:00,18.6 +2025-03-04T08:00,17.0 +2025-03-04T09:00,20.3 +2025-03-04T10:00,24.6 +2025-03-04T11:00,21.8 +2025-03-04T12:00,23.7 +2025-03-04T13:00,22.9 +2025-03-04T14:00,19.4 +2025-03-04T15:00,22.1 +2025-03-04T16:00,19.0 +2025-03-04T17:00,22.1 +2025-03-04T18:00,18.6 +2025-03-04T19:00,14.5 +2025-03-04T20:00,13.3 +2025-03-04T21:00,18.5 +2025-03-04T22:00,13.7 +2025-03-04T23:00,12.3 +2025-03-05T00:00,13.7 +2025-03-05T01:00,14.1 +2025-03-05T02:00,16.9 +2025-03-05T03:00,18.2 +2025-03-05T04:00,16.9 +2025-03-05T05:00,21.3 +2025-03-05T06:00,19.8 +2025-03-05T07:00,14.0 +2025-03-05T08:00,19.7 +2025-03-05T09:00,20.2 +2025-03-05T10:00,23.0 +2025-03-05T11:00,23.6 +2025-03-05T12:00,21.9 +2025-03-05T13:00,26.7 +2025-03-05T14:00,18.9 +2025-03-05T15:00,23.1 +2025-03-05T16:00,20.3 +2025-03-05T17:00,21.2 +2025-03-05T18:00,18.6 +2025-03-05T19:00,19.9 +2025-03-05T20:00,16.1 +2025-03-05T21:00,13.4 +2025-03-05T22:00,11.7 +2025-03-05T23:00,15.7 +2025-03-06T00:00,9.1 +2025-03-06T01:00,8.6 +2025-03-06T02:00,15.0 +2025-03-06T03:00,17.9 +2025-03-06T04:00,17.5 +2025-03-06T05:00,13.9 +2025-03-06T06:00,21.0 +2025-03-06T07:00,19.5 +2025-03-06T08:00,23.0 +2025-03-06T09:00,25.9 +2025-03-06T10:00,18.8 +2025-03-06T11:00,23.7 +2025-03-06T12:00,27.1 +2025-03-06T13:00,26.5 +2025-03-06T14:00,19.8 +2025-03-06T15:00,22.8 +2025-03-06T16:00,19.3 +2025-03-06T17:00,15.7 +2025-03-06T18:00,19.2 +2025-03-06T19:00,16.9 +2025-03-06T20:00,14.0 +2025-03-06T21:00,17.1 +2025-03-06T22:00,17.8 +2025-03-06T23:00,9.5 +2025-03-07T00:00,10.7 +2025-03-07T01:00,12.1 +2025-03-07T02:00,18.9 +2025-03-07T03:00,12.8 +2025-03-07T04:00,19.8 +2025-03-07T05:00,20.0 +2025-03-07T06:00,17.7 +2025-03-07T07:00,21.0 +2025-03-07T08:00,22.2 +2025-03-07T09:00,18.5 +2025-03-07T10:00,19.6 +2025-03-07T11:00,15.4 +2025-03-07T12:00,22.5 +2025-03-07T13:00,21.9 +2025-03-07T14:00,21.1 +2025-03-07T15:00,23.0 +2025-03-07T16:00,19.9 +2025-03-07T17:00,20.7 +2025-03-07T18:00,17.8 +2025-03-07T19:00,20.2 +2025-03-07T20:00,16.1 +2025-03-07T21:00,15.0 +2025-03-07T22:00,17.5 +2025-03-07T23:00,19.0 +2025-03-08T00:00,14.7 +2025-03-08T01:00,12.8 +2025-03-08T02:00,15.0 +2025-03-08T03:00,12.4 +2025-03-08T04:00,22.0 +2025-03-08T05:00,14.6 +2025-03-08T06:00,19.0 +2025-03-08T07:00,16.2 +2025-03-08T08:00,24.5 +2025-03-08T09:00,20.8 +2025-03-08T10:00,23.3 +2025-03-08T11:00,22.7 +2025-03-08T12:00,24.0 +2025-03-08T13:00,20.8 +2025-03-08T14:00,24.4 +2025-03-08T15:00,22.7 +2025-03-08T16:00,20.5 +2025-03-08T17:00,17.8 +2025-03-08T18:00,18.3 +2025-03-08T19:00,20.9 +2025-03-08T20:00,14.9 +2025-03-08T21:00,15.7 +2025-03-08T22:00,17.7 +2025-03-08T23:00,15.3 +2025-03-09T00:00,17.2 +2025-03-09T01:00,13.5 +2025-03-09T02:00,17.3 +2025-03-09T03:00,12.8 +2025-03-09T04:00,18.0 +2025-03-09T05:00,16.4 +2025-03-09T06:00,18.6 +2025-03-09T07:00,16.1 +2025-03-09T08:00,20.9 +2025-03-09T09:00,23.3 +2025-03-09T10:00,27.1 +2025-03-09T11:00,23.5 +2025-03-09T12:00,20.7 +2025-03-09T13:00,23.8 +2025-03-09T14:00,21.9 +2025-03-09T15:00,21.5 +2025-03-09T16:00,18.2 +2025-03-09T17:00,19.7 +2025-03-09T18:00,19.0 +2025-03-09T19:00,18.3 +2025-03-09T20:00,11.4 +2025-03-09T21:00,16.1 +2025-03-09T22:00,16.5 +2025-03-09T23:00,12.1 +2025-03-10T00:00,13.4 +2025-03-10T01:00,7.7 +2025-03-10T02:00,9.8 +2025-03-10T03:00,14.9 +2025-03-10T04:00,16.0 +2025-03-10T05:00,13.4 +2025-03-10T06:00,21.6 +2025-03-10T07:00,23.1 +2025-03-10T08:00,21.1 +2025-03-10T09:00,20.4 +2025-03-10T10:00,26.9 +2025-03-10T11:00,19.1 +2025-03-10T12:00,22.2 +2025-03-10T13:00,15.5 +2025-03-10T14:00,23.7 +2025-03-10T15:00,23.7 +2025-03-10T16:00,14.5 +2025-03-10T17:00,20.3 +2025-03-10T18:00,17.4 +2025-03-10T19:00,21.1 +2025-03-10T20:00,13.5 +2025-03-10T21:00,11.2 +2025-03-10T22:00,11.1 +2025-03-10T23:00,11.0 +2025-03-11T00:00,12.3 +2025-03-11T01:00,15.6 +2025-03-11T02:00,13.9 +2025-03-11T03:00,14.2 +2025-03-11T04:00,16.5 +2025-03-11T05:00,16.1 +2025-03-11T06:00,14.9 +2025-03-11T07:00,18.3 +2025-03-11T08:00,17.3 +2025-03-11T09:00,16.0 +2025-03-11T10:00,21.3 +2025-03-11T11:00,21.9 +2025-03-11T12:00,20.2 +2025-03-11T13:00,21.2 +2025-03-11T14:00,20.2 +2025-03-11T15:00,23.3 +2025-03-11T16:00,12.8 +2025-03-11T17:00,19.7 +2025-03-11T18:00,14.4 +2025-03-11T19:00,16.8 +2025-03-11T20:00,14.9 +2025-03-11T21:00,14.9 +2025-03-11T22:00,18.4 +2025-03-11T23:00,15.1 +2025-03-12T00:00,18.1 +2025-03-12T01:00,18.1 +2025-03-12T02:00,10.2 +2025-03-12T03:00,17.2 +2025-03-12T04:00,17.2 +2025-03-12T05:00,20.1 +2025-03-12T06:00,13.7 +2025-03-12T07:00,17.4 +2025-03-12T08:00,23.5 +2025-03-12T09:00,19.7 +2025-03-12T10:00,19.9 +2025-03-12T11:00,24.1 +2025-03-12T12:00,21.0 +2025-03-12T13:00,21.0 +2025-03-12T14:00,24.8 +2025-03-12T15:00,22.1 +2025-03-12T16:00,14.5 +2025-03-12T17:00,15.8 +2025-03-12T18:00,17.0 +2025-03-12T19:00,14.4 +2025-03-12T20:00,17.8 +2025-03-12T21:00,14.5 +2025-03-12T22:00,12.7 +2025-03-12T23:00,13.4 +2025-03-13T00:00,16.0 +2025-03-13T01:00,13.4 +2025-03-13T02:00,14.5 +2025-03-13T03:00,13.4 +2025-03-13T04:00,17.4 +2025-03-13T05:00,18.1 +2025-03-13T06:00,16.5 +2025-03-13T07:00,20.0 +2025-03-13T08:00,21.2 +2025-03-13T09:00,19.9 +2025-03-13T10:00,17.3 +2025-03-13T11:00,24.4 +2025-03-13T12:00,20.1 +2025-03-13T13:00,18.6 +2025-03-13T14:00,19.4 +2025-03-13T15:00,19.8 +2025-03-13T16:00,17.5 +2025-03-13T17:00,20.4 +2025-03-13T18:00,16.1 +2025-03-13T19:00,14.6 +2025-03-13T20:00,17.0 +2025-03-13T21:00,18.3 +2025-03-13T22:00,15.0 +2025-03-13T23:00,13.7 +2025-03-14T00:00,9.9 +2025-03-14T01:00,14.4 +2025-03-14T02:00,14.3 +2025-03-14T03:00,15.5 +2025-03-14T04:00,13.2 +2025-03-14T05:00,15.9 +2025-03-14T06:00,17.8 +2025-03-14T07:00,22.5 +2025-03-14T08:00,14.3 +2025-03-14T09:00,20.0 +2025-03-14T10:00,23.0 +2025-03-14T11:00,24.0 +2025-03-14T12:00,16.8 +2025-03-14T13:00,22.4 +2025-03-14T14:00,23.2 +2025-03-14T15:00,15.3 +2025-03-14T16:00,20.9 +2025-03-14T17:00,21.4 +2025-03-14T18:00,14.4 +2025-03-14T19:00,13.3 +2025-03-14T20:00,19.5 +2025-03-14T21:00,13.9 +2025-03-14T22:00,15.0 +2025-03-14T23:00,10.5 +2025-03-15T00:00,11.7 +2025-03-15T01:00,9.3 +2025-03-15T02:00,13.9 +2025-03-15T03:00,17.6 +2025-03-15T04:00,16.5 +2025-03-15T05:00,16.3 +2025-03-15T06:00,16.8 +2025-03-15T07:00,22.9 +2025-03-15T08:00,18.7 +2025-03-15T09:00,20.7 +2025-03-15T10:00,24.7 +2025-03-15T11:00,22.0 +2025-03-15T12:00,24.9 +2025-03-15T13:00,21.1 +2025-03-15T14:00,24.6 +2025-03-15T15:00,20.2 +2025-03-15T16:00,21.1 +2025-03-15T17:00,13.9 +2025-03-15T18:00,15.4 +2025-03-15T19:00,12.8 +2025-03-15T20:00,12.0 +2025-03-15T21:00,17.3 +2025-03-15T22:00,14.2 +2025-03-15T23:00,11.2 +2025-03-16T00:00,6.8 +2025-03-16T01:00,18.1 +2025-03-16T02:00,7.6 +2025-03-16T03:00,17.6 +2025-03-16T04:00,15.6 +2025-03-16T05:00,14.7 +2025-03-16T06:00,21.7 +2025-03-16T07:00,19.2 +2025-03-16T08:00,20.1 +2025-03-16T09:00,20.0 +2025-03-16T10:00,20.8 +2025-03-16T11:00,22.3 +2025-03-16T12:00,20.3 +2025-03-16T13:00,21.5 +2025-03-16T14:00,21.7 +2025-03-16T15:00,14.3 +2025-03-16T16:00,18.9 +2025-03-16T17:00,13.6 +2025-03-16T18:00,16.1 +2025-03-16T19:00,12.3 +2025-03-16T20:00,17.5 +2025-03-16T21:00,9.7 +2025-03-16T22:00,16.3 +2025-03-16T23:00,10.9 +2025-03-17T00:00,12.4 +2025-03-17T01:00,13.4 +2025-03-17T02:00,14.1 +2025-03-17T03:00,16.7 +2025-03-17T04:00,13.8 +2025-03-17T05:00,15.6 +2025-03-17T06:00,14.1 +2025-03-17T07:00,18.3 +2025-03-17T08:00,18.6 +2025-03-17T09:00,17.1 +2025-03-17T10:00,16.7 +2025-03-17T11:00,19.8 +2025-03-17T12:00,18.9 +2025-03-17T13:00,18.1 +2025-03-17T14:00,23.0 +2025-03-17T15:00,20.4 +2025-03-17T16:00,13.2 +2025-03-17T17:00,14.4 +2025-03-17T18:00,12.4 +2025-03-17T19:00,13.0 +2025-03-17T20:00,9.8 +2025-03-17T21:00,7.9 +2025-03-17T22:00,9.3 +2025-03-17T23:00,18.0 +2025-03-18T00:00,17.1 +2025-03-18T01:00,16.2 +2025-03-18T02:00,8.5 +2025-03-18T03:00,16.1 +2025-03-18T04:00,20.3 +2025-03-18T05:00,16.9 +2025-03-18T06:00,16.5 +2025-03-18T07:00,23.9 +2025-03-18T08:00,19.5 +2025-03-18T09:00,18.2 +2025-03-18T10:00,22.5 +2025-03-18T11:00,22.1 +2025-03-18T12:00,22.6 +2025-03-18T13:00,18.4 +2025-03-18T14:00,20.1 +2025-03-18T15:00,20.5 +2025-03-18T16:00,24.3 +2025-03-18T17:00,18.7 +2025-03-18T18:00,17.8 +2025-03-18T19:00,16.1 +2025-03-18T20:00,12.0 +2025-03-18T21:00,10.8 +2025-03-18T22:00,13.4 +2025-03-18T23:00,8.6 +2025-03-19T00:00,11.3 +2025-03-19T01:00,13.0 +2025-03-19T02:00,9.2 +2025-03-19T03:00,17.7 +2025-03-19T04:00,17.1 +2025-03-19T05:00,18.9 +2025-03-19T06:00,15.0 +2025-03-19T07:00,22.4 +2025-03-19T08:00,13.9 +2025-03-19T09:00,20.0 +2025-03-19T10:00,20.4 +2025-03-19T11:00,20.0 +2025-03-19T12:00,19.4 +2025-03-19T13:00,23.3 +2025-03-19T14:00,22.2 +2025-03-19T15:00,14.6 +2025-03-19T16:00,19.5 +2025-03-19T17:00,15.8 +2025-03-19T18:00,13.8 +2025-03-19T19:00,10.8 +2025-03-19T20:00,14.7 +2025-03-19T21:00,18.0 +2025-03-19T22:00,13.0 +2025-03-19T23:00,10.0 +2025-03-20T00:00,12.6 +2025-03-20T01:00,12.1 +2025-03-20T02:00,11.5 +2025-03-20T03:00,14.3 +2025-03-20T04:00,12.9 +2025-03-20T05:00,11.4 +2025-03-20T06:00,13.3 +2025-03-20T07:00,21.4 +2025-03-20T08:00,23.4 +2025-03-20T09:00,17.6 +2025-03-20T10:00,21.1 +2025-03-20T11:00,20.9 +2025-03-20T12:00,16.0 +2025-03-20T13:00,19.8 +2025-03-20T14:00,22.5 +2025-03-20T15:00,21.1 +2025-03-20T16:00,18.5 +2025-03-20T17:00,16.7 +2025-03-20T18:00,13.1 +2025-03-20T19:00,14.3 +2025-03-20T20:00,16.5 +2025-03-20T21:00,9.3 +2025-03-20T22:00,13.7 +2025-03-20T23:00,11.4 +2025-03-21T00:00,13.2 +2025-03-21T01:00,12.5 +2025-03-21T02:00,13.4 +2025-03-21T03:00,10.1 +2025-03-21T04:00,14.8 +2025-03-21T05:00,14.0 +2025-03-21T06:00,19.3 +2025-03-21T07:00,15.9 +2025-03-21T08:00,13.0 +2025-03-21T09:00,16.3 +2025-03-21T10:00,17.6 +2025-03-21T11:00,19.9 +2025-03-21T12:00,20.8 +2025-03-21T13:00,22.0 +2025-03-21T14:00,19.2 +2025-03-21T15:00,18.2 +2025-03-21T16:00,17.2 +2025-03-21T17:00,15.1 +2025-03-21T18:00,22.6 +2025-03-21T19:00,15.8 +2025-03-21T20:00,12.5 +2025-03-21T21:00,12.5 +2025-03-21T22:00,7.5 +2025-03-21T23:00,15.2 +2025-03-22T00:00,11.4 +2025-03-22T01:00,8.8 +2025-03-22T02:00,9.7 +2025-03-22T03:00,15.0 +2025-03-22T04:00,13.2 +2025-03-22T05:00,15.2 +2025-03-22T06:00,13.8 +2025-03-22T07:00,17.0 +2025-03-22T08:00,18.6 +2025-03-22T09:00,18.3 +2025-03-22T10:00,15.3 +2025-03-22T11:00,20.4 +2025-03-22T12:00,18.5 +2025-03-22T13:00,22.9 +2025-03-22T14:00,18.9 +2025-03-22T15:00,19.3 +2025-03-22T16:00,13.8 +2025-03-22T17:00,18.4 +2025-03-22T18:00,13.8 +2025-03-22T19:00,11.4 +2025-03-22T20:00,13.3 +2025-03-22T21:00,17.9 +2025-03-22T22:00,12.0 +2025-03-22T23:00,11.5 +2025-03-23T00:00,8.3 +2025-03-23T01:00,8.7 +2025-03-23T02:00,17.5 +2025-03-23T03:00,13.6 +2025-03-23T04:00,8.4 +2025-03-23T05:00,12.9 +2025-03-23T06:00,16.1 +2025-03-23T07:00,17.4 +2025-03-23T08:00,19.1 +2025-03-23T09:00,16.2 +2025-03-23T10:00,22.2 +2025-03-23T11:00,21.2 +2025-03-23T12:00,17.0 +2025-03-23T13:00,14.0 +2025-03-23T14:00,18.2 +2025-03-23T15:00,20.2 +2025-03-23T16:00,20.7 +2025-03-23T17:00,14.7 +2025-03-23T18:00,10.4 +2025-03-23T19:00,14.5 +2025-03-23T20:00,18.2 +2025-03-23T21:00,13.6 +2025-03-23T22:00,11.5 +2025-03-23T23:00,15.2 +2025-03-24T00:00,11.2 +2025-03-24T01:00,9.3 +2025-03-24T02:00,7.7 +2025-03-24T03:00,11.9 +2025-03-24T04:00,13.1 +2025-03-24T05:00,15.9 +2025-03-24T06:00,15.1 +2025-03-24T07:00,15.3 +2025-03-24T08:00,16.6 +2025-03-24T09:00,22.5 +2025-03-24T10:00,20.8 +2025-03-24T11:00,21.3 +2025-03-24T12:00,19.4 +2025-03-24T13:00,19.0 +2025-03-24T14:00,20.3 +2025-03-24T15:00,17.1 +2025-03-24T16:00,18.0 +2025-03-24T17:00,12.5 +2025-03-24T18:00,17.4 +2025-03-24T19:00,11.2 +2025-03-24T20:00,19.1 +2025-03-24T21:00,10.9 +2025-03-24T22:00,16.7 +2025-03-24T23:00,17.1 +2025-03-25T00:00,13.9 +2025-03-25T01:00,12.8 +2025-03-25T02:00,15.2 +2025-03-25T03:00,13.0 +2025-03-25T04:00,13.1 +2025-03-25T05:00,15.4 +2025-03-25T06:00,16.5 +2025-03-25T07:00,13.2 +2025-03-25T08:00,18.8 +2025-03-25T09:00,16.9 +2025-03-25T10:00,20.0 +2025-03-25T11:00,18.7 +2025-03-25T12:00,18.0 +2025-03-25T13:00,16.0 +2025-03-25T14:00,16.0 +2025-03-25T15:00,15.1 +2025-03-25T16:00,15.0 +2025-03-25T17:00,21.7 +2025-03-25T18:00,12.2 +2025-03-25T19:00,13.4 +2025-03-25T20:00,13.5 +2025-03-25T21:00,15.2 +2025-03-25T22:00,13.4 +2025-03-25T23:00,16.4 +2025-03-26T00:00,7.0 +2025-03-26T01:00,12.4 +2025-03-26T02:00,12.1 +2025-03-26T03:00,12.3 +2025-03-26T04:00,13.2 +2025-03-26T05:00,11.9 +2025-03-26T06:00,15.8 +2025-03-26T07:00,16.3 +2025-03-26T08:00,15.5 +2025-03-26T09:00,16.4 +2025-03-26T10:00,21.2 +2025-03-26T11:00,11.3 +2025-03-26T12:00,18.4 +2025-03-26T13:00,23.1 +2025-03-26T14:00,17.8 +2025-03-26T15:00,21.1 +2025-03-26T16:00,13.7 +2025-03-26T17:00,21.2 +2025-03-26T18:00,12.5 +2025-03-26T19:00,14.8 +2025-03-26T20:00,13.0 +2025-03-26T21:00,10.5 +2025-03-26T22:00,11.4 +2025-03-26T23:00,12.6 +2025-03-27T00:00,6.0 +2025-03-27T01:00,15.1 +2025-03-27T02:00,13.0 +2025-03-27T03:00,17.1 +2025-03-27T04:00,13.5 +2025-03-27T05:00,16.2 +2025-03-27T06:00,12.6 +2025-03-27T07:00,11.0 +2025-03-27T08:00,21.2 +2025-03-27T09:00,21.9 +2025-03-27T10:00,23.5 +2025-03-27T11:00,19.4 +2025-03-27T12:00,15.2 +2025-03-27T13:00,16.1 +2025-03-27T14:00,20.0 +2025-03-27T15:00,17.1 +2025-03-27T16:00,16.2 +2025-03-27T17:00,21.0 +2025-03-27T18:00,14.4 +2025-03-27T19:00,11.6 +2025-03-27T20:00,15.8 +2025-03-27T21:00,11.1 +2025-03-27T22:00,9.1 +2025-03-27T23:00,14.4 +2025-03-28T00:00,6.4 +2025-03-28T01:00,12.3 +2025-03-28T02:00,10.1 +2025-03-28T03:00,15.3 +2025-03-28T04:00,12.3 +2025-03-28T05:00,13.6 +2025-03-28T06:00,17.2 +2025-03-28T07:00,16.1 +2025-03-28T08:00,16.3 +2025-03-28T09:00,16.1 +2025-03-28T10:00,20.7 +2025-03-28T11:00,18.2 +2025-03-28T12:00,21.3 +2025-03-28T13:00,15.7 +2025-03-28T14:00,20.1 +2025-03-28T15:00,18.2 +2025-03-28T16:00,18.8 +2025-03-28T17:00,19.6 +2025-03-28T18:00,8.7 +2025-03-28T19:00,12.2 +2025-03-28T20:00,13.7 +2025-03-28T21:00,10.1 +2025-03-28T22:00,11.2 +2025-03-28T23:00,11.1 +2025-03-29T00:00,7.0 +2025-03-29T01:00,15.2 +2025-03-29T02:00,16.0 +2025-03-29T03:00,10.7 +2025-03-29T04:00,11.3 +2025-03-29T05:00,11.3 +2025-03-29T06:00,12.3 +2025-03-29T07:00,12.6 +2025-03-29T08:00,18.1 +2025-03-29T09:00,17.2 +2025-03-29T10:00,18.5 +2025-03-29T11:00,20.8 +2025-03-29T12:00,20.7 +2025-03-29T13:00,20.9 +2025-03-29T14:00,22.3 +2025-03-29T15:00,21.7 +2025-03-29T16:00,16.2 +2025-03-29T17:00,19.1 +2025-03-29T18:00,18.3 +2025-03-29T19:00,14.0 +2025-03-29T20:00,13.5 +2025-03-29T21:00,7.1 +2025-03-29T22:00,14.8 +2025-03-29T23:00,11.3 +2025-03-30T00:00,12.6 +2025-03-30T01:00,7.0 +2025-03-30T02:00,9.7 +2025-03-30T03:00,17.2 +2025-03-30T04:00,14.4 +2025-03-30T05:00,11.8 +2025-03-30T06:00,17.4 +2025-03-30T07:00,19.3 +2025-03-30T08:00,17.3 +2025-03-30T09:00,14.8 +2025-03-30T10:00,16.8 +2025-03-30T11:00,16.8 +2025-03-30T12:00,14.0 +2025-03-30T13:00,18.5 +2025-03-30T14:00,14.1 +2025-03-30T15:00,18.5 +2025-03-30T16:00,20.2 +2025-03-30T17:00,15.0 +2025-03-30T18:00,15.2 +2025-03-30T19:00,13.1 +2025-03-30T20:00,14.7 +2025-03-30T21:00,8.5 +2025-03-30T22:00,16.6 +2025-03-30T23:00,11.1 +2025-03-31T00:00,9.4 +2025-03-31T01:00,3.5 +2025-03-31T02:00,13.5 +2025-03-31T03:00,11.6 +2025-03-31T04:00,13.9 +2025-03-31T05:00,14.1 +2025-03-31T06:00,11.0 +2025-03-31T07:00,20.5 +2025-03-31T08:00,16.0 +2025-03-31T09:00,12.3 +2025-03-31T10:00,10.1 +2025-03-31T11:00,16.6 +2025-03-31T12:00,17.5 +2025-03-31T13:00,18.2 +2025-03-31T14:00,20.7 +2025-03-31T15:00,16.0 +2025-03-31T16:00,18.1 +2025-03-31T17:00,13.2 +2025-03-31T18:00,18.0 +2025-03-31T19:00,14.7 +2025-03-31T20:00,11.4 +2025-03-31T21:00,10.6 +2025-03-31T22:00,14.3 +2025-03-31T23:00,11.0 +2025-04-01T00:00,9.4 +2025-04-01T01:00,12.8 +2025-04-01T02:00,12.5 +2025-04-01T03:00,11.8 +2025-04-01T04:00,10.3 +2025-04-01T05:00,12.3 +2025-04-01T06:00,17.0 +2025-04-01T07:00,14.5 +2025-04-01T08:00,21.3 +2025-04-01T09:00,17.5 +2025-04-01T10:00,14.7 +2025-04-01T11:00,17.2 +2025-04-01T12:00,14.0 +2025-04-01T13:00,15.4 +2025-04-01T14:00,12.5 +2025-04-01T15:00,15.6 +2025-04-01T16:00,10.9 +2025-04-01T17:00,12.3 +2025-04-01T18:00,15.2 +2025-04-01T19:00,14.8 +2025-04-01T20:00,12.9 +2025-04-01T21:00,14.1 +2025-04-01T22:00,12.3 +2025-04-01T23:00,7.3 +2025-04-02T00:00,7.9 +2025-04-02T01:00,12.5 +2025-04-02T02:00,12.4 +2025-04-02T03:00,11.6 +2025-04-02T04:00,10.2 +2025-04-02T05:00,10.4 +2025-04-02T06:00,13.9 +2025-04-02T07:00,14.5 +2025-04-02T08:00,19.6 +2025-04-02T09:00,13.3 +2025-04-02T10:00,20.4 +2025-04-02T11:00,16.5 +2025-04-02T12:00,19.4 +2025-04-02T13:00,21.1 +2025-04-02T14:00,21.2 +2025-04-02T15:00,19.4 +2025-04-02T16:00,14.2 +2025-04-02T17:00,19.0 +2025-04-02T18:00,12.0 +2025-04-02T19:00,10.8 +2025-04-02T20:00,13.5 +2025-04-02T21:00,14.0 +2025-04-02T22:00,11.8 +2025-04-02T23:00,10.4 +2025-04-03T00:00,8.5 +2025-04-03T01:00,14.3 +2025-04-03T02:00,12.0 +2025-04-03T03:00,9.0 +2025-04-03T04:00,14.9 +2025-04-03T05:00,10.6 +2025-04-03T06:00,16.5 +2025-04-03T07:00,17.5 +2025-04-03T08:00,11.2 +2025-04-03T09:00,16.3 +2025-04-03T10:00,16.7 +2025-04-03T11:00,16.1 +2025-04-03T12:00,19.4 +2025-04-03T13:00,17.1 +2025-04-03T14:00,21.4 +2025-04-03T15:00,13.5 +2025-04-03T16:00,15.0 +2025-04-03T17:00,15.6 +2025-04-03T18:00,8.9 +2025-04-03T19:00,12.4 +2025-04-03T20:00,15.0 +2025-04-03T21:00,10.8 +2025-04-03T22:00,8.0 +2025-04-03T23:00,13.1 +2025-04-04T00:00,9.1 +2025-04-04T01:00,10.3 +2025-04-04T02:00,9.4 +2025-04-04T03:00,11.0 +2025-04-04T04:00,15.0 +2025-04-04T05:00,11.3 +2025-04-04T06:00,17.6 +2025-04-04T07:00,14.6 +2025-04-04T08:00,16.6 +2025-04-04T09:00,21.1 +2025-04-04T10:00,16.7 +2025-04-04T11:00,16.5 +2025-04-04T12:00,16.5 +2025-04-04T13:00,19.8 +2025-04-04T14:00,19.2 +2025-04-04T15:00,15.3 +2025-04-04T16:00,15.0 +2025-04-04T17:00,15.0 +2025-04-04T18:00,11.9 +2025-04-04T19:00,12.4 +2025-04-04T20:00,9.8 +2025-04-04T21:00,11.1 +2025-04-04T22:00,13.6 +2025-04-04T23:00,8.8 +2025-04-05T00:00,5.9 +2025-04-05T01:00,8.1 +2025-04-05T02:00,15.6 +2025-04-05T03:00,10.5 +2025-04-05T04:00,14.2 +2025-04-05T05:00,14.5 +2025-04-05T06:00,11.0 +2025-04-05T07:00,14.5 +2025-04-05T08:00,12.7 +2025-04-05T09:00,15.0 +2025-04-05T10:00,15.7 +2025-04-05T11:00,15.9 +2025-04-05T12:00,21.0 +2025-04-05T13:00,18.6 +2025-04-05T14:00,18.2 +2025-04-05T15:00,14.1 +2025-04-05T16:00,12.5 +2025-04-05T17:00,15.7 +2025-04-05T18:00,18.1 +2025-04-05T19:00,10.5 +2025-04-05T20:00,6.3 +2025-04-05T21:00,7.8 +2025-04-05T22:00,7.8 +2025-04-05T23:00,11.9 +2025-04-06T00:00,4.2 +2025-04-06T01:00,7.5 +2025-04-06T02:00,10.2 +2025-04-06T03:00,9.1 +2025-04-06T04:00,10.8 +2025-04-06T05:00,12.9 +2025-04-06T06:00,10.9 +2025-04-06T07:00,13.4 +2025-04-06T08:00,12.9 +2025-04-06T09:00,13.2 +2025-04-06T10:00,16.7 +2025-04-06T11:00,14.5 +2025-04-06T12:00,15.8 +2025-04-06T13:00,14.0 +2025-04-06T14:00,15.7 +2025-04-06T15:00,16.7 +2025-04-06T16:00,14.0 +2025-04-06T17:00,16.0 +2025-04-06T18:00,16.7 +2025-04-06T19:00,9.4 +2025-04-06T20:00,9.1 +2025-04-06T21:00,10.3 +2025-04-06T22:00,10.4 +2025-04-06T23:00,8.6 +2025-04-07T00:00,5.5 +2025-04-07T01:00,6.5 +2025-04-07T02:00,6.0 +2025-04-07T03:00,7.5 +2025-04-07T04:00,17.6 +2025-04-07T05:00,12.7 +2025-04-07T06:00,14.5 +2025-04-07T07:00,13.7 +2025-04-07T08:00,12.0 +2025-04-07T09:00,20.4 +2025-04-07T10:00,18.4 +2025-04-07T11:00,16.7 +2025-04-07T12:00,18.1 +2025-04-07T13:00,13.4 +2025-04-07T14:00,16.1 +2025-04-07T15:00,14.8 +2025-04-07T16:00,14.9 +2025-04-07T17:00,13.5 +2025-04-07T18:00,14.9 +2025-04-07T19:00,15.6 +2025-04-07T20:00,9.6 +2025-04-07T21:00,15.9 +2025-04-07T22:00,7.9 +2025-04-07T23:00,6.5 +2025-04-08T00:00,10.0 +2025-04-08T01:00,12.5 +2025-04-08T02:00,8.3 +2025-04-08T03:00,7.1 +2025-04-08T04:00,12.0 +2025-04-08T05:00,15.4 +2025-04-08T06:00,12.5 +2025-04-08T07:00,15.0 +2025-04-08T08:00,14.7 +2025-04-08T09:00,17.5 +2025-04-08T10:00,18.6 +2025-04-08T11:00,20.3 +2025-04-08T12:00,16.3 +2025-04-08T13:00,16.0 +2025-04-08T14:00,14.2 +2025-04-08T15:00,8.2 +2025-04-08T16:00,17.9 +2025-04-08T17:00,10.0 +2025-04-08T18:00,11.0 +2025-04-08T19:00,9.6 +2025-04-08T20:00,9.5 +2025-04-08T21:00,4.3 +2025-04-08T22:00,8.0 +2025-04-08T23:00,7.1 +2025-04-09T00:00,11.2 +2025-04-09T01:00,10.9 +2025-04-09T02:00,11.6 +2025-04-09T03:00,11.0 +2025-04-09T04:00,8.9 +2025-04-09T05:00,9.4 +2025-04-09T06:00,16.1 +2025-04-09T07:00,11.2 +2025-04-09T08:00,16.2 +2025-04-09T09:00,15.5 +2025-04-09T10:00,13.5 +2025-04-09T11:00,18.0 +2025-04-09T12:00,16.8 +2025-04-09T13:00,14.9 +2025-04-09T14:00,18.1 +2025-04-09T15:00,11.8 +2025-04-09T16:00,17.9 +2025-04-09T17:00,13.4 +2025-04-09T18:00,12.0 +2025-04-09T19:00,11.2 +2025-04-09T20:00,7.5 +2025-04-09T21:00,12.0 +2025-04-09T22:00,12.5 +2025-04-09T23:00,4.9 +2025-04-10T00:00,8.9 +2025-04-10T01:00,9.2 +2025-04-10T02:00,7.4 +2025-04-10T03:00,12.7 +2025-04-10T04:00,12.6 +2025-04-10T05:00,12.7 +2025-04-10T06:00,13.7 +2025-04-10T07:00,16.2 +2025-04-10T08:00,14.5 +2025-04-10T09:00,14.2 +2025-04-10T10:00,17.6 +2025-04-10T11:00,11.6 +2025-04-10T12:00,15.3 +2025-04-10T13:00,22.0 +2025-04-10T14:00,13.7 +2025-04-10T15:00,17.7 +2025-04-10T16:00,12.3 +2025-04-10T17:00,10.9 +2025-04-10T18:00,15.5 +2025-04-10T19:00,13.7 +2025-04-10T20:00,7.0 +2025-04-10T21:00,13.1 +2025-04-10T22:00,5.8 +2025-04-10T23:00,6.8 +2025-04-11T00:00,7.8 +2025-04-11T01:00,4.8 +2025-04-11T02:00,9.3 +2025-04-11T03:00,8.3 +2025-04-11T04:00,7.8 +2025-04-11T05:00,11.6 +2025-04-11T06:00,13.8 +2025-04-11T07:00,13.4 +2025-04-11T08:00,18.2 +2025-04-11T09:00,17.3 +2025-04-11T10:00,20.6 +2025-04-11T11:00,19.2 +2025-04-11T12:00,16.5 +2025-04-11T13:00,19.1 +2025-04-11T14:00,15.3 +2025-04-11T15:00,17.4 +2025-04-11T16:00,17.4 +2025-04-11T17:00,13.9 +2025-04-11T18:00,11.6 +2025-04-11T19:00,11.7 +2025-04-11T20:00,10.8 +2025-04-11T21:00,5.8 +2025-04-11T22:00,10.2 +2025-04-11T23:00,6.0 +2025-04-12T00:00,12.2 +2025-04-12T01:00,9.3 +2025-04-12T02:00,12.4 +2025-04-12T03:00,15.4 +2025-04-12T04:00,9.4 +2025-04-12T05:00,13.1 +2025-04-12T06:00,15.8 +2025-04-12T07:00,18.5 +2025-04-12T08:00,18.4 +2025-04-12T09:00,11.9 +2025-04-12T10:00,15.6 +2025-04-12T11:00,21.9 +2025-04-12T12:00,16.3 +2025-04-12T13:00,16.0 +2025-04-12T14:00,15.6 +2025-04-12T15:00,15.6 +2025-04-12T16:00,18.8 +2025-04-12T17:00,10.0 +2025-04-12T18:00,11.5 +2025-04-12T19:00,8.6 +2025-04-12T20:00,9.2 +2025-04-12T21:00,11.0 +2025-04-12T22:00,6.4 +2025-04-12T23:00,6.3 +2025-04-13T00:00,9.2 +2025-04-13T01:00,7.3 +2025-04-13T02:00,10.1 +2025-04-13T03:00,11.3 +2025-04-13T04:00,13.4 +2025-04-13T05:00,10.9 +2025-04-13T06:00,10.9 +2025-04-13T07:00,11.9 +2025-04-13T08:00,16.8 +2025-04-13T09:00,18.3 +2025-04-13T10:00,16.4 +2025-04-13T11:00,11.8 +2025-04-13T12:00,16.4 +2025-04-13T13:00,11.0 +2025-04-13T14:00,14.7 +2025-04-13T15:00,15.0 +2025-04-13T16:00,13.9 +2025-04-13T17:00,13.9 +2025-04-13T18:00,15.7 +2025-04-13T19:00,8.4 +2025-04-13T20:00,16.8 +2025-04-13T21:00,7.9 +2025-04-13T22:00,10.2 +2025-04-13T23:00,11.7 +2025-04-14T00:00,10.2 +2025-04-14T01:00,6.4 +2025-04-14T02:00,10.1 +2025-04-14T03:00,7.2 +2025-04-14T04:00,6.6 +2025-04-14T05:00,12.1 +2025-04-14T06:00,14.8 +2025-04-14T07:00,14.9 +2025-04-14T08:00,14.8 +2025-04-14T09:00,12.0 +2025-04-14T10:00,14.8 +2025-04-14T11:00,16.7 +2025-04-14T12:00,12.4 +2025-04-14T13:00,10.7 +2025-04-14T14:00,16.0 +2025-04-14T15:00,15.6 +2025-04-14T16:00,14.2 +2025-04-14T17:00,15.0 +2025-04-14T18:00,10.4 +2025-04-14T19:00,11.6 +2025-04-14T20:00,9.0 +2025-04-14T21:00,8.7 +2025-04-14T22:00,9.0 +2025-04-14T23:00,6.9 +2025-04-15T00:00,6.6 +2025-04-15T01:00,4.4 +2025-04-15T02:00,5.7 +2025-04-15T03:00,5.9 +2025-04-15T04:00,10.7 +2025-04-15T05:00,7.0 +2025-04-15T06:00,9.2 +2025-04-15T07:00,10.8 +2025-04-15T08:00,11.1 +2025-04-15T09:00,13.3 +2025-04-15T10:00,18.4 +2025-04-15T11:00,12.2 +2025-04-15T12:00,14.8 +2025-04-15T13:00,16.5 +2025-04-15T14:00,15.4 +2025-04-15T15:00,18.2 +2025-04-15T16:00,18.1 +2025-04-15T17:00,16.6 +2025-04-15T18:00,6.5 +2025-04-15T19:00,12.3 +2025-04-15T20:00,4.4 +2025-04-15T21:00,8.7 +2025-04-15T22:00,7.9 +2025-04-15T23:00,5.0 +2025-04-16T00:00,7.8 +2025-04-16T01:00,11.9 +2025-04-16T02:00,16.0 +2025-04-16T03:00,9.5 +2025-04-16T04:00,9.1 +2025-04-16T05:00,13.8 +2025-04-16T06:00,13.3 +2025-04-16T07:00,10.2 +2025-04-16T08:00,16.6 +2025-04-16T09:00,15.9 +2025-04-16T10:00,18.7 +2025-04-16T11:00,14.2 +2025-04-16T12:00,15.9 +2025-04-16T13:00,14.4 +2025-04-16T14:00,18.5 +2025-04-16T15:00,11.0 +2025-04-16T16:00,11.6 +2025-04-16T17:00,10.4 +2025-04-16T18:00,6.2 +2025-04-16T19:00,12.4 +2025-04-16T20:00,13.8 +2025-04-16T21:00,3.0 +2025-04-16T22:00,7.0 +2025-04-16T23:00,10.4 +2025-04-17T00:00,9.4 +2025-04-17T01:00,9.0 +2025-04-17T02:00,6.1 +2025-04-17T03:00,11.0 +2025-04-17T04:00,15.2 +2025-04-17T05:00,11.1 +2025-04-17T06:00,9.8 +2025-04-17T07:00,14.1 +2025-04-17T08:00,15.0 +2025-04-17T09:00,14.4 +2025-04-17T10:00,16.0 +2025-04-17T11:00,17.3 +2025-04-17T12:00,16.2 +2025-04-17T13:00,13.9 +2025-04-17T14:00,9.6 +2025-04-17T15:00,16.5 +2025-04-17T16:00,15.7 +2025-04-17T17:00,10.7 +2025-04-17T18:00,10.4 +2025-04-17T19:00,9.7 +2025-04-17T20:00,12.6 +2025-04-17T21:00,5.0 +2025-04-17T22:00,8.6 +2025-04-17T23:00,5.9 +2025-04-18T00:00,12.3 +2025-04-18T01:00,7.5 +2025-04-18T02:00,4.6 +2025-04-18T03:00,6.1 +2025-04-18T04:00,7.2 +2025-04-18T05:00,11.1 +2025-04-18T06:00,10.8 +2025-04-18T07:00,11.9 +2025-04-18T08:00,18.8 +2025-04-18T09:00,10.9 +2025-04-18T10:00,18.2 +2025-04-18T11:00,15.1 +2025-04-18T12:00,16.8 +2025-04-18T13:00,16.1 +2025-04-18T14:00,14.7 +2025-04-18T15:00,11.0 +2025-04-18T16:00,11.9 +2025-04-18T17:00,14.2 +2025-04-18T18:00,15.6 +2025-04-18T19:00,8.9 +2025-04-18T20:00,10.2 +2025-04-18T21:00,7.5 +2025-04-18T22:00,4.9 +2025-04-18T23:00,7.6 +2025-04-19T00:00,5.4 +2025-04-19T01:00,5.1 +2025-04-19T02:00,8.9 +2025-04-19T03:00,6.7 +2025-04-19T04:00,7.4 +2025-04-19T05:00,8.8 +2025-04-19T06:00,9.0 +2025-04-19T07:00,13.4 +2025-04-19T08:00,14.6 +2025-04-19T09:00,12.8 +2025-04-19T10:00,13.5 +2025-04-19T11:00,11.7 +2025-04-19T12:00,21.7 +2025-04-19T13:00,15.4 +2025-04-19T14:00,17.3 +2025-04-19T15:00,14.6 +2025-04-19T16:00,8.2 +2025-04-19T17:00,9.1 +2025-04-19T18:00,9.4 +2025-04-19T19:00,7.7 +2025-04-19T20:00,5.3 +2025-04-19T21:00,6.8 +2025-04-19T22:00,8.4 +2025-04-19T23:00,7.2 +2025-04-20T00:00,8.1 +2025-04-20T01:00,6.5 +2025-04-20T02:00,10.5 +2025-04-20T03:00,7.7 +2025-04-20T04:00,6.1 +2025-04-20T05:00,7.9 +2025-04-20T06:00,8.9 +2025-04-20T07:00,16.4 +2025-04-20T08:00,10.4 +2025-04-20T09:00,10.7 +2025-04-20T10:00,16.6 +2025-04-20T11:00,9.4 +2025-04-20T12:00,16.9 +2025-04-20T13:00,12.9 +2025-04-20T14:00,10.6 +2025-04-20T15:00,15.1 +2025-04-20T16:00,13.7 +2025-04-20T17:00,11.5 +2025-04-20T18:00,12.7 +2025-04-20T19:00,10.3 +2025-04-20T20:00,7.9 +2025-04-20T21:00,7.4 +2025-04-20T22:00,13.1 +2025-04-20T23:00,6.4 +2025-04-21T00:00,8.0 +2025-04-21T01:00,7.6 +2025-04-21T02:00,4.9 +2025-04-21T03:00,6.2 +2025-04-21T04:00,10.3 +2025-04-21T05:00,12.0 +2025-04-21T06:00,12.5 +2025-04-21T07:00,13.0 +2025-04-21T08:00,13.8 +2025-04-21T09:00,12.5 +2025-04-21T10:00,14.4 +2025-04-21T11:00,13.6 +2025-04-21T12:00,15.0 +2025-04-21T13:00,14.0 +2025-04-21T14:00,8.2 +2025-04-21T15:00,13.0 +2025-04-21T16:00,15.4 +2025-04-21T17:00,8.2 +2025-04-21T18:00,13.8 +2025-04-21T19:00,10.9 +2025-04-21T20:00,9.4 +2025-04-21T21:00,7.9 +2025-04-21T22:00,9.8 +2025-04-21T23:00,3.2 +2025-04-22T00:00,6.0 +2025-04-22T01:00,8.0 +2025-04-22T02:00,11.0 +2025-04-22T03:00,11.3 +2025-04-22T04:00,10.2 +2025-04-22T05:00,9.7 +2025-04-22T06:00,12.4 +2025-04-22T07:00,11.7 +2025-04-22T08:00,16.8 +2025-04-22T09:00,8.9 +2025-04-22T10:00,10.5 +2025-04-22T11:00,14.9 +2025-04-22T12:00,17.1 +2025-04-22T13:00,15.8 +2025-04-22T14:00,14.0 +2025-04-22T15:00,17.2 +2025-04-22T16:00,13.3 +2025-04-22T17:00,12.4 +2025-04-22T18:00,7.5 +2025-04-22T19:00,6.6 +2025-04-22T20:00,15.3 +2025-04-22T21:00,9.5 +2025-04-22T22:00,11.8 +2025-04-22T23:00,6.8 +2025-04-23T00:00,10.5 +2025-04-23T01:00,7.6 +2025-04-23T02:00,6.3 +2025-04-23T03:00,5.4 +2025-04-23T04:00,5.7 +2025-04-23T05:00,4.7 +2025-04-23T06:00,8.8 +2025-04-23T07:00,10.5 +2025-04-23T08:00,14.4 +2025-04-23T09:00,14.5 +2025-04-23T10:00,12.1 +2025-04-23T11:00,13.2 +2025-04-23T12:00,15.9 +2025-04-23T13:00,12.9 +2025-04-23T14:00,14.8 +2025-04-23T15:00,13.0 +2025-04-23T16:00,6.8 +2025-04-23T17:00,9.2 +2025-04-23T18:00,11.8 +2025-04-23T19:00,11.6 +2025-04-23T20:00,6.6 +2025-04-23T21:00,7.7 +2025-04-23T22:00,5.6 +2025-04-23T23:00,3.3 +2025-04-24T00:00,4.4 +2025-04-24T01:00,5.2 +2025-04-24T02:00,4.4 +2025-04-24T03:00,5.9 +2025-04-24T04:00,11.6 +2025-04-24T05:00,5.5 +2025-04-24T06:00,5.1 +2025-04-24T07:00,10.1 +2025-04-24T08:00,8.7 +2025-04-24T09:00,9.5 +2025-04-24T10:00,16.2 +2025-04-24T11:00,9.3 +2025-04-24T12:00,16.4 +2025-04-24T13:00,10.1 +2025-04-24T14:00,14.6 +2025-04-24T15:00,15.3 +2025-04-24T16:00,9.6 +2025-04-24T17:00,1.5 +2025-04-24T18:00,14.5 +2025-04-24T19:00,8.7 +2025-04-24T20:00,5.3 +2025-04-24T21:00,5.4 +2025-04-24T22:00,7.4 +2025-04-24T23:00,7.4 +2025-04-25T00:00,9.8 +2025-04-25T01:00,6.1 +2025-04-25T02:00,6.6 +2025-04-25T03:00,8.1 +2025-04-25T04:00,13.2 +2025-04-25T05:00,5.8 +2025-04-25T06:00,7.5 +2025-04-25T07:00,12.3 +2025-04-25T08:00,11.4 +2025-04-25T09:00,16.2 +2025-04-25T10:00,15.8 +2025-04-25T11:00,11.8 +2025-04-25T12:00,15.4 +2025-04-25T13:00,16.9 +2025-04-25T14:00,11.7 +2025-04-25T15:00,17.4 +2025-04-25T16:00,8.9 +2025-04-25T17:00,8.5 +2025-04-25T18:00,15.4 +2025-04-25T19:00,9.2 +2025-04-25T20:00,7.0 +2025-04-25T21:00,8.3 +2025-04-25T22:00,6.1 +2025-04-25T23:00,3.7 +2025-04-26T00:00,2.9 +2025-04-26T01:00,5.8 +2025-04-26T02:00,8.3 +2025-04-26T03:00,8.6 +2025-04-26T04:00,4.9 +2025-04-26T05:00,12.3 +2025-04-26T06:00,6.0 +2025-04-26T07:00,11.7 +2025-04-26T08:00,8.2 +2025-04-26T09:00,16.4 +2025-04-26T10:00,10.7 +2025-04-26T11:00,12.4 +2025-04-26T12:00,13.4 +2025-04-26T13:00,13.1 +2025-04-26T14:00,14.9 +2025-04-26T15:00,13.5 +2025-04-26T16:00,13.6 +2025-04-26T17:00,10.6 +2025-04-26T18:00,12.9 +2025-04-26T19:00,8.1 +2025-04-26T20:00,7.5 +2025-04-26T21:00,8.9 +2025-04-26T22:00,2.3 +2025-04-26T23:00,6.2 +2025-04-27T00:00,11.0 +2025-04-27T01:00,8.6 +2025-04-27T02:00,8.6 +2025-04-27T03:00,5.7 +2025-04-27T04:00,6.5 +2025-04-27T05:00,12.7 +2025-04-27T06:00,9.2 +2025-04-27T07:00,10.0 +2025-04-27T08:00,11.4 +2025-04-27T09:00,12.4 +2025-04-27T10:00,14.4 +2025-04-27T11:00,11.0 +2025-04-27T12:00,14.6 +2025-04-27T13:00,14.1 +2025-04-27T14:00,15.2 +2025-04-27T15:00,9.4 +2025-04-27T16:00,10.7 +2025-04-27T17:00,11.3 +2025-04-27T18:00,12.9 +2025-04-27T19:00,10.3 +2025-04-27T20:00,6.9 +2025-04-27T21:00,4.7 +2025-04-27T22:00,5.0 +2025-04-27T23:00,3.8 +2025-04-28T00:00,10.2 +2025-04-28T01:00,3.3 +2025-04-28T02:00,8.0 +2025-04-28T03:00,3.2 +2025-04-28T04:00,10.1 +2025-04-28T05:00,8.3 +2025-04-28T06:00,7.5 +2025-04-28T07:00,12.7 +2025-04-28T08:00,9.6 +2025-04-28T09:00,13.9 +2025-04-28T10:00,14.4 +2025-04-28T11:00,10.0 +2025-04-28T12:00,18.4 +2025-04-28T13:00,17.0 +2025-04-28T14:00,12.3 +2025-04-28T15:00,10.4 +2025-04-28T16:00,10.0 +2025-04-28T17:00,9.9 +2025-04-28T18:00,13.8 +2025-04-28T19:00,6.5 +2025-04-28T20:00,5.9 +2025-04-28T21:00,5.4 +2025-04-28T22:00,12.1 +2025-04-28T23:00,5.8 +2025-04-29T00:00,3.1 +2025-04-29T01:00,4.2 +2025-04-29T02:00,4.8 +2025-04-29T03:00,4.8 +2025-04-29T04:00,6.8 +2025-04-29T05:00,7.2 +2025-04-29T06:00,11.5 +2025-04-29T07:00,9.8 +2025-04-29T08:00,8.9 +2025-04-29T09:00,12.6 +2025-04-29T10:00,14.7 +2025-04-29T11:00,14.1 +2025-04-29T12:00,17.0 +2025-04-29T13:00,10.6 +2025-04-29T14:00,12.2 +2025-04-29T15:00,12.6 +2025-04-29T16:00,16.9 +2025-04-29T17:00,9.5 +2025-04-29T18:00,11.6 +2025-04-29T19:00,8.8 +2025-04-29T20:00,7.5 +2025-04-29T21:00,5.8 +2025-04-29T22:00,4.9 +2025-04-29T23:00,4.7 +2025-04-30T00:00,3.4 +2025-04-30T01:00,6.8 +2025-04-30T02:00,6.7 +2025-04-30T03:00,8.5 +2025-04-30T04:00,7.0 +2025-04-30T05:00,9.9 +2025-04-30T06:00,8.3 +2025-04-30T07:00,9.2 +2025-04-30T08:00,13.1 +2025-04-30T09:00,11.9 +2025-04-30T10:00,12.2 +2025-04-30T11:00,14.7 +2025-04-30T12:00,19.1 +2025-04-30T13:00,13.9 +2025-04-30T14:00,16.4 +2025-04-30T15:00,15.7 +2025-04-30T16:00,9.6 +2025-04-30T17:00,13.4 +2025-04-30T18:00,10.4 +2025-04-30T19:00,6.6 +2025-04-30T20:00,2.5 +2025-04-30T21:00,5.9 +2025-04-30T22:00,7.0 +2025-04-30T23:00,5.3 +2025-05-01T00:00,8.7 +2025-05-01T01:00,10.3 +2025-05-01T02:00,3.3 +2025-05-01T03:00,6.3 +2025-05-01T04:00,6.8 +2025-05-01T05:00,12.1 +2025-05-01T06:00,8.5 +2025-05-01T07:00,8.8 +2025-05-01T08:00,11.1 +2025-05-01T09:00,8.6 +2025-05-01T10:00,8.3 +2025-05-01T11:00,10.7 +2025-05-01T12:00,15.3 +2025-05-01T13:00,10.1 +2025-05-01T14:00,16.7 +2025-05-01T15:00,13.8 +2025-05-01T16:00,11.8 +2025-05-01T17:00,6.3 +2025-05-01T18:00,9.4 +2025-05-01T19:00,7.8 +2025-05-01T20:00,7.3 +2025-05-01T21:00,10.1 +2025-05-01T22:00,3.5 +2025-05-01T23:00,2.9 +2025-05-02T00:00,2.6 +2025-05-02T01:00,4.4 +2025-05-02T02:00,8.9 +2025-05-02T03:00,7.0 +2025-05-02T04:00,10.1 +2025-05-02T05:00,9.1 +2025-05-02T06:00,13.1 +2025-05-02T07:00,9.9 +2025-05-02T08:00,12.2 +2025-05-02T09:00,15.2 +2025-05-02T10:00,12.8 +2025-05-02T11:00,15.1 +2025-05-02T12:00,14.2 +2025-05-02T13:00,13.2 +2025-05-02T14:00,13.5 +2025-05-02T15:00,11.0 +2025-05-02T16:00,17.1 +2025-05-02T17:00,9.7 +2025-05-02T18:00,6.8 +2025-05-02T19:00,5.1 +2025-05-02T20:00,9.7 +2025-05-02T21:00,8.7 +2025-05-02T22:00,4.6 +2025-05-02T23:00,1.0 +2025-05-03T00:00,2.7 +2025-05-03T01:00,7.8 +2025-05-03T02:00,5.2 +2025-05-03T03:00,1.1 +2025-05-03T04:00,7.2 +2025-05-03T05:00,8.4 +2025-05-03T06:00,9.7 +2025-05-03T07:00,9.5 +2025-05-03T08:00,11.5 +2025-05-03T09:00,9.8 +2025-05-03T10:00,15.6 +2025-05-03T11:00,7.7 +2025-05-03T12:00,12.0 +2025-05-03T13:00,12.0 +2025-05-03T14:00,17.9 +2025-05-03T15:00,12.0 +2025-05-03T16:00,12.2 +2025-05-03T17:00,9.6 +2025-05-03T18:00,10.0 +2025-05-03T19:00,5.8 +2025-05-03T20:00,11.1 +2025-05-03T21:00,1.8 +2025-05-03T22:00,7.0 +2025-05-03T23:00,4.0 +2025-05-04T00:00,1.0 +2025-05-04T01:00,2.2 +2025-05-04T02:00,3.1 +2025-05-04T03:00,6.2 +2025-05-04T04:00,11.6 +2025-05-04T05:00,9.7 +2025-05-04T06:00,9.4 +2025-05-04T07:00,15.2 +2025-05-04T08:00,13.4 +2025-05-04T09:00,10.5 +2025-05-04T10:00,9.4 +2025-05-04T11:00,13.3 +2025-05-04T12:00,10.5 +2025-05-04T13:00,13.2 +2025-05-04T14:00,10.6 +2025-05-04T15:00,12.7 +2025-05-04T16:00,15.2 +2025-05-04T17:00,9.7 +2025-05-04T18:00,10.1 +2025-05-04T19:00,8.5 +2025-05-04T20:00,5.6 +2025-05-04T21:00,7.6 +2025-05-04T22:00,5.6 +2025-05-04T23:00,7.6 +2025-05-05T00:00,11.9 +2025-05-05T01:00,6.1 +2025-05-05T02:00,9.4 +2025-05-05T03:00,6.6 +2025-05-05T04:00,5.0 +2025-05-05T05:00,5.0 +2025-05-05T06:00,5.8 +2025-05-05T07:00,11.8 +2025-05-05T08:00,13.8 +2025-05-05T09:00,9.1 +2025-05-05T10:00,15.6 +2025-05-05T11:00,15.5 +2025-05-05T12:00,10.7 +2025-05-05T13:00,11.7 +2025-05-05T14:00,8.2 +2025-05-05T15:00,11.0 +2025-05-05T16:00,9.3 +2025-05-05T17:00,10.3 +2025-05-05T18:00,7.9 +2025-05-05T19:00,10.4 +2025-05-05T20:00,6.0 +2025-05-05T21:00,8.3 +2025-05-05T22:00,8.8 +2025-05-05T23:00,4.8 +2025-05-06T00:00,1.1 +2025-05-06T01:00,5.1 +2025-05-06T02:00,2.7 +2025-05-06T03:00,2.4 +2025-05-06T04:00,6.0 +2025-05-06T05:00,5.0 +2025-05-06T06:00,11.6 +2025-05-06T07:00,8.3 +2025-05-06T08:00,13.8 +2025-05-06T09:00,13.7 +2025-05-06T10:00,11.9 +2025-05-06T11:00,11.0 +2025-05-06T12:00,12.3 +2025-05-06T13:00,14.4 +2025-05-06T14:00,16.5 +2025-05-06T15:00,9.0 +2025-05-06T16:00,10.9 +2025-05-06T17:00,12.7 +2025-05-06T18:00,8.4 +2025-05-06T19:00,8.9 +2025-05-06T20:00,6.5 +2025-05-06T21:00,7.0 +2025-05-06T22:00,8.1 +2025-05-06T23:00,4.0 +2025-05-07T00:00,3.4 +2025-05-07T01:00,3.0 +2025-05-07T02:00,7.2 +2025-05-07T03:00,2.0 +2025-05-07T04:00,10.1 +2025-05-07T05:00,8.0 +2025-05-07T06:00,6.0 +2025-05-07T07:00,11.0 +2025-05-07T08:00,9.5 +2025-05-07T09:00,12.7 +2025-05-07T10:00,12.1 +2025-05-07T11:00,14.7 +2025-05-07T12:00,14.3 +2025-05-07T13:00,13.6 +2025-05-07T14:00,16.6 +2025-05-07T15:00,7.9 +2025-05-07T16:00,11.5 +2025-05-07T17:00,6.5 +2025-05-07T18:00,6.9 +2025-05-07T19:00,11.0 +2025-05-07T20:00,9.5 +2025-05-07T21:00,6.0 +2025-05-07T22:00,6.3 +2025-05-07T23:00,6.7 +2025-05-08T00:00,2.3 +2025-05-08T01:00,1.0 +2025-05-08T02:00,4.2 +2025-05-08T03:00,7.7 +2025-05-08T04:00,4.1 +2025-05-08T05:00,9.3 +2025-05-08T06:00,7.4 +2025-05-08T07:00,15.5 +2025-05-08T08:00,12.7 +2025-05-08T09:00,7.9 +2025-05-08T10:00,10.9 +2025-05-08T11:00,11.0 +2025-05-08T12:00,9.2 +2025-05-08T13:00,11.6 +2025-05-08T14:00,12.4 +2025-05-08T15:00,14.2 +2025-05-08T16:00,9.0 +2025-05-08T17:00,12.5 +2025-05-08T18:00,6.6 +2025-05-08T19:00,8.0 +2025-05-08T20:00,6.8 +2025-05-08T21:00,1.0 +2025-05-08T22:00,1.8 +2025-05-08T23:00,6.9 +2025-05-09T00:00,11.2 +2025-05-09T01:00,6.8 +2025-05-09T02:00,5.3 +2025-05-09T03:00,3.6 +2025-05-09T04:00,6.1 +2025-05-09T05:00,8.2 +2025-05-09T06:00,9.3 +2025-05-09T07:00,8.5 +2025-05-09T08:00,7.2 +2025-05-09T09:00,11.7 +2025-05-09T10:00,11.6 +2025-05-09T11:00,15.3 +2025-05-09T12:00,15.4 +2025-05-09T13:00,9.5 +2025-05-09T14:00,10.8 +2025-05-09T15:00,10.5 +2025-05-09T16:00,12.0 +2025-05-09T17:00,5.9 +2025-05-09T18:00,8.9 +2025-05-09T19:00,9.5 +2025-05-09T20:00,8.0 +2025-05-09T21:00,9.8 +2025-05-09T22:00,1.0 +2025-05-09T23:00,5.0 +2025-05-10T00:00,4.6 +2025-05-10T01:00,4.5 +2025-05-10T02:00,8.9 +2025-05-10T03:00,6.3 +2025-05-10T04:00,9.3 +2025-05-10T05:00,7.2 +2025-05-10T06:00,9.8 +2025-05-10T07:00,7.0 +2025-05-10T08:00,13.4 +2025-05-10T09:00,13.5 +2025-05-10T10:00,15.8 +2025-05-10T11:00,13.3 +2025-05-10T12:00,11.5 +2025-05-10T13:00,14.1 +2025-05-10T14:00,12.4 +2025-05-10T15:00,12.4 +2025-05-10T16:00,10.0 +2025-05-10T17:00,7.1 +2025-05-10T18:00,13.2 +2025-05-10T19:00,9.8 +2025-05-10T20:00,11.0 +2025-05-10T21:00,7.0 +2025-05-10T22:00,3.3 +2025-05-10T23:00,1.0 +2025-05-11T00:00,4.6 +2025-05-11T01:00,4.3 +2025-05-11T02:00,4.0 +2025-05-11T03:00,4.9 +2025-05-11T04:00,4.2 +2025-05-11T05:00,8.1 +2025-05-11T06:00,4.8 +2025-05-11T07:00,9.5 +2025-05-11T08:00,12.0 +2025-05-11T09:00,13.1 +2025-05-11T10:00,12.6 +2025-05-11T11:00,13.4 +2025-05-11T12:00,11.8 +2025-05-11T13:00,15.5 +2025-05-11T14:00,13.4 +2025-05-11T15:00,12.0 +2025-05-11T16:00,7.4 +2025-05-11T17:00,8.4 +2025-05-11T18:00,9.7 +2025-05-11T19:00,3.4 +2025-05-11T20:00,9.1 +2025-05-11T21:00,1.5 +2025-05-11T22:00,4.4 +2025-05-11T23:00,3.0 +2025-05-12T00:00,1.0 +2025-05-12T01:00,4.1 +2025-05-12T02:00,2.3 +2025-05-12T03:00,2.9 +2025-05-12T04:00,5.7 +2025-05-12T05:00,11.0 +2025-05-12T06:00,9.5 +2025-05-12T07:00,6.4 +2025-05-12T08:00,13.6 +2025-05-12T09:00,9.0 +2025-05-12T10:00,11.2 +2025-05-12T11:00,15.3 +2025-05-12T12:00,13.7 +2025-05-12T13:00,11.6 +2025-05-12T14:00,11.0 +2025-05-12T15:00,9.9 +2025-05-12T16:00,12.9 +2025-05-12T17:00,12.0 +2025-05-12T18:00,6.3 +2025-05-12T19:00,3.5 +2025-05-12T20:00,2.4 +2025-05-12T21:00,6.0 +2025-05-12T22:00,2.8 +2025-05-12T23:00,1.0 +2025-05-13T00:00,2.7 +2025-05-13T01:00,2.9 +2025-05-13T02:00,5.3 +2025-05-13T03:00,2.0 +2025-05-13T04:00,4.8 +2025-05-13T05:00,2.2 +2025-05-13T06:00,6.3 +2025-05-13T07:00,10.3 +2025-05-13T08:00,8.3 +2025-05-13T09:00,13.5 +2025-05-13T10:00,12.1 +2025-05-13T11:00,15.1 +2025-05-13T12:00,12.6 +2025-05-13T13:00,15.3 +2025-05-13T14:00,14.3 +2025-05-13T15:00,8.8 +2025-05-13T16:00,10.1 +2025-05-13T17:00,9.0 +2025-05-13T18:00,5.5 +2025-05-13T19:00,6.9 +2025-05-13T20:00,5.3 +2025-05-13T21:00,7.0 +2025-05-13T22:00,3.7 +2025-05-13T23:00,6.2 +2025-05-14T00:00,5.9 +2025-05-14T01:00,2.8 +2025-05-14T02:00,2.9 +2025-05-14T03:00,4.2 +2025-05-14T04:00,1.2 +2025-05-14T05:00,12.6 +2025-05-14T06:00,8.8 +2025-05-14T07:00,9.3 +2025-05-14T08:00,10.0 +2025-05-14T09:00,12.1 +2025-05-14T10:00,11.4 +2025-05-14T11:00,12.4 +2025-05-14T12:00,10.0 +2025-05-14T13:00,11.3 +2025-05-14T14:00,13.1 +2025-05-14T15:00,12.2 +2025-05-14T16:00,6.5 +2025-05-14T17:00,5.4 +2025-05-14T18:00,14.2 +2025-05-14T19:00,8.2 +2025-05-14T20:00,6.0 +2025-05-14T21:00,6.6 +2025-05-14T22:00,1.9 +2025-05-14T23:00,1.0 +2025-05-15T00:00,5.2 +2025-05-15T01:00,2.0 +2025-05-15T02:00,8.6 +2025-05-15T03:00,3.7 +2025-05-15T04:00,9.6 +2025-05-15T05:00,1.6 +2025-05-15T06:00,4.4 +2025-05-15T07:00,5.0 +2025-05-15T08:00,10.1 +2025-05-15T09:00,12.0 +2025-05-15T10:00,13.4 +2025-05-15T11:00,18.3 +2025-05-15T12:00,6.8 +2025-05-15T13:00,10.1 +2025-05-15T14:00,8.5 +2025-05-15T15:00,10.4 +2025-05-15T16:00,12.5 +2025-05-15T17:00,3.9 +2025-05-15T18:00,6.5 +2025-05-15T19:00,10.0 +2025-05-15T20:00,6.3 +2025-05-15T21:00,4.0 +2025-05-15T22:00,1.0 +2025-05-15T23:00,4.3 +2025-05-16T00:00,4.6 +2025-05-16T01:00,3.8 +2025-05-16T02:00,4.2 +2025-05-16T03:00,6.4 +2025-05-16T04:00,5.7 +2025-05-16T05:00,7.2 +2025-05-16T06:00,6.4 +2025-05-16T07:00,12.8 +2025-05-16T08:00,10.3 +2025-05-16T09:00,9.8 +2025-05-16T10:00,13.6 +2025-05-16T11:00,13.3 +2025-05-16T12:00,12.1 +2025-05-16T13:00,13.2 +2025-05-16T14:00,9.1 +2025-05-16T15:00,11.3 +2025-05-16T16:00,10.6 +2025-05-16T17:00,3.0 +2025-05-16T18:00,6.5 +2025-05-16T19:00,7.6 +2025-05-16T20:00,7.9 +2025-05-16T21:00,4.2 +2025-05-16T22:00,4.2 +2025-05-16T23:00,5.2 +2025-05-17T00:00,6.1 +2025-05-17T01:00,2.9 +2025-05-17T02:00,6.9 +2025-05-17T03:00,6.5 +2025-05-17T04:00,8.9 +2025-05-17T05:00,4.5 +2025-05-17T06:00,11.8 +2025-05-17T07:00,10.6 +2025-05-17T08:00,8.9 +2025-05-17T09:00,6.5 +2025-05-17T10:00,11.0 +2025-05-17T11:00,11.9 +2025-05-17T12:00,13.3 +2025-05-17T13:00,13.7 +2025-05-17T14:00,13.9 +2025-05-17T15:00,10.2 +2025-05-17T16:00,12.8 +2025-05-17T17:00,8.5 +2025-05-17T18:00,7.6 +2025-05-17T19:00,7.0 +2025-05-17T20:00,8.0 +2025-05-17T21:00,1.9 +2025-05-17T22:00,6.1 +2025-05-17T23:00,2.0 +2025-05-18T00:00,6.2 +2025-05-18T01:00,4.2 +2025-05-18T02:00,4.7 +2025-05-18T03:00,5.0 +2025-05-18T04:00,4.9 +2025-05-18T05:00,8.3 +2025-05-18T06:00,6.5 +2025-05-18T07:00,5.1 +2025-05-18T08:00,8.7 +2025-05-18T09:00,8.6 +2025-05-18T10:00,14.0 +2025-05-18T11:00,12.1 +2025-05-18T12:00,15.0 +2025-05-18T13:00,9.2 +2025-05-18T14:00,9.8 +2025-05-18T15:00,7.0 +2025-05-18T16:00,12.4 +2025-05-18T17:00,7.1 +2025-05-18T18:00,8.9 +2025-05-18T19:00,3.3 +2025-05-18T20:00,4.8 +2025-05-18T21:00,2.1 +2025-05-18T22:00,5.4 +2025-05-18T23:00,4.3 +2025-05-19T00:00,3.0 +2025-05-19T01:00,4.4 +2025-05-19T02:00,9.9 +2025-05-19T03:00,2.9 +2025-05-19T04:00,4.9 +2025-05-19T05:00,8.6 +2025-05-19T06:00,4.7 +2025-05-19T07:00,10.5 +2025-05-19T08:00,6.9 +2025-05-19T09:00,11.9 +2025-05-19T10:00,17.0 +2025-05-19T11:00,8.2 +2025-05-19T12:00,14.3 +2025-05-19T13:00,11.9 +2025-05-19T14:00,12.7 +2025-05-19T15:00,8.1 +2025-05-19T16:00,9.1 +2025-05-19T17:00,9.9 +2025-05-19T18:00,1.0 +2025-05-19T19:00,1.0 +2025-05-19T20:00,2.7 +2025-05-19T21:00,5.7 +2025-05-19T22:00,2.1 +2025-05-19T23:00,4.5 +2025-05-20T00:00,5.2 +2025-05-20T01:00,3.9 +2025-05-20T02:00,1.0 +2025-05-20T03:00,5.6 +2025-05-20T04:00,2.7 +2025-05-20T05:00,9.6 +2025-05-20T06:00,7.5 +2025-05-20T07:00,7.0 +2025-05-20T08:00,3.7 +2025-05-20T09:00,10.1 +2025-05-20T10:00,6.6 +2025-05-20T11:00,7.6 +2025-05-20T12:00,16.0 +2025-05-20T13:00,9.8 +2025-05-20T14:00,10.8 +2025-05-20T15:00,11.3 +2025-05-20T16:00,7.4 +2025-05-20T17:00,7.9 +2025-05-20T18:00,5.3 +2025-05-20T19:00,8.8 +2025-05-20T20:00,4.7 +2025-05-20T21:00,3.1 +2025-05-20T22:00,2.4 +2025-05-20T23:00,4.3 +2025-05-21T00:00,2.6 +2025-05-21T01:00,1.0 +2025-05-21T02:00,4.1 +2025-05-21T03:00,5.2 +2025-05-21T04:00,4.5 +2025-05-21T05:00,2.8 +2025-05-21T06:00,4.3 +2025-05-21T07:00,8.2 +2025-05-21T08:00,7.3 +2025-05-21T09:00,10.2 +2025-05-21T10:00,10.9 +2025-05-21T11:00,11.8 +2025-05-21T12:00,11.7 +2025-05-21T13:00,13.1 +2025-05-21T14:00,13.1 +2025-05-21T15:00,9.3 +2025-05-21T16:00,5.1 +2025-05-21T17:00,7.0 +2025-05-21T18:00,6.8 +2025-05-21T19:00,3.3 +2025-05-21T20:00,7.3 +2025-05-21T21:00,4.5 +2025-05-21T22:00,3.7 +2025-05-21T23:00,3.5 +2025-05-22T00:00,6.5 +2025-05-22T01:00,3.4 +2025-05-22T02:00,7.1 +2025-05-22T03:00,8.8 +2025-05-22T04:00,5.0 +2025-05-22T05:00,7.2 +2025-05-22T06:00,7.8 +2025-05-22T07:00,4.1 +2025-05-22T08:00,10.3 +2025-05-22T09:00,7.4 +2025-05-22T10:00,5.8 +2025-05-22T11:00,6.1 +2025-05-22T12:00,10.5 +2025-05-22T13:00,9.6 +2025-05-22T14:00,11.9 +2025-05-22T15:00,13.7 +2025-05-22T16:00,6.1 +2025-05-22T17:00,3.9 +2025-05-22T18:00,11.7 +2025-05-22T19:00,4.4 +2025-05-22T20:00,5.1 +2025-05-22T21:00,4.7 +2025-05-22T22:00,3.7 +2025-05-22T23:00,6.5 +2025-05-23T00:00,1.0 +2025-05-23T01:00,1.0 +2025-05-23T02:00,8.7 +2025-05-23T03:00,5.2 +2025-05-23T04:00,3.1 +2025-05-23T05:00,4.5 +2025-05-23T06:00,5.2 +2025-05-23T07:00,7.7 +2025-05-23T08:00,7.4 +2025-05-23T09:00,14.2 +2025-05-23T10:00,9.9 +2025-05-23T11:00,10.3 +2025-05-23T12:00,11.4 +2025-05-23T13:00,14.1 +2025-05-23T14:00,8.6 +2025-05-23T15:00,8.4 +2025-05-23T16:00,9.0 +2025-05-23T17:00,8.3 +2025-05-23T18:00,8.5 +2025-05-23T19:00,3.5 +2025-05-23T20:00,2.6 +2025-05-23T21:00,2.0 +2025-05-23T22:00,4.4 +2025-05-23T23:00,3.1 +2025-05-24T00:00,2.3 +2025-05-24T01:00,1.0 +2025-05-24T02:00,7.7 +2025-05-24T03:00,3.2 +2025-05-24T04:00,4.6 +2025-05-24T05:00,4.8 +2025-05-24T06:00,7.6 +2025-05-24T07:00,5.2 +2025-05-24T08:00,9.3 +2025-05-24T09:00,10.6 +2025-05-24T10:00,9.8 +2025-05-24T11:00,9.6 +2025-05-24T12:00,14.9 +2025-05-24T13:00,7.4 +2025-05-24T14:00,11.5 +2025-05-24T15:00,8.5 +2025-05-24T16:00,11.6 +2025-05-24T17:00,6.4 +2025-05-24T18:00,12.7 +2025-05-24T19:00,6.4 +2025-05-24T20:00,5.2 +2025-05-24T21:00,1.7 +2025-05-24T22:00,2.5 +2025-05-24T23:00,2.0 +2025-05-25T00:00,4.0 +2025-05-25T01:00,1.9 +2025-05-25T02:00,4.0 +2025-05-25T03:00,5.4 +2025-05-25T04:00,3.7 +2025-05-25T05:00,4.5 +2025-05-25T06:00,8.1 +2025-05-25T07:00,11.8 +2025-05-25T08:00,9.8 +2025-05-25T09:00,11.7 +2025-05-25T10:00,12.7 +2025-05-25T11:00,8.0 +2025-05-25T12:00,14.3 +2025-05-25T13:00,10.5 +2025-05-25T14:00,9.6 +2025-05-25T15:00,12.2 +2025-05-25T16:00,11.8 +2025-05-25T17:00,8.0 +2025-05-25T18:00,11.6 +2025-05-25T19:00,8.3 +2025-05-25T20:00,3.2 +2025-05-25T21:00,5.6 +2025-05-25T22:00,3.1 +2025-05-25T23:00,3.4 +2025-05-26T00:00,3.2 +2025-05-26T01:00,2.5 +2025-05-26T02:00,5.7 +2025-05-26T03:00,6.8 +2025-05-26T04:00,7.8 +2025-05-26T05:00,3.5 +2025-05-26T06:00,6.2 +2025-05-26T07:00,7.6 +2025-05-26T08:00,12.6 +2025-05-26T09:00,9.2 +2025-05-26T10:00,5.9 +2025-05-26T11:00,9.4 +2025-05-26T12:00,8.9 +2025-05-26T13:00,11.7 +2025-05-26T14:00,9.4 +2025-05-26T15:00,9.5 +2025-05-26T16:00,10.7 +2025-05-26T17:00,9.9 +2025-05-26T18:00,4.8 +2025-05-26T19:00,6.4 +2025-05-26T20:00,7.3 +2025-05-26T21:00,8.6 +2025-05-26T22:00,6.0 +2025-05-26T23:00,6.4 +2025-05-27T00:00,4.5 +2025-05-27T01:00,3.5 +2025-05-27T02:00,6.9 +2025-05-27T03:00,5.3 +2025-05-27T04:00,10.0 +2025-05-27T05:00,8.7 +2025-05-27T06:00,1.0 +2025-05-27T07:00,4.2 +2025-05-27T08:00,9.5 +2025-05-27T09:00,9.2 +2025-05-27T10:00,9.1 +2025-05-27T11:00,15.6 +2025-05-27T12:00,15.5 +2025-05-27T13:00,10.1 +2025-05-27T14:00,8.5 +2025-05-27T15:00,9.0 +2025-05-27T16:00,6.1 +2025-05-27T17:00,7.5 +2025-05-27T18:00,7.3 +2025-05-27T19:00,9.6 +2025-05-27T20:00,7.2 +2025-05-27T21:00,3.3 +2025-05-27T22:00,2.3 +2025-05-27T23:00,3.6 +2025-05-28T00:00,1.0 +2025-05-28T01:00,1.0 +2025-05-28T02:00,2.6 +2025-05-28T03:00,2.5 +2025-05-28T04:00,2.7 +2025-05-28T05:00,3.7 +2025-05-28T06:00,5.4 +2025-05-28T07:00,7.6 +2025-05-28T08:00,5.3 +2025-05-28T09:00,11.4 +2025-05-28T10:00,14.2 +2025-05-28T11:00,14.1 +2025-05-28T12:00,12.6 +2025-05-28T13:00,11.2 +2025-05-28T14:00,9.3 +2025-05-28T15:00,9.9 +2025-05-28T16:00,9.9 +2025-05-28T17:00,13.9 +2025-05-28T18:00,8.2 +2025-05-28T19:00,3.5 +2025-05-28T20:00,1.0 +2025-05-28T21:00,3.9 +2025-05-28T22:00,1.1 +2025-05-28T23:00,1.4 +2025-05-29T00:00,6.4 +2025-05-29T01:00,1.0 +2025-05-29T02:00,4.0 +2025-05-29T03:00,5.4 +2025-05-29T04:00,8.2 +2025-05-29T05:00,7.9 +2025-05-29T06:00,5.3 +2025-05-29T07:00,9.6 +2025-05-29T08:00,11.6 +2025-05-29T09:00,13.3 +2025-05-29T10:00,8.2 +2025-05-29T11:00,10.2 +2025-05-29T12:00,4.5 +2025-05-29T13:00,12.4 +2025-05-29T14:00,10.4 +2025-05-29T15:00,6.2 +2025-05-29T16:00,5.5 +2025-05-29T17:00,4.8 +2025-05-29T18:00,4.8 +2025-05-29T19:00,8.4 +2025-05-29T20:00,5.6 +2025-05-29T21:00,6.3 +2025-05-29T22:00,1.4 +2025-05-29T23:00,3.5 +2025-05-30T00:00,1.0 +2025-05-30T01:00,5.5 +2025-05-30T02:00,4.1 +2025-05-30T03:00,3.2 +2025-05-30T04:00,4.1 +2025-05-30T05:00,3.0 +2025-05-30T06:00,1.0 +2025-05-30T07:00,5.5 +2025-05-30T08:00,9.9 +2025-05-30T09:00,8.7 +2025-05-30T10:00,10.2 +2025-05-30T11:00,12.7 +2025-05-30T12:00,10.2 +2025-05-30T13:00,11.2 +2025-05-30T14:00,13.5 +2025-05-30T15:00,7.4 +2025-05-30T16:00,5.1 +2025-05-30T17:00,9.5 +2025-05-30T18:00,6.5 +2025-05-30T19:00,5.3 +2025-05-30T20:00,3.6 +2025-05-30T21:00,1.9 +2025-05-30T22:00,1.0 +2025-05-30T23:00,2.6 +2025-05-31T00:00,1.0 +2025-05-31T01:00,2.9 +2025-05-31T02:00,1.5 +2025-05-31T03:00,4.6 +2025-05-31T04:00,1.8 +2025-05-31T05:00,7.0 +2025-05-31T06:00,4.4 +2025-05-31T07:00,4.3 +2025-05-31T08:00,6.6 +2025-05-31T09:00,11.6 +2025-05-31T10:00,10.6 +2025-05-31T11:00,4.4 +2025-05-31T12:00,11.6 +2025-05-31T13:00,12.0 +2025-05-31T14:00,11.1 +2025-05-31T15:00,7.1 +2025-05-31T16:00,7.3 +2025-05-31T17:00,4.8 +2025-05-31T18:00,10.3 +2025-05-31T19:00,1.0 +2025-05-31T20:00,4.4 +2025-05-31T21:00,4.6 +2025-05-31T22:00,2.6 +2025-05-31T23:00,4.1 +2025-06-01T00:00,1.0 +2025-06-01T01:00,1.7 +2025-06-01T02:00,3.5 +2025-06-01T03:00,5.5 +2025-06-01T04:00,1.0 +2025-06-01T05:00,3.0 +2025-06-01T06:00,7.6 +2025-06-01T07:00,8.7 +2025-06-01T08:00,11.4 +2025-06-01T09:00,10.5 +2025-06-01T10:00,8.6 +2025-06-01T11:00,10.5 +2025-06-01T12:00,8.4 +2025-06-01T13:00,8.1 +2025-06-01T14:00,6.8 +2025-06-01T15:00,6.4 +2025-06-01T16:00,10.1 +2025-06-01T17:00,10.1 +2025-06-01T18:00,5.8 +2025-06-01T19:00,5.2 +2025-06-01T20:00,7.4 +2025-06-01T21:00,2.9 +2025-06-01T22:00,5.0 +2025-06-01T23:00,1.0 +2025-06-02T00:00,1.0 +2025-06-02T01:00,5.4 +2025-06-02T02:00,3.4 +2025-06-02T03:00,1.0 +2025-06-02T04:00,5.8 +2025-06-02T05:00,3.3 +2025-06-02T06:00,6.8 +2025-06-02T07:00,8.0 +2025-06-02T08:00,10.9 +2025-06-02T09:00,9.9 +2025-06-02T10:00,7.6 +2025-06-02T11:00,8.7 +2025-06-02T12:00,12.2 +2025-06-02T13:00,9.8 +2025-06-02T14:00,7.8 +2025-06-02T15:00,7.0 +2025-06-02T16:00,9.6 +2025-06-02T17:00,12.7 +2025-06-02T18:00,9.5 +2025-06-02T19:00,5.2 +2025-06-02T20:00,2.9 +2025-06-02T21:00,2.1 +2025-06-02T22:00,3.9 +2025-06-02T23:00,1.0 +2025-06-03T00:00,6.2 +2025-06-03T01:00,2.4 +2025-06-03T02:00,1.0 +2025-06-03T03:00,4.1 +2025-06-03T04:00,2.2 +2025-06-03T05:00,1.0 +2025-06-03T06:00,2.0 +2025-06-03T07:00,7.0 +2025-06-03T08:00,3.8 +2025-06-03T09:00,2.0 +2025-06-03T10:00,10.8 +2025-06-03T11:00,7.9 +2025-06-03T12:00,10.2 +2025-06-03T13:00,12.0 +2025-06-03T14:00,7.0 +2025-06-03T15:00,3.9 +2025-06-03T16:00,10.7 +2025-06-03T17:00,10.2 +2025-06-03T18:00,8.7 +2025-06-03T19:00,7.7 +2025-06-03T20:00,3.8 +2025-06-03T21:00,8.1 +2025-06-03T22:00,1.0 +2025-06-03T23:00,4.6 +2025-06-04T00:00,4.8 +2025-06-04T01:00,1.0 +2025-06-04T02:00,5.7 +2025-06-04T03:00,7.0 +2025-06-04T04:00,8.5 +2025-06-04T05:00,3.0 +2025-06-04T06:00,6.5 +2025-06-04T07:00,5.7 +2025-06-04T08:00,8.5 +2025-06-04T09:00,8.9 +2025-06-04T10:00,11.4 +2025-06-04T11:00,8.6 +2025-06-04T12:00,6.6 +2025-06-04T13:00,10.3 +2025-06-04T14:00,9.2 +2025-06-04T15:00,2.4 +2025-06-04T16:00,11.1 +2025-06-04T17:00,8.1 +2025-06-04T18:00,4.0 +2025-06-04T19:00,5.5 +2025-06-04T20:00,6.3 +2025-06-04T21:00,4.3 +2025-06-04T22:00,5.1 +2025-06-04T23:00,5.2 +2025-06-05T00:00,2.8 +2025-06-05T01:00,3.2 +2025-06-05T02:00,6.2 +2025-06-05T03:00,1.0 +2025-06-05T04:00,8.3 +2025-06-05T05:00,6.3 +2025-06-05T06:00,5.5 +2025-06-05T07:00,5.7 +2025-06-05T08:00,5.3 +2025-06-05T09:00,8.8 +2025-06-05T10:00,10.6 +2025-06-05T11:00,12.9 +2025-06-05T12:00,8.5 +2025-06-05T13:00,9.7 +2025-06-05T14:00,5.1 +2025-06-05T15:00,9.0 +2025-06-05T16:00,7.8 +2025-06-05T17:00,13.7 +2025-06-05T18:00,4.5 +2025-06-05T19:00,3.1 +2025-06-05T20:00,1.0 +2025-06-05T21:00,1.0 +2025-06-05T22:00,1.5 +2025-06-05T23:00,1.0 +2025-06-06T00:00,1.0 +2025-06-06T01:00,1.9 +2025-06-06T02:00,4.1 +2025-06-06T03:00,3.9 +2025-06-06T04:00,1.0 +2025-06-06T05:00,1.0 +2025-06-06T06:00,2.7 +2025-06-06T07:00,10.5 +2025-06-06T08:00,8.9 +2025-06-06T09:00,11.8 +2025-06-06T10:00,11.0 +2025-06-06T11:00,7.9 +2025-06-06T12:00,11.1 +2025-06-06T13:00,8.7 +2025-06-06T14:00,6.5 +2025-06-06T15:00,6.0 +2025-06-06T16:00,11.6 +2025-06-06T17:00,8.3 +2025-06-06T18:00,9.3 +2025-06-06T19:00,5.4 +2025-06-06T20:00,1.1 +2025-06-06T21:00,3.6 +2025-06-06T22:00,2.7 +2025-06-06T23:00,1.0 +2025-06-07T00:00,9.4 +2025-06-07T01:00,1.2 +2025-06-07T02:00,1.5 +2025-06-07T03:00,1.6 +2025-06-07T04:00,6.0 +2025-06-07T05:00,5.5 +2025-06-07T06:00,1.0 +2025-06-07T07:00,4.6 +2025-06-07T08:00,7.4 +2025-06-07T09:00,11.7 +2025-06-07T10:00,9.4 +2025-06-07T11:00,10.2 +2025-06-07T12:00,8.9 +2025-06-07T13:00,11.4 +2025-06-07T14:00,9.1 +2025-06-07T15:00,5.1 +2025-06-07T16:00,6.7 +2025-06-07T17:00,6.2 +2025-06-07T18:00,1.0 +2025-06-07T19:00,1.4 +2025-06-07T20:00,3.5 +2025-06-07T21:00,2.4 +2025-06-07T22:00,2.1 +2025-06-07T23:00,1.0 +2025-06-08T00:00,3.3 +2025-06-08T01:00,4.3 +2025-06-08T02:00,1.0 +2025-06-08T03:00,4.3 +2025-06-08T04:00,1.0 +2025-06-08T05:00,5.1 +2025-06-08T06:00,4.7 +2025-06-08T07:00,6.5 +2025-06-08T08:00,4.4 +2025-06-08T09:00,9.3 +2025-06-08T10:00,10.4 +2025-06-08T11:00,12.1 +2025-06-08T12:00,8.8 +2025-06-08T13:00,8.3 +2025-06-08T14:00,9.0 +2025-06-08T15:00,11.3 +2025-06-08T16:00,7.0 +2025-06-08T17:00,10.3 +2025-06-08T18:00,3.1 +2025-06-08T19:00,3.0 +2025-06-08T20:00,5.3 +2025-06-08T21:00,1.0 +2025-06-08T22:00,1.0 +2025-06-08T23:00,2.8 +2025-06-09T00:00,6.5 +2025-06-09T01:00,1.4 +2025-06-09T02:00,2.8 +2025-06-09T03:00,4.3 +2025-06-09T04:00,5.5 +2025-06-09T05:00,2.8 +2025-06-09T06:00,4.5 +2025-06-09T07:00,8.3 +2025-06-09T08:00,9.4 +2025-06-09T09:00,5.0 +2025-06-09T10:00,13.9 +2025-06-09T11:00,10.5 +2025-06-09T12:00,8.8 +2025-06-09T13:00,8.8 +2025-06-09T14:00,7.1 +2025-06-09T15:00,9.5 +2025-06-09T16:00,8.9 +2025-06-09T17:00,1.0 +2025-06-09T18:00,5.2 +2025-06-09T19:00,6.7 +2025-06-09T20:00,1.0 +2025-06-09T21:00,1.0 +2025-06-09T22:00,1.0 +2025-06-09T23:00,1.0 +2025-06-10T00:00,1.0 +2025-06-10T01:00,1.0 +2025-06-10T02:00,4.1 +2025-06-10T03:00,5.2 +2025-06-10T04:00,1.0 +2025-06-10T05:00,5.0 +2025-06-10T06:00,5.7 +2025-06-10T07:00,6.9 +2025-06-10T08:00,8.5 +2025-06-10T09:00,8.8 +2025-06-10T10:00,11.8 +2025-06-10T11:00,8.3 +2025-06-10T12:00,9.5 +2025-06-10T13:00,13.5 +2025-06-10T14:00,7.7 +2025-06-10T15:00,6.1 +2025-06-10T16:00,5.4 +2025-06-10T17:00,4.2 +2025-06-10T18:00,4.7 +2025-06-10T19:00,2.7 +2025-06-10T20:00,7.4 +2025-06-10T21:00,3.3 +2025-06-10T22:00,2.1 +2025-06-10T23:00,1.0 +2025-06-11T00:00,4.1 +2025-06-11T01:00,4.9 +2025-06-11T02:00,1.8 +2025-06-11T03:00,1.0 +2025-06-11T04:00,2.7 +2025-06-11T05:00,4.9 +2025-06-11T06:00,8.2 +2025-06-11T07:00,2.1 +2025-06-11T08:00,10.9 +2025-06-11T09:00,8.6 +2025-06-11T10:00,5.4 +2025-06-11T11:00,12.0 +2025-06-11T12:00,5.4 +2025-06-11T13:00,8.5 +2025-06-11T14:00,11.0 +2025-06-11T15:00,12.6 +2025-06-11T16:00,6.6 +2025-06-11T17:00,5.6 +2025-06-11T18:00,8.7 +2025-06-11T19:00,6.0 +2025-06-11T20:00,1.0 +2025-06-11T21:00,3.6 +2025-06-11T22:00,4.2 +2025-06-11T23:00,1.0 +2025-06-12T00:00,3.9 +2025-06-12T01:00,1.0 +2025-06-12T02:00,1.7 +2025-06-12T03:00,3.9 +2025-06-12T04:00,4.7 +2025-06-12T05:00,1.7 +2025-06-12T06:00,6.7 +2025-06-12T07:00,2.8 +2025-06-12T08:00,3.8 +2025-06-12T09:00,5.9 +2025-06-12T10:00,9.1 +2025-06-12T11:00,8.8 +2025-06-12T12:00,10.6 +2025-06-12T13:00,9.5 +2025-06-12T14:00,9.7 +2025-06-12T15:00,7.8 +2025-06-12T16:00,8.7 +2025-06-12T17:00,4.9 +2025-06-12T18:00,4.8 +2025-06-12T19:00,2.2 +2025-06-12T20:00,4.3 +2025-06-12T21:00,3.4 +2025-06-12T22:00,1.0 +2025-06-12T23:00,5.4 +2025-06-13T00:00,2.4 +2025-06-13T01:00,1.0 +2025-06-13T02:00,1.0 +2025-06-13T03:00,1.0 +2025-06-13T04:00,1.0 +2025-06-13T05:00,3.6 +2025-06-13T06:00,6.7 +2025-06-13T07:00,5.9 +2025-06-13T08:00,14.8 +2025-06-13T09:00,3.9 +2025-06-13T10:00,7.7 +2025-06-13T11:00,6.1 +2025-06-13T12:00,9.8 +2025-06-13T13:00,11.4 +2025-06-13T14:00,8.1 +2025-06-13T15:00,5.9 +2025-06-13T16:00,8.1 +2025-06-13T17:00,11.6 +2025-06-13T18:00,5.6 +2025-06-13T19:00,1.0 +2025-06-13T20:00,1.1 +2025-06-13T21:00,6.9 +2025-06-13T22:00,1.0 +2025-06-13T23:00,3.4 +2025-06-14T00:00,1.4 +2025-06-14T01:00,4.6 +2025-06-14T02:00,3.5 +2025-06-14T03:00,4.3 +2025-06-14T04:00,5.1 +2025-06-14T05:00,8.6 +2025-06-14T06:00,9.7 +2025-06-14T07:00,5.8 +2025-06-14T08:00,11.4 +2025-06-14T09:00,12.6 +2025-06-14T10:00,6.8 +2025-06-14T11:00,9.2 +2025-06-14T12:00,6.6 +2025-06-14T13:00,10.8 +2025-06-14T14:00,4.5 +2025-06-14T15:00,3.7 +2025-06-14T16:00,6.4 +2025-06-14T17:00,7.5 +2025-06-14T18:00,1.0 +2025-06-14T19:00,2.5 +2025-06-14T20:00,2.4 +2025-06-14T21:00,3.4 +2025-06-14T22:00,1.0 +2025-06-14T23:00,4.1 +2025-06-15T00:00,1.0 +2025-06-15T01:00,1.0 +2025-06-15T02:00,1.0 +2025-06-15T03:00,1.2 +2025-06-15T04:00,1.0 +2025-06-15T05:00,5.6 +2025-06-15T06:00,2.2 +2025-06-15T07:00,9.3 +2025-06-15T08:00,7.7 +2025-06-15T09:00,9.8 +2025-06-15T10:00,6.5 +2025-06-15T11:00,11.3 +2025-06-15T12:00,10.5 +2025-06-15T13:00,6.5 +2025-06-15T14:00,10.3 +2025-06-15T15:00,7.4 +2025-06-15T16:00,6.2 +2025-06-15T17:00,3.8 +2025-06-15T18:00,8.2 +2025-06-15T19:00,10.1 +2025-06-15T20:00,1.3 +2025-06-15T21:00,2.2 +2025-06-15T22:00,4.1 +2025-06-15T23:00,6.3 +2025-06-16T00:00,4.0 +2025-06-16T01:00,1.0 +2025-06-16T02:00,2.9 +2025-06-16T03:00,3.1 +2025-06-16T04:00,1.0 +2025-06-16T05:00,5.5 +2025-06-16T06:00,1.0 +2025-06-16T07:00,3.4 +2025-06-16T08:00,5.1 +2025-06-16T09:00,9.5 +2025-06-16T10:00,9.5 +2025-06-16T11:00,9.4 +2025-06-16T12:00,10.4 +2025-06-16T13:00,8.6 +2025-06-16T14:00,12.0 +2025-06-16T15:00,11.6 +2025-06-16T16:00,8.8 +2025-06-16T17:00,3.6 +2025-06-16T18:00,3.2 +2025-06-16T19:00,5.9 +2025-06-16T20:00,1.0 +2025-06-16T21:00,6.8 +2025-06-16T22:00,1.0 +2025-06-16T23:00,5.2 +2025-06-17T00:00,1.0 +2025-06-17T01:00,5.8 +2025-06-17T02:00,1.0 +2025-06-17T03:00,6.0 +2025-06-17T04:00,5.6 +2025-06-17T05:00,3.1 +2025-06-17T06:00,3.7 +2025-06-17T07:00,7.4 +2025-06-17T08:00,8.8 +2025-06-17T09:00,7.6 +2025-06-17T10:00,10.7 +2025-06-17T11:00,8.8 +2025-06-17T12:00,10.5 +2025-06-17T13:00,14.7 +2025-06-17T14:00,9.8 +2025-06-17T15:00,11.9 +2025-06-17T16:00,5.4 +2025-06-17T17:00,5.6 +2025-06-17T18:00,8.6 +2025-06-17T19:00,4.4 +2025-06-17T20:00,3.1 +2025-06-17T21:00,2.8 +2025-06-17T22:00,2.8 +2025-06-17T23:00,2.9 +2025-06-18T00:00,6.1 +2025-06-18T01:00,2.3 +2025-06-18T02:00,1.0 +2025-06-18T03:00,4.0 +2025-06-18T04:00,3.5 +2025-06-18T05:00,2.1 +2025-06-18T06:00,4.8 +2025-06-18T07:00,4.3 +2025-06-18T08:00,8.5 +2025-06-18T09:00,8.4 +2025-06-18T10:00,9.1 +2025-06-18T11:00,8.4 +2025-06-18T12:00,8.0 +2025-06-18T13:00,10.0 +2025-06-18T14:00,9.0 +2025-06-18T15:00,10.1 +2025-06-18T16:00,7.8 +2025-06-18T17:00,1.0 +2025-06-18T18:00,1.0 +2025-06-18T19:00,3.3 +2025-06-18T20:00,1.0 +2025-06-18T21:00,1.9 +2025-06-18T22:00,1.0 +2025-06-18T23:00,1.5 +2025-06-19T00:00,1.2 +2025-06-19T01:00,3.3 +2025-06-19T02:00,2.4 +2025-06-19T03:00,1.0 +2025-06-19T04:00,3.8 +2025-06-19T05:00,4.0 +2025-06-19T06:00,1.9 +2025-06-19T07:00,2.9 +2025-06-19T08:00,5.5 +2025-06-19T09:00,9.9 +2025-06-19T10:00,10.4 +2025-06-19T11:00,11.1 +2025-06-19T12:00,5.4 +2025-06-19T13:00,10.8 +2025-06-19T14:00,10.2 +2025-06-19T15:00,6.2 +2025-06-19T16:00,3.5 +2025-06-19T17:00,8.0 +2025-06-19T18:00,8.6 +2025-06-19T19:00,1.2 +2025-06-19T20:00,3.1 +2025-06-19T21:00,5.2 +2025-06-19T22:00,2.0 +2025-06-19T23:00,2.9 +2025-06-20T00:00,1.0 +2025-06-20T01:00,1.0 +2025-06-20T02:00,2.7 +2025-06-20T03:00,6.1 +2025-06-20T04:00,4.7 +2025-06-20T05:00,8.5 +2025-06-20T06:00,6.1 +2025-06-20T07:00,10.1 +2025-06-20T08:00,9.1 +2025-06-20T09:00,9.3 +2025-06-20T10:00,9.6 +2025-06-20T11:00,6.5 +2025-06-20T12:00,8.0 +2025-06-20T13:00,8.3 +2025-06-20T14:00,7.1 +2025-06-20T15:00,6.2 +2025-06-20T16:00,6.0 +2025-06-20T17:00,6.4 +2025-06-20T18:00,3.8 +2025-06-20T19:00,6.3 +2025-06-20T20:00,5.3 +2025-06-20T21:00,6.2 +2025-06-20T22:00,5.1 +2025-06-20T23:00,1.4 +2025-06-21T00:00,1.0 +2025-06-21T01:00,4.6 +2025-06-21T02:00,3.6 +2025-06-21T03:00,1.6 +2025-06-21T04:00,1.0 +2025-06-21T05:00,4.9 +2025-06-21T06:00,7.0 +2025-06-21T07:00,7.6 +2025-06-21T08:00,7.1 +2025-06-21T09:00,11.2 +2025-06-21T10:00,6.9 +2025-06-21T11:00,5.3 +2025-06-21T12:00,7.4 +2025-06-21T13:00,7.7 +2025-06-21T14:00,7.3 +2025-06-21T15:00,6.5 +2025-06-21T16:00,7.0 +2025-06-21T17:00,2.0 +2025-06-21T18:00,7.6 +2025-06-21T19:00,3.4 +2025-06-21T20:00,3.1 +2025-06-21T21:00,1.0 +2025-06-21T22:00,1.0 +2025-06-21T23:00,1.0 +2025-06-22T00:00,1.0 +2025-06-22T01:00,3.4 +2025-06-22T02:00,4.0 +2025-06-22T03:00,4.0 +2025-06-22T04:00,1.4 +2025-06-22T05:00,4.6 +2025-06-22T06:00,3.3 +2025-06-22T07:00,5.8 +2025-06-22T08:00,9.5 +2025-06-22T09:00,7.6 +2025-06-22T10:00,8.1 +2025-06-22T11:00,6.9 +2025-06-22T12:00,11.4 +2025-06-22T13:00,10.2 +2025-06-22T14:00,10.7 +2025-06-22T15:00,8.8 +2025-06-22T16:00,4.9 +2025-06-22T17:00,7.8 +2025-06-22T18:00,7.8 +2025-06-22T19:00,2.9 +2025-06-22T20:00,3.5 +2025-06-22T21:00,1.0 +2025-06-22T22:00,4.3 +2025-06-22T23:00,1.0 +2025-06-23T00:00,3.3 +2025-06-23T01:00,1.8 +2025-06-23T02:00,1.0 +2025-06-23T03:00,2.4 +2025-06-23T04:00,1.0 +2025-06-23T05:00,2.5 +2025-06-23T06:00,7.2 +2025-06-23T07:00,2.0 +2025-06-23T08:00,9.5 +2025-06-23T09:00,6.2 +2025-06-23T10:00,5.4 +2025-06-23T11:00,9.8 +2025-06-23T12:00,13.1 +2025-06-23T13:00,12.7 +2025-06-23T14:00,10.0 +2025-06-23T15:00,9.0 +2025-06-23T16:00,9.7 +2025-06-23T17:00,3.8 +2025-06-23T18:00,6.1 +2025-06-23T19:00,2.1 +2025-06-23T20:00,2.0 +2025-06-23T21:00,7.0 +2025-06-23T22:00,3.9 +2025-06-23T23:00,2.2 +2025-06-24T00:00,1.0 +2025-06-24T01:00,2.7 +2025-06-24T02:00,5.7 +2025-06-24T03:00,1.0 +2025-06-24T04:00,2.0 +2025-06-24T05:00,3.2 +2025-06-24T06:00,2.8 +2025-06-24T07:00,9.0 +2025-06-24T08:00,9.5 +2025-06-24T09:00,2.1 +2025-06-24T10:00,6.6 +2025-06-24T11:00,12.2 +2025-06-24T12:00,11.2 +2025-06-24T13:00,14.2 +2025-06-24T14:00,8.2 +2025-06-24T15:00,13.3 +2025-06-24T16:00,10.4 +2025-06-24T17:00,6.1 +2025-06-24T18:00,4.6 +2025-06-24T19:00,3.4 +2025-06-24T20:00,10.0 +2025-06-24T21:00,4.2 +2025-06-24T22:00,3.3 +2025-06-24T23:00,1.0 +2025-06-25T00:00,2.3 +2025-06-25T01:00,3.5 +2025-06-25T02:00,1.0 +2025-06-25T03:00,5.3 +2025-06-25T04:00,2.4 +2025-06-25T05:00,7.7 +2025-06-25T06:00,2.9 +2025-06-25T07:00,11.2 +2025-06-25T08:00,2.2 +2025-06-25T09:00,11.1 +2025-06-25T10:00,10.5 +2025-06-25T11:00,6.8 +2025-06-25T12:00,11.3 +2025-06-25T13:00,6.7 +2025-06-25T14:00,8.3 +2025-06-25T15:00,5.9 +2025-06-25T16:00,7.1 +2025-06-25T17:00,5.2 +2025-06-25T18:00,8.0 +2025-06-25T19:00,5.0 +2025-06-25T20:00,4.4 +2025-06-25T21:00,1.1 +2025-06-25T22:00,2.7 +2025-06-25T23:00,1.0 +2025-06-26T00:00,1.5 +2025-06-26T01:00,1.0 +2025-06-26T02:00,1.3 +2025-06-26T03:00,1.0 +2025-06-26T04:00,2.9 +2025-06-26T05:00,4.7 +2025-06-26T06:00,4.8 +2025-06-26T07:00,6.2 +2025-06-26T08:00,9.2 +2025-06-26T09:00,4.8 +2025-06-26T10:00,7.1 +2025-06-26T11:00,7.0 +2025-06-26T12:00,7.8 +2025-06-26T13:00,12.8 +2025-06-26T14:00,7.6 +2025-06-26T15:00,9.8 +2025-06-26T16:00,4.1 +2025-06-26T17:00,5.5 +2025-06-26T18:00,8.8 +2025-06-26T19:00,3.7 +2025-06-26T20:00,2.2 +2025-06-26T21:00,1.4 +2025-06-26T22:00,2.6 +2025-06-26T23:00,2.9 +2025-06-27T00:00,1.0 +2025-06-27T01:00,1.2 +2025-06-27T02:00,4.2 +2025-06-27T03:00,2.2 +2025-06-27T04:00,2.4 +2025-06-27T05:00,4.5 +2025-06-27T06:00,6.5 +2025-06-27T07:00,7.2 +2025-06-27T08:00,4.3 +2025-06-27T09:00,10.4 +2025-06-27T10:00,8.7 +2025-06-27T11:00,6.6 +2025-06-27T12:00,10.5 +2025-06-27T13:00,11.0 +2025-06-27T14:00,10.0 +2025-06-27T15:00,8.9 +2025-06-27T16:00,4.6 +2025-06-27T17:00,9.4 +2025-06-27T18:00,5.3 +2025-06-27T19:00,6.5 +2025-06-27T20:00,1.0 +2025-06-27T21:00,1.4 +2025-06-27T22:00,2.6 +2025-06-27T23:00,3.5 +2025-06-28T00:00,2.9 +2025-06-28T01:00,1.0 +2025-06-28T02:00,1.0 +2025-06-28T03:00,2.4 +2025-06-28T04:00,2.8 +2025-06-28T05:00,9.1 +2025-06-28T06:00,9.1 +2025-06-28T07:00,9.1 +2025-06-28T08:00,4.6 +2025-06-28T09:00,7.2 +2025-06-28T10:00,8.8 +2025-06-28T11:00,9.3 +2025-06-28T12:00,9.7 +2025-06-28T13:00,7.2 +2025-06-28T14:00,5.9 +2025-06-28T15:00,5.3 +2025-06-28T16:00,2.8 +2025-06-28T17:00,5.6 +2025-06-28T18:00,4.7 +2025-06-28T19:00,5.1 +2025-06-28T20:00,3.6 +2025-06-28T21:00,2.5 +2025-06-28T22:00,1.0 +2025-06-28T23:00,3.0 +2025-06-29T00:00,1.3 +2025-06-29T01:00,1.0 +2025-06-29T02:00,8.4 +2025-06-29T03:00,3.4 +2025-06-29T04:00,1.0 +2025-06-29T05:00,4.3 +2025-06-29T06:00,7.2 +2025-06-29T07:00,2.8 +2025-06-29T08:00,7.8 +2025-06-29T09:00,7.9 +2025-06-29T10:00,10.9 +2025-06-29T11:00,6.8 +2025-06-29T12:00,8.1 +2025-06-29T13:00,12.2 +2025-06-29T14:00,7.2 +2025-06-29T15:00,2.8 +2025-06-29T16:00,10.1 +2025-06-29T17:00,7.8 +2025-06-29T18:00,7.7 +2025-06-29T19:00,4.9 +2025-06-29T20:00,4.0 +2025-06-29T21:00,1.1 +2025-06-29T22:00,1.0 +2025-06-29T23:00,3.3 +2025-06-30T00:00,1.0 +2025-06-30T01:00,3.0 +2025-06-30T02:00,4.7 +2025-06-30T03:00,2.0 +2025-06-30T04:00,1.4 +2025-06-30T05:00,3.1 +2025-06-30T06:00,4.0 +2025-06-30T07:00,3.1 +2025-06-30T08:00,3.0 +2025-06-30T09:00,9.2 +2025-06-30T10:00,9.0 +2025-06-30T11:00,4.8 +2025-06-30T12:00,7.4 +2025-06-30T13:00,3.1 +2025-06-30T14:00,5.5 +2025-06-30T15:00,8.4 +2025-06-30T16:00,2.7 +2025-06-30T17:00,6.3 +2025-06-30T18:00,4.2 +2025-06-30T19:00,2.5 +2025-06-30T20:00,3.0 +2025-06-30T21:00,4.4 +2025-06-30T22:00,2.5 +2025-06-30T23:00,2.9 +2025-07-01T00:00,1.0 +2025-07-01T01:00,2.8 +2025-07-01T02:00,1.0 +2025-07-01T03:00,2.6 +2025-07-01T04:00,3.7 +2025-07-01T05:00,2.8 +2025-07-01T06:00,9.1 +2025-07-01T07:00,3.5 +2025-07-01T08:00,4.1 +2025-07-01T09:00,6.6 +2025-07-01T10:00,7.3 +2025-07-01T11:00,14.8 +2025-07-01T12:00,8.3 +2025-07-01T13:00,10.7 +2025-07-01T14:00,10.2 +2025-07-01T15:00,10.4 +2025-07-01T16:00,9.3 +2025-07-01T17:00,8.9 +2025-07-01T18:00,8.0 +2025-07-01T19:00,8.3 +2025-07-01T20:00,3.1 +2025-07-01T21:00,4.4 +2025-07-01T22:00,4.4 +2025-07-01T23:00,1.9 +2025-07-02T00:00,1.0 +2025-07-02T01:00,1.8 +2025-07-02T02:00,1.0 +2025-07-02T03:00,3.1 +2025-07-02T04:00,4.7 +2025-07-02T05:00,1.7 +2025-07-02T06:00,5.6 +2025-07-02T07:00,5.7 +2025-07-02T08:00,9.0 +2025-07-02T09:00,7.5 +2025-07-02T10:00,12.4 +2025-07-02T11:00,8.4 +2025-07-02T12:00,7.9 +2025-07-02T13:00,9.0 +2025-07-02T14:00,7.1 +2025-07-02T15:00,6.0 +2025-07-02T16:00,6.8 +2025-07-02T17:00,2.8 +2025-07-02T18:00,9.4 +2025-07-02T19:00,1.0 +2025-07-02T20:00,2.5 +2025-07-02T21:00,2.0 +2025-07-02T22:00,1.5 +2025-07-02T23:00,1.0 +2025-07-03T00:00,1.2 +2025-07-03T01:00,7.2 +2025-07-03T02:00,1.4 +2025-07-03T03:00,1.9 +2025-07-03T04:00,10.5 +2025-07-03T05:00,3.5 +2025-07-03T06:00,3.6 +2025-07-03T07:00,5.1 +2025-07-03T08:00,6.5 +2025-07-03T09:00,5.8 +2025-07-03T10:00,5.7 +2025-07-03T11:00,8.9 +2025-07-03T12:00,6.5 +2025-07-03T13:00,10.1 +2025-07-03T14:00,5.1 +2025-07-03T15:00,7.6 +2025-07-03T16:00,9.4 +2025-07-03T17:00,7.7 +2025-07-03T18:00,6.3 +2025-07-03T19:00,1.6 +2025-07-03T20:00,2.9 +2025-07-03T21:00,1.0 +2025-07-03T22:00,1.0 +2025-07-03T23:00,4.2 +2025-07-04T00:00,1.0 +2025-07-04T01:00,1.5 +2025-07-04T02:00,3.8 +2025-07-04T03:00,2.6 +2025-07-04T04:00,7.4 +2025-07-04T05:00,5.5 +2025-07-04T06:00,3.6 +2025-07-04T07:00,3.6 +2025-07-04T08:00,8.4 +2025-07-04T09:00,8.4 +2025-07-04T10:00,8.2 +2025-07-04T11:00,5.1 +2025-07-04T12:00,6.3 +2025-07-04T13:00,8.9 +2025-07-04T14:00,10.2 +2025-07-04T15:00,8.7 +2025-07-04T16:00,9.3 +2025-07-04T17:00,5.7 +2025-07-04T18:00,2.4 +2025-07-04T19:00,9.4 +2025-07-04T20:00,1.0 +2025-07-04T21:00,2.3 +2025-07-04T22:00,1.0 +2025-07-04T23:00,6.1 +2025-07-05T00:00,4.0 +2025-07-05T01:00,1.0 +2025-07-05T02:00,5.0 +2025-07-05T03:00,2.5 +2025-07-05T04:00,1.0 +2025-07-05T05:00,6.1 +2025-07-05T06:00,2.3 +2025-07-05T07:00,4.7 +2025-07-05T08:00,9.8 +2025-07-05T09:00,10.6 +2025-07-05T10:00,7.3 +2025-07-05T11:00,11.0 +2025-07-05T12:00,9.6 +2025-07-05T13:00,8.5 +2025-07-05T14:00,7.6 +2025-07-05T15:00,9.2 +2025-07-05T16:00,8.6 +2025-07-05T17:00,5.0 +2025-07-05T18:00,1.1 +2025-07-05T19:00,1.0 +2025-07-05T20:00,1.9 +2025-07-05T21:00,6.1 +2025-07-05T22:00,1.0 +2025-07-05T23:00,1.0 +2025-07-06T00:00,5.9 +2025-07-06T01:00,1.0 +2025-07-06T02:00,5.9 +2025-07-06T03:00,6.0 +2025-07-06T04:00,1.0 +2025-07-06T05:00,3.7 +2025-07-06T06:00,5.0 +2025-07-06T07:00,4.1 +2025-07-06T08:00,8.3 +2025-07-06T09:00,9.3 +2025-07-06T10:00,7.6 +2025-07-06T11:00,4.8 +2025-07-06T12:00,9.6 +2025-07-06T13:00,10.3 +2025-07-06T14:00,5.0 +2025-07-06T15:00,9.3 +2025-07-06T16:00,5.6 +2025-07-06T17:00,7.9 +2025-07-06T18:00,3.4 +2025-07-06T19:00,1.0 +2025-07-06T20:00,4.0 +2025-07-06T21:00,1.0 +2025-07-06T22:00,1.0 +2025-07-06T23:00,1.0 +2025-07-07T00:00,1.0 +2025-07-07T01:00,1.6 +2025-07-07T02:00,1.1 +2025-07-07T03:00,8.1 +2025-07-07T04:00,1.0 +2025-07-07T05:00,1.5 +2025-07-07T06:00,6.8 +2025-07-07T07:00,8.1 +2025-07-07T08:00,1.8 +2025-07-07T09:00,8.3 +2025-07-07T10:00,9.1 +2025-07-07T11:00,10.5 +2025-07-07T12:00,9.3 +2025-07-07T13:00,4.6 +2025-07-07T14:00,4.7 +2025-07-07T15:00,5.9 +2025-07-07T16:00,5.1 +2025-07-07T17:00,6.1 +2025-07-07T18:00,1.9 +2025-07-07T19:00,5.9 +2025-07-07T20:00,2.5 +2025-07-07T21:00,5.9 +2025-07-07T22:00,1.0 +2025-07-07T23:00,3.1 +2025-07-08T00:00,1.0 +2025-07-08T01:00,2.6 +2025-07-08T02:00,1.0 +2025-07-08T03:00,6.8 +2025-07-08T04:00,1.0 +2025-07-08T05:00,5.5 +2025-07-08T06:00,9.4 +2025-07-08T07:00,10.5 +2025-07-08T08:00,6.4 +2025-07-08T09:00,5.6 +2025-07-08T10:00,5.4 +2025-07-08T11:00,12.1 +2025-07-08T12:00,6.3 +2025-07-08T13:00,10.7 +2025-07-08T14:00,11.3 +2025-07-08T15:00,8.2 +2025-07-08T16:00,10.7 +2025-07-08T17:00,8.0 +2025-07-08T18:00,6.3 +2025-07-08T19:00,1.0 +2025-07-08T20:00,5.0 +2025-07-08T21:00,3.1 +2025-07-08T22:00,1.0 +2025-07-08T23:00,1.0 +2025-07-09T00:00,1.0 +2025-07-09T01:00,1.0 +2025-07-09T02:00,1.7 +2025-07-09T03:00,4.2 +2025-07-09T04:00,5.8 +2025-07-09T05:00,5.8 +2025-07-09T06:00,9.0 +2025-07-09T07:00,9.0 +2025-07-09T08:00,7.9 +2025-07-09T09:00,11.1 +2025-07-09T10:00,8.2 +2025-07-09T11:00,7.5 +2025-07-09T12:00,7.2 +2025-07-09T13:00,10.3 +2025-07-09T14:00,3.3 +2025-07-09T15:00,8.8 +2025-07-09T16:00,5.0 +2025-07-09T17:00,7.8 +2025-07-09T18:00,3.1 +2025-07-09T19:00,5.6 +2025-07-09T20:00,5.7 +2025-07-09T21:00,4.0 +2025-07-09T22:00,2.0 +2025-07-09T23:00,2.7 +2025-07-10T00:00,1.4 +2025-07-10T01:00,5.0 +2025-07-10T02:00,2.2 +2025-07-10T03:00,4.5 +2025-07-10T04:00,1.0 +2025-07-10T05:00,1.0 +2025-07-10T06:00,5.5 +2025-07-10T07:00,11.1 +2025-07-10T08:00,3.5 +2025-07-10T09:00,10.6 +2025-07-10T10:00,3.5 +2025-07-10T11:00,7.0 +2025-07-10T12:00,10.4 +2025-07-10T13:00,6.7 +2025-07-10T14:00,10.2 +2025-07-10T15:00,5.3 +2025-07-10T16:00,2.1 +2025-07-10T17:00,6.4 +2025-07-10T18:00,4.2 +2025-07-10T19:00,1.0 +2025-07-10T20:00,2.2 +2025-07-10T21:00,4.1 +2025-07-10T22:00,1.0 +2025-07-10T23:00,1.0 +2025-07-11T00:00,3.1 +2025-07-11T01:00,2.9 +2025-07-11T02:00,1.0 +2025-07-11T03:00,1.3 +2025-07-11T04:00,3.8 +2025-07-11T05:00,2.7 +2025-07-11T06:00,3.6 +2025-07-11T07:00,8.5 +2025-07-11T08:00,2.8 +2025-07-11T09:00,12.8 +2025-07-11T10:00,9.0 +2025-07-11T11:00,7.4 +2025-07-11T12:00,12.8 +2025-07-11T13:00,12.3 +2025-07-11T14:00,11.7 +2025-07-11T15:00,5.6 +2025-07-11T16:00,7.0 +2025-07-11T17:00,4.6 +2025-07-11T18:00,5.2 +2025-07-11T19:00,6.6 +2025-07-11T20:00,8.0 +2025-07-11T21:00,1.0 +2025-07-11T22:00,5.7 +2025-07-11T23:00,1.0 +2025-07-12T00:00,1.0 +2025-07-12T01:00,1.0 +2025-07-12T02:00,1.0 +2025-07-12T03:00,1.6 +2025-07-12T04:00,9.4 +2025-07-12T05:00,3.0 +2025-07-12T06:00,7.3 +2025-07-12T07:00,6.6 +2025-07-12T08:00,4.6 +2025-07-12T09:00,9.0 +2025-07-12T10:00,5.4 +2025-07-12T11:00,10.5 +2025-07-12T12:00,10.0 +2025-07-12T13:00,7.6 +2025-07-12T14:00,10.3 +2025-07-12T15:00,6.9 +2025-07-12T16:00,8.6 +2025-07-12T17:00,2.9 +2025-07-12T18:00,1.0 +2025-07-12T19:00,2.8 +2025-07-12T20:00,1.7 +2025-07-12T21:00,1.0 +2025-07-12T22:00,1.7 +2025-07-12T23:00,1.0 +2025-07-13T00:00,4.5 +2025-07-13T01:00,1.0 +2025-07-13T02:00,2.8 +2025-07-13T03:00,1.0 +2025-07-13T04:00,2.3 +2025-07-13T05:00,4.1 +2025-07-13T06:00,8.1 +2025-07-13T07:00,3.2 +2025-07-13T08:00,8.8 +2025-07-13T09:00,8.9 +2025-07-13T10:00,8.9 +2025-07-13T11:00,4.2 +2025-07-13T12:00,10.9 +2025-07-13T13:00,10.2 +2025-07-13T14:00,5.9 +2025-07-13T15:00,7.7 +2025-07-13T16:00,5.7 +2025-07-13T17:00,11.5 +2025-07-13T18:00,4.2 +2025-07-13T19:00,5.6 +2025-07-13T20:00,2.6 +2025-07-13T21:00,1.0 +2025-07-13T22:00,2.7 +2025-07-13T23:00,1.0 +2025-07-14T00:00,1.0 +2025-07-14T01:00,3.2 +2025-07-14T02:00,1.3 +2025-07-14T03:00,1.0 +2025-07-14T04:00,2.7 +2025-07-14T05:00,4.4 +2025-07-14T06:00,4.4 +2025-07-14T07:00,7.3 +2025-07-14T08:00,6.3 +2025-07-14T09:00,9.8 +2025-07-14T10:00,7.6 +2025-07-14T11:00,8.2 +2025-07-14T12:00,10.3 +2025-07-14T13:00,11.7 +2025-07-14T14:00,8.3 +2025-07-14T15:00,7.0 +2025-07-14T16:00,3.6 +2025-07-14T17:00,6.9 +2025-07-14T18:00,4.6 +2025-07-14T19:00,2.8 +2025-07-14T20:00,4.2 +2025-07-14T21:00,5.4 +2025-07-14T22:00,7.6 +2025-07-14T23:00,1.0 +2025-07-15T00:00,1.0 +2025-07-15T01:00,3.8 +2025-07-15T02:00,1.0 +2025-07-15T03:00,5.9 +2025-07-15T04:00,4.1 +2025-07-15T05:00,5.8 +2025-07-15T06:00,3.2 +2025-07-15T07:00,6.0 +2025-07-15T08:00,7.8 +2025-07-15T09:00,2.9 +2025-07-15T10:00,9.2 +2025-07-15T11:00,10.7 +2025-07-15T12:00,10.0 +2025-07-15T13:00,9.7 +2025-07-15T14:00,9.1 +2025-07-15T15:00,7.8 +2025-07-15T16:00,9.0 +2025-07-15T17:00,3.8 +2025-07-15T18:00,6.5 +2025-07-15T19:00,3.1 +2025-07-15T20:00,2.1 +2025-07-15T21:00,1.0 +2025-07-15T22:00,1.0 +2025-07-15T23:00,1.6 +2025-07-16T00:00,1.0 +2025-07-16T01:00,1.0 +2025-07-16T02:00,1.6 +2025-07-16T03:00,1.0 +2025-07-16T04:00,4.4 +2025-07-16T05:00,8.2 +2025-07-16T06:00,4.0 +2025-07-16T07:00,4.7 +2025-07-16T08:00,9.7 +2025-07-16T09:00,4.8 +2025-07-16T10:00,8.4 +2025-07-16T11:00,10.1 +2025-07-16T12:00,6.7 +2025-07-16T13:00,6.7 +2025-07-16T14:00,7.5 +2025-07-16T15:00,8.8 +2025-07-16T16:00,4.5 +2025-07-16T17:00,5.7 +2025-07-16T18:00,2.4 +2025-07-16T19:00,4.5 +2025-07-16T20:00,9.0 +2025-07-16T21:00,5.3 +2025-07-16T22:00,3.0 +2025-07-16T23:00,1.6 +2025-07-17T00:00,1.0 +2025-07-17T01:00,1.0 +2025-07-17T02:00,6.8 +2025-07-17T03:00,1.0 +2025-07-17T04:00,5.5 +2025-07-17T05:00,2.6 +2025-07-17T06:00,8.8 +2025-07-17T07:00,7.1 +2025-07-17T08:00,12.6 +2025-07-17T09:00,13.3 +2025-07-17T10:00,9.7 +2025-07-17T11:00,9.5 +2025-07-17T12:00,12.9 +2025-07-17T13:00,6.9 +2025-07-17T14:00,8.8 +2025-07-17T15:00,9.1 +2025-07-17T16:00,4.4 +2025-07-17T17:00,7.9 +2025-07-17T18:00,6.0 +2025-07-17T19:00,1.0 +2025-07-17T20:00,4.5 +2025-07-17T21:00,1.0 +2025-07-17T22:00,1.0 +2025-07-17T23:00,1.0 +2025-07-18T00:00,1.0 +2025-07-18T01:00,1.0 +2025-07-18T02:00,1.9 +2025-07-18T03:00,4.7 +2025-07-18T04:00,1.4 +2025-07-18T05:00,3.8 +2025-07-18T06:00,5.1 +2025-07-18T07:00,7.6 +2025-07-18T08:00,4.7 +2025-07-18T09:00,9.6 +2025-07-18T10:00,4.8 +2025-07-18T11:00,9.6 +2025-07-18T12:00,7.6 +2025-07-18T13:00,6.8 +2025-07-18T14:00,10.0 +2025-07-18T15:00,12.1 +2025-07-18T16:00,8.9 +2025-07-18T17:00,6.4 +2025-07-18T18:00,9.0 +2025-07-18T19:00,1.0 +2025-07-18T20:00,3.6 +2025-07-18T21:00,6.8 +2025-07-18T22:00,1.7 +2025-07-18T23:00,2.6 +2025-07-19T00:00,4.3 +2025-07-19T01:00,1.0 +2025-07-19T02:00,5.4 +2025-07-19T03:00,6.1 +2025-07-19T04:00,1.5 +2025-07-19T05:00,3.2 +2025-07-19T06:00,10.0 +2025-07-19T07:00,7.5 +2025-07-19T08:00,8.9 +2025-07-19T09:00,7.7 +2025-07-19T10:00,9.5 +2025-07-19T11:00,10.4 +2025-07-19T12:00,9.8 +2025-07-19T13:00,13.2 +2025-07-19T14:00,9.7 +2025-07-19T15:00,3.4 +2025-07-19T16:00,8.1 +2025-07-19T17:00,1.8 +2025-07-19T18:00,5.3 +2025-07-19T19:00,1.8 +2025-07-19T20:00,5.8 +2025-07-19T21:00,1.1 +2025-07-19T22:00,4.2 +2025-07-19T23:00,3.4 +2025-07-20T00:00,1.0 +2025-07-20T01:00,3.6 +2025-07-20T02:00,3.8 +2025-07-20T03:00,1.0 +2025-07-20T04:00,1.0 +2025-07-20T05:00,4.6 +2025-07-20T06:00,7.2 +2025-07-20T07:00,7.0 +2025-07-20T08:00,11.5 +2025-07-20T09:00,8.3 +2025-07-20T10:00,8.9 +2025-07-20T11:00,11.3 +2025-07-20T12:00,11.7 +2025-07-20T13:00,7.9 +2025-07-20T14:00,11.4 +2025-07-20T15:00,12.4 +2025-07-20T16:00,10.8 +2025-07-20T17:00,11.8 +2025-07-20T18:00,5.6 +2025-07-20T19:00,2.3 +2025-07-20T20:00,8.5 +2025-07-20T21:00,4.3 +2025-07-20T22:00,5.4 +2025-07-20T23:00,1.3 +2025-07-21T00:00,2.4 +2025-07-21T01:00,3.8 +2025-07-21T02:00,4.2 +2025-07-21T03:00,2.4 +2025-07-21T04:00,3.0 +2025-07-21T05:00,4.4 +2025-07-21T06:00,7.9 +2025-07-21T07:00,5.4 +2025-07-21T08:00,8.4 +2025-07-21T09:00,5.1 +2025-07-21T10:00,8.2 +2025-07-21T11:00,11.9 +2025-07-21T12:00,10.2 +2025-07-21T13:00,8.5 +2025-07-21T14:00,7.3 +2025-07-21T15:00,9.6 +2025-07-21T16:00,4.6 +2025-07-21T17:00,4.8 +2025-07-21T18:00,8.9 +2025-07-21T19:00,4.3 +2025-07-21T20:00,4.4 +2025-07-21T21:00,2.4 +2025-07-21T22:00,3.5 +2025-07-21T23:00,1.0 +2025-07-22T00:00,1.0 +2025-07-22T01:00,2.7 +2025-07-22T02:00,1.0 +2025-07-22T03:00,1.0 +2025-07-22T04:00,4.8 +2025-07-22T05:00,3.6 +2025-07-22T06:00,6.5 +2025-07-22T07:00,8.0 +2025-07-22T08:00,4.3 +2025-07-22T09:00,8.1 +2025-07-22T10:00,6.8 +2025-07-22T11:00,10.2 +2025-07-22T12:00,14.2 +2025-07-22T13:00,14.6 +2025-07-22T14:00,9.7 +2025-07-22T15:00,6.9 +2025-07-22T16:00,4.8 +2025-07-22T17:00,4.3 +2025-07-22T18:00,6.5 +2025-07-22T19:00,2.0 +2025-07-22T20:00,3.2 +2025-07-22T21:00,1.5 +2025-07-22T22:00,2.9 +2025-07-22T23:00,1.0 +2025-07-23T00:00,1.0 +2025-07-23T01:00,3.7 +2025-07-23T02:00,2.6 +2025-07-23T03:00,3.2 +2025-07-23T04:00,5.4 +2025-07-23T05:00,6.8 +2025-07-23T06:00,6.7 +2025-07-23T07:00,5.9 +2025-07-23T08:00,8.1 +2025-07-23T09:00,7.3 +2025-07-23T10:00,5.9 +2025-07-23T11:00,8.2 +2025-07-23T12:00,7.7 +2025-07-23T13:00,15.5 +2025-07-23T14:00,13.0 +2025-07-23T15:00,10.1 +2025-07-23T16:00,9.1 +2025-07-23T17:00,9.6 +2025-07-23T18:00,3.8 +2025-07-23T19:00,6.9 +2025-07-23T20:00,4.3 +2025-07-23T21:00,2.5 +2025-07-23T22:00,1.0 +2025-07-23T23:00,1.0 +2025-07-24T00:00,1.0 +2025-07-24T01:00,6.3 +2025-07-24T02:00,4.0 +2025-07-24T03:00,2.0 +2025-07-24T04:00,4.6 +2025-07-24T05:00,5.6 +2025-07-24T06:00,8.7 +2025-07-24T07:00,9.8 +2025-07-24T08:00,6.6 +2025-07-24T09:00,8.1 +2025-07-24T10:00,7.8 +2025-07-24T11:00,7.7 +2025-07-24T12:00,7.4 +2025-07-24T13:00,7.2 +2025-07-24T14:00,8.3 +2025-07-24T15:00,5.4 +2025-07-24T16:00,10.2 +2025-07-24T17:00,5.8 +2025-07-24T18:00,2.6 +2025-07-24T19:00,4.7 +2025-07-24T20:00,5.5 +2025-07-24T21:00,4.4 +2025-07-24T22:00,1.0 +2025-07-24T23:00,1.0 +2025-07-25T00:00,1.0 +2025-07-25T01:00,1.0 +2025-07-25T02:00,5.6 +2025-07-25T03:00,1.0 +2025-07-25T04:00,3.9 +2025-07-25T05:00,5.8 +2025-07-25T06:00,2.8 +2025-07-25T07:00,4.7 +2025-07-25T08:00,7.2 +2025-07-25T09:00,8.3 +2025-07-25T10:00,6.0 +2025-07-25T11:00,9.6 +2025-07-25T12:00,8.9 +2025-07-25T13:00,9.3 +2025-07-25T14:00,9.9 +2025-07-25T15:00,13.0 +2025-07-25T16:00,8.5 +2025-07-25T17:00,3.8 +2025-07-25T18:00,6.2 +2025-07-25T19:00,2.6 +2025-07-25T20:00,5.8 +2025-07-25T21:00,1.5 +2025-07-25T22:00,1.0 +2025-07-25T23:00,3.2 +2025-07-26T00:00,3.6 +2025-07-26T01:00,1.0 +2025-07-26T02:00,4.8 +2025-07-26T03:00,2.8 +2025-07-26T04:00,3.1 +2025-07-26T05:00,6.3 +2025-07-26T06:00,4.2 +2025-07-26T07:00,4.6 +2025-07-26T08:00,11.2 +2025-07-26T09:00,8.0 +2025-07-26T10:00,5.3 +2025-07-26T11:00,10.6 +2025-07-26T12:00,7.4 +2025-07-26T13:00,12.4 +2025-07-26T14:00,10.0 +2025-07-26T15:00,7.8 +2025-07-26T16:00,7.9 +2025-07-26T17:00,8.4 +2025-07-26T18:00,7.5 +2025-07-26T19:00,6.7 +2025-07-26T20:00,4.1 +2025-07-26T21:00,1.0 +2025-07-26T22:00,1.8 +2025-07-26T23:00,1.0 +2025-07-27T00:00,3.5 +2025-07-27T01:00,3.2 +2025-07-27T02:00,1.0 +2025-07-27T03:00,1.8 +2025-07-27T04:00,2.2 +2025-07-27T05:00,1.4 +2025-07-27T06:00,1.1 +2025-07-27T07:00,6.9 +2025-07-27T08:00,9.5 +2025-07-27T09:00,8.9 +2025-07-27T10:00,12.9 +2025-07-27T11:00,12.6 +2025-07-27T12:00,16.7 +2025-07-27T13:00,8.8 +2025-07-27T14:00,10.4 +2025-07-27T15:00,12.5 +2025-07-27T16:00,5.4 +2025-07-27T17:00,8.2 +2025-07-27T18:00,8.4 +2025-07-27T19:00,3.8 +2025-07-27T20:00,1.0 +2025-07-27T21:00,1.0 +2025-07-27T22:00,2.4 +2025-07-27T23:00,5.6 +2025-07-28T00:00,4.2 +2025-07-28T01:00,1.0 +2025-07-28T02:00,2.6 +2025-07-28T03:00,4.8 +2025-07-28T04:00,6.4 +2025-07-28T05:00,6.4 +2025-07-28T06:00,4.1 +2025-07-28T07:00,3.3 diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-renamed/case.json b/agents/evals/fixtures/cases/line-timeseries-pygal-renamed/case.json new file mode 100644 index 00000000000..4a133c27689 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-renamed/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "line-timeseries", + "library": "pygal", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "date", + "column": "Messdatum" + }, + { + "role": "value", + "column": "Feinstaub PM2,5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "renamed", + "synthetic", + "renamed-headers", + "non-ascii-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, renamed)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-renamed/data.csv b/agents/evals/fixtures/cases/line-timeseries-pygal-renamed/data.csv new file mode 100644 index 00000000000..1acececa252 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-renamed/data.csv @@ -0,0 +1,366 @@ +Messdatum,"Feinstaub PM2,5 (µg/m³)" +2025-01-01,17.9 +2025-01-02,24.6 +2025-01-03,22.3 +2025-01-04,19.7 +2025-01-05,24.6 +2025-01-06,18.5 +2025-01-07,24.3 +2025-01-08,27.0 +2025-01-09,19.5 +2025-01-10,23.5 +2025-01-11,22.1 +2025-01-12,18.0 +2025-01-13,23.4 +2025-01-14,17.7 +2025-01-15,23.4 +2025-01-16,27.7 +2025-01-17,25.0 +2025-01-18,25.4 +2025-01-19,27.6 +2025-01-20,21.4 +2025-01-21,27.6 +2025-01-22,23.7 +2025-01-23,15.1 +2025-01-24,21.3 +2025-01-25,19.2 +2025-01-26,20.5 +2025-01-27,22.6 +2025-01-28,19.9 +2025-01-29,19.4 +2025-01-30,22.3 +2025-01-31,23.3 +2025-02-01,16.0 +2025-02-02,23.0 +2025-02-03,24.3 +2025-02-04,19.1 +2025-02-05,24.0 +2025-02-06,26.4 +2025-02-07,21.2 +2025-02-08,21.2 +2025-02-09,19.0 +2025-02-10,19.3 +2025-02-11,22.2 +2025-02-12,17.0 +2025-02-13,21.7 +2025-02-14,22.9 +2025-02-15,23.2 +2025-02-16,17.4 +2025-02-17,15.9 +2025-02-18,24.8 +2025-02-19,15.1 +2025-02-20,18.2 +2025-02-21,18.8 +2025-02-22,20.0 +2025-02-23,19.5 +2025-02-24,16.1 +2025-02-25,19.4 +2025-02-26,14.9 +2025-02-27,16.9 +2025-02-28,13.7 +2025-03-01,16.2 +2025-03-02,17.4 +2025-03-03,17.6 +2025-03-04,18.8 +2025-03-05,18.1 +2025-03-06,14.9 +2025-03-07,21.0 +2025-03-08,18.6 +2025-03-09,19.7 +2025-03-10,21.0 +2025-03-11,18.8 +2025-03-12,15.6 +2025-03-13,21.5 +2025-03-14,19.8 +2025-03-15,20.0 +2025-03-16,13.3 +2025-03-17,18.1 +2025-03-18,19.4 +2025-03-19,18.5 +2025-03-20,11.2 +2025-03-21,13.9 +2025-03-22,14.1 +2025-03-23,17.1 +2025-03-24,17.4 +2025-03-25,16.5 +2025-03-26,12.9 +2025-03-27,17.8 +2025-03-28,12.5 +2025-03-29,13.4 +2025-03-30,17.2 +2025-03-31,14.9 +2025-04-01,13.2 +2025-04-02,11.7 +2025-04-03,12.6 +2025-04-04,13.2 +2025-04-05,13.4 +2025-04-06,13.9 +2025-04-07,12.0 +2025-04-08,12.9 +2025-04-09,14.9 +2025-04-10,14.9 +2025-04-11,14.0 +2025-04-12,11.7 +2025-04-13,17.6 +2025-04-14,13.3 +2025-04-15,13.7 +2025-04-16,14.3 +2025-04-17,12.6 +2025-04-18,6.9 +2025-04-19,15.9 +2025-04-20,9.3 +2025-04-21,12.4 +2025-04-22,11.9 +2025-04-23,9.2 +2025-04-24,14.0 +2025-04-25,10.5 +2025-04-26,3.5 +2025-04-27,13.9 +2025-04-28,9.8 +2025-04-29,12.6 +2025-04-30,10.1 +2025-05-01,8.7 +2025-05-02,8.4 +2025-05-03,7.9 +2025-05-04,11.6 +2025-05-05,10.4 +2025-05-06,8.5 +2025-05-07,4.8 +2025-05-08,6.6 +2025-05-09,5.8 +2025-05-10,8.1 +2025-05-11,7.7 +2025-05-12,3.0 +2025-05-13,11.8 +2025-05-14,2.0 +2025-05-15,4.9 +2025-05-16,5.6 +2025-05-17,13.2 +2025-05-18,5.6 +2025-05-19,8.5 +2025-05-20,10.2 +2025-05-21,8.9 +2025-05-22,13.2 +2025-05-23,9.8 +2025-05-24,11.2 +2025-05-25,10.2 +2025-05-26,11.0 +2025-05-27,2.7 +2025-05-28,8.0 +2025-05-29,4.9 +2025-05-30,6.1 +2025-05-31,8.3 +2025-06-01,5.0 +2025-06-02,5.5 +2025-06-03,1.0 +2025-06-04,5.8 +2025-06-05,13.9 +2025-06-06,1.0 +2025-06-07,6.7 +2025-06-08,2.8 +2025-06-09,6.8 +2025-06-10,7.7 +2025-06-11,1.8 +2025-06-12,5.2 +2025-06-13,6.9 +2025-06-14,9.8 +2025-06-15,3.7 +2025-06-16,5.5 +2025-06-17,9.5 +2025-06-18,7.0 +2025-06-19,2.0 +2025-06-20,10.5 +2025-06-21,5.8 +2025-06-22,9.9 +2025-06-23,8.1 +2025-06-24,9.7 +2025-06-25,6.0 +2025-06-26,1.0 +2025-06-27,10.1 +2025-06-28,5.7 +2025-06-29,5.4 +2025-06-30,1.7 +2025-07-01,1.0 +2025-07-02,4.1 +2025-07-03,9.5 +2025-07-04,6.5 +2025-07-05,6.7 +2025-07-06,6.0 +2025-07-07,6.6 +2025-07-08,6.2 +2025-07-09,1.0 +2025-07-10,3.9 +2025-07-11,3.2 +2025-07-12,7.3 +2025-07-13,8.5 +2025-07-14,5.7 +2025-07-15,1.0 +2025-07-16,5.3 +2025-07-17,2.0 +2025-07-18,5.3 +2025-07-19,11.1 +2025-07-20,1.0 +2025-07-21,5.9 +2025-07-22,7.5 +2025-07-23,10.8 +2025-07-24,4.7 +2025-07-25,3.9 +2025-07-26,5.6 +2025-07-27,4.3 +2025-07-28,6.9 +2025-07-29,7.3 +2025-07-30,11.5 +2025-07-31,6.4 +2025-08-01,3.3 +2025-08-02,4.5 +2025-08-03,5.9 +2025-08-04,8.8 +2025-08-05,4.1 +2025-08-06,1.0 +2025-08-07,4.9 +2025-08-08,6.5 +2025-08-09,2.7 +2025-08-10,7.3 +2025-08-11,14.3 +2025-08-12,4.8 +2025-08-13,9.0 +2025-08-14,7.6 +2025-08-15,9.1 +2025-08-16,9.1 +2025-08-17,1.0 +2025-08-18,5.4 +2025-08-19,10.8 +2025-08-20,11.0 +2025-08-21,5.4 +2025-08-22,7.8 +2025-08-23,4.6 +2025-08-24,7.1 +2025-08-25,10.3 +2025-08-26,10.0 +2025-08-27,8.1 +2025-08-28,10.8 +2025-08-29,6.1 +2025-08-30,12.0 +2025-08-31,12.1 +2025-09-01,10.2 +2025-09-02,8.0 +2025-09-03,8.6 +2025-09-04,6.4 +2025-09-05,10.7 +2025-09-06,9.6 +2025-09-07,16.1 +2025-09-08,15.1 +2025-09-09,10.9 +2025-09-10,12.6 +2025-09-11,8.1 +2025-09-12,9.8 +2025-09-13,10.3 +2025-09-14,15.2 +2025-09-15,6.7 +2025-09-16,13.8 +2025-09-17,15.9 +2025-09-18,15.9 +2025-09-19,12.7 +2025-09-20,11.9 +2025-09-21,11.2 +2025-09-22,12.6 +2025-09-23,10.3 +2025-09-24,15.6 +2025-09-25,15.9 +2025-09-26,16.0 +2025-09-27,15.7 +2025-09-28,16.3 +2025-09-29,17.1 +2025-09-30,13.0 +2025-10-01,9.4 +2025-10-02,13.8 +2025-10-03,15.5 +2025-10-04,16.7 +2025-10-05,7.5 +2025-10-06,15.5 +2025-10-07,14.6 +2025-10-08,8.4 +2025-10-09,12.4 +2025-10-10,14.0 +2025-10-11,19.5 +2025-10-12,16.5 +2025-10-13,16.2 +2025-10-14,20.3 +2025-10-15,13.1 +2025-10-16,11.8 +2025-10-17,16.5 +2025-10-18,17.6 +2025-10-19,14.6 +2025-10-20,17.0 +2025-10-21,23.6 +2025-10-22,13.7 +2025-10-23,22.0 +2025-10-24,20.6 +2025-10-25,19.7 +2025-10-26,16.0 +2025-10-27,16.8 +2025-10-28,20.3 +2025-10-29,22.0 +2025-10-30,12.7 +2025-10-31,22.1 +2025-11-01,15.8 +2025-11-02,14.0 +2025-11-03,18.2 +2025-11-04,22.0 +2025-11-05,19.9 +2025-11-06,14.6 +2025-11-07,18.6 +2025-11-08,23.5 +2025-11-09,18.2 +2025-11-10,21.3 +2025-11-11,19.6 +2025-11-12,21.4 +2025-11-13,24.2 +2025-11-14,23.5 +2025-11-15,24.8 +2025-11-16,20.7 +2025-11-17,15.9 +2025-11-18,22.3 +2025-11-19,18.0 +2025-11-20,19.9 +2025-11-21,27.6 +2025-11-22,20.2 +2025-11-23,21.4 +2025-11-24,19.1 +2025-11-25,24.8 +2025-11-26,26.6 +2025-11-27,20.4 +2025-11-28,18.0 +2025-11-29,22.4 +2025-11-30,22.0 +2025-12-01,26.8 +2025-12-02,23.8 +2025-12-03,25.2 +2025-12-04,19.9 +2025-12-05,25.3 +2025-12-06,27.0 +2025-12-07,22.7 +2025-12-08,27.2 +2025-12-09,21.1 +2025-12-10,26.7 +2025-12-11,20.8 +2025-12-12,23.9 +2025-12-13,25.4 +2025-12-14,26.1 +2025-12-15,22.2 +2025-12-16,22.4 +2025-12-17,28.7 +2025-12-18,26.0 +2025-12-19,19.5 +2025-12-20,25.6 +2025-12-21,20.2 +2025-12-22,16.5 +2025-12-23,23.7 +2025-12-24,21.2 +2025-12-25,20.3 +2025-12-26,21.8 +2025-12-27,20.9 +2025-12-28,33.7 +2025-12-29,24.7 +2025-12-30,19.7 +2025-12-31,20.3 diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-x10/case.json b/agents/evals/fixtures/cases/line-timeseries-pygal-x10/case.json new file mode 100644 index 00000000000..df9a563782f --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "line-timeseries", + "library": "pygal", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "date", + "column": "Date" + }, + { + "role": "value", + "column": "PM2.5 (µg/m³)" + } + ], + "expected": "accepted", + "tags": [ + "time-series", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 1010, x10)" +} diff --git a/agents/evals/fixtures/cases/line-timeseries-pygal-x10/data.csv b/agents/evals/fixtures/cases/line-timeseries-pygal-x10/data.csv new file mode 100644 index 00000000000..d69098f1840 --- /dev/null +++ b/agents/evals/fixtures/cases/line-timeseries-pygal-x10/data.csv @@ -0,0 +1,366 @@ +Date,PM2.5 (µg/m³) +2025-01-01,179.0 +2025-01-02,246.1 +2025-01-03,223.2 +2025-01-04,197.2 +2025-01-05,246.4 +2025-01-06,184.6 +2025-01-07,242.9 +2025-01-08,269.7 +2025-01-09,195.4 +2025-01-10,235.3 +2025-01-11,221.1 +2025-01-12,180.4 +2025-01-13,233.7 +2025-01-14,176.8 +2025-01-15,233.5 +2025-01-16,277.1 +2025-01-17,249.7 +2025-01-18,253.6 +2025-01-19,276.5 +2025-01-20,214.0 +2025-01-21,275.9 +2025-01-22,237.2 +2025-01-23,150.9 +2025-01-24,213.1 +2025-01-25,192.2 +2025-01-26,204.9 +2025-01-27,225.5 +2025-01-28,198.6 +2025-01-29,193.8 +2025-01-30,222.6 +2025-01-31,232.6 +2025-02-01,159.6 +2025-02-02,229.7 +2025-02-03,242.6 +2025-02-04,191.1 +2025-02-05,239.6 +2025-02-06,264.2 +2025-02-07,211.6 +2025-02-08,211.5 +2025-02-09,190.3 +2025-02-10,193.0 +2025-02-11,222.4 +2025-02-12,170.5 +2025-02-13,216.9 +2025-02-14,229.4 +2025-02-15,232.5 +2025-02-16,173.6 +2025-02-17,158.6 +2025-02-18,247.5 +2025-02-19,150.8 +2025-02-20,181.6 +2025-02-21,188.4 +2025-02-22,200.1 +2025-02-23,194.6 +2025-02-24,161.2 +2025-02-25,193.6 +2025-02-26,149.2 +2025-02-27,169.4 +2025-02-28,136.7 +2025-03-01,161.8 +2025-03-02,173.7 +2025-03-03,176.3 +2025-03-04,187.9 +2025-03-05,181.3 +2025-03-06,149.2 +2025-03-07,210.2 +2025-03-08,186.1 +2025-03-09,196.5 +2025-03-10,209.8 +2025-03-11,187.5 +2025-03-12,155.9 +2025-03-13,215.2 +2025-03-14,198.3 +2025-03-15,199.9 +2025-03-16,133.0 +2025-03-17,181.2 +2025-03-18,194.2 +2025-03-19,184.7 +2025-03-20,112.3 +2025-03-21,139.4 +2025-03-22,141.1 +2025-03-23,170.6 +2025-03-24,173.6 +2025-03-25,164.8 +2025-03-26,129.1 +2025-03-27,177.8 +2025-03-28,125.2 +2025-03-29,134.4 +2025-03-30,172.4 +2025-03-31,149.0 +2025-04-01,132.3 +2025-04-02,117.2 +2025-04-03,125.5 +2025-04-04,132.0 +2025-04-05,134.3 +2025-04-06,138.8 +2025-04-07,119.8 +2025-04-08,129.4 +2025-04-09,149.4 +2025-04-10,148.6 +2025-04-11,139.6 +2025-04-12,117.2 +2025-04-13,176.2 +2025-04-14,132.7 +2025-04-15,136.6 +2025-04-16,142.8 +2025-04-17,125.7 +2025-04-18,69.5 +2025-04-19,159.4 +2025-04-20,93.1 +2025-04-21,123.7 +2025-04-22,118.5 +2025-04-23,91.6 +2025-04-24,139.6 +2025-04-25,104.9 +2025-04-26,35.3 +2025-04-27,139.0 +2025-04-28,98.0 +2025-04-29,125.8 +2025-04-30,101.2 +2025-05-01,87.1 +2025-05-02,84.3 +2025-05-03,79.1 +2025-05-04,115.6 +2025-05-05,103.8 +2025-05-06,85.3 +2025-05-07,48.1 +2025-05-08,66.0 +2025-05-09,58.0 +2025-05-10,80.6 +2025-05-11,76.7 +2025-05-12,29.9 +2025-05-13,117.9 +2025-05-14,19.5 +2025-05-15,49.1 +2025-05-16,56.2 +2025-05-17,132.2 +2025-05-18,56.4 +2025-05-19,85.2 +2025-05-20,101.8 +2025-05-21,89.2 +2025-05-22,131.5 +2025-05-23,98.2 +2025-05-24,112.2 +2025-05-25,101.7 +2025-05-26,110.4 +2025-05-27,26.9 +2025-05-28,80.0 +2025-05-29,49.5 +2025-05-30,61.1 +2025-05-31,83.2 +2025-06-01,50.0 +2025-06-02,54.5 +2025-06-03,10.0 +2025-06-04,58.3 +2025-06-05,138.9 +2025-06-06,10.0 +2025-06-07,66.6 +2025-06-08,28.5 +2025-06-09,67.7 +2025-06-10,76.6 +2025-06-11,18.3 +2025-06-12,51.6 +2025-06-13,68.6 +2025-06-14,98.0 +2025-06-15,37.1 +2025-06-16,54.6 +2025-06-17,94.7 +2025-06-18,70.2 +2025-06-19,19.5 +2025-06-20,104.6 +2025-06-21,57.7 +2025-06-22,99.1 +2025-06-23,81.2 +2025-06-24,96.8 +2025-06-25,59.9 +2025-06-26,10.0 +2025-06-27,101.3 +2025-06-28,57.2 +2025-06-29,54.3 +2025-06-30,17.4 +2025-07-01,10.0 +2025-07-02,40.9 +2025-07-03,94.6 +2025-07-04,64.7 +2025-07-05,67.4 +2025-07-06,59.6 +2025-07-07,66.4 +2025-07-08,61.8 +2025-07-09,10.0 +2025-07-10,39.3 +2025-07-11,31.6 +2025-07-12,73.1 +2025-07-13,84.7 +2025-07-14,57.3 +2025-07-15,10.0 +2025-07-16,52.8 +2025-07-17,20.4 +2025-07-18,53.1 +2025-07-19,110.5 +2025-07-20,10.0 +2025-07-21,58.9 +2025-07-22,75.3 +2025-07-23,108.3 +2025-07-24,46.7 +2025-07-25,39.4 +2025-07-26,56.4 +2025-07-27,43.1 +2025-07-28,68.7 +2025-07-29,73.1 +2025-07-30,115.3 +2025-07-31,64.3 +2025-08-01,33.0 +2025-08-02,45.4 +2025-08-03,58.8 +2025-08-04,87.6 +2025-08-05,40.9 +2025-08-06,10.0 +2025-08-07,48.8 +2025-08-08,65.4 +2025-08-09,26.8 +2025-08-10,72.6 +2025-08-11,142.5 +2025-08-12,47.6 +2025-08-13,90.2 +2025-08-14,75.6 +2025-08-15,90.9 +2025-08-16,90.8 +2025-08-17,10.0 +2025-08-18,53.7 +2025-08-19,107.8 +2025-08-20,109.7 +2025-08-21,53.8 +2025-08-22,77.6 +2025-08-23,45.9 +2025-08-24,71.1 +2025-08-25,102.7 +2025-08-26,99.7 +2025-08-27,81.4 +2025-08-28,108.3 +2025-08-29,60.8 +2025-08-30,119.9 +2025-08-31,121.0 +2025-09-01,101.8 +2025-09-02,79.5 +2025-09-03,85.9 +2025-09-04,64.1 +2025-09-05,107.1 +2025-09-06,96.4 +2025-09-07,160.7 +2025-09-08,150.6 +2025-09-09,109.3 +2025-09-10,126.2 +2025-09-11,80.5 +2025-09-12,98.0 +2025-09-13,102.9 +2025-09-14,151.9 +2025-09-15,67.2 +2025-09-16,137.7 +2025-09-17,159.1 +2025-09-18,159.2 +2025-09-19,126.9 +2025-09-20,119.1 +2025-09-21,111.9 +2025-09-22,125.6 +2025-09-23,103.0 +2025-09-24,155.7 +2025-09-25,159.4 +2025-09-26,159.9 +2025-09-27,157.2 +2025-09-28,162.9 +2025-09-29,171.0 +2025-09-30,129.9 +2025-10-01,94.1 +2025-10-02,137.8 +2025-10-03,155.3 +2025-10-04,167.5 +2025-10-05,74.5 +2025-10-06,154.8 +2025-10-07,146.0 +2025-10-08,84.2 +2025-10-09,124.1 +2025-10-10,140.0 +2025-10-11,194.7 +2025-10-12,165.4 +2025-10-13,161.8 +2025-10-14,202.7 +2025-10-15,131.1 +2025-10-16,118.3 +2025-10-17,165.4 +2025-10-18,175.5 +2025-10-19,145.6 +2025-10-20,170.0 +2025-10-21,235.5 +2025-10-22,137.0 +2025-10-23,219.8 +2025-10-24,205.5 +2025-10-25,197.4 +2025-10-26,160.3 +2025-10-27,168.2 +2025-10-28,203.4 +2025-10-29,219.9 +2025-10-30,127.5 +2025-10-31,221.2 +2025-11-01,157.8 +2025-11-02,140.4 +2025-11-03,181.8 +2025-11-04,219.6 +2025-11-05,198.9 +2025-11-06,146.4 +2025-11-07,185.6 +2025-11-08,234.7 +2025-11-09,181.6 +2025-11-10,213.1 +2025-11-11,195.7 +2025-11-12,214.2 +2025-11-13,241.9 +2025-11-14,234.8 +2025-11-15,247.8 +2025-11-16,207.2 +2025-11-17,159.5 +2025-11-18,223.2 +2025-11-19,179.9 +2025-11-20,199.2 +2025-11-21,275.8 +2025-11-22,202.0 +2025-11-23,214.3 +2025-11-24,191.3 +2025-11-25,248.5 +2025-11-26,265.6 +2025-11-27,203.9 +2025-11-28,179.6 +2025-11-29,223.6 +2025-11-30,220.3 +2025-12-01,268.2 +2025-12-02,238.3 +2025-12-03,252.4 +2025-12-04,198.7 +2025-12-05,252.7 +2025-12-06,270.2 +2025-12-07,226.7 +2025-12-08,271.8 +2025-12-09,210.9 +2025-12-10,266.6 +2025-12-11,207.8 +2025-12-12,239.0 +2025-12-13,254.4 +2025-12-14,260.7 +2025-12-15,221.9 +2025-12-16,223.7 +2025-12-17,286.5 +2025-12-18,259.7 +2025-12-19,194.6 +2025-12-20,256.0 +2025-12-21,202.3 +2025-12-22,165.2 +2025-12-23,237.0 +2025-12-24,211.8 +2025-12-25,203.4 +2025-12-26,218.4 +2025-12-27,209.3 +2025-12-28,336.9 +2025-12-29,247.4 +2025-12-30,196.6 +2025-12-31,202.6 diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-date/case.json b/agents/evals/fixtures/cases/pie-basic-letsplot-date/case.json new file mode 100644 index 00000000000..c33ef203c2f --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "pie-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "category", + "column": "Expense Category" + }, + { + "role": "value", + "column": "Amount (CHF)" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, date)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-date/data.csv b/agents/evals/fixtures/cases/pie-basic-letsplot-date/data.csv new file mode 100644 index 00000000000..a243c78806b --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-date/data.csv @@ -0,0 +1,7 @@ +Expense Category,Amount (CHF),Booking Date,Imported On +Housing,1913.25,05.05.2026,2026-05-05 +Food,692.31,20.01.2026,2026-01-23 +Transport,402.45,29.03.2026,2026-03-30 +Leisure,337.19,13.05.2026,2026-05-14 +Health,244.50,17.02.2026,2026-02-18 +Savings,648.13,20.03.2026,2026-03-24 diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-decimal-comma/case.json b/agents/evals/fixtures/cases/pie-basic-letsplot-decimal-comma/case.json new file mode 100644 index 00000000000..3deae1386b7 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "pie-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "category", + "column": "Expense Category" + }, + { + "role": "value", + "column": "Amount (CHF)" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-decimal-comma/data.csv b/agents/evals/fixtures/cases/pie-basic-letsplot-decimal-comma/data.csv new file mode 100644 index 00000000000..2d4e55ae017 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-decimal-comma/data.csv @@ -0,0 +1,7 @@ +Expense Category;Amount (CHF) +Housing;1913,25 +Food;692,31 +Transport;402,45 +Leisure;337,19 +Health;244,50 +Savings;648,13 diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-n12/case.json b/agents/evals/fixtures/cases/pie-basic-letsplot-n12/case.json new file mode 100644 index 00000000000..c0425bfd5fa --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "pie-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "category", + "column": "Expense Category" + }, + { + "role": "value", + "column": "Amount (CHF)" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, n12)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-n12/data.csv b/agents/evals/fixtures/cases/pie-basic-letsplot-n12/data.csv new file mode 100644 index 00000000000..cd24cc6737c --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-n12/data.csv @@ -0,0 +1,13 @@ +Expense Category,Amount (CHF) +Housing,1686.23 +Food,719.68 +Transport,443.66 +Leisure,311.31 +Health,236.78 +Savings,595.60 +Insurance,342.29 +Education,138.39 +Clothing,114.95 +Utilities,215.46 +Gifts,55.02 +Other,93.78 diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-n5000/case.json b/agents/evals/fixtures/cases/pie-basic-letsplot-n5000/case.json new file mode 100644 index 00000000000..d693fd08eb3 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-n5000/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "pie-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "category", + "column": "Expense Category" + }, + { + "role": "value", + "column": "Amount (CHF)" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "n5000", + "synthetic", + "large", + "aggregation" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, n5000)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-n5000/data.csv b/agents/evals/fixtures/cases/pie-basic-letsplot-n5000/data.csv new file mode 100644 index 00000000000..573db3f08c9 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-n5000/data.csv @@ -0,0 +1,5001 @@ +Expense Category,Amount (CHF) +Transport,29.12 +Food,27.01 +Food,31.20 +Transport,6.75 +Food,17.05 +Food,39.81 +Food,3.90 +Food,5.14 +Food,43.53 +Transport,14.79 +Food,10.09 +Food,41.71 +Transport,41.78 +Housing,727.06 +Transport,22.80 +Food,37.10 +Food,37.37 +Food,21.56 +Transport,46.95 +Savings,313.75 +Leisure,40.26 +Food,74.54 +Savings,108.08 +Food,48.05 +Transport,3.17 +Leisure,25.46 +Food,34.41 +Food,1.38 +Transport,34.60 +Transport,26.44 +Transport,5.57 +Food,26.45 +Transport,38.92 +Transport,15.54 +Food,33.13 +Transport,57.14 +Food,25.91 +Food,7.31 +Leisure,19.39 +Transport,17.56 +Housing,863.42 +Food,99.41 +Leisure,50.43 +Food,9.47 +Transport,86.07 +Health,19.85 +Transport,19.83 +Leisure,51.21 +Transport,19.71 +Health,46.35 +Leisure,29.07 +Transport,42.76 +Leisure,66.38 +Transport,29.34 +Food,17.51 +Food,91.26 +Transport,5.41 +Transport,42.32 +Food,94.67 +Transport,38.19 +Food,125.98 +Food,20.50 +Leisure,19.79 +Food,46.17 +Transport,10.88 +Transport,3.39 +Transport,15.03 +Food,69.25 +Food,23.25 +Health,15.98 +Food,33.71 +Food,26.33 +Leisure,54.29 +Food,16.13 +Food,6.64 +Food,48.42 +Leisure,21.38 +Transport,16.44 +Food,33.57 +Transport,7.01 +Food,23.80 +Leisure,126.55 +Transport,63.15 +Food,24.87 +Leisure,59.51 +Food,58.30 +Food,35.38 +Health,34.36 +Leisure,65.60 +Leisure,55.45 +Leisure,142.97 +Food,32.77 +Transport,31.86 +Savings,282.88 +Transport,17.75 +Leisure,44.28 +Health,116.20 +Housing,448.42 +Food,2.75 +Food,36.40 +Transport,28.77 +Food,15.48 +Food,60.75 +Food,14.43 +Food,58.48 +Transport,9.03 +Food,69.04 +Transport,6.90 +Food,52.23 +Food,24.96 +Transport,46.84 +Food,7.51 +Food,7.63 +Transport,12.13 +Leisure,63.78 +Food,15.40 +Transport,10.14 +Food,33.35 +Food,18.90 +Food,17.09 +Housing,1680.60 +Transport,17.91 +Housing,484.79 +Leisure,93.05 +Food,59.23 +Leisure,33.31 +Leisure,99.03 +Food,105.68 +Transport,60.01 +Transport,22.04 +Transport,45.52 +Food,8.92 +Food,41.48 +Food,34.92 +Transport,14.48 +Transport,20.71 +Transport,11.43 +Food,44.98 +Food,48.04 +Transport,3.81 +Food,32.72 +Transport,14.75 +Food,17.11 +Leisure,9.66 +Food,205.39 +Transport,12.28 +Transport,13.00 +Transport,22.18 +Leisure,60.31 +Food,4.12 +Transport,5.49 +Food,58.07 +Transport,9.24 +Food,9.83 +Food,17.00 +Food,45.07 +Food,19.46 +Transport,6.05 +Food,69.55 +Transport,17.24 +Transport,5.63 +Food,51.44 +Leisure,73.20 +Savings,124.36 +Transport,8.09 +Transport,57.12 +Leisure,17.30 +Food,72.39 +Food,12.30 +Food,15.08 +Transport,23.27 +Housing,1834.60 +Leisure,58.70 +Transport,6.66 +Food,17.83 +Health,15.63 +Leisure,13.85 +Transport,29.93 +Food,39.29 +Food,48.17 +Food,32.77 +Health,91.92 +Food,24.67 +Health,66.92 +Transport,57.29 +Savings,102.02 +Transport,36.05 +Transport,30.63 +Food,7.80 +Food,15.51 +Transport,33.35 +Leisure,61.30 +Transport,14.03 +Transport,24.40 +Food,40.14 +Health,24.84 +Transport,3.60 +Food,17.71 +Leisure,22.30 +Food,29.16 +Transport,21.09 +Food,42.98 +Housing,918.98 +Transport,11.15 +Leisure,49.81 +Food,133.34 +Food,18.86 +Savings,128.71 +Health,245.63 +Leisure,13.16 +Transport,22.35 +Food,48.86 +Transport,9.31 +Health,39.50 +Transport,39.16 +Transport,4.05 +Transport,13.42 +Savings,170.32 +Transport,26.58 +Health,44.15 +Leisure,23.07 +Food,68.83 +Transport,23.46 +Transport,30.21 +Transport,37.82 +Housing,651.68 +Food,69.32 +Transport,39.29 +Health,42.64 +Leisure,57.93 +Food,18.74 +Food,43.39 +Food,43.76 +Food,70.86 +Food,34.55 +Transport,5.22 +Transport,7.87 +Food,13.55 +Savings,128.26 +Leisure,53.45 +Transport,54.67 +Transport,18.03 +Health,96.93 +Leisure,32.19 +Transport,23.95 +Transport,6.36 +Food,32.18 +Food,93.04 +Food,20.97 +Leisure,20.44 +Savings,252.84 +Leisure,125.42 +Transport,1.00 +Food,18.53 +Leisure,28.58 +Leisure,13.22 +Transport,49.70 +Transport,59.86 +Food,12.63 +Food,51.19 +Leisure,25.81 +Health,140.29 +Food,57.21 +Food,35.76 +Food,12.21 +Transport,25.78 +Food,22.43 +Food,48.51 +Health,64.34 +Food,36.70 +Food,39.63 +Leisure,24.04 +Food,40.92 +Transport,26.00 +Food,36.04 +Transport,23.27 +Food,33.85 +Transport,30.10 +Food,25.68 +Leisure,47.16 +Transport,9.04 +Food,56.32 +Food,9.56 +Food,8.91 +Food,39.92 +Food,89.74 +Transport,35.34 +Housing,1456.05 +Transport,60.28 +Leisure,49.48 +Food,37.00 +Leisure,74.09 +Leisure,29.23 +Transport,10.38 +Food,11.22 +Transport,15.65 +Transport,21.35 +Food,150.20 +Food,24.26 +Health,46.13 +Transport,6.23 +Leisure,38.44 +Transport,27.29 +Transport,70.96 +Food,62.45 +Transport,7.64 +Food,13.75 +Transport,10.57 +Housing,183.95 +Food,55.27 +Transport,21.94 +Transport,17.51 +Food,52.01 +Leisure,65.93 +Leisure,66.52 +Food,58.41 +Leisure,177.53 +Food,21.60 +Food,32.21 +Transport,37.56 +Food,21.65 +Leisure,45.18 +Leisure,5.35 +Transport,36.86 +Transport,9.44 +Transport,7.89 +Food,22.96 +Leisure,19.98 +Food,45.37 +Transport,20.92 +Food,14.63 +Food,18.48 +Health,19.23 +Food,12.21 +Transport,18.65 +Transport,27.30 +Food,56.56 +Health,14.50 +Transport,24.28 +Health,34.56 +Food,40.27 +Transport,16.41 +Food,95.65 +Food,7.04 +Food,38.32 +Leisure,1.21 +Food,32.93 +Transport,23.07 +Transport,50.98 +Transport,14.03 +Food,52.37 +Transport,54.10 +Food,5.07 +Transport,29.71 +Transport,47.72 +Leisure,18.32 +Transport,44.69 +Transport,4.39 +Transport,42.81 +Transport,13.97 +Transport,3.39 +Food,26.33 +Leisure,47.35 +Food,38.48 +Transport,48.45 +Food,43.21 +Transport,22.20 +Transport,3.38 +Health,21.38 +Health,23.77 +Transport,27.59 +Transport,3.84 +Transport,38.35 +Transport,6.86 +Food,73.01 +Food,26.80 +Food,24.15 +Transport,52.51 +Transport,26.13 +Leisure,129.57 +Food,54.72 +Food,14.11 +Transport,27.08 +Transport,30.87 +Transport,32.13 +Transport,31.27 +Transport,46.05 +Transport,7.06 +Savings,135.80 +Food,47.72 +Transport,13.65 +Food,15.82 +Leisure,54.77 +Housing,3504.09 +Housing,1372.62 +Health,73.48 +Transport,2.41 +Transport,9.93 +Food,10.25 +Transport,22.30 +Food,17.10 +Transport,14.84 +Food,29.85 +Food,28.27 +Food,107.34 +Food,41.61 +Food,42.42 +Transport,27.64 +Health,42.95 +Transport,43.90 +Leisure,50.08 +Leisure,8.90 +Food,67.70 +Food,27.69 +Transport,47.26 +Transport,8.06 +Leisure,24.91 +Transport,24.53 +Transport,35.03 +Transport,20.03 +Housing,800.10 +Food,3.70 +Transport,14.23 +Leisure,18.18 +Food,97.00 +Food,13.58 +Transport,6.53 +Transport,15.80 +Transport,42.68 +Leisure,19.32 +Transport,37.98 +Housing,1365.14 +Transport,31.64 +Food,40.10 +Transport,6.45 +Food,37.27 +Food,14.53 +Leisure,112.92 +Leisure,91.50 +Transport,21.26 +Transport,12.78 +Food,3.98 +Transport,52.65 +Leisure,70.57 +Transport,10.01 +Health,31.07 +Food,25.99 +Food,52.80 +Food,24.57 +Leisure,61.81 +Transport,8.76 +Leisure,27.14 +Transport,6.49 +Leisure,77.03 +Transport,20.59 +Transport,7.51 +Food,35.91 +Food,58.94 +Transport,27.41 +Food,94.26 +Transport,18.55 +Food,56.56 +Transport,38.76 +Food,111.30 +Transport,32.90 +Food,63.36 +Food,24.95 +Transport,24.06 +Transport,24.33 +Health,97.76 +Transport,26.29 +Food,69.79 +Food,23.92 +Housing,589.89 +Transport,13.22 +Leisure,23.49 +Food,24.32 +Food,52.78 +Transport,29.00 +Food,49.29 +Transport,5.99 +Health,35.62 +Transport,45.16 +Transport,24.54 +Food,25.82 +Leisure,28.54 +Food,57.19 +Transport,25.27 +Food,83.46 +Food,17.90 +Food,20.84 +Food,73.88 +Food,26.89 +Transport,22.35 +Housing,695.25 +Health,6.37 +Savings,218.27 +Housing,1182.49 +Health,32.55 +Transport,20.82 +Transport,14.67 +Food,35.42 +Food,36.62 +Food,43.32 +Food,12.31 +Food,6.17 +Transport,34.05 +Food,30.73 +Transport,26.40 +Food,19.82 +Transport,25.01 +Food,31.11 +Leisure,33.16 +Transport,23.41 +Food,53.75 +Transport,22.73 +Food,8.33 +Health,54.06 +Food,27.09 +Health,26.35 +Leisure,28.37 +Transport,12.32 +Transport,31.57 +Transport,20.89 +Transport,26.59 +Savings,119.65 +Leisure,50.59 +Food,40.80 +Food,42.06 +Transport,3.29 +Food,13.44 +Food,94.47 +Transport,13.23 +Leisure,9.80 +Food,26.43 +Food,56.29 +Health,45.53 +Health,36.49 +Leisure,21.59 +Food,45.32 +Transport,6.81 +Transport,31.71 +Transport,15.59 +Food,22.31 +Health,133.00 +Food,116.57 +Food,66.03 +Transport,11.30 +Food,13.78 +Leisure,24.17 +Food,86.86 +Transport,13.73 +Food,18.03 +Health,27.82 +Health,35.32 +Transport,28.31 +Leisure,30.96 +Food,66.01 +Savings,31.23 +Food,13.77 +Transport,19.96 +Transport,7.05 +Food,86.29 +Food,118.72 +Food,122.85 +Food,32.97 +Food,7.71 +Transport,34.01 +Leisure,60.82 +Transport,4.65 +Food,20.31 +Health,34.19 +Food,64.84 +Food,22.73 +Housing,575.32 +Food,12.43 +Food,59.54 +Food,15.00 +Food,36.29 +Transport,7.08 +Health,140.31 +Transport,46.06 +Food,13.03 +Health,60.23 +Food,7.00 +Transport,9.57 +Health,58.76 +Transport,33.88 +Food,19.36 +Transport,33.48 +Leisure,23.57 +Leisure,74.14 +Food,100.50 +Food,51.14 +Transport,17.39 +Food,79.23 +Leisure,20.61 +Food,50.76 +Transport,11.02 +Transport,19.87 +Food,2.89 +Leisure,95.11 +Housing,690.50 +Transport,29.39 +Transport,41.65 +Leisure,139.52 +Food,1.50 +Housing,1808.60 +Food,20.17 +Transport,5.78 +Health,63.70 +Leisure,75.70 +Food,21.74 +Food,15.65 +Transport,56.12 +Transport,19.68 +Food,36.55 +Transport,11.34 +Leisure,156.24 +Housing,318.03 +Transport,13.10 +Transport,57.15 +Food,23.38 +Food,8.44 +Food,25.41 +Food,5.43 +Food,34.37 +Food,19.21 +Food,25.35 +Housing,439.75 +Transport,59.75 +Food,50.87 +Leisure,55.56 +Leisure,28.94 +Food,79.64 +Transport,44.68 +Food,31.25 +Savings,135.50 +Food,26.03 +Food,44.67 +Food,23.28 +Transport,15.48 +Transport,18.62 +Savings,81.08 +Transport,9.77 +Health,37.05 +Food,56.82 +Leisure,56.01 +Transport,42.26 +Transport,3.96 +Transport,11.21 +Food,2.04 +Food,16.65 +Transport,29.83 +Transport,19.87 +Transport,59.32 +Transport,2.34 +Leisure,12.47 +Food,39.99 +Food,21.11 +Food,66.68 +Transport,2.35 +Housing,2556.14 +Health,67.69 +Transport,24.37 +Food,16.58 +Food,42.17 +Housing,634.54 +Food,41.51 +Transport,22.11 +Food,83.90 +Leisure,56.42 +Transport,21.93 +Transport,7.08 +Savings,60.96 +Food,36.79 +Food,75.56 +Housing,2075.70 +Housing,1222.85 +Food,14.31 +Food,14.35 +Transport,27.95 +Transport,39.61 +Food,24.39 +Food,69.06 +Leisure,97.57 +Health,81.63 +Food,10.40 +Food,21.21 +Transport,18.34 +Food,16.22 +Food,33.30 +Food,75.48 +Transport,15.00 +Food,8.65 +Leisure,17.06 +Leisure,25.45 +Health,68.25 +Transport,26.13 +Food,3.95 +Health,91.30 +Transport,74.28 +Leisure,23.08 +Leisure,41.57 +Savings,587.03 +Food,65.73 +Food,33.59 +Food,10.64 +Savings,330.00 +Leisure,13.69 +Food,52.66 +Food,47.34 +Transport,61.15 +Transport,11.91 +Housing,1065.13 +Food,63.35 +Food,16.22 +Transport,19.98 +Food,13.27 +Transport,43.23 +Food,86.96 +Food,15.67 +Transport,31.79 +Food,65.20 +Transport,18.83 +Transport,37.97 +Food,9.84 +Transport,30.70 +Leisure,19.67 +Food,86.33 +Transport,15.83 +Transport,50.95 +Leisure,35.06 +Savings,92.09 +Transport,46.46 +Food,12.13 +Savings,739.49 +Transport,68.80 +Food,33.71 +Transport,19.82 +Leisure,31.57 +Housing,1981.44 +Food,5.77 +Health,52.66 +Transport,34.93 +Food,19.23 +Food,72.63 +Food,75.04 +Transport,13.11 +Food,58.15 +Food,47.42 +Food,29.85 +Food,32.31 +Health,48.06 +Food,59.27 +Health,19.65 +Food,30.61 +Transport,10.26 +Health,16.01 +Food,48.26 +Transport,22.82 +Food,24.31 +Transport,5.05 +Food,39.37 +Transport,31.20 +Transport,18.94 +Savings,866.40 +Transport,16.28 +Food,49.13 +Transport,23.34 +Leisure,43.06 +Transport,43.69 +Food,45.05 +Food,34.92 +Food,43.94 +Food,39.90 +Food,41.66 +Food,13.98 +Transport,13.24 +Food,29.02 +Food,92.31 +Food,32.62 +Transport,19.20 +Transport,8.43 +Food,46.72 +Leisure,15.63 +Food,25.88 +Transport,25.30 +Food,16.17 +Food,14.65 +Food,31.95 +Health,27.58 +Leisure,70.35 +Food,12.55 +Food,6.31 +Transport,24.54 +Food,8.96 +Food,25.79 +Food,34.48 +Transport,15.46 +Food,93.72 +Leisure,12.18 +Transport,2.11 +Transport,6.19 +Food,51.31 +Food,10.85 +Food,31.75 +Transport,18.57 +Food,15.67 +Leisure,25.23 +Food,28.73 +Food,37.45 +Health,43.63 +Health,196.70 +Food,43.56 +Transport,5.98 +Food,18.70 +Food,9.76 +Food,28.40 +Health,66.46 +Food,24.52 +Transport,47.42 +Food,51.86 +Food,99.48 +Food,154.84 +Health,142.43 +Food,22.47 +Food,67.17 +Food,39.84 +Health,114.11 +Food,37.79 +Food,47.61 +Food,19.74 +Transport,8.94 +Food,20.59 +Housing,728.84 +Health,26.99 +Food,14.03 +Food,25.58 +Transport,26.51 +Food,32.97 +Savings,358.63 +Transport,4.18 +Food,9.53 +Transport,32.97 +Food,29.60 +Leisure,27.56 +Transport,16.54 +Food,8.93 +Health,88.24 +Food,29.39 +Leisure,44.52 +Food,13.93 +Health,252.30 +Health,41.89 +Food,60.49 +Leisure,11.17 +Food,18.14 +Savings,382.63 +Transport,30.27 +Transport,7.52 +Transport,28.14 +Transport,16.07 +Food,38.04 +Health,49.83 +Transport,12.49 +Transport,3.48 +Transport,7.26 +Food,19.72 +Transport,8.38 +Transport,20.54 +Leisure,33.90 +Transport,22.27 +Leisure,16.67 +Food,73.10 +Food,8.80 +Transport,26.01 +Transport,9.65 +Leisure,51.39 +Food,33.23 +Transport,11.91 +Transport,55.10 +Savings,699.72 +Transport,25.34 +Transport,40.39 +Food,96.01 +Leisure,50.04 +Food,54.86 +Food,56.29 +Savings,167.10 +Savings,40.89 +Leisure,60.90 +Transport,36.19 +Food,4.21 +Food,27.35 +Transport,37.78 +Transport,32.43 +Food,6.11 +Transport,5.80 +Transport,55.12 +Transport,26.19 +Transport,26.88 +Food,11.63 +Food,11.55 +Food,17.67 +Food,42.38 +Transport,64.49 +Food,20.92 +Transport,20.50 +Transport,14.49 +Health,41.99 +Transport,54.00 +Food,14.22 +Food,98.14 +Leisure,92.94 +Transport,47.71 +Leisure,12.36 +Leisure,8.95 +Transport,21.34 +Leisure,18.29 +Food,15.58 +Food,13.52 +Food,23.45 +Transport,15.22 +Leisure,21.90 +Food,4.40 +Food,18.43 +Health,31.45 +Food,14.43 +Health,46.07 +Leisure,11.58 +Savings,118.54 +Transport,34.65 +Transport,29.38 +Transport,14.48 +Food,40.71 +Health,55.18 +Transport,25.54 +Food,64.56 +Transport,28.42 +Leisure,35.96 +Food,9.26 +Food,58.64 +Transport,8.37 +Food,40.21 +Transport,15.85 +Transport,20.68 +Leisure,23.16 +Leisure,87.37 +Transport,26.86 +Leisure,63.35 +Food,8.81 +Food,17.69 +Food,31.18 +Health,201.22 +Savings,97.05 +Transport,2.81 +Food,40.77 +Transport,27.33 +Food,45.28 +Transport,8.13 +Savings,258.80 +Transport,39.08 +Health,35.09 +Food,11.94 +Savings,31.58 +Food,82.98 +Leisure,11.09 +Transport,15.98 +Leisure,39.40 +Food,50.37 +Transport,22.39 +Food,27.99 +Food,55.18 +Transport,15.60 +Transport,1.93 +Food,5.18 +Food,75.14 +Food,10.01 +Food,49.02 +Food,26.39 +Transport,5.69 +Food,35.32 +Housing,1593.22 +Savings,733.12 +Food,14.80 +Leisure,49.43 +Food,4.82 +Transport,37.28 +Food,17.04 +Food,39.64 +Leisure,89.92 +Food,40.48 +Transport,1.66 +Food,4.39 +Leisure,41.22 +Food,39.24 +Transport,13.08 +Food,37.56 +Food,66.56 +Food,28.56 +Food,40.22 +Food,20.12 +Transport,23.19 +Food,42.36 +Transport,6.93 +Transport,31.68 +Leisure,45.18 +Transport,50.59 +Food,11.99 +Housing,309.97 +Leisure,24.73 +Transport,29.29 +Leisure,68.13 +Food,26.77 +Transport,60.50 +Food,20.39 +Leisure,73.06 +Food,47.25 +Food,118.92 +Food,18.37 +Food,6.74 +Food,41.84 +Leisure,42.20 +Food,26.44 +Food,94.36 +Food,11.83 +Food,19.39 +Food,58.81 +Food,8.58 +Food,5.43 +Leisure,90.57 +Food,17.45 +Food,8.49 +Savings,468.10 +Transport,15.93 +Food,28.87 +Transport,25.94 +Food,14.49 +Transport,1.42 +Food,46.52 +Food,11.69 +Housing,2087.28 +Transport,46.04 +Food,55.38 +Transport,8.77 +Health,117.41 +Leisure,34.01 +Transport,21.07 +Food,16.57 +Savings,60.98 +Food,11.15 +Housing,2091.25 +Leisure,57.02 +Savings,261.13 +Health,33.57 +Food,56.03 +Leisure,25.85 +Food,85.21 +Transport,24.37 +Food,125.40 +Food,28.89 +Transport,21.26 +Health,12.14 +Health,35.51 +Leisure,78.43 +Food,7.14 +Food,70.92 +Leisure,103.62 +Food,46.67 +Savings,621.63 +Leisure,71.86 +Leisure,13.98 +Food,12.52 +Transport,13.96 +Transport,51.18 +Transport,13.01 +Food,79.73 +Leisure,13.21 +Leisure,4.26 +Savings,1250.90 +Leisure,57.95 +Leisure,56.82 +Food,77.21 +Transport,11.95 +Transport,41.27 +Food,40.47 +Leisure,67.19 +Housing,1045.74 +Food,6.10 +Health,107.35 +Transport,30.06 +Transport,4.07 +Food,29.29 +Transport,4.30 +Transport,21.44 +Transport,11.47 +Transport,10.54 +Transport,32.69 +Leisure,31.79 +Transport,26.79 +Food,43.32 +Transport,28.27 +Food,92.97 +Food,31.65 +Transport,30.64 +Food,69.25 +Transport,60.50 +Transport,18.47 +Transport,58.56 +Food,22.67 +Transport,13.33 +Health,167.81 +Transport,41.80 +Food,3.70 +Transport,45.04 +Housing,666.13 +Health,49.83 +Savings,76.96 +Health,8.97 +Food,22.67 +Food,14.14 +Transport,11.02 +Transport,18.66 +Transport,72.75 +Housing,848.16 +Transport,24.29 +Food,38.11 +Food,19.82 +Food,34.50 +Transport,9.17 +Transport,15.98 +Food,56.98 +Health,6.42 +Food,29.68 +Food,16.13 +Health,46.55 +Food,11.29 +Transport,13.76 +Food,27.31 +Food,41.30 +Transport,7.90 +Food,97.52 +Food,78.93 +Leisure,24.27 +Transport,36.96 +Savings,602.63 +Health,91.94 +Transport,55.39 +Transport,24.94 +Food,15.91 +Leisure,52.00 +Transport,13.32 +Food,24.14 +Transport,7.05 +Transport,19.69 +Food,8.58 +Leisure,118.74 +Transport,8.55 +Transport,32.92 +Health,119.39 +Food,35.76 +Housing,537.23 +Health,42.66 +Food,61.41 +Food,35.98 +Food,45.75 +Transport,41.04 +Transport,9.19 +Food,28.14 +Leisure,162.34 +Food,21.95 +Transport,12.93 +Food,2.43 +Food,11.37 +Transport,24.23 +Leisure,16.27 +Leisure,31.94 +Food,14.06 +Transport,16.18 +Food,37.56 +Transport,21.18 +Food,116.84 +Food,27.50 +Food,28.16 +Transport,26.14 +Transport,5.45 +Food,22.06 +Food,39.28 +Transport,17.49 +Leisure,16.72 +Transport,6.63 +Transport,37.69 +Food,50.34 +Transport,16.80 +Transport,12.81 +Leisure,86.52 +Food,83.31 +Health,16.69 +Transport,19.45 +Food,34.99 +Health,79.62 +Food,32.03 +Leisure,20.84 +Health,41.30 +Transport,13.63 +Savings,167.28 +Food,23.30 +Transport,22.14 +Health,101.97 +Food,43.15 +Transport,17.68 +Health,7.63 +Transport,9.72 +Leisure,9.19 +Food,13.70 +Savings,313.15 +Transport,3.37 +Savings,146.84 +Food,16.31 +Food,46.60 +Food,65.16 +Transport,17.15 +Transport,1.80 +Food,17.79 +Transport,35.29 +Health,86.07 +Leisure,1.88 +Food,35.71 +Food,59.49 +Transport,18.95 +Food,11.47 +Food,64.22 +Health,16.96 +Transport,10.16 +Food,70.42 +Transport,17.88 +Food,48.70 +Transport,18.02 +Food,10.30 +Transport,16.00 +Transport,48.66 +Food,42.46 +Food,20.30 +Transport,28.60 +Leisure,39.64 +Transport,12.71 +Transport,66.47 +Food,86.20 +Health,28.16 +Leisure,50.87 +Food,85.22 +Leisure,62.83 +Food,28.56 +Food,36.79 +Transport,16.78 +Transport,23.63 +Transport,21.61 +Transport,29.61 +Leisure,4.06 +Health,207.32 +Food,128.54 +Food,71.66 +Food,76.93 +Food,42.16 +Transport,5.04 +Food,32.52 +Transport,44.40 +Food,38.11 +Transport,5.08 +Transport,22.68 +Food,19.88 +Transport,16.38 +Transport,32.48 +Transport,43.81 +Housing,1141.70 +Food,46.38 +Leisure,21.34 +Leisure,96.95 +Food,120.50 +Leisure,24.17 +Leisure,41.35 +Health,98.93 +Savings,558.24 +Health,112.45 +Food,38.15 +Food,9.12 +Food,26.11 +Health,15.92 +Food,166.90 +Savings,102.57 +Food,19.31 +Transport,15.68 +Housing,743.86 +Transport,21.10 +Transport,33.25 +Leisure,12.63 +Food,95.97 +Housing,750.99 +Food,2.88 +Food,18.70 +Transport,23.85 +Food,50.09 +Food,20.33 +Food,36.57 +Food,44.52 +Savings,55.81 +Transport,9.71 +Food,18.10 +Leisure,74.48 +Food,9.44 +Leisure,20.50 +Food,88.23 +Leisure,29.76 +Food,27.24 +Transport,38.29 +Food,6.35 +Housing,560.89 +Transport,10.29 +Leisure,19.46 +Transport,55.80 +Transport,21.40 +Transport,13.83 +Food,8.82 +Transport,28.08 +Transport,18.78 +Health,44.98 +Transport,18.48 +Food,35.87 +Food,47.81 +Food,52.34 +Health,46.92 +Transport,9.78 +Food,25.85 +Food,39.07 +Food,47.65 +Leisure,80.04 +Leisure,54.21 +Food,46.74 +Housing,2235.70 +Transport,48.82 +Food,90.33 +Food,13.48 +Transport,23.56 +Transport,56.98 +Food,30.27 +Leisure,27.73 +Food,21.55 +Transport,32.38 +Food,119.52 +Food,38.53 +Health,64.90 +Housing,1311.10 +Transport,5.86 +Food,19.19 +Leisure,22.35 +Savings,293.02 +Transport,5.03 +Housing,1712.94 +Transport,4.77 +Leisure,29.21 +Transport,10.26 +Transport,26.63 +Leisure,24.57 +Transport,69.04 +Leisure,23.66 +Transport,24.92 +Food,22.83 +Transport,41.47 +Transport,24.11 +Transport,10.75 +Leisure,24.99 +Food,105.24 +Transport,37.27 +Food,28.96 +Food,97.13 +Food,19.33 +Food,31.43 +Food,8.68 +Savings,168.20 +Health,40.54 +Food,19.44 +Food,32.20 +Food,32.95 +Leisure,33.86 +Transport,24.20 +Leisure,13.59 +Leisure,47.56 +Savings,758.24 +Food,9.46 +Transport,18.26 +Food,6.88 +Leisure,123.53 +Transport,5.13 +Food,80.26 +Food,34.23 +Health,117.89 +Transport,8.93 +Transport,41.50 +Health,91.65 +Food,41.78 +Leisure,39.84 +Transport,7.04 +Transport,4.69 +Savings,27.21 +Leisure,5.02 +Transport,10.06 +Food,51.65 +Leisure,16.75 +Savings,415.51 +Transport,3.73 +Transport,14.17 +Food,23.48 +Transport,13.18 +Housing,612.95 +Transport,16.13 +Food,22.25 +Food,17.62 +Food,42.25 +Food,44.94 +Savings,378.23 +Food,42.61 +Health,270.58 +Leisure,45.93 +Transport,53.45 +Transport,18.93 +Transport,19.72 +Food,70.37 +Food,23.25 +Leisure,27.84 +Transport,24.33 +Savings,246.70 +Savings,823.52 +Transport,31.98 +Transport,14.40 +Health,20.66 +Transport,25.36 +Leisure,29.91 +Food,19.14 +Transport,4.18 +Leisure,59.33 +Housing,621.05 +Food,7.49 +Food,77.62 +Food,37.61 +Transport,35.89 +Transport,5.29 +Food,38.59 +Food,43.13 +Food,14.53 +Transport,14.79 +Transport,8.17 +Leisure,28.90 +Transport,37.32 +Transport,27.79 +Food,33.67 +Leisure,12.24 +Transport,13.63 +Transport,38.84 +Food,70.83 +Food,12.55 +Food,26.86 +Transport,18.65 +Transport,15.88 +Food,21.02 +Transport,12.74 +Food,9.88 +Leisure,92.16 +Food,50.00 +Transport,28.62 +Leisure,40.19 +Food,18.66 +Food,36.17 +Food,49.97 +Transport,24.82 +Housing,1155.26 +Transport,52.90 +Food,115.04 +Food,41.41 +Leisure,24.22 +Leisure,30.91 +Food,66.16 +Leisure,51.87 +Leisure,23.74 +Health,1.00 +Leisure,28.82 +Leisure,15.18 +Transport,9.62 +Food,33.20 +Health,120.98 +Transport,10.66 +Housing,1934.12 +Leisure,26.36 +Leisure,1.00 +Transport,15.78 +Transport,17.03 +Food,66.25 +Food,28.41 +Leisure,65.54 +Transport,12.13 +Leisure,50.17 +Savings,357.79 +Transport,17.95 +Health,63.53 +Transport,21.40 +Food,43.47 +Food,50.06 +Leisure,57.71 +Health,32.73 +Leisure,21.09 +Savings,408.71 +Transport,34.52 +Food,17.14 +Food,168.17 +Leisure,21.32 +Food,72.44 +Food,42.94 +Food,29.21 +Leisure,17.79 +Health,13.44 +Housing,1158.40 +Food,34.27 +Food,17.94 +Food,120.72 +Housing,737.97 +Transport,31.04 +Transport,14.90 +Leisure,41.70 +Transport,24.57 +Food,71.66 +Health,54.03 +Leisure,39.57 +Food,22.62 +Food,31.74 +Transport,45.28 +Transport,42.28 +Transport,39.51 +Transport,7.47 +Food,21.65 +Leisure,61.23 +Transport,7.37 +Housing,1217.82 +Transport,11.65 +Food,37.65 +Food,48.08 +Health,92.78 +Food,5.34 +Health,148.53 +Food,3.41 +Savings,155.58 +Transport,8.23 +Savings,160.27 +Transport,39.32 +Transport,62.19 +Food,8.65 +Transport,20.83 +Health,59.72 +Transport,30.88 +Housing,969.56 +Transport,5.36 +Food,29.90 +Transport,7.78 +Leisure,66.67 +Transport,59.11 +Leisure,32.64 +Transport,13.72 +Transport,19.40 +Leisure,128.02 +Leisure,14.46 +Transport,21.06 +Food,23.71 +Food,72.40 +Transport,12.47 +Leisure,30.30 +Leisure,4.20 +Food,30.03 +Transport,29.30 +Food,24.35 +Transport,7.64 +Housing,924.98 +Transport,4.69 +Leisure,36.66 +Transport,22.60 +Leisure,3.40 +Leisure,88.08 +Food,43.13 +Transport,22.38 +Transport,10.14 +Housing,1347.95 +Leisure,17.69 +Leisure,12.37 +Transport,10.19 +Transport,5.75 +Food,129.84 +Transport,34.20 +Leisure,43.63 +Transport,25.29 +Leisure,70.33 +Health,131.89 +Health,21.19 +Savings,251.64 +Housing,1392.79 +Health,26.18 +Transport,14.44 +Food,20.15 +Transport,33.23 +Transport,5.44 +Food,23.26 +Leisure,2.60 +Housing,794.42 +Food,32.61 +Food,4.21 +Housing,679.27 +Health,17.96 +Food,53.64 +Leisure,70.00 +Food,37.91 +Leisure,44.49 +Savings,159.68 +Transport,31.62 +Transport,16.45 +Transport,38.82 +Food,9.35 +Food,55.77 +Transport,86.62 +Food,71.27 +Transport,14.14 +Health,49.59 +Food,34.29 +Leisure,34.05 +Food,12.71 +Health,87.53 +Food,23.05 +Food,85.03 +Food,39.65 +Food,19.90 +Food,32.57 +Transport,38.13 +Leisure,73.03 +Transport,25.19 +Food,89.38 +Food,13.44 +Housing,1094.76 +Transport,19.99 +Leisure,17.21 +Housing,1635.09 +Food,49.35 +Food,70.60 +Transport,5.39 +Transport,8.48 +Health,29.42 +Savings,182.74 +Transport,15.41 +Food,98.32 +Transport,12.19 +Transport,13.53 +Transport,54.60 +Leisure,81.12 +Leisure,39.44 +Transport,21.24 +Transport,26.06 +Health,12.68 +Transport,12.80 +Food,18.65 +Transport,37.10 +Transport,11.05 +Leisure,43.09 +Food,21.28 +Transport,20.87 +Leisure,64.76 +Transport,68.46 +Leisure,13.15 +Food,35.28 +Leisure,37.58 +Food,81.24 +Food,34.97 +Transport,9.41 +Transport,20.94 +Food,28.74 +Food,37.18 +Transport,37.78 +Leisure,51.51 +Food,26.04 +Food,98.76 +Food,71.40 +Food,7.06 +Transport,32.70 +Food,46.87 +Savings,311.86 +Transport,19.54 +Food,2.17 +Transport,5.47 +Food,62.52 +Savings,585.19 +Savings,523.64 +Food,39.01 +Leisure,33.19 +Savings,46.40 +Transport,16.67 +Leisure,83.89 +Transport,13.49 +Food,69.23 +Transport,74.05 +Food,50.13 +Food,23.63 +Leisure,47.36 +Leisure,29.12 +Food,14.23 +Food,32.86 +Transport,12.16 +Housing,454.10 +Savings,896.21 +Transport,48.28 +Leisure,12.17 +Transport,40.60 +Food,62.61 +Food,25.90 +Transport,24.31 +Food,67.67 +Food,60.52 +Transport,15.78 +Leisure,17.14 +Food,37.50 +Food,9.67 +Leisure,65.84 +Food,44.92 +Housing,627.59 +Health,85.76 +Health,46.13 +Food,59.46 +Transport,6.70 +Housing,502.74 +Food,55.36 +Food,28.39 +Health,34.18 +Transport,11.45 +Transport,21.12 +Leisure,8.45 +Food,52.71 +Transport,39.60 +Food,20.46 +Leisure,76.87 +Food,44.79 +Transport,13.08 +Food,24.86 +Housing,1229.72 +Transport,25.51 +Food,30.83 +Leisure,16.42 +Leisure,90.58 +Leisure,56.67 +Food,46.60 +Transport,12.48 +Transport,5.23 +Housing,370.39 +Health,39.19 +Transport,36.80 +Health,10.70 +Transport,11.86 +Transport,9.80 +Leisure,88.80 +Food,66.99 +Food,30.13 +Housing,869.90 +Transport,12.48 +Food,26.06 +Leisure,79.98 +Leisure,46.75 +Housing,660.74 +Food,30.09 +Health,7.12 +Food,14.76 +Food,58.06 +Transport,41.35 +Food,25.25 +Transport,10.83 +Food,20.16 +Housing,320.41 +Transport,7.50 +Savings,176.74 +Transport,49.15 +Transport,24.10 +Transport,47.47 +Leisure,8.58 +Savings,191.31 +Transport,68.78 +Leisure,28.22 +Health,97.11 +Food,23.61 +Food,30.35 +Transport,37.87 +Leisure,50.73 +Transport,37.51 +Food,28.67 +Food,12.37 +Leisure,27.52 +Leisure,40.04 +Leisure,82.25 +Leisure,89.38 +Food,12.48 +Transport,11.21 +Transport,35.95 +Leisure,17.62 +Transport,11.60 +Food,26.13 +Transport,8.10 +Transport,11.24 +Housing,262.19 +Food,6.84 +Food,26.21 +Transport,14.46 +Housing,75.71 +Transport,22.61 +Food,11.05 +Transport,37.20 +Transport,21.80 +Transport,5.43 +Leisure,51.47 +Leisure,31.48 +Transport,11.53 +Transport,6.44 +Transport,22.55 +Food,106.11 +Transport,41.23 +Housing,1349.22 +Food,50.51 +Food,32.01 +Savings,416.66 +Health,90.33 +Savings,153.14 +Transport,46.44 +Health,7.60 +Food,80.66 +Leisure,83.25 +Leisure,15.00 +Food,121.82 +Food,28.98 +Housing,389.51 +Food,71.41 +Housing,2268.50 +Transport,28.05 +Housing,509.36 +Savings,436.52 +Housing,736.77 +Leisure,46.16 +Transport,15.94 +Leisure,74.06 +Transport,32.40 +Food,24.16 +Food,33.13 +Transport,50.48 +Food,106.52 +Leisure,36.72 +Transport,40.59 +Health,154.52 +Food,69.80 +Transport,49.11 +Transport,29.15 +Transport,20.93 +Food,4.81 +Health,87.24 +Health,112.35 +Food,64.57 +Food,119.05 +Food,53.72 +Savings,407.13 +Food,18.60 +Leisure,40.26 +Transport,45.97 +Food,41.33 +Transport,28.34 +Housing,184.43 +Health,88.57 +Food,10.61 +Health,23.12 +Food,5.70 +Food,37.66 +Leisure,58.89 +Transport,15.45 +Food,12.45 +Transport,8.33 +Transport,50.55 +Food,24.87 +Transport,7.41 +Food,134.47 +Food,62.88 +Leisure,66.76 +Food,22.50 +Transport,14.75 +Transport,5.92 +Housing,369.00 +Health,150.06 +Food,50.25 +Leisure,20.15 +Health,43.59 +Transport,51.56 +Transport,48.84 +Health,109.13 +Food,23.47 +Leisure,26.12 +Food,15.10 +Food,6.86 +Food,44.19 +Transport,4.04 +Leisure,38.15 +Transport,6.30 +Food,1.00 +Savings,98.47 +Food,8.08 +Leisure,34.07 +Food,20.95 +Transport,6.19 +Transport,5.33 +Leisure,33.05 +Transport,12.35 +Transport,51.58 +Leisure,18.12 +Food,32.47 +Food,109.11 +Transport,45.70 +Health,49.26 +Food,17.74 +Health,79.54 +Health,46.24 +Savings,361.32 +Transport,32.55 +Transport,49.08 +Savings,518.65 +Transport,39.77 +Food,75.34 +Food,16.43 +Leisure,22.09 +Food,14.96 +Leisure,24.12 +Housing,988.84 +Food,67.40 +Leisure,70.61 +Food,28.72 +Transport,7.04 +Food,43.48 +Transport,40.75 +Transport,37.34 +Transport,28.90 +Transport,19.72 +Food,54.78 +Transport,11.27 +Health,21.21 +Food,22.86 +Transport,26.77 +Leisure,53.72 +Transport,27.55 +Food,49.46 +Food,19.28 +Food,36.75 +Savings,164.31 +Food,15.15 +Transport,4.81 +Leisure,54.60 +Food,9.23 +Food,12.44 +Food,49.05 +Health,94.09 +Food,13.02 +Food,10.81 +Transport,16.36 +Transport,4.13 +Transport,16.54 +Transport,10.73 +Leisure,19.91 +Transport,9.87 +Transport,51.70 +Transport,26.31 +Food,78.89 +Health,81.98 +Housing,450.18 +Food,71.99 +Food,27.13 +Food,34.00 +Food,47.61 +Food,9.15 +Food,52.73 +Transport,17.01 +Transport,18.49 +Savings,233.88 +Health,97.36 +Transport,10.75 +Savings,58.02 +Leisure,52.49 +Food,32.04 +Food,17.97 +Transport,42.12 +Leisure,71.98 +Health,147.91 +Food,44.83 +Food,40.38 +Transport,22.84 +Transport,25.03 +Food,28.09 +Transport,21.86 +Transport,27.53 +Food,96.09 +Transport,1.00 +Leisure,10.77 +Food,29.27 +Transport,25.14 +Food,7.45 +Food,66.31 +Health,82.94 +Savings,245.32 +Health,117.16 +Food,43.79 +Leisure,33.79 +Transport,16.11 +Leisure,53.05 +Leisure,42.92 +Transport,7.53 +Transport,29.52 +Food,37.12 +Food,89.39 +Transport,5.66 +Transport,43.48 +Food,72.19 +Transport,9.33 +Health,7.48 +Health,107.50 +Transport,56.76 +Leisure,35.10 +Transport,46.40 +Transport,15.83 +Transport,18.94 +Transport,4.91 +Transport,28.84 +Leisure,60.06 +Food,1.95 +Leisure,10.67 +Food,62.01 +Food,17.65 +Food,70.28 +Leisure,35.25 +Leisure,44.54 +Transport,53.38 +Transport,9.79 +Transport,37.81 +Health,146.72 +Food,35.32 +Transport,49.21 +Transport,21.66 +Food,107.79 +Transport,4.67 +Food,28.47 +Leisure,8.84 +Food,16.97 +Food,37.51 +Food,99.26 +Health,26.59 +Health,45.41 +Housing,509.37 +Food,38.98 +Transport,22.40 +Food,20.50 +Food,37.60 +Food,27.25 +Housing,618.23 +Transport,7.72 +Food,49.27 +Food,20.86 +Food,3.15 +Transport,26.22 +Transport,16.93 +Food,14.07 +Food,14.66 +Housing,403.82 +Leisure,144.84 +Housing,222.30 +Transport,5.18 +Transport,16.92 +Food,59.30 +Transport,3.15 +Transport,30.07 +Food,103.69 +Transport,17.16 +Transport,23.06 +Food,23.96 +Leisure,47.06 +Transport,14.64 +Food,104.49 +Leisure,89.73 +Housing,2026.10 +Transport,19.41 +Transport,15.98 +Transport,22.12 +Food,33.58 +Food,36.69 +Transport,40.28 +Food,189.69 +Food,7.66 +Food,37.97 +Food,21.85 +Food,20.78 +Food,43.79 +Transport,45.86 +Housing,60.53 +Transport,12.57 +Leisure,11.31 +Transport,36.80 +Health,38.80 +Leisure,37.02 +Transport,25.09 +Leisure,55.63 +Leisure,73.52 +Transport,22.93 +Food,15.39 +Food,18.79 +Food,44.72 +Transport,17.49 +Food,60.29 +Leisure,7.61 +Food,18.90 +Transport,9.48 +Savings,164.92 +Food,50.37 +Housing,319.86 +Transport,25.45 +Transport,14.56 +Health,115.30 +Transport,12.84 +Transport,26.49 +Transport,9.82 +Food,23.85 +Leisure,47.75 +Leisure,55.72 +Health,17.10 +Health,40.70 +Transport,16.12 +Health,61.15 +Food,98.63 +Food,40.86 +Health,41.80 +Leisure,49.98 +Transport,19.13 +Health,51.14 +Food,19.41 +Food,9.39 +Food,43.97 +Health,44.73 +Savings,284.24 +Food,2.79 +Food,33.58 +Health,52.29 +Transport,60.11 +Transport,11.71 +Health,29.99 +Leisure,11.21 +Food,34.07 +Food,61.11 +Savings,267.21 +Leisure,34.48 +Food,64.92 +Health,36.66 +Leisure,61.80 +Transport,14.61 +Leisure,94.60 +Transport,19.63 +Food,44.12 +Food,16.29 +Food,24.60 +Health,5.92 +Health,63.03 +Transport,10.44 +Food,147.49 +Transport,51.42 +Transport,13.97 +Food,29.45 +Food,16.34 +Transport,4.59 +Health,49.51 +Transport,2.27 +Transport,29.23 +Food,43.60 +Transport,30.51 +Transport,21.97 +Food,35.60 +Food,25.50 +Food,47.83 +Housing,357.51 +Transport,25.21 +Housing,1863.67 +Food,46.93 +Food,24.10 +Leisure,30.06 +Transport,43.21 +Food,20.22 +Transport,24.60 +Food,7.60 +Transport,19.25 +Transport,6.02 +Transport,5.60 +Transport,15.06 +Health,251.63 +Leisure,59.91 +Food,31.10 +Transport,18.53 +Transport,52.68 +Food,13.35 +Food,23.20 +Leisure,25.56 +Transport,6.19 +Savings,161.76 +Transport,21.99 +Health,52.32 +Food,6.00 +Transport,12.82 +Transport,79.18 +Leisure,42.22 +Savings,436.59 +Transport,18.96 +Food,64.78 +Transport,14.41 +Food,33.63 +Leisure,82.34 +Health,109.85 +Food,39.36 +Transport,80.47 +Leisure,26.36 +Food,22.04 +Transport,30.82 +Transport,7.89 +Food,76.01 +Food,54.72 +Transport,30.20 +Transport,41.22 +Transport,52.18 +Leisure,48.56 +Food,98.97 +Transport,25.39 +Leisure,41.67 +Food,26.17 +Transport,46.07 +Transport,24.23 +Transport,31.21 +Transport,8.37 +Food,45.24 +Transport,20.66 +Food,24.79 +Transport,10.89 +Food,18.35 +Food,70.00 +Savings,218.26 +Transport,19.55 +Leisure,18.94 +Transport,21.46 +Savings,113.35 +Leisure,9.38 +Food,11.74 +Transport,21.19 +Food,25.79 +Food,61.07 +Food,43.96 +Housing,985.54 +Savings,59.69 +Transport,32.99 +Leisure,34.98 +Food,23.25 +Leisure,10.64 +Food,79.15 +Transport,24.34 +Food,8.92 +Transport,6.86 +Food,18.03 +Food,72.10 +Food,12.95 +Food,77.41 +Transport,27.93 +Transport,17.28 +Health,61.11 +Savings,369.51 +Health,107.70 +Transport,24.33 +Food,20.16 +Savings,247.98 +Food,34.99 +Food,13.52 +Transport,25.65 +Food,32.06 +Housing,320.76 +Transport,7.88 +Leisure,16.17 +Health,143.28 +Food,58.32 +Housing,327.14 +Food,18.05 +Health,52.86 +Food,27.49 +Transport,24.82 +Transport,48.81 +Transport,64.13 +Transport,17.73 +Transport,5.10 +Transport,13.38 +Food,17.60 +Leisure,26.92 +Savings,220.49 +Food,37.33 +Health,129.38 +Food,25.58 +Health,94.46 +Transport,10.72 +Transport,16.89 +Leisure,16.84 +Leisure,77.55 +Leisure,34.02 +Leisure,4.48 +Leisure,67.71 +Leisure,56.53 +Food,61.31 +Leisure,54.95 +Food,9.72 +Savings,186.29 +Transport,21.31 +Leisure,28.49 +Leisure,82.67 +Leisure,26.15 +Food,113.79 +Food,36.93 +Transport,36.62 +Food,77.12 +Savings,149.90 +Transport,6.53 +Transport,5.30 +Transport,6.11 +Savings,268.24 +Food,12.48 +Transport,25.94 +Leisure,1.00 +Health,104.23 +Leisure,58.42 +Savings,347.52 +Transport,57.08 +Transport,111.71 +Savings,305.83 +Transport,19.34 +Health,38.49 +Transport,34.09 +Food,99.53 +Transport,44.62 +Transport,19.32 +Transport,19.74 +Food,8.01 +Food,5.97 +Transport,19.05 +Food,47.92 +Transport,30.33 +Leisure,52.51 +Food,35.40 +Health,65.09 +Leisure,61.24 +Transport,39.83 +Transport,4.20 +Food,49.11 +Transport,44.07 +Food,42.87 +Food,7.66 +Transport,16.55 +Food,61.82 +Food,28.45 +Food,46.16 +Housing,1916.07 +Health,36.47 +Transport,16.92 +Food,22.91 +Housing,390.67 +Transport,14.35 +Transport,14.98 +Food,17.05 +Transport,73.86 +Leisure,50.75 +Transport,12.09 +Food,41.30 +Transport,14.63 +Food,19.82 +Health,56.73 +Transport,8.77 +Transport,11.58 +Food,79.42 +Food,39.60 +Food,90.06 +Food,13.29 +Transport,85.06 +Housing,644.77 +Savings,201.07 +Leisure,56.26 +Transport,8.05 +Food,31.23 +Transport,33.96 +Transport,6.87 +Health,51.15 +Health,28.55 +Transport,20.24 +Leisure,31.27 +Food,46.67 +Leisure,63.23 +Food,123.54 +Transport,5.68 +Leisure,14.69 +Food,99.05 +Leisure,22.92 +Food,5.58 +Food,29.66 +Food,35.94 +Transport,9.48 +Transport,3.04 +Leisure,13.96 +Food,63.82 +Transport,24.67 +Leisure,7.66 +Transport,41.16 +Food,7.24 +Savings,430.69 +Transport,46.82 +Food,36.71 +Transport,26.38 +Housing,523.47 +Transport,20.05 +Leisure,10.35 +Transport,8.83 +Food,34.25 +Transport,27.76 +Transport,15.90 +Food,26.95 +Food,31.91 +Leisure,16.20 +Food,45.83 +Transport,11.77 +Transport,64.95 +Transport,20.59 +Food,51.81 +Transport,6.13 +Transport,32.05 +Health,28.92 +Housing,1234.93 +Transport,36.82 +Transport,24.79 +Food,64.32 +Food,59.60 +Food,27.36 +Food,6.63 +Health,150.61 +Food,52.71 +Savings,132.73 +Food,62.73 +Food,25.17 +Transport,8.14 +Transport,16.18 +Food,30.03 +Leisure,28.51 +Food,46.67 +Transport,55.80 +Food,13.77 +Food,75.92 +Leisure,53.48 +Leisure,33.67 +Food,16.53 +Transport,19.68 +Food,12.29 +Food,62.18 +Food,84.11 +Leisure,40.72 +Leisure,85.70 +Food,25.78 +Food,44.73 +Leisure,19.26 +Leisure,72.79 +Savings,42.30 +Food,66.26 +Food,69.76 +Leisure,126.33 +Health,50.17 +Transport,23.98 +Food,52.40 +Transport,33.95 +Transport,21.37 +Food,53.51 +Transport,16.28 +Food,90.73 +Food,14.84 +Leisure,46.90 +Transport,10.13 +Transport,48.01 +Food,53.54 +Food,30.90 +Food,10.96 +Savings,107.89 +Transport,9.02 +Transport,40.13 +Transport,14.95 +Leisure,114.85 +Transport,28.36 +Transport,62.36 +Food,89.22 +Transport,6.26 +Transport,35.38 +Transport,15.46 +Food,98.59 +Food,32.59 +Health,14.69 +Leisure,68.99 +Transport,30.24 +Food,20.75 +Health,15.96 +Housing,841.99 +Transport,37.44 +Leisure,19.62 +Food,24.84 +Health,45.27 +Transport,32.33 +Food,62.88 +Housing,936.60 +Transport,36.03 +Food,44.74 +Savings,643.44 +Food,34.18 +Transport,24.22 +Transport,4.75 +Food,40.80 +Leisure,85.79 +Food,15.00 +Food,23.35 +Housing,992.24 +Food,68.02 +Transport,6.77 +Food,83.40 +Leisure,34.15 +Food,22.25 +Health,96.38 +Transport,9.50 +Transport,17.10 +Transport,13.31 +Transport,21.29 +Food,16.21 +Food,23.32 +Food,19.10 +Food,28.72 +Food,51.55 +Leisure,5.88 +Food,60.90 +Transport,25.28 +Leisure,18.60 +Transport,4.48 +Transport,38.37 +Food,15.86 +Food,21.84 +Savings,176.96 +Health,114.17 +Health,24.02 +Food,38.80 +Transport,25.39 +Food,15.44 +Food,22.01 +Food,40.74 +Transport,36.62 +Food,29.02 +Transport,27.06 +Leisure,26.22 +Food,20.40 +Leisure,63.82 +Savings,60.75 +Food,21.96 +Food,57.39 +Transport,14.44 +Transport,21.76 +Food,17.81 +Food,86.82 +Transport,4.01 +Food,74.59 +Transport,7.69 +Food,14.86 +Food,54.16 +Health,127.37 +Leisure,20.09 +Transport,1.86 +Health,97.95 +Transport,42.17 +Transport,10.93 +Transport,23.43 +Food,36.98 +Transport,14.14 +Food,29.59 +Transport,7.65 +Food,25.42 +Food,18.45 +Savings,408.52 +Transport,15.10 +Food,26.20 +Leisure,22.70 +Food,35.50 +Transport,1.74 +Food,6.05 +Food,26.75 +Transport,21.08 +Leisure,4.83 +Transport,18.61 +Transport,26.36 +Transport,22.79 +Transport,5.22 +Transport,1.18 +Transport,27.35 +Transport,27.69 +Health,9.77 +Food,18.50 +Housing,67.80 +Transport,27.59 +Food,94.16 +Transport,46.52 +Leisure,47.51 +Food,11.24 +Food,112.32 +Transport,25.73 +Food,3.93 +Health,26.97 +Food,28.54 +Food,52.12 +Food,79.64 +Transport,20.50 +Leisure,45.51 +Leisure,26.38 +Food,23.04 +Food,11.00 +Food,13.06 +Leisure,17.46 +Food,16.08 +Leisure,39.27 +Transport,14.75 +Transport,26.11 +Transport,43.64 +Food,9.67 +Food,25.31 +Food,13.75 +Food,47.14 +Leisure,139.72 +Health,21.27 +Transport,18.75 +Food,8.32 +Transport,6.41 +Transport,46.05 +Savings,563.46 +Transport,12.65 +Food,11.96 +Health,31.61 +Food,12.86 +Health,64.03 +Health,165.74 +Transport,7.43 +Food,49.98 +Housing,897.59 +Savings,152.64 +Savings,763.34 +Food,28.52 +Transport,5.48 +Savings,73.57 +Food,39.46 +Food,35.77 +Food,99.73 +Food,44.28 +Transport,52.14 +Transport,23.62 +Food,105.81 +Food,60.90 +Food,21.22 +Transport,14.28 +Food,33.09 +Transport,32.74 +Food,78.52 +Transport,45.02 +Transport,19.87 +Health,12.74 +Leisure,23.10 +Food,17.49 +Transport,14.14 +Savings,117.66 +Transport,44.36 +Leisure,101.34 +Savings,222.89 +Food,70.34 +Transport,22.93 +Transport,10.56 +Transport,8.08 +Leisure,39.30 +Transport,5.62 +Food,4.67 +Transport,14.85 +Savings,502.39 +Transport,20.85 +Food,9.89 +Food,63.39 +Transport,8.80 +Transport,21.39 +Transport,14.59 +Food,16.72 +Leisure,20.89 +Transport,9.61 +Food,25.38 +Health,67.63 +Food,109.64 +Transport,16.56 +Transport,11.49 +Health,15.72 +Food,32.21 +Food,24.59 +Leisure,48.65 +Leisure,66.39 +Food,49.51 +Transport,26.96 +Food,88.10 +Transport,21.21 +Food,19.99 +Health,48.46 +Food,6.98 +Food,87.78 +Transport,26.93 +Transport,23.41 +Food,39.53 +Transport,20.14 +Transport,28.11 +Food,22.11 +Food,42.11 +Transport,49.33 +Leisure,22.77 +Leisure,64.42 +Leisure,86.98 +Food,7.74 +Food,11.64 +Food,81.52 +Transport,2.50 +Leisure,20.23 +Transport,45.68 +Leisure,20.97 +Food,29.48 +Food,29.33 +Leisure,42.42 +Food,4.87 +Health,20.14 +Transport,27.50 +Transport,13.82 +Food,2.24 +Food,24.76 +Food,16.66 +Transport,7.36 +Transport,18.28 +Transport,34.16 +Food,19.92 +Transport,9.77 +Leisure,102.44 +Food,34.49 +Food,26.16 +Leisure,29.19 +Food,8.83 +Leisure,14.66 +Transport,14.00 +Transport,11.41 +Food,42.75 +Leisure,55.71 +Food,78.65 +Transport,31.17 +Transport,17.59 +Food,80.89 +Health,12.82 +Transport,17.90 +Leisure,73.37 +Food,57.92 +Leisure,31.91 +Transport,37.42 +Housing,315.59 +Leisure,14.86 +Food,23.96 +Food,69.68 +Transport,26.37 +Food,36.90 +Food,43.07 +Food,130.93 +Health,24.88 +Food,12.03 +Leisure,87.38 +Health,52.89 +Leisure,122.68 +Transport,17.93 +Food,16.66 +Leisure,28.35 +Transport,4.59 +Leisure,13.13 +Transport,39.25 +Transport,67.58 +Food,13.99 +Leisure,77.76 +Leisure,18.10 +Leisure,10.77 +Transport,18.53 +Health,20.00 +Transport,8.40 +Leisure,67.03 +Transport,8.89 +Health,38.53 +Food,8.90 +Housing,591.63 +Transport,38.41 +Transport,9.60 +Leisure,46.11 +Food,69.80 +Leisure,15.47 +Food,21.13 +Housing,1684.12 +Transport,84.17 +Food,49.71 +Transport,64.16 +Transport,31.53 +Leisure,7.78 +Food,59.94 +Food,80.50 +Food,75.35 +Food,5.15 +Leisure,62.30 +Food,12.81 +Food,54.42 +Transport,4.72 +Transport,19.79 +Leisure,12.96 +Transport,16.67 +Food,27.02 +Transport,24.71 +Leisure,97.60 +Food,37.64 +Food,54.24 +Food,70.22 +Transport,36.89 +Leisure,68.89 +Food,19.75 +Transport,27.06 +Health,32.88 +Transport,12.77 +Transport,4.50 +Leisure,26.57 +Transport,33.35 +Transport,10.38 +Transport,40.91 +Transport,2.88 +Transport,7.03 +Food,6.12 +Transport,11.71 +Leisure,88.79 +Transport,20.84 +Transport,10.73 +Food,47.03 +Transport,37.49 +Transport,1.93 +Leisure,31.26 +Food,79.04 +Food,31.63 +Food,31.34 +Transport,18.86 +Transport,103.13 +Transport,34.80 +Leisure,118.66 +Food,13.06 +Food,10.95 +Transport,8.15 +Transport,16.34 +Food,14.96 +Leisure,12.21 +Transport,18.54 +Food,27.34 +Food,12.34 +Food,16.89 +Transport,27.93 +Food,2.83 +Food,12.70 +Food,14.60 +Leisure,12.08 +Transport,4.34 +Savings,110.04 +Food,21.90 +Food,20.29 +Transport,27.21 +Food,53.00 +Food,14.03 +Health,9.05 +Transport,14.53 +Transport,39.98 +Housing,2240.41 +Leisure,56.73 +Transport,18.89 +Food,12.22 +Savings,94.83 +Transport,46.78 +Transport,26.25 +Health,24.23 +Transport,8.04 +Food,18.48 +Transport,7.40 +Transport,11.18 +Transport,43.63 +Transport,28.71 +Leisure,103.22 +Leisure,22.61 +Food,4.85 +Transport,17.98 +Food,21.34 +Transport,13.36 +Leisure,23.57 +Housing,878.80 +Transport,51.36 +Transport,42.33 +Food,11.55 +Housing,901.87 +Food,40.25 +Food,6.51 +Food,14.68 +Transport,13.38 +Leisure,14.95 +Food,62.50 +Food,24.34 +Transport,6.92 +Transport,39.00 +Leisure,41.99 +Food,149.79 +Food,57.67 +Transport,44.28 +Savings,292.60 +Food,15.11 +Leisure,59.20 +Food,99.00 +Food,2.61 +Food,29.08 +Housing,957.63 +Transport,43.21 +Food,60.38 +Leisure,92.17 +Transport,30.87 +Transport,18.48 +Health,40.60 +Food,36.15 +Food,20.79 +Food,20.49 +Transport,4.94 +Housing,65.99 +Leisure,2.65 +Food,68.32 +Food,25.72 +Leisure,54.52 +Food,20.90 +Food,33.00 +Housing,557.46 +Transport,83.42 +Food,1.87 +Food,66.16 +Transport,7.09 +Food,33.13 +Transport,6.06 +Transport,18.60 +Health,53.51 +Health,64.93 +Food,8.11 +Food,30.50 +Housing,740.55 +Food,23.73 +Leisure,47.34 +Transport,76.94 +Food,7.47 +Leisure,33.14 +Food,111.70 +Food,55.53 +Transport,28.94 +Leisure,43.76 +Leisure,2.53 +Transport,41.90 +Transport,25.75 +Leisure,84.99 +Leisure,49.93 +Leisure,16.37 +Food,79.48 +Health,64.87 +Food,26.88 +Transport,14.09 +Leisure,63.35 +Food,24.36 +Food,49.89 +Food,27.78 +Transport,16.41 +Food,85.25 +Transport,17.16 +Transport,1.71 +Leisure,11.33 +Food,48.52 +Food,36.72 +Savings,776.70 +Transport,42.95 +Leisure,33.77 +Health,177.33 +Food,35.63 +Transport,8.79 +Food,15.13 +Food,36.10 +Transport,19.22 +Transport,16.93 +Food,27.96 +Transport,31.94 +Health,69.33 +Transport,6.16 +Food,14.22 +Transport,24.91 +Housing,1517.71 +Leisure,61.91 +Leisure,10.88 +Leisure,9.48 +Food,36.23 +Food,29.20 +Health,105.74 +Transport,14.44 +Health,56.50 +Food,33.20 +Food,9.37 +Food,59.55 +Transport,15.14 +Transport,13.78 +Food,51.46 +Transport,28.51 +Food,24.16 +Transport,42.29 +Food,20.24 +Transport,13.22 +Transport,14.21 +Health,85.58 +Housing,222.64 +Food,38.04 +Food,26.91 +Transport,13.14 +Transport,15.30 +Housing,819.84 +Transport,6.25 +Leisure,32.48 +Transport,31.49 +Food,26.58 +Leisure,111.93 +Transport,7.20 +Leisure,80.99 +Transport,9.58 +Food,20.02 +Leisure,25.19 +Housing,742.76 +Food,11.70 +Transport,13.44 +Food,26.14 +Transport,16.09 +Transport,10.40 +Transport,13.93 +Health,129.99 +Transport,11.84 +Leisure,45.36 +Transport,45.39 +Transport,55.72 +Transport,63.14 +Transport,19.90 +Food,97.01 +Transport,38.27 +Transport,20.44 +Transport,19.82 +Food,16.49 +Transport,12.41 +Transport,20.77 +Health,104.76 +Food,33.15 +Transport,8.47 +Transport,21.11 +Food,29.72 +Food,96.86 +Food,53.42 +Health,153.28 +Savings,676.37 +Transport,21.86 +Transport,23.84 +Food,35.65 +Transport,24.39 +Health,19.42 +Food,16.12 +Housing,659.22 +Leisure,5.88 +Transport,26.39 +Food,55.67 +Food,44.53 +Food,167.08 +Transport,38.60 +Transport,34.07 +Transport,1.40 +Transport,93.53 +Food,13.99 +Food,31.03 +Food,14.50 +Transport,57.52 +Transport,56.39 +Food,22.78 +Leisure,33.93 +Food,9.93 +Food,1.51 +Housing,986.81 +Food,39.55 +Leisure,16.03 +Leisure,60.85 +Transport,17.25 +Transport,17.07 +Transport,52.68 +Leisure,24.95 +Transport,19.80 +Transport,24.80 +Leisure,49.03 +Leisure,22.57 +Food,36.55 +Leisure,84.01 +Transport,1.50 +Health,12.51 +Leisure,56.59 +Transport,20.20 +Savings,492.85 +Food,44.62 +Transport,10.15 +Transport,6.13 +Leisure,47.39 +Food,26.73 +Transport,86.12 +Transport,3.13 +Transport,28.88 +Transport,10.30 +Leisure,39.53 +Savings,229.54 +Food,23.40 +Transport,27.00 +Transport,15.99 +Leisure,14.98 +Food,14.17 +Transport,25.96 +Savings,569.13 +Transport,26.08 +Food,76.06 +Housing,1388.51 +Food,23.39 +Food,41.54 +Leisure,21.60 +Food,36.68 +Food,8.96 +Transport,28.19 +Food,22.51 +Food,35.71 +Leisure,19.49 +Food,60.44 +Leisure,29.36 +Leisure,41.76 +Savings,284.57 +Leisure,32.63 +Food,61.40 +Transport,11.29 +Transport,32.33 +Food,20.46 +Food,109.18 +Health,109.24 +Transport,23.77 +Transport,25.88 +Leisure,38.04 +Transport,6.82 +Food,72.46 +Food,41.23 +Health,37.66 +Leisure,62.00 +Food,77.21 +Health,30.18 +Housing,2577.01 +Transport,1.52 +Food,28.93 +Food,76.19 +Transport,21.51 +Transport,46.05 +Transport,31.51 +Savings,165.18 +Food,131.17 +Leisure,43.92 +Food,6.53 +Health,45.71 +Transport,2.61 +Transport,6.56 +Food,22.69 +Food,9.56 +Food,83.90 +Food,43.83 +Food,46.23 +Transport,18.78 +Food,48.89 +Food,87.90 +Food,86.86 +Food,31.34 +Housing,2787.64 +Savings,198.98 +Transport,18.01 +Food,145.83 +Leisure,104.60 +Transport,6.10 +Transport,11.49 +Transport,38.99 +Food,29.46 +Transport,37.34 +Health,42.18 +Leisure,15.86 +Transport,21.50 +Transport,13.23 +Transport,19.60 +Housing,1166.25 +Food,2.60 +Transport,34.99 +Transport,4.68 +Transport,20.46 +Food,93.72 +Leisure,9.22 +Food,55.29 +Leisure,12.18 +Food,14.29 +Transport,9.03 +Housing,443.11 +Leisure,15.97 +Health,180.55 +Transport,4.70 +Food,51.58 +Food,23.04 +Health,6.98 +Leisure,138.00 +Food,4.09 +Health,63.15 +Food,26.40 +Food,75.14 +Food,36.29 +Leisure,47.20 +Food,19.00 +Food,19.43 +Food,83.73 +Food,17.23 +Transport,4.03 +Leisure,70.46 +Food,32.67 +Food,9.96 +Food,13.15 +Food,15.27 +Leisure,40.23 +Transport,21.08 +Food,22.91 +Savings,89.12 +Food,74.55 +Leisure,24.55 +Transport,16.14 +Transport,34.45 +Leisure,45.49 +Food,25.64 +Transport,14.40 +Leisure,50.72 +Food,8.98 +Food,11.15 +Food,40.64 +Savings,449.22 +Food,71.47 +Transport,33.01 +Housing,671.78 +Transport,22.14 +Food,49.90 +Food,3.47 +Transport,76.35 +Food,27.27 +Health,93.06 +Food,28.90 +Transport,20.22 +Housing,610.79 +Transport,8.37 +Savings,323.12 +Food,9.32 +Health,68.25 +Transport,14.72 +Transport,17.36 +Leisure,8.48 +Leisure,28.58 +Leisure,93.09 +Food,10.07 +Transport,29.32 +Transport,15.01 +Savings,483.99 +Leisure,7.93 +Transport,20.80 +Food,47.69 +Food,44.42 +Transport,29.10 +Health,115.84 +Food,30.74 +Food,87.32 +Transport,24.20 +Food,39.17 +Food,17.11 +Transport,18.39 +Transport,32.39 +Food,60.31 +Leisure,24.43 +Leisure,53.32 +Food,101.07 +Food,11.78 +Leisure,20.42 +Food,47.83 +Transport,13.55 +Transport,12.72 +Transport,15.50 +Food,29.88 +Transport,4.10 +Food,114.28 +Leisure,44.38 +Food,81.62 +Leisure,42.74 +Leisure,41.77 +Transport,33.05 +Transport,6.78 +Transport,27.95 +Food,9.88 +Transport,40.32 +Transport,4.99 +Food,18.38 +Transport,30.36 +Leisure,69.91 +Food,25.56 +Food,8.53 +Transport,34.80 +Leisure,37.18 +Health,66.96 +Transport,33.60 +Transport,11.37 +Housing,1688.35 +Savings,139.09 +Transport,31.03 +Food,47.18 +Food,34.43 +Health,66.67 +Health,34.74 +Food,39.77 +Food,93.47 +Food,18.10 +Food,111.47 +Transport,18.40 +Transport,17.08 +Food,69.70 +Food,78.51 +Food,27.75 +Savings,379.86 +Transport,47.21 +Food,33.42 +Food,22.10 +Food,47.73 +Leisure,38.35 +Food,25.71 +Food,33.20 +Food,80.62 +Transport,8.90 +Food,22.95 +Transport,40.43 +Transport,1.32 +Transport,13.68 +Food,21.15 +Food,131.06 +Transport,19.89 +Food,50.30 +Transport,5.35 +Food,25.97 +Leisure,14.44 +Transport,18.87 +Food,17.14 +Health,93.88 +Transport,23.99 +Food,30.48 +Food,23.17 +Food,8.42 +Health,44.79 +Health,105.06 +Food,33.43 +Food,69.76 +Transport,61.94 +Food,45.51 +Food,23.84 +Food,46.17 +Leisure,31.34 +Food,17.54 +Health,62.78 +Food,6.59 +Food,15.31 +Food,26.72 +Food,1.52 +Transport,8.78 +Leisure,15.04 +Food,67.44 +Transport,16.00 +Transport,30.21 +Leisure,197.96 +Health,72.94 +Food,16.13 +Housing,555.51 +Leisure,100.05 +Food,42.88 +Transport,18.39 +Health,129.82 +Leisure,29.92 +Transport,27.31 +Health,51.67 +Food,38.60 +Transport,34.53 +Food,21.95 +Transport,26.04 +Health,30.79 +Transport,10.61 +Transport,9.16 +Food,12.37 +Leisure,53.78 +Health,53.57 +Transport,11.73 +Food,92.72 +Transport,8.51 +Transport,15.48 +Leisure,54.09 +Food,142.13 +Food,43.46 +Transport,19.09 +Transport,27.74 +Transport,24.72 +Transport,2.59 +Transport,13.37 +Food,25.37 +Leisure,29.05 +Transport,26.62 +Transport,9.21 +Transport,32.18 +Food,33.27 +Housing,340.35 +Health,109.78 +Transport,18.02 +Housing,1685.99 +Food,138.23 +Food,26.34 +Transport,24.41 +Food,10.35 +Food,32.65 +Transport,46.84 +Transport,12.44 +Food,14.86 +Transport,34.23 +Leisure,29.78 +Housing,39.42 +Transport,38.67 +Food,31.90 +Savings,304.49 +Food,48.80 +Food,7.72 +Leisure,20.98 +Housing,843.32 +Transport,49.65 +Health,131.51 +Food,16.53 +Food,20.80 +Food,9.20 +Transport,4.50 +Food,60.77 +Leisure,35.07 +Transport,32.32 +Food,44.14 +Health,30.14 +Health,101.51 +Transport,35.06 +Transport,53.35 +Food,4.17 +Transport,22.69 +Transport,24.19 +Transport,6.04 +Leisure,71.85 +Leisure,25.26 +Transport,43.73 +Transport,54.04 +Leisure,50.74 +Food,22.52 +Food,32.79 +Food,25.17 +Food,22.08 +Transport,27.74 +Transport,6.84 +Food,32.64 +Leisure,10.17 +Transport,20.81 +Food,30.66 +Food,45.08 +Food,50.75 +Transport,14.02 +Leisure,86.38 +Transport,25.53 +Food,38.40 +Food,65.68 +Savings,394.67 +Health,99.07 +Transport,2.13 +Transport,8.29 +Health,57.87 +Transport,22.02 +Food,22.68 +Housing,364.08 +Food,55.26 +Transport,10.57 +Health,22.06 +Leisure,14.61 +Food,4.29 +Leisure,5.05 +Food,92.35 +Food,73.67 +Transport,21.71 +Health,31.33 +Savings,317.13 +Food,29.69 +Food,35.69 +Food,38.64 +Food,21.62 +Leisure,26.76 +Food,13.35 +Leisure,23.06 +Food,48.35 +Leisure,38.42 +Transport,12.95 +Food,31.18 +Transport,38.61 +Transport,22.49 +Transport,9.32 +Food,56.01 +Savings,1314.59 +Transport,34.89 +Transport,20.69 +Food,21.27 +Health,92.83 +Transport,10.43 +Transport,11.50 +Food,12.39 +Health,48.52 +Transport,1.00 +Housing,1226.99 +Food,4.02 +Transport,6.57 +Leisure,32.56 +Leisure,57.76 +Food,13.63 +Food,34.48 +Transport,13.56 +Transport,21.16 +Food,25.00 +Food,5.98 +Food,80.77 +Savings,415.70 +Transport,19.60 +Food,61.50 +Health,7.30 +Food,24.02 +Food,67.41 +Transport,22.67 +Leisure,19.68 +Food,67.78 +Food,24.65 +Leisure,42.51 +Health,153.38 +Food,47.52 +Food,86.85 +Transport,22.23 +Food,36.76 +Food,5.28 +Transport,15.45 +Food,22.66 +Food,195.94 +Housing,745.92 +Food,21.16 +Transport,47.51 +Food,45.61 +Transport,28.89 +Food,55.20 +Food,16.11 +Food,28.56 +Transport,21.92 +Transport,15.39 +Health,39.99 +Leisure,14.02 +Transport,27.99 +Food,16.20 +Food,23.27 +Transport,34.05 +Food,33.30 +Health,14.89 +Food,34.56 +Food,11.77 +Health,109.13 +Savings,127.33 +Food,19.51 +Leisure,12.72 +Transport,13.99 +Transport,2.33 +Food,43.38 +Health,102.79 +Food,23.25 +Transport,30.06 +Savings,53.90 +Food,93.90 +Transport,26.98 +Health,143.98 +Leisure,54.68 +Transport,38.69 +Transport,55.97 +Food,16.92 +Food,9.81 +Leisure,23.26 +Leisure,57.28 +Transport,8.05 +Food,14.41 +Leisure,27.01 +Food,29.12 +Transport,21.87 +Food,39.46 +Transport,26.82 +Food,13.74 +Food,13.01 +Transport,32.00 +Leisure,65.03 +Food,52.14 +Housing,2000.29 +Food,9.86 +Food,44.63 +Housing,966.93 +Food,36.52 +Health,81.60 +Food,2.79 +Leisure,29.75 +Food,35.62 +Transport,19.86 +Food,30.61 +Transport,47.46 +Savings,156.33 +Food,38.98 +Health,21.43 +Leisure,97.83 +Food,17.33 +Transport,14.31 +Transport,27.63 +Transport,26.49 +Food,30.14 +Food,25.69 +Transport,32.50 +Leisure,9.94 +Food,33.84 +Leisure,12.83 +Food,71.84 +Food,33.28 +Transport,40.30 +Leisure,62.66 +Transport,25.60 +Transport,39.34 +Food,87.81 +Savings,144.05 +Savings,49.69 +Food,65.66 +Food,76.69 +Transport,23.01 +Health,89.13 +Transport,20.77 +Food,23.61 +Health,74.95 +Health,25.63 +Housing,639.29 +Transport,18.04 +Transport,3.15 +Transport,15.51 +Transport,15.44 +Food,5.17 +Food,8.97 +Transport,5.50 +Food,58.43 +Transport,14.88 +Food,29.28 +Food,33.50 +Transport,18.15 +Savings,244.71 +Health,61.65 +Transport,7.96 +Transport,18.43 +Health,58.28 +Health,30.48 +Transport,4.45 +Health,37.44 +Food,71.07 +Leisure,13.53 +Transport,26.87 +Transport,38.20 +Leisure,53.77 +Savings,239.13 +Transport,7.78 +Food,26.14 +Food,17.72 +Transport,29.43 +Food,17.96 +Food,31.39 +Food,32.88 +Leisure,25.11 +Food,34.29 +Savings,189.57 +Leisure,69.09 +Transport,33.00 +Food,12.04 +Leisure,67.96 +Transport,9.26 +Transport,35.32 +Transport,14.98 +Leisure,28.39 +Transport,29.56 +Housing,216.31 +Food,20.56 +Food,27.80 +Transport,104.98 +Transport,52.00 +Food,54.95 +Transport,18.65 +Transport,14.73 +Housing,416.48 +Leisure,9.32 +Food,61.95 +Transport,38.45 +Transport,17.73 +Food,6.78 +Food,46.27 +Transport,9.76 +Housing,353.08 +Leisure,47.54 +Food,39.58 +Food,16.38 +Food,75.88 +Transport,15.20 +Leisure,47.76 +Food,22.27 +Transport,9.45 +Transport,24.14 +Leisure,12.34 +Transport,50.68 +Food,18.76 +Health,32.98 +Transport,30.78 +Food,29.35 +Food,99.36 +Transport,29.50 +Leisure,84.70 +Transport,10.87 +Housing,745.04 +Food,42.33 +Food,84.51 +Transport,46.84 +Transport,41.12 +Transport,18.79 +Transport,31.34 +Food,46.60 +Food,26.56 +Leisure,74.62 +Food,20.53 +Health,53.70 +Food,36.65 +Housing,836.20 +Food,70.23 +Food,77.25 +Transport,21.32 +Leisure,25.17 +Transport,43.41 +Food,9.68 +Transport,7.03 +Leisure,59.97 +Food,84.60 +Transport,8.23 +Transport,16.32 +Transport,35.56 +Food,18.93 +Transport,32.89 +Food,30.22 +Food,30.59 +Transport,22.26 +Food,37.34 +Food,28.14 +Transport,28.63 +Leisure,33.54 +Transport,32.26 +Transport,1.85 +Food,21.10 +Food,38.05 +Transport,3.63 +Food,24.87 +Leisure,24.91 +Food,73.00 +Transport,39.57 +Leisure,18.62 +Food,59.68 +Food,58.56 +Transport,42.37 +Transport,33.86 +Transport,69.69 +Leisure,30.24 +Food,43.05 +Food,76.85 +Food,19.69 +Savings,110.25 +Transport,40.60 +Transport,10.03 +Transport,9.65 +Food,44.11 +Transport,39.37 +Food,99.74 +Health,74.36 +Leisure,3.51 +Food,45.21 +Food,65.22 +Food,31.58 +Transport,19.03 +Transport,15.45 +Savings,55.71 +Transport,5.99 +Transport,10.63 +Food,23.67 +Transport,4.54 +Food,79.48 +Transport,37.79 +Health,14.85 +Savings,132.45 +Leisure,90.42 +Transport,13.36 +Food,24.09 +Health,40.93 +Food,19.13 +Leisure,39.06 +Food,46.40 +Transport,44.22 +Leisure,84.10 +Leisure,14.58 +Transport,27.99 +Food,18.65 +Health,11.03 +Food,60.84 +Food,17.25 +Transport,30.94 +Transport,12.10 +Food,27.01 +Transport,19.15 +Food,80.86 +Food,28.10 +Transport,13.44 +Food,27.12 +Leisure,29.62 +Food,32.03 +Health,31.98 +Transport,8.94 +Food,67.38 +Leisure,3.92 +Leisure,112.15 +Transport,46.41 +Food,11.87 +Leisure,27.71 +Health,42.24 +Leisure,28.66 +Transport,38.50 +Savings,247.57 +Food,49.51 +Food,47.63 +Transport,11.90 +Leisure,44.14 +Transport,9.33 +Transport,67.31 +Food,26.62 +Transport,15.38 +Transport,8.57 +Transport,25.16 +Food,18.63 +Housing,643.30 +Transport,14.92 +Transport,17.12 +Food,8.69 +Transport,17.20 +Leisure,97.36 +Transport,54.92 +Leisure,24.09 +Food,20.20 +Food,19.65 +Leisure,41.60 +Transport,7.49 +Transport,10.77 +Transport,25.50 +Transport,10.88 +Leisure,55.20 +Health,106.37 +Transport,6.02 +Transport,39.92 +Food,10.45 +Health,43.25 +Food,23.67 +Food,34.68 +Transport,9.79 +Transport,32.71 +Transport,14.19 +Food,39.72 +Transport,24.43 +Transport,17.11 +Transport,14.55 +Transport,15.39 +Transport,22.52 +Health,91.35 +Health,18.61 +Food,58.21 +Food,65.64 +Food,25.65 +Food,39.39 +Transport,32.91 +Food,34.11 +Food,17.31 +Transport,41.51 +Leisure,75.59 +Food,17.01 +Food,22.02 +Health,24.80 +Leisure,12.24 +Housing,346.55 +Leisure,113.48 +Transport,7.67 +Savings,324.48 +Leisure,26.04 +Leisure,29.94 +Leisure,57.11 +Food,42.88 +Food,52.50 +Transport,19.39 +Food,46.14 +Food,18.04 +Leisure,55.66 +Transport,36.51 +Transport,19.52 +Food,68.19 +Food,31.02 +Leisure,25.31 +Transport,51.78 +Health,28.33 +Transport,5.69 +Health,105.46 +Leisure,8.73 +Health,20.79 +Transport,10.37 +Food,19.28 +Food,14.04 +Food,37.84 +Transport,27.77 +Housing,1027.07 +Transport,20.83 +Food,48.07 +Food,91.99 +Leisure,97.29 +Transport,17.75 +Transport,8.73 +Leisure,76.70 +Transport,20.12 +Transport,19.76 +Savings,330.50 +Health,26.42 +Food,113.19 +Transport,33.67 +Food,46.39 +Transport,42.48 +Food,16.57 +Savings,106.86 +Food,12.16 +Health,2.83 +Transport,28.34 +Food,44.17 +Transport,29.82 +Transport,20.86 +Transport,28.62 +Food,28.01 +Food,43.66 +Leisure,50.96 +Food,65.92 +Food,35.84 +Food,25.63 +Food,11.68 +Transport,64.12 +Health,99.12 +Food,32.21 +Food,20.94 +Food,37.07 +Food,23.93 +Leisure,13.99 +Food,29.05 +Leisure,69.57 +Transport,4.00 +Food,59.78 +Leisure,29.57 +Food,13.80 +Food,49.47 +Transport,12.05 +Food,20.73 +Food,33.90 +Transport,9.28 +Food,34.69 +Leisure,6.11 +Savings,433.11 +Transport,37.04 +Leisure,108.76 +Leisure,30.90 +Food,48.12 +Food,30.05 +Food,47.20 +Transport,2.09 +Food,81.69 +Leisure,43.51 +Transport,58.41 +Food,21.48 +Transport,29.50 +Savings,338.28 +Transport,9.33 +Transport,33.73 +Food,28.44 +Leisure,89.53 +Transport,10.22 +Food,36.94 +Food,6.66 +Housing,735.62 +Transport,38.80 +Food,33.38 +Food,11.83 +Food,65.40 +Transport,75.68 +Food,32.92 +Leisure,45.57 +Transport,21.34 +Leisure,58.15 +Transport,2.49 +Food,34.64 +Food,58.62 +Transport,18.63 +Transport,9.07 +Transport,13.32 +Food,80.69 +Health,39.77 +Food,21.67 +Food,106.91 +Leisure,5.35 +Leisure,82.06 +Transport,30.85 +Transport,34.16 +Transport,24.18 +Transport,8.49 +Housing,407.16 +Leisure,45.35 +Transport,54.09 +Leisure,20.21 +Food,28.83 +Transport,28.58 +Transport,6.05 +Transport,23.82 +Transport,14.24 +Leisure,61.79 +Leisure,32.71 +Health,84.53 +Food,39.76 +Housing,101.73 +Transport,14.66 +Food,19.63 +Health,115.32 +Transport,15.39 +Transport,30.67 +Food,22.56 +Leisure,13.14 +Transport,39.53 +Housing,1978.89 +Housing,3161.63 +Transport,33.22 +Transport,28.96 +Health,82.83 +Leisure,30.61 +Leisure,27.78 +Leisure,146.28 +Transport,6.08 +Food,32.80 +Leisure,76.13 +Savings,465.96 +Food,31.35 +Food,25.03 +Transport,8.74 +Housing,207.72 +Transport,30.46 +Transport,24.51 +Leisure,44.61 +Health,79.23 +Food,18.82 +Health,61.15 +Health,91.39 +Food,48.80 +Savings,265.56 +Food,77.85 +Transport,23.20 +Food,62.38 +Transport,27.44 +Leisure,42.46 +Food,80.39 +Food,50.97 +Food,3.29 +Transport,4.56 +Food,40.82 +Health,195.22 +Transport,41.46 +Leisure,24.77 +Leisure,24.70 +Transport,9.03 +Health,33.26 +Food,36.55 +Health,127.52 +Leisure,37.63 +Transport,4.80 +Food,76.01 +Transport,45.92 +Transport,34.49 +Food,32.29 +Food,41.31 +Transport,50.31 +Health,82.31 +Food,57.15 +Transport,22.37 +Transport,23.60 +Food,44.61 +Transport,18.56 +Food,123.95 +Health,83.31 +Transport,52.34 +Transport,18.40 +Food,57.61 +Leisure,36.48 +Leisure,79.26 +Food,60.43 +Health,64.01 +Food,5.38 +Housing,1187.74 +Transport,21.44 +Leisure,85.03 +Transport,46.19 +Food,21.74 +Food,15.48 +Savings,354.34 +Food,4.30 +Food,51.30 +Food,39.49 +Food,25.01 +Transport,45.79 +Leisure,58.02 +Leisure,4.71 +Transport,20.52 +Health,37.98 +Transport,19.22 +Leisure,95.75 +Transport,15.47 +Leisure,76.49 +Leisure,115.72 +Transport,10.09 +Food,104.21 +Transport,23.72 +Food,36.34 +Transport,22.05 +Transport,26.32 +Health,45.42 +Transport,28.57 +Food,23.33 +Transport,21.51 +Food,23.67 +Transport,61.89 +Food,26.00 +Leisure,63.70 +Transport,28.16 +Food,32.20 +Health,52.94 +Health,51.83 +Leisure,16.62 +Transport,22.06 +Food,86.25 +Leisure,65.42 +Transport,32.82 +Transport,11.03 +Food,6.12 +Transport,21.40 +Transport,36.88 +Health,89.53 +Food,19.84 +Leisure,187.74 +Transport,30.44 +Health,67.57 +Transport,24.59 +Transport,28.88 +Food,20.82 +Leisure,91.22 +Leisure,61.24 +Leisure,105.41 +Leisure,44.17 +Transport,16.42 +Leisure,40.67 +Food,35.10 +Transport,15.53 +Food,11.12 +Savings,519.62 +Food,9.68 +Leisure,51.05 +Food,18.98 +Transport,29.24 +Transport,25.02 +Food,20.93 +Savings,248.18 +Transport,19.61 +Leisure,30.14 +Transport,21.96 +Food,45.76 +Food,86.18 +Food,79.05 +Food,13.37 +Food,18.22 +Leisure,71.81 +Health,44.13 +Transport,37.21 +Food,13.00 +Leisure,33.22 +Transport,51.06 +Transport,13.44 +Food,24.20 +Housing,2233.32 +Leisure,41.37 +Food,67.60 +Transport,66.64 +Food,32.36 +Food,44.75 +Transport,10.52 +Transport,5.75 +Food,115.48 +Food,12.36 +Transport,69.12 +Food,14.34 +Housing,210.95 +Transport,2.91 +Transport,8.18 +Food,38.96 +Transport,30.03 +Food,87.45 +Food,50.41 +Transport,13.42 +Leisure,24.71 +Transport,46.98 +Transport,30.30 +Health,64.71 +Food,35.63 +Savings,412.31 +Food,19.52 +Health,43.38 +Food,25.46 +Transport,29.38 +Food,13.25 +Leisure,14.24 +Transport,14.54 +Health,96.14 +Food,51.71 +Transport,34.24 +Food,20.03 +Transport,56.34 +Leisure,20.91 +Food,6.15 +Health,57.12 +Health,91.67 +Transport,65.21 +Food,39.32 +Food,50.41 +Transport,7.13 +Transport,32.06 +Health,25.01 +Health,10.17 +Transport,6.00 +Leisure,64.93 +Transport,55.63 +Food,5.48 +Food,36.32 +Health,37.01 +Food,46.56 +Food,101.16 +Leisure,56.61 +Transport,8.15 +Food,18.10 +Health,102.24 +Transport,37.31 +Transport,36.13 +Transport,27.34 +Leisure,55.34 +Leisure,69.72 +Food,44.04 +Leisure,36.03 +Leisure,45.20 +Food,17.39 +Leisure,73.23 +Transport,12.25 +Food,16.69 +Transport,12.22 +Health,28.62 +Transport,29.51 +Transport,54.89 +Leisure,54.52 +Food,15.17 +Transport,14.82 +Food,3.78 +Transport,10.13 +Leisure,44.32 +Food,60.71 +Food,28.56 +Transport,8.58 +Savings,202.88 +Transport,24.40 +Food,17.15 +Transport,9.62 +Savings,523.34 +Transport,24.49 +Transport,40.03 +Leisure,24.05 +Food,36.89 +Transport,13.95 +Transport,8.26 +Food,28.60 +Food,60.30 +Transport,49.68 +Food,84.23 +Leisure,51.01 +Food,30.02 +Health,133.28 +Food,58.05 +Transport,19.81 +Transport,12.54 +Transport,8.75 +Transport,56.80 +Food,77.94 +Transport,10.65 +Transport,16.60 +Transport,42.96 +Transport,13.65 +Transport,29.21 +Transport,13.82 +Food,42.83 +Food,32.32 +Health,28.76 +Food,25.86 +Transport,23.82 +Housing,361.70 +Food,10.39 +Transport,44.37 +Food,29.89 +Leisure,24.58 +Leisure,73.59 +Transport,20.38 +Transport,37.73 +Food,52.57 +Food,29.10 +Leisure,2.50 +Food,12.31 +Food,21.51 +Housing,380.31 +Transport,19.34 +Food,18.51 +Health,13.59 +Health,190.58 +Food,58.38 +Health,38.37 +Transport,23.68 +Food,10.59 +Transport,4.60 +Transport,7.12 +Food,42.66 +Leisure,48.13 +Leisure,98.06 +Food,26.59 +Health,150.36 +Food,32.06 +Transport,20.78 +Transport,54.34 +Leisure,20.96 +Transport,11.18 +Food,22.86 +Food,83.97 +Food,7.69 +Food,36.21 +Transport,17.07 +Leisure,13.79 +Food,45.17 +Food,15.42 +Health,72.44 +Transport,47.19 +Transport,35.94 +Transport,10.99 +Transport,8.21 +Transport,28.57 +Health,62.74 +Health,35.22 +Transport,17.60 +Transport,17.76 +Food,54.12 +Transport,31.72 +Food,8.36 +Food,19.50 +Leisure,19.62 +Savings,253.81 +Leisure,131.15 +Food,21.60 +Transport,14.89 +Food,47.81 +Food,61.42 +Transport,18.01 +Food,52.62 +Transport,8.78 +Food,73.99 +Health,72.02 +Transport,43.51 +Food,32.28 +Transport,31.75 +Leisure,9.90 +Health,28.09 +Food,14.37 +Housing,1153.68 +Leisure,26.46 +Transport,11.70 +Food,41.17 +Transport,41.36 +Leisure,47.12 +Health,52.57 +Food,60.89 +Transport,9.85 +Food,29.91 +Health,87.74 +Transport,24.20 +Leisure,24.22 +Food,28.46 +Food,36.03 +Leisure,40.42 +Food,17.80 +Health,109.49 +Leisure,47.10 +Leisure,34.81 +Health,121.29 +Health,52.15 +Leisure,43.67 +Food,45.77 +Leisure,59.75 +Food,16.92 +Food,28.90 +Food,34.33 +Transport,42.68 +Food,16.92 +Leisure,56.62 +Food,47.10 +Leisure,33.09 +Health,5.70 +Leisure,49.76 +Food,30.54 +Savings,422.99 +Food,48.89 +Food,103.93 +Health,71.31 +Transport,21.79 +Food,41.26 +Food,83.57 +Food,23.82 +Savings,109.84 +Food,50.72 +Food,82.92 +Transport,38.18 +Food,37.10 +Leisure,100.27 +Savings,92.08 +Food,25.97 +Food,20.22 +Leisure,127.62 +Savings,57.32 +Transport,18.38 +Transport,5.91 +Transport,5.15 +Food,15.09 +Leisure,15.15 +Food,2.17 +Transport,5.82 +Transport,37.02 +Food,28.53 +Transport,41.33 +Housing,1123.34 +Transport,14.52 +Health,61.21 +Transport,11.48 +Housing,650.70 +Transport,24.99 +Transport,11.38 +Food,58.42 +Transport,52.95 +Transport,43.56 +Food,34.25 +Food,11.44 +Transport,2.78 +Food,28.89 +Housing,71.44 +Transport,11.57 +Transport,22.13 +Food,47.24 +Leisure,119.44 +Transport,5.93 +Transport,21.92 +Health,90.15 +Food,51.76 +Food,42.41 +Leisure,106.42 +Transport,24.74 +Health,63.67 +Food,45.55 +Leisure,4.55 +Food,45.05 +Food,12.09 +Leisure,20.99 +Transport,18.30 +Transport,4.06 +Savings,151.05 +Transport,28.99 +Transport,8.90 +Savings,205.64 +Transport,8.80 +Transport,23.59 +Leisure,46.08 +Food,69.75 +Transport,4.56 +Leisure,30.02 +Housing,800.11 +Food,31.15 +Food,12.08 +Food,36.24 +Food,11.72 +Food,114.49 +Food,43.45 +Leisure,37.67 +Transport,5.93 +Leisure,33.44 +Food,28.01 +Leisure,25.09 +Food,53.09 +Food,83.84 +Food,15.42 +Transport,3.38 +Health,90.88 +Transport,2.11 +Food,36.12 +Food,64.12 +Savings,206.98 +Transport,8.60 +Transport,45.53 +Housing,1295.05 +Food,14.25 +Food,4.39 +Transport,23.95 +Transport,20.28 +Transport,35.29 +Savings,198.44 +Food,51.64 +Food,39.59 +Leisure,46.41 +Food,78.96 +Transport,53.33 +Transport,13.39 +Transport,47.24 +Food,60.81 +Transport,36.81 +Food,14.60 +Transport,27.61 +Food,11.43 +Food,27.07 +Health,34.02 +Transport,10.14 +Food,1.37 +Food,17.00 +Food,87.72 +Leisure,23.98 +Food,20.75 +Transport,18.83 +Transport,7.39 +Leisure,83.02 +Food,11.33 +Transport,9.77 +Transport,16.66 +Transport,13.39 +Leisure,6.66 +Leisure,52.68 +Transport,87.30 +Food,36.02 +Transport,4.52 +Food,27.72 +Food,53.81 +Transport,4.76 +Food,68.44 +Food,88.49 +Food,41.52 +Transport,16.40 +Transport,15.00 +Food,34.97 +Food,17.80 +Leisure,76.40 +Transport,6.30 +Transport,25.48 +Food,44.49 +Transport,32.69 +Leisure,32.59 +Transport,43.82 +Transport,28.09 +Transport,11.27 +Food,18.37 +Food,34.80 +Housing,1237.70 +Transport,19.03 +Food,6.49 +Transport,39.77 +Leisure,9.88 +Food,80.46 +Food,43.16 +Food,17.23 +Transport,14.46 +Transport,59.47 +Food,25.62 +Food,9.80 +Health,59.78 +Leisure,44.99 +Transport,7.67 +Savings,593.53 +Transport,22.96 +Leisure,34.08 +Food,30.02 +Transport,9.87 +Food,91.36 +Leisure,11.00 +Food,35.64 +Transport,2.66 +Transport,48.33 +Food,26.25 +Leisure,35.95 +Transport,28.00 +Transport,18.98 +Transport,43.07 +Food,38.45 +Food,106.55 +Transport,11.28 +Transport,48.97 +Transport,3.20 +Savings,176.18 +Savings,124.91 +Housing,161.10 +Food,43.83 +Leisure,29.53 +Food,10.16 +Food,28.52 +Transport,10.71 +Transport,29.38 +Food,25.24 +Transport,26.63 +Leisure,45.89 +Savings,497.30 +Food,42.30 +Transport,6.58 +Food,59.94 +Transport,20.92 +Housing,175.47 +Health,86.17 +Health,48.44 +Leisure,20.78 +Food,24.91 +Health,47.36 +Housing,656.55 +Transport,11.43 +Food,2.83 +Housing,810.76 +Housing,816.22 +Transport,25.14 +Food,32.45 +Leisure,38.09 +Food,14.09 +Food,36.68 +Transport,57.64 +Leisure,26.90 +Food,40.88 +Food,27.98 +Transport,11.30 +Housing,614.17 +Transport,1.00 +Food,18.39 +Food,21.35 +Health,110.20 +Food,56.89 +Food,12.97 +Leisure,57.08 +Transport,9.16 +Food,139.83 +Housing,2252.62 +Food,24.62 +Food,61.95 +Transport,19.75 +Food,7.91 +Savings,558.30 +Transport,10.39 +Savings,405.79 +Transport,15.39 +Transport,30.57 +Food,53.23 +Transport,26.24 +Food,63.96 +Leisure,131.71 +Food,32.56 +Food,17.47 +Transport,14.78 +Leisure,11.58 +Leisure,16.71 +Food,2.78 +Food,11.21 +Food,27.21 +Health,64.00 +Food,10.28 +Housing,309.23 +Health,19.30 +Transport,2.96 +Transport,28.93 +Food,7.29 +Transport,60.20 +Transport,17.88 +Food,23.17 +Transport,13.02 +Food,19.43 +Leisure,44.44 +Food,45.34 +Food,33.08 +Transport,4.71 +Transport,72.17 +Transport,13.33 +Transport,12.33 +Food,12.28 +Food,31.95 +Food,63.24 +Leisure,14.03 +Food,28.25 +Leisure,62.14 +Health,20.06 +Transport,9.27 +Savings,22.38 +Food,6.76 +Transport,63.83 +Food,29.65 +Transport,24.00 +Food,52.74 +Health,107.15 +Leisure,112.75 +Leisure,34.62 +Food,20.69 +Transport,38.94 +Food,10.16 +Transport,21.87 +Food,28.19 +Food,49.99 +Food,52.93 +Transport,29.55 +Leisure,50.01 +Leisure,28.29 +Food,25.87 +Health,66.80 +Leisure,93.58 +Leisure,15.75 +Food,42.60 +Food,7.87 +Transport,7.98 +Food,82.61 +Food,53.32 +Transport,12.17 +Food,48.26 +Transport,9.15 +Housing,1978.26 +Housing,396.07 +Leisure,17.17 +Food,33.44 +Health,20.95 +Leisure,47.32 +Transport,16.75 +Health,58.19 +Food,152.76 +Leisure,32.81 +Food,75.74 +Food,95.33 +Savings,115.75 +Housing,738.72 +Transport,9.92 +Health,64.72 +Transport,11.51 +Health,44.20 +Food,83.47 +Leisure,13.94 +Food,31.61 +Food,40.75 +Food,17.97 +Savings,433.61 +Food,11.01 +Food,28.23 +Food,21.08 +Leisure,9.65 +Transport,39.30 +Food,68.71 +Health,29.00 +Transport,22.07 +Leisure,48.11 +Leisure,24.47 +Food,8.09 +Transport,2.41 +Leisure,28.59 +Transport,6.56 +Leisure,22.25 +Food,3.84 +Transport,6.45 +Transport,45.22 +Transport,10.41 +Food,10.47 +Transport,7.88 +Food,21.19 +Transport,35.43 +Food,20.46 +Transport,6.53 +Transport,23.66 +Food,20.65 +Food,22.17 +Food,37.97 +Transport,15.68 +Food,32.58 +Savings,190.15 +Leisure,114.96 +Transport,14.60 +Transport,49.98 +Transport,26.92 +Transport,31.75 +Food,27.80 +Food,24.16 +Transport,18.10 +Leisure,20.70 +Leisure,55.90 +Transport,15.59 +Food,109.48 +Savings,585.53 +Leisure,65.99 +Leisure,3.57 +Leisure,25.28 +Leisure,27.28 +Transport,17.26 +Savings,332.57 +Leisure,45.31 +Food,64.97 +Food,37.12 +Transport,47.34 +Food,23.84 +Health,55.89 +Food,22.56 +Leisure,12.90 +Food,78.80 +Food,10.67 +Leisure,8.13 +Food,22.10 +Transport,30.18 +Transport,36.58 +Health,30.72 +Transport,3.70 +Food,54.86 +Health,44.09 +Health,52.25 +Savings,117.68 +Food,58.30 +Transport,6.92 +Transport,20.21 +Food,24.84 +Leisure,53.39 +Food,18.90 +Leisure,56.68 +Transport,43.92 +Food,52.08 +Leisure,11.36 +Health,55.20 +Transport,16.86 +Food,14.76 +Food,35.95 +Transport,18.19 +Transport,21.14 +Food,60.79 +Food,40.74 +Transport,32.58 +Food,23.46 +Transport,15.99 +Food,43.75 +Food,26.38 +Food,90.58 +Food,12.50 +Transport,5.03 +Food,52.70 +Leisure,103.94 +Food,32.48 +Transport,27.74 +Food,15.38 +Transport,21.63 +Leisure,70.17 +Health,17.17 +Transport,18.61 +Leisure,115.13 +Food,46.31 +Housing,606.74 +Transport,21.64 +Food,31.32 +Food,22.18 +Savings,131.25 +Food,149.25 +Transport,60.00 +Leisure,32.29 +Leisure,59.20 +Food,25.91 +Transport,13.35 +Food,95.23 +Transport,9.21 +Food,26.61 +Leisure,27.49 +Leisure,49.99 +Transport,17.06 +Leisure,78.39 +Leisure,9.70 +Transport,20.72 +Transport,3.31 +Leisure,25.38 +Food,47.97 +Transport,6.47 +Health,92.11 +Leisure,21.02 +Health,7.98 +Transport,17.08 +Food,26.49 +Transport,10.67 +Transport,33.41 +Savings,66.14 +Housing,505.36 +Transport,5.31 +Food,13.40 +Transport,5.36 +Food,24.20 +Transport,39.37 +Food,101.65 +Leisure,13.48 +Food,108.85 +Housing,101.13 +Savings,86.66 +Transport,21.59 +Transport,14.89 +Transport,5.78 +Health,107.95 +Transport,74.63 +Leisure,14.21 +Health,35.50 +Transport,101.47 +Transport,40.38 +Savings,344.68 +Food,8.15 +Transport,15.80 +Food,88.24 +Food,14.76 +Health,18.29 +Transport,43.81 +Food,33.16 +Transport,26.66 +Housing,630.18 +Transport,11.79 +Health,63.64 +Food,43.91 +Health,79.82 +Transport,52.26 +Housing,474.66 +Food,24.63 +Food,8.82 +Food,81.74 +Food,72.09 +Transport,53.10 +Leisure,44.14 +Food,37.09 +Food,23.66 +Health,71.73 +Health,88.03 +Health,38.07 +Transport,35.67 +Food,34.28 +Food,37.89 +Food,11.76 +Transport,11.54 +Leisure,28.04 +Food,8.45 +Food,63.45 +Food,17.66 +Leisure,74.25 diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-renamed/case.json b/agents/evals/fixtures/cases/pie-basic-letsplot-renamed/case.json new file mode 100644 index 00000000000..7289dd58b88 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-renamed/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "pie-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "category", + "column": "Ausgabenposten" + }, + { + "role": "value", + "column": "Betrag CHF" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "renamed", + "synthetic", + "renamed-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, renamed)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-renamed/data.csv b/agents/evals/fixtures/cases/pie-basic-letsplot-renamed/data.csv new file mode 100644 index 00000000000..e8f468eb775 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-renamed/data.csv @@ -0,0 +1,7 @@ +Ausgabenposten,Betrag CHF +Housing,1913.25 +Food,692.31 +Transport,402.45 +Leisure,337.19 +Health,244.50 +Savings,648.13 diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-x10/case.json b/agents/evals/fixtures/cases/pie-basic-letsplot-x10/case.json new file mode 100644 index 00000000000..8f1a914490f --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "pie-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "category", + "column": "Expense Category" + }, + { + "role": "value", + "column": "Amount (CHF)" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, x10)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-letsplot-x10/data.csv b/agents/evals/fixtures/cases/pie-basic-letsplot-x10/data.csv new file mode 100644 index 00000000000..5d1b1cfa042 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-letsplot-x10/data.csv @@ -0,0 +1,7 @@ +Expense Category,Amount (CHF) +Housing,19132.53 +Food,6923.09 +Transport,4024.49 +Leisure,3371.93 +Health,2445.05 +Savings,6481.28 diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-date/case.json b/agents/evals/fixtures/cases/pie-basic-pygal-date/case.json new file mode 100644 index 00000000000..efb5d4600fe --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "pie-basic", + "library": "pygal", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "category", + "column": "Expense Category" + }, + { + "role": "value", + "column": "Amount (CHF)" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, date)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-date/data.csv b/agents/evals/fixtures/cases/pie-basic-pygal-date/data.csv new file mode 100644 index 00000000000..a243c78806b --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-date/data.csv @@ -0,0 +1,7 @@ +Expense Category,Amount (CHF),Booking Date,Imported On +Housing,1913.25,05.05.2026,2026-05-05 +Food,692.31,20.01.2026,2026-01-23 +Transport,402.45,29.03.2026,2026-03-30 +Leisure,337.19,13.05.2026,2026-05-14 +Health,244.50,17.02.2026,2026-02-18 +Savings,648.13,20.03.2026,2026-03-24 diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-decimal-comma/case.json b/agents/evals/fixtures/cases/pie-basic-pygal-decimal-comma/case.json new file mode 100644 index 00000000000..1a02a9a3dbf --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "pie-basic", + "library": "pygal", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "category", + "column": "Expense Category" + }, + { + "role": "value", + "column": "Amount (CHF)" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-decimal-comma/data.csv b/agents/evals/fixtures/cases/pie-basic-pygal-decimal-comma/data.csv new file mode 100644 index 00000000000..2d4e55ae017 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-decimal-comma/data.csv @@ -0,0 +1,7 @@ +Expense Category;Amount (CHF) +Housing;1913,25 +Food;692,31 +Transport;402,45 +Leisure;337,19 +Health;244,50 +Savings;648,13 diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-n12/case.json b/agents/evals/fixtures/cases/pie-basic-pygal-n12/case.json new file mode 100644 index 00000000000..61987a09870 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "pie-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "category", + "column": "Expense Category" + }, + { + "role": "value", + "column": "Amount (CHF)" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, n12)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-n12/data.csv b/agents/evals/fixtures/cases/pie-basic-pygal-n12/data.csv new file mode 100644 index 00000000000..cd24cc6737c --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-n12/data.csv @@ -0,0 +1,13 @@ +Expense Category,Amount (CHF) +Housing,1686.23 +Food,719.68 +Transport,443.66 +Leisure,311.31 +Health,236.78 +Savings,595.60 +Insurance,342.29 +Education,138.39 +Clothing,114.95 +Utilities,215.46 +Gifts,55.02 +Other,93.78 diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-n5000/case.json b/agents/evals/fixtures/cases/pie-basic-pygal-n5000/case.json new file mode 100644 index 00000000000..71ba476a9b5 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-n5000/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "pie-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "category", + "column": "Expense Category" + }, + { + "role": "value", + "column": "Amount (CHF)" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "n5000", + "synthetic", + "large", + "aggregation" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, n5000)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-n5000/data.csv b/agents/evals/fixtures/cases/pie-basic-pygal-n5000/data.csv new file mode 100644 index 00000000000..573db3f08c9 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-n5000/data.csv @@ -0,0 +1,5001 @@ +Expense Category,Amount (CHF) +Transport,29.12 +Food,27.01 +Food,31.20 +Transport,6.75 +Food,17.05 +Food,39.81 +Food,3.90 +Food,5.14 +Food,43.53 +Transport,14.79 +Food,10.09 +Food,41.71 +Transport,41.78 +Housing,727.06 +Transport,22.80 +Food,37.10 +Food,37.37 +Food,21.56 +Transport,46.95 +Savings,313.75 +Leisure,40.26 +Food,74.54 +Savings,108.08 +Food,48.05 +Transport,3.17 +Leisure,25.46 +Food,34.41 +Food,1.38 +Transport,34.60 +Transport,26.44 +Transport,5.57 +Food,26.45 +Transport,38.92 +Transport,15.54 +Food,33.13 +Transport,57.14 +Food,25.91 +Food,7.31 +Leisure,19.39 +Transport,17.56 +Housing,863.42 +Food,99.41 +Leisure,50.43 +Food,9.47 +Transport,86.07 +Health,19.85 +Transport,19.83 +Leisure,51.21 +Transport,19.71 +Health,46.35 +Leisure,29.07 +Transport,42.76 +Leisure,66.38 +Transport,29.34 +Food,17.51 +Food,91.26 +Transport,5.41 +Transport,42.32 +Food,94.67 +Transport,38.19 +Food,125.98 +Food,20.50 +Leisure,19.79 +Food,46.17 +Transport,10.88 +Transport,3.39 +Transport,15.03 +Food,69.25 +Food,23.25 +Health,15.98 +Food,33.71 +Food,26.33 +Leisure,54.29 +Food,16.13 +Food,6.64 +Food,48.42 +Leisure,21.38 +Transport,16.44 +Food,33.57 +Transport,7.01 +Food,23.80 +Leisure,126.55 +Transport,63.15 +Food,24.87 +Leisure,59.51 +Food,58.30 +Food,35.38 +Health,34.36 +Leisure,65.60 +Leisure,55.45 +Leisure,142.97 +Food,32.77 +Transport,31.86 +Savings,282.88 +Transport,17.75 +Leisure,44.28 +Health,116.20 +Housing,448.42 +Food,2.75 +Food,36.40 +Transport,28.77 +Food,15.48 +Food,60.75 +Food,14.43 +Food,58.48 +Transport,9.03 +Food,69.04 +Transport,6.90 +Food,52.23 +Food,24.96 +Transport,46.84 +Food,7.51 +Food,7.63 +Transport,12.13 +Leisure,63.78 +Food,15.40 +Transport,10.14 +Food,33.35 +Food,18.90 +Food,17.09 +Housing,1680.60 +Transport,17.91 +Housing,484.79 +Leisure,93.05 +Food,59.23 +Leisure,33.31 +Leisure,99.03 +Food,105.68 +Transport,60.01 +Transport,22.04 +Transport,45.52 +Food,8.92 +Food,41.48 +Food,34.92 +Transport,14.48 +Transport,20.71 +Transport,11.43 +Food,44.98 +Food,48.04 +Transport,3.81 +Food,32.72 +Transport,14.75 +Food,17.11 +Leisure,9.66 +Food,205.39 +Transport,12.28 +Transport,13.00 +Transport,22.18 +Leisure,60.31 +Food,4.12 +Transport,5.49 +Food,58.07 +Transport,9.24 +Food,9.83 +Food,17.00 +Food,45.07 +Food,19.46 +Transport,6.05 +Food,69.55 +Transport,17.24 +Transport,5.63 +Food,51.44 +Leisure,73.20 +Savings,124.36 +Transport,8.09 +Transport,57.12 +Leisure,17.30 +Food,72.39 +Food,12.30 +Food,15.08 +Transport,23.27 +Housing,1834.60 +Leisure,58.70 +Transport,6.66 +Food,17.83 +Health,15.63 +Leisure,13.85 +Transport,29.93 +Food,39.29 +Food,48.17 +Food,32.77 +Health,91.92 +Food,24.67 +Health,66.92 +Transport,57.29 +Savings,102.02 +Transport,36.05 +Transport,30.63 +Food,7.80 +Food,15.51 +Transport,33.35 +Leisure,61.30 +Transport,14.03 +Transport,24.40 +Food,40.14 +Health,24.84 +Transport,3.60 +Food,17.71 +Leisure,22.30 +Food,29.16 +Transport,21.09 +Food,42.98 +Housing,918.98 +Transport,11.15 +Leisure,49.81 +Food,133.34 +Food,18.86 +Savings,128.71 +Health,245.63 +Leisure,13.16 +Transport,22.35 +Food,48.86 +Transport,9.31 +Health,39.50 +Transport,39.16 +Transport,4.05 +Transport,13.42 +Savings,170.32 +Transport,26.58 +Health,44.15 +Leisure,23.07 +Food,68.83 +Transport,23.46 +Transport,30.21 +Transport,37.82 +Housing,651.68 +Food,69.32 +Transport,39.29 +Health,42.64 +Leisure,57.93 +Food,18.74 +Food,43.39 +Food,43.76 +Food,70.86 +Food,34.55 +Transport,5.22 +Transport,7.87 +Food,13.55 +Savings,128.26 +Leisure,53.45 +Transport,54.67 +Transport,18.03 +Health,96.93 +Leisure,32.19 +Transport,23.95 +Transport,6.36 +Food,32.18 +Food,93.04 +Food,20.97 +Leisure,20.44 +Savings,252.84 +Leisure,125.42 +Transport,1.00 +Food,18.53 +Leisure,28.58 +Leisure,13.22 +Transport,49.70 +Transport,59.86 +Food,12.63 +Food,51.19 +Leisure,25.81 +Health,140.29 +Food,57.21 +Food,35.76 +Food,12.21 +Transport,25.78 +Food,22.43 +Food,48.51 +Health,64.34 +Food,36.70 +Food,39.63 +Leisure,24.04 +Food,40.92 +Transport,26.00 +Food,36.04 +Transport,23.27 +Food,33.85 +Transport,30.10 +Food,25.68 +Leisure,47.16 +Transport,9.04 +Food,56.32 +Food,9.56 +Food,8.91 +Food,39.92 +Food,89.74 +Transport,35.34 +Housing,1456.05 +Transport,60.28 +Leisure,49.48 +Food,37.00 +Leisure,74.09 +Leisure,29.23 +Transport,10.38 +Food,11.22 +Transport,15.65 +Transport,21.35 +Food,150.20 +Food,24.26 +Health,46.13 +Transport,6.23 +Leisure,38.44 +Transport,27.29 +Transport,70.96 +Food,62.45 +Transport,7.64 +Food,13.75 +Transport,10.57 +Housing,183.95 +Food,55.27 +Transport,21.94 +Transport,17.51 +Food,52.01 +Leisure,65.93 +Leisure,66.52 +Food,58.41 +Leisure,177.53 +Food,21.60 +Food,32.21 +Transport,37.56 +Food,21.65 +Leisure,45.18 +Leisure,5.35 +Transport,36.86 +Transport,9.44 +Transport,7.89 +Food,22.96 +Leisure,19.98 +Food,45.37 +Transport,20.92 +Food,14.63 +Food,18.48 +Health,19.23 +Food,12.21 +Transport,18.65 +Transport,27.30 +Food,56.56 +Health,14.50 +Transport,24.28 +Health,34.56 +Food,40.27 +Transport,16.41 +Food,95.65 +Food,7.04 +Food,38.32 +Leisure,1.21 +Food,32.93 +Transport,23.07 +Transport,50.98 +Transport,14.03 +Food,52.37 +Transport,54.10 +Food,5.07 +Transport,29.71 +Transport,47.72 +Leisure,18.32 +Transport,44.69 +Transport,4.39 +Transport,42.81 +Transport,13.97 +Transport,3.39 +Food,26.33 +Leisure,47.35 +Food,38.48 +Transport,48.45 +Food,43.21 +Transport,22.20 +Transport,3.38 +Health,21.38 +Health,23.77 +Transport,27.59 +Transport,3.84 +Transport,38.35 +Transport,6.86 +Food,73.01 +Food,26.80 +Food,24.15 +Transport,52.51 +Transport,26.13 +Leisure,129.57 +Food,54.72 +Food,14.11 +Transport,27.08 +Transport,30.87 +Transport,32.13 +Transport,31.27 +Transport,46.05 +Transport,7.06 +Savings,135.80 +Food,47.72 +Transport,13.65 +Food,15.82 +Leisure,54.77 +Housing,3504.09 +Housing,1372.62 +Health,73.48 +Transport,2.41 +Transport,9.93 +Food,10.25 +Transport,22.30 +Food,17.10 +Transport,14.84 +Food,29.85 +Food,28.27 +Food,107.34 +Food,41.61 +Food,42.42 +Transport,27.64 +Health,42.95 +Transport,43.90 +Leisure,50.08 +Leisure,8.90 +Food,67.70 +Food,27.69 +Transport,47.26 +Transport,8.06 +Leisure,24.91 +Transport,24.53 +Transport,35.03 +Transport,20.03 +Housing,800.10 +Food,3.70 +Transport,14.23 +Leisure,18.18 +Food,97.00 +Food,13.58 +Transport,6.53 +Transport,15.80 +Transport,42.68 +Leisure,19.32 +Transport,37.98 +Housing,1365.14 +Transport,31.64 +Food,40.10 +Transport,6.45 +Food,37.27 +Food,14.53 +Leisure,112.92 +Leisure,91.50 +Transport,21.26 +Transport,12.78 +Food,3.98 +Transport,52.65 +Leisure,70.57 +Transport,10.01 +Health,31.07 +Food,25.99 +Food,52.80 +Food,24.57 +Leisure,61.81 +Transport,8.76 +Leisure,27.14 +Transport,6.49 +Leisure,77.03 +Transport,20.59 +Transport,7.51 +Food,35.91 +Food,58.94 +Transport,27.41 +Food,94.26 +Transport,18.55 +Food,56.56 +Transport,38.76 +Food,111.30 +Transport,32.90 +Food,63.36 +Food,24.95 +Transport,24.06 +Transport,24.33 +Health,97.76 +Transport,26.29 +Food,69.79 +Food,23.92 +Housing,589.89 +Transport,13.22 +Leisure,23.49 +Food,24.32 +Food,52.78 +Transport,29.00 +Food,49.29 +Transport,5.99 +Health,35.62 +Transport,45.16 +Transport,24.54 +Food,25.82 +Leisure,28.54 +Food,57.19 +Transport,25.27 +Food,83.46 +Food,17.90 +Food,20.84 +Food,73.88 +Food,26.89 +Transport,22.35 +Housing,695.25 +Health,6.37 +Savings,218.27 +Housing,1182.49 +Health,32.55 +Transport,20.82 +Transport,14.67 +Food,35.42 +Food,36.62 +Food,43.32 +Food,12.31 +Food,6.17 +Transport,34.05 +Food,30.73 +Transport,26.40 +Food,19.82 +Transport,25.01 +Food,31.11 +Leisure,33.16 +Transport,23.41 +Food,53.75 +Transport,22.73 +Food,8.33 +Health,54.06 +Food,27.09 +Health,26.35 +Leisure,28.37 +Transport,12.32 +Transport,31.57 +Transport,20.89 +Transport,26.59 +Savings,119.65 +Leisure,50.59 +Food,40.80 +Food,42.06 +Transport,3.29 +Food,13.44 +Food,94.47 +Transport,13.23 +Leisure,9.80 +Food,26.43 +Food,56.29 +Health,45.53 +Health,36.49 +Leisure,21.59 +Food,45.32 +Transport,6.81 +Transport,31.71 +Transport,15.59 +Food,22.31 +Health,133.00 +Food,116.57 +Food,66.03 +Transport,11.30 +Food,13.78 +Leisure,24.17 +Food,86.86 +Transport,13.73 +Food,18.03 +Health,27.82 +Health,35.32 +Transport,28.31 +Leisure,30.96 +Food,66.01 +Savings,31.23 +Food,13.77 +Transport,19.96 +Transport,7.05 +Food,86.29 +Food,118.72 +Food,122.85 +Food,32.97 +Food,7.71 +Transport,34.01 +Leisure,60.82 +Transport,4.65 +Food,20.31 +Health,34.19 +Food,64.84 +Food,22.73 +Housing,575.32 +Food,12.43 +Food,59.54 +Food,15.00 +Food,36.29 +Transport,7.08 +Health,140.31 +Transport,46.06 +Food,13.03 +Health,60.23 +Food,7.00 +Transport,9.57 +Health,58.76 +Transport,33.88 +Food,19.36 +Transport,33.48 +Leisure,23.57 +Leisure,74.14 +Food,100.50 +Food,51.14 +Transport,17.39 +Food,79.23 +Leisure,20.61 +Food,50.76 +Transport,11.02 +Transport,19.87 +Food,2.89 +Leisure,95.11 +Housing,690.50 +Transport,29.39 +Transport,41.65 +Leisure,139.52 +Food,1.50 +Housing,1808.60 +Food,20.17 +Transport,5.78 +Health,63.70 +Leisure,75.70 +Food,21.74 +Food,15.65 +Transport,56.12 +Transport,19.68 +Food,36.55 +Transport,11.34 +Leisure,156.24 +Housing,318.03 +Transport,13.10 +Transport,57.15 +Food,23.38 +Food,8.44 +Food,25.41 +Food,5.43 +Food,34.37 +Food,19.21 +Food,25.35 +Housing,439.75 +Transport,59.75 +Food,50.87 +Leisure,55.56 +Leisure,28.94 +Food,79.64 +Transport,44.68 +Food,31.25 +Savings,135.50 +Food,26.03 +Food,44.67 +Food,23.28 +Transport,15.48 +Transport,18.62 +Savings,81.08 +Transport,9.77 +Health,37.05 +Food,56.82 +Leisure,56.01 +Transport,42.26 +Transport,3.96 +Transport,11.21 +Food,2.04 +Food,16.65 +Transport,29.83 +Transport,19.87 +Transport,59.32 +Transport,2.34 +Leisure,12.47 +Food,39.99 +Food,21.11 +Food,66.68 +Transport,2.35 +Housing,2556.14 +Health,67.69 +Transport,24.37 +Food,16.58 +Food,42.17 +Housing,634.54 +Food,41.51 +Transport,22.11 +Food,83.90 +Leisure,56.42 +Transport,21.93 +Transport,7.08 +Savings,60.96 +Food,36.79 +Food,75.56 +Housing,2075.70 +Housing,1222.85 +Food,14.31 +Food,14.35 +Transport,27.95 +Transport,39.61 +Food,24.39 +Food,69.06 +Leisure,97.57 +Health,81.63 +Food,10.40 +Food,21.21 +Transport,18.34 +Food,16.22 +Food,33.30 +Food,75.48 +Transport,15.00 +Food,8.65 +Leisure,17.06 +Leisure,25.45 +Health,68.25 +Transport,26.13 +Food,3.95 +Health,91.30 +Transport,74.28 +Leisure,23.08 +Leisure,41.57 +Savings,587.03 +Food,65.73 +Food,33.59 +Food,10.64 +Savings,330.00 +Leisure,13.69 +Food,52.66 +Food,47.34 +Transport,61.15 +Transport,11.91 +Housing,1065.13 +Food,63.35 +Food,16.22 +Transport,19.98 +Food,13.27 +Transport,43.23 +Food,86.96 +Food,15.67 +Transport,31.79 +Food,65.20 +Transport,18.83 +Transport,37.97 +Food,9.84 +Transport,30.70 +Leisure,19.67 +Food,86.33 +Transport,15.83 +Transport,50.95 +Leisure,35.06 +Savings,92.09 +Transport,46.46 +Food,12.13 +Savings,739.49 +Transport,68.80 +Food,33.71 +Transport,19.82 +Leisure,31.57 +Housing,1981.44 +Food,5.77 +Health,52.66 +Transport,34.93 +Food,19.23 +Food,72.63 +Food,75.04 +Transport,13.11 +Food,58.15 +Food,47.42 +Food,29.85 +Food,32.31 +Health,48.06 +Food,59.27 +Health,19.65 +Food,30.61 +Transport,10.26 +Health,16.01 +Food,48.26 +Transport,22.82 +Food,24.31 +Transport,5.05 +Food,39.37 +Transport,31.20 +Transport,18.94 +Savings,866.40 +Transport,16.28 +Food,49.13 +Transport,23.34 +Leisure,43.06 +Transport,43.69 +Food,45.05 +Food,34.92 +Food,43.94 +Food,39.90 +Food,41.66 +Food,13.98 +Transport,13.24 +Food,29.02 +Food,92.31 +Food,32.62 +Transport,19.20 +Transport,8.43 +Food,46.72 +Leisure,15.63 +Food,25.88 +Transport,25.30 +Food,16.17 +Food,14.65 +Food,31.95 +Health,27.58 +Leisure,70.35 +Food,12.55 +Food,6.31 +Transport,24.54 +Food,8.96 +Food,25.79 +Food,34.48 +Transport,15.46 +Food,93.72 +Leisure,12.18 +Transport,2.11 +Transport,6.19 +Food,51.31 +Food,10.85 +Food,31.75 +Transport,18.57 +Food,15.67 +Leisure,25.23 +Food,28.73 +Food,37.45 +Health,43.63 +Health,196.70 +Food,43.56 +Transport,5.98 +Food,18.70 +Food,9.76 +Food,28.40 +Health,66.46 +Food,24.52 +Transport,47.42 +Food,51.86 +Food,99.48 +Food,154.84 +Health,142.43 +Food,22.47 +Food,67.17 +Food,39.84 +Health,114.11 +Food,37.79 +Food,47.61 +Food,19.74 +Transport,8.94 +Food,20.59 +Housing,728.84 +Health,26.99 +Food,14.03 +Food,25.58 +Transport,26.51 +Food,32.97 +Savings,358.63 +Transport,4.18 +Food,9.53 +Transport,32.97 +Food,29.60 +Leisure,27.56 +Transport,16.54 +Food,8.93 +Health,88.24 +Food,29.39 +Leisure,44.52 +Food,13.93 +Health,252.30 +Health,41.89 +Food,60.49 +Leisure,11.17 +Food,18.14 +Savings,382.63 +Transport,30.27 +Transport,7.52 +Transport,28.14 +Transport,16.07 +Food,38.04 +Health,49.83 +Transport,12.49 +Transport,3.48 +Transport,7.26 +Food,19.72 +Transport,8.38 +Transport,20.54 +Leisure,33.90 +Transport,22.27 +Leisure,16.67 +Food,73.10 +Food,8.80 +Transport,26.01 +Transport,9.65 +Leisure,51.39 +Food,33.23 +Transport,11.91 +Transport,55.10 +Savings,699.72 +Transport,25.34 +Transport,40.39 +Food,96.01 +Leisure,50.04 +Food,54.86 +Food,56.29 +Savings,167.10 +Savings,40.89 +Leisure,60.90 +Transport,36.19 +Food,4.21 +Food,27.35 +Transport,37.78 +Transport,32.43 +Food,6.11 +Transport,5.80 +Transport,55.12 +Transport,26.19 +Transport,26.88 +Food,11.63 +Food,11.55 +Food,17.67 +Food,42.38 +Transport,64.49 +Food,20.92 +Transport,20.50 +Transport,14.49 +Health,41.99 +Transport,54.00 +Food,14.22 +Food,98.14 +Leisure,92.94 +Transport,47.71 +Leisure,12.36 +Leisure,8.95 +Transport,21.34 +Leisure,18.29 +Food,15.58 +Food,13.52 +Food,23.45 +Transport,15.22 +Leisure,21.90 +Food,4.40 +Food,18.43 +Health,31.45 +Food,14.43 +Health,46.07 +Leisure,11.58 +Savings,118.54 +Transport,34.65 +Transport,29.38 +Transport,14.48 +Food,40.71 +Health,55.18 +Transport,25.54 +Food,64.56 +Transport,28.42 +Leisure,35.96 +Food,9.26 +Food,58.64 +Transport,8.37 +Food,40.21 +Transport,15.85 +Transport,20.68 +Leisure,23.16 +Leisure,87.37 +Transport,26.86 +Leisure,63.35 +Food,8.81 +Food,17.69 +Food,31.18 +Health,201.22 +Savings,97.05 +Transport,2.81 +Food,40.77 +Transport,27.33 +Food,45.28 +Transport,8.13 +Savings,258.80 +Transport,39.08 +Health,35.09 +Food,11.94 +Savings,31.58 +Food,82.98 +Leisure,11.09 +Transport,15.98 +Leisure,39.40 +Food,50.37 +Transport,22.39 +Food,27.99 +Food,55.18 +Transport,15.60 +Transport,1.93 +Food,5.18 +Food,75.14 +Food,10.01 +Food,49.02 +Food,26.39 +Transport,5.69 +Food,35.32 +Housing,1593.22 +Savings,733.12 +Food,14.80 +Leisure,49.43 +Food,4.82 +Transport,37.28 +Food,17.04 +Food,39.64 +Leisure,89.92 +Food,40.48 +Transport,1.66 +Food,4.39 +Leisure,41.22 +Food,39.24 +Transport,13.08 +Food,37.56 +Food,66.56 +Food,28.56 +Food,40.22 +Food,20.12 +Transport,23.19 +Food,42.36 +Transport,6.93 +Transport,31.68 +Leisure,45.18 +Transport,50.59 +Food,11.99 +Housing,309.97 +Leisure,24.73 +Transport,29.29 +Leisure,68.13 +Food,26.77 +Transport,60.50 +Food,20.39 +Leisure,73.06 +Food,47.25 +Food,118.92 +Food,18.37 +Food,6.74 +Food,41.84 +Leisure,42.20 +Food,26.44 +Food,94.36 +Food,11.83 +Food,19.39 +Food,58.81 +Food,8.58 +Food,5.43 +Leisure,90.57 +Food,17.45 +Food,8.49 +Savings,468.10 +Transport,15.93 +Food,28.87 +Transport,25.94 +Food,14.49 +Transport,1.42 +Food,46.52 +Food,11.69 +Housing,2087.28 +Transport,46.04 +Food,55.38 +Transport,8.77 +Health,117.41 +Leisure,34.01 +Transport,21.07 +Food,16.57 +Savings,60.98 +Food,11.15 +Housing,2091.25 +Leisure,57.02 +Savings,261.13 +Health,33.57 +Food,56.03 +Leisure,25.85 +Food,85.21 +Transport,24.37 +Food,125.40 +Food,28.89 +Transport,21.26 +Health,12.14 +Health,35.51 +Leisure,78.43 +Food,7.14 +Food,70.92 +Leisure,103.62 +Food,46.67 +Savings,621.63 +Leisure,71.86 +Leisure,13.98 +Food,12.52 +Transport,13.96 +Transport,51.18 +Transport,13.01 +Food,79.73 +Leisure,13.21 +Leisure,4.26 +Savings,1250.90 +Leisure,57.95 +Leisure,56.82 +Food,77.21 +Transport,11.95 +Transport,41.27 +Food,40.47 +Leisure,67.19 +Housing,1045.74 +Food,6.10 +Health,107.35 +Transport,30.06 +Transport,4.07 +Food,29.29 +Transport,4.30 +Transport,21.44 +Transport,11.47 +Transport,10.54 +Transport,32.69 +Leisure,31.79 +Transport,26.79 +Food,43.32 +Transport,28.27 +Food,92.97 +Food,31.65 +Transport,30.64 +Food,69.25 +Transport,60.50 +Transport,18.47 +Transport,58.56 +Food,22.67 +Transport,13.33 +Health,167.81 +Transport,41.80 +Food,3.70 +Transport,45.04 +Housing,666.13 +Health,49.83 +Savings,76.96 +Health,8.97 +Food,22.67 +Food,14.14 +Transport,11.02 +Transport,18.66 +Transport,72.75 +Housing,848.16 +Transport,24.29 +Food,38.11 +Food,19.82 +Food,34.50 +Transport,9.17 +Transport,15.98 +Food,56.98 +Health,6.42 +Food,29.68 +Food,16.13 +Health,46.55 +Food,11.29 +Transport,13.76 +Food,27.31 +Food,41.30 +Transport,7.90 +Food,97.52 +Food,78.93 +Leisure,24.27 +Transport,36.96 +Savings,602.63 +Health,91.94 +Transport,55.39 +Transport,24.94 +Food,15.91 +Leisure,52.00 +Transport,13.32 +Food,24.14 +Transport,7.05 +Transport,19.69 +Food,8.58 +Leisure,118.74 +Transport,8.55 +Transport,32.92 +Health,119.39 +Food,35.76 +Housing,537.23 +Health,42.66 +Food,61.41 +Food,35.98 +Food,45.75 +Transport,41.04 +Transport,9.19 +Food,28.14 +Leisure,162.34 +Food,21.95 +Transport,12.93 +Food,2.43 +Food,11.37 +Transport,24.23 +Leisure,16.27 +Leisure,31.94 +Food,14.06 +Transport,16.18 +Food,37.56 +Transport,21.18 +Food,116.84 +Food,27.50 +Food,28.16 +Transport,26.14 +Transport,5.45 +Food,22.06 +Food,39.28 +Transport,17.49 +Leisure,16.72 +Transport,6.63 +Transport,37.69 +Food,50.34 +Transport,16.80 +Transport,12.81 +Leisure,86.52 +Food,83.31 +Health,16.69 +Transport,19.45 +Food,34.99 +Health,79.62 +Food,32.03 +Leisure,20.84 +Health,41.30 +Transport,13.63 +Savings,167.28 +Food,23.30 +Transport,22.14 +Health,101.97 +Food,43.15 +Transport,17.68 +Health,7.63 +Transport,9.72 +Leisure,9.19 +Food,13.70 +Savings,313.15 +Transport,3.37 +Savings,146.84 +Food,16.31 +Food,46.60 +Food,65.16 +Transport,17.15 +Transport,1.80 +Food,17.79 +Transport,35.29 +Health,86.07 +Leisure,1.88 +Food,35.71 +Food,59.49 +Transport,18.95 +Food,11.47 +Food,64.22 +Health,16.96 +Transport,10.16 +Food,70.42 +Transport,17.88 +Food,48.70 +Transport,18.02 +Food,10.30 +Transport,16.00 +Transport,48.66 +Food,42.46 +Food,20.30 +Transport,28.60 +Leisure,39.64 +Transport,12.71 +Transport,66.47 +Food,86.20 +Health,28.16 +Leisure,50.87 +Food,85.22 +Leisure,62.83 +Food,28.56 +Food,36.79 +Transport,16.78 +Transport,23.63 +Transport,21.61 +Transport,29.61 +Leisure,4.06 +Health,207.32 +Food,128.54 +Food,71.66 +Food,76.93 +Food,42.16 +Transport,5.04 +Food,32.52 +Transport,44.40 +Food,38.11 +Transport,5.08 +Transport,22.68 +Food,19.88 +Transport,16.38 +Transport,32.48 +Transport,43.81 +Housing,1141.70 +Food,46.38 +Leisure,21.34 +Leisure,96.95 +Food,120.50 +Leisure,24.17 +Leisure,41.35 +Health,98.93 +Savings,558.24 +Health,112.45 +Food,38.15 +Food,9.12 +Food,26.11 +Health,15.92 +Food,166.90 +Savings,102.57 +Food,19.31 +Transport,15.68 +Housing,743.86 +Transport,21.10 +Transport,33.25 +Leisure,12.63 +Food,95.97 +Housing,750.99 +Food,2.88 +Food,18.70 +Transport,23.85 +Food,50.09 +Food,20.33 +Food,36.57 +Food,44.52 +Savings,55.81 +Transport,9.71 +Food,18.10 +Leisure,74.48 +Food,9.44 +Leisure,20.50 +Food,88.23 +Leisure,29.76 +Food,27.24 +Transport,38.29 +Food,6.35 +Housing,560.89 +Transport,10.29 +Leisure,19.46 +Transport,55.80 +Transport,21.40 +Transport,13.83 +Food,8.82 +Transport,28.08 +Transport,18.78 +Health,44.98 +Transport,18.48 +Food,35.87 +Food,47.81 +Food,52.34 +Health,46.92 +Transport,9.78 +Food,25.85 +Food,39.07 +Food,47.65 +Leisure,80.04 +Leisure,54.21 +Food,46.74 +Housing,2235.70 +Transport,48.82 +Food,90.33 +Food,13.48 +Transport,23.56 +Transport,56.98 +Food,30.27 +Leisure,27.73 +Food,21.55 +Transport,32.38 +Food,119.52 +Food,38.53 +Health,64.90 +Housing,1311.10 +Transport,5.86 +Food,19.19 +Leisure,22.35 +Savings,293.02 +Transport,5.03 +Housing,1712.94 +Transport,4.77 +Leisure,29.21 +Transport,10.26 +Transport,26.63 +Leisure,24.57 +Transport,69.04 +Leisure,23.66 +Transport,24.92 +Food,22.83 +Transport,41.47 +Transport,24.11 +Transport,10.75 +Leisure,24.99 +Food,105.24 +Transport,37.27 +Food,28.96 +Food,97.13 +Food,19.33 +Food,31.43 +Food,8.68 +Savings,168.20 +Health,40.54 +Food,19.44 +Food,32.20 +Food,32.95 +Leisure,33.86 +Transport,24.20 +Leisure,13.59 +Leisure,47.56 +Savings,758.24 +Food,9.46 +Transport,18.26 +Food,6.88 +Leisure,123.53 +Transport,5.13 +Food,80.26 +Food,34.23 +Health,117.89 +Transport,8.93 +Transport,41.50 +Health,91.65 +Food,41.78 +Leisure,39.84 +Transport,7.04 +Transport,4.69 +Savings,27.21 +Leisure,5.02 +Transport,10.06 +Food,51.65 +Leisure,16.75 +Savings,415.51 +Transport,3.73 +Transport,14.17 +Food,23.48 +Transport,13.18 +Housing,612.95 +Transport,16.13 +Food,22.25 +Food,17.62 +Food,42.25 +Food,44.94 +Savings,378.23 +Food,42.61 +Health,270.58 +Leisure,45.93 +Transport,53.45 +Transport,18.93 +Transport,19.72 +Food,70.37 +Food,23.25 +Leisure,27.84 +Transport,24.33 +Savings,246.70 +Savings,823.52 +Transport,31.98 +Transport,14.40 +Health,20.66 +Transport,25.36 +Leisure,29.91 +Food,19.14 +Transport,4.18 +Leisure,59.33 +Housing,621.05 +Food,7.49 +Food,77.62 +Food,37.61 +Transport,35.89 +Transport,5.29 +Food,38.59 +Food,43.13 +Food,14.53 +Transport,14.79 +Transport,8.17 +Leisure,28.90 +Transport,37.32 +Transport,27.79 +Food,33.67 +Leisure,12.24 +Transport,13.63 +Transport,38.84 +Food,70.83 +Food,12.55 +Food,26.86 +Transport,18.65 +Transport,15.88 +Food,21.02 +Transport,12.74 +Food,9.88 +Leisure,92.16 +Food,50.00 +Transport,28.62 +Leisure,40.19 +Food,18.66 +Food,36.17 +Food,49.97 +Transport,24.82 +Housing,1155.26 +Transport,52.90 +Food,115.04 +Food,41.41 +Leisure,24.22 +Leisure,30.91 +Food,66.16 +Leisure,51.87 +Leisure,23.74 +Health,1.00 +Leisure,28.82 +Leisure,15.18 +Transport,9.62 +Food,33.20 +Health,120.98 +Transport,10.66 +Housing,1934.12 +Leisure,26.36 +Leisure,1.00 +Transport,15.78 +Transport,17.03 +Food,66.25 +Food,28.41 +Leisure,65.54 +Transport,12.13 +Leisure,50.17 +Savings,357.79 +Transport,17.95 +Health,63.53 +Transport,21.40 +Food,43.47 +Food,50.06 +Leisure,57.71 +Health,32.73 +Leisure,21.09 +Savings,408.71 +Transport,34.52 +Food,17.14 +Food,168.17 +Leisure,21.32 +Food,72.44 +Food,42.94 +Food,29.21 +Leisure,17.79 +Health,13.44 +Housing,1158.40 +Food,34.27 +Food,17.94 +Food,120.72 +Housing,737.97 +Transport,31.04 +Transport,14.90 +Leisure,41.70 +Transport,24.57 +Food,71.66 +Health,54.03 +Leisure,39.57 +Food,22.62 +Food,31.74 +Transport,45.28 +Transport,42.28 +Transport,39.51 +Transport,7.47 +Food,21.65 +Leisure,61.23 +Transport,7.37 +Housing,1217.82 +Transport,11.65 +Food,37.65 +Food,48.08 +Health,92.78 +Food,5.34 +Health,148.53 +Food,3.41 +Savings,155.58 +Transport,8.23 +Savings,160.27 +Transport,39.32 +Transport,62.19 +Food,8.65 +Transport,20.83 +Health,59.72 +Transport,30.88 +Housing,969.56 +Transport,5.36 +Food,29.90 +Transport,7.78 +Leisure,66.67 +Transport,59.11 +Leisure,32.64 +Transport,13.72 +Transport,19.40 +Leisure,128.02 +Leisure,14.46 +Transport,21.06 +Food,23.71 +Food,72.40 +Transport,12.47 +Leisure,30.30 +Leisure,4.20 +Food,30.03 +Transport,29.30 +Food,24.35 +Transport,7.64 +Housing,924.98 +Transport,4.69 +Leisure,36.66 +Transport,22.60 +Leisure,3.40 +Leisure,88.08 +Food,43.13 +Transport,22.38 +Transport,10.14 +Housing,1347.95 +Leisure,17.69 +Leisure,12.37 +Transport,10.19 +Transport,5.75 +Food,129.84 +Transport,34.20 +Leisure,43.63 +Transport,25.29 +Leisure,70.33 +Health,131.89 +Health,21.19 +Savings,251.64 +Housing,1392.79 +Health,26.18 +Transport,14.44 +Food,20.15 +Transport,33.23 +Transport,5.44 +Food,23.26 +Leisure,2.60 +Housing,794.42 +Food,32.61 +Food,4.21 +Housing,679.27 +Health,17.96 +Food,53.64 +Leisure,70.00 +Food,37.91 +Leisure,44.49 +Savings,159.68 +Transport,31.62 +Transport,16.45 +Transport,38.82 +Food,9.35 +Food,55.77 +Transport,86.62 +Food,71.27 +Transport,14.14 +Health,49.59 +Food,34.29 +Leisure,34.05 +Food,12.71 +Health,87.53 +Food,23.05 +Food,85.03 +Food,39.65 +Food,19.90 +Food,32.57 +Transport,38.13 +Leisure,73.03 +Transport,25.19 +Food,89.38 +Food,13.44 +Housing,1094.76 +Transport,19.99 +Leisure,17.21 +Housing,1635.09 +Food,49.35 +Food,70.60 +Transport,5.39 +Transport,8.48 +Health,29.42 +Savings,182.74 +Transport,15.41 +Food,98.32 +Transport,12.19 +Transport,13.53 +Transport,54.60 +Leisure,81.12 +Leisure,39.44 +Transport,21.24 +Transport,26.06 +Health,12.68 +Transport,12.80 +Food,18.65 +Transport,37.10 +Transport,11.05 +Leisure,43.09 +Food,21.28 +Transport,20.87 +Leisure,64.76 +Transport,68.46 +Leisure,13.15 +Food,35.28 +Leisure,37.58 +Food,81.24 +Food,34.97 +Transport,9.41 +Transport,20.94 +Food,28.74 +Food,37.18 +Transport,37.78 +Leisure,51.51 +Food,26.04 +Food,98.76 +Food,71.40 +Food,7.06 +Transport,32.70 +Food,46.87 +Savings,311.86 +Transport,19.54 +Food,2.17 +Transport,5.47 +Food,62.52 +Savings,585.19 +Savings,523.64 +Food,39.01 +Leisure,33.19 +Savings,46.40 +Transport,16.67 +Leisure,83.89 +Transport,13.49 +Food,69.23 +Transport,74.05 +Food,50.13 +Food,23.63 +Leisure,47.36 +Leisure,29.12 +Food,14.23 +Food,32.86 +Transport,12.16 +Housing,454.10 +Savings,896.21 +Transport,48.28 +Leisure,12.17 +Transport,40.60 +Food,62.61 +Food,25.90 +Transport,24.31 +Food,67.67 +Food,60.52 +Transport,15.78 +Leisure,17.14 +Food,37.50 +Food,9.67 +Leisure,65.84 +Food,44.92 +Housing,627.59 +Health,85.76 +Health,46.13 +Food,59.46 +Transport,6.70 +Housing,502.74 +Food,55.36 +Food,28.39 +Health,34.18 +Transport,11.45 +Transport,21.12 +Leisure,8.45 +Food,52.71 +Transport,39.60 +Food,20.46 +Leisure,76.87 +Food,44.79 +Transport,13.08 +Food,24.86 +Housing,1229.72 +Transport,25.51 +Food,30.83 +Leisure,16.42 +Leisure,90.58 +Leisure,56.67 +Food,46.60 +Transport,12.48 +Transport,5.23 +Housing,370.39 +Health,39.19 +Transport,36.80 +Health,10.70 +Transport,11.86 +Transport,9.80 +Leisure,88.80 +Food,66.99 +Food,30.13 +Housing,869.90 +Transport,12.48 +Food,26.06 +Leisure,79.98 +Leisure,46.75 +Housing,660.74 +Food,30.09 +Health,7.12 +Food,14.76 +Food,58.06 +Transport,41.35 +Food,25.25 +Transport,10.83 +Food,20.16 +Housing,320.41 +Transport,7.50 +Savings,176.74 +Transport,49.15 +Transport,24.10 +Transport,47.47 +Leisure,8.58 +Savings,191.31 +Transport,68.78 +Leisure,28.22 +Health,97.11 +Food,23.61 +Food,30.35 +Transport,37.87 +Leisure,50.73 +Transport,37.51 +Food,28.67 +Food,12.37 +Leisure,27.52 +Leisure,40.04 +Leisure,82.25 +Leisure,89.38 +Food,12.48 +Transport,11.21 +Transport,35.95 +Leisure,17.62 +Transport,11.60 +Food,26.13 +Transport,8.10 +Transport,11.24 +Housing,262.19 +Food,6.84 +Food,26.21 +Transport,14.46 +Housing,75.71 +Transport,22.61 +Food,11.05 +Transport,37.20 +Transport,21.80 +Transport,5.43 +Leisure,51.47 +Leisure,31.48 +Transport,11.53 +Transport,6.44 +Transport,22.55 +Food,106.11 +Transport,41.23 +Housing,1349.22 +Food,50.51 +Food,32.01 +Savings,416.66 +Health,90.33 +Savings,153.14 +Transport,46.44 +Health,7.60 +Food,80.66 +Leisure,83.25 +Leisure,15.00 +Food,121.82 +Food,28.98 +Housing,389.51 +Food,71.41 +Housing,2268.50 +Transport,28.05 +Housing,509.36 +Savings,436.52 +Housing,736.77 +Leisure,46.16 +Transport,15.94 +Leisure,74.06 +Transport,32.40 +Food,24.16 +Food,33.13 +Transport,50.48 +Food,106.52 +Leisure,36.72 +Transport,40.59 +Health,154.52 +Food,69.80 +Transport,49.11 +Transport,29.15 +Transport,20.93 +Food,4.81 +Health,87.24 +Health,112.35 +Food,64.57 +Food,119.05 +Food,53.72 +Savings,407.13 +Food,18.60 +Leisure,40.26 +Transport,45.97 +Food,41.33 +Transport,28.34 +Housing,184.43 +Health,88.57 +Food,10.61 +Health,23.12 +Food,5.70 +Food,37.66 +Leisure,58.89 +Transport,15.45 +Food,12.45 +Transport,8.33 +Transport,50.55 +Food,24.87 +Transport,7.41 +Food,134.47 +Food,62.88 +Leisure,66.76 +Food,22.50 +Transport,14.75 +Transport,5.92 +Housing,369.00 +Health,150.06 +Food,50.25 +Leisure,20.15 +Health,43.59 +Transport,51.56 +Transport,48.84 +Health,109.13 +Food,23.47 +Leisure,26.12 +Food,15.10 +Food,6.86 +Food,44.19 +Transport,4.04 +Leisure,38.15 +Transport,6.30 +Food,1.00 +Savings,98.47 +Food,8.08 +Leisure,34.07 +Food,20.95 +Transport,6.19 +Transport,5.33 +Leisure,33.05 +Transport,12.35 +Transport,51.58 +Leisure,18.12 +Food,32.47 +Food,109.11 +Transport,45.70 +Health,49.26 +Food,17.74 +Health,79.54 +Health,46.24 +Savings,361.32 +Transport,32.55 +Transport,49.08 +Savings,518.65 +Transport,39.77 +Food,75.34 +Food,16.43 +Leisure,22.09 +Food,14.96 +Leisure,24.12 +Housing,988.84 +Food,67.40 +Leisure,70.61 +Food,28.72 +Transport,7.04 +Food,43.48 +Transport,40.75 +Transport,37.34 +Transport,28.90 +Transport,19.72 +Food,54.78 +Transport,11.27 +Health,21.21 +Food,22.86 +Transport,26.77 +Leisure,53.72 +Transport,27.55 +Food,49.46 +Food,19.28 +Food,36.75 +Savings,164.31 +Food,15.15 +Transport,4.81 +Leisure,54.60 +Food,9.23 +Food,12.44 +Food,49.05 +Health,94.09 +Food,13.02 +Food,10.81 +Transport,16.36 +Transport,4.13 +Transport,16.54 +Transport,10.73 +Leisure,19.91 +Transport,9.87 +Transport,51.70 +Transport,26.31 +Food,78.89 +Health,81.98 +Housing,450.18 +Food,71.99 +Food,27.13 +Food,34.00 +Food,47.61 +Food,9.15 +Food,52.73 +Transport,17.01 +Transport,18.49 +Savings,233.88 +Health,97.36 +Transport,10.75 +Savings,58.02 +Leisure,52.49 +Food,32.04 +Food,17.97 +Transport,42.12 +Leisure,71.98 +Health,147.91 +Food,44.83 +Food,40.38 +Transport,22.84 +Transport,25.03 +Food,28.09 +Transport,21.86 +Transport,27.53 +Food,96.09 +Transport,1.00 +Leisure,10.77 +Food,29.27 +Transport,25.14 +Food,7.45 +Food,66.31 +Health,82.94 +Savings,245.32 +Health,117.16 +Food,43.79 +Leisure,33.79 +Transport,16.11 +Leisure,53.05 +Leisure,42.92 +Transport,7.53 +Transport,29.52 +Food,37.12 +Food,89.39 +Transport,5.66 +Transport,43.48 +Food,72.19 +Transport,9.33 +Health,7.48 +Health,107.50 +Transport,56.76 +Leisure,35.10 +Transport,46.40 +Transport,15.83 +Transport,18.94 +Transport,4.91 +Transport,28.84 +Leisure,60.06 +Food,1.95 +Leisure,10.67 +Food,62.01 +Food,17.65 +Food,70.28 +Leisure,35.25 +Leisure,44.54 +Transport,53.38 +Transport,9.79 +Transport,37.81 +Health,146.72 +Food,35.32 +Transport,49.21 +Transport,21.66 +Food,107.79 +Transport,4.67 +Food,28.47 +Leisure,8.84 +Food,16.97 +Food,37.51 +Food,99.26 +Health,26.59 +Health,45.41 +Housing,509.37 +Food,38.98 +Transport,22.40 +Food,20.50 +Food,37.60 +Food,27.25 +Housing,618.23 +Transport,7.72 +Food,49.27 +Food,20.86 +Food,3.15 +Transport,26.22 +Transport,16.93 +Food,14.07 +Food,14.66 +Housing,403.82 +Leisure,144.84 +Housing,222.30 +Transport,5.18 +Transport,16.92 +Food,59.30 +Transport,3.15 +Transport,30.07 +Food,103.69 +Transport,17.16 +Transport,23.06 +Food,23.96 +Leisure,47.06 +Transport,14.64 +Food,104.49 +Leisure,89.73 +Housing,2026.10 +Transport,19.41 +Transport,15.98 +Transport,22.12 +Food,33.58 +Food,36.69 +Transport,40.28 +Food,189.69 +Food,7.66 +Food,37.97 +Food,21.85 +Food,20.78 +Food,43.79 +Transport,45.86 +Housing,60.53 +Transport,12.57 +Leisure,11.31 +Transport,36.80 +Health,38.80 +Leisure,37.02 +Transport,25.09 +Leisure,55.63 +Leisure,73.52 +Transport,22.93 +Food,15.39 +Food,18.79 +Food,44.72 +Transport,17.49 +Food,60.29 +Leisure,7.61 +Food,18.90 +Transport,9.48 +Savings,164.92 +Food,50.37 +Housing,319.86 +Transport,25.45 +Transport,14.56 +Health,115.30 +Transport,12.84 +Transport,26.49 +Transport,9.82 +Food,23.85 +Leisure,47.75 +Leisure,55.72 +Health,17.10 +Health,40.70 +Transport,16.12 +Health,61.15 +Food,98.63 +Food,40.86 +Health,41.80 +Leisure,49.98 +Transport,19.13 +Health,51.14 +Food,19.41 +Food,9.39 +Food,43.97 +Health,44.73 +Savings,284.24 +Food,2.79 +Food,33.58 +Health,52.29 +Transport,60.11 +Transport,11.71 +Health,29.99 +Leisure,11.21 +Food,34.07 +Food,61.11 +Savings,267.21 +Leisure,34.48 +Food,64.92 +Health,36.66 +Leisure,61.80 +Transport,14.61 +Leisure,94.60 +Transport,19.63 +Food,44.12 +Food,16.29 +Food,24.60 +Health,5.92 +Health,63.03 +Transport,10.44 +Food,147.49 +Transport,51.42 +Transport,13.97 +Food,29.45 +Food,16.34 +Transport,4.59 +Health,49.51 +Transport,2.27 +Transport,29.23 +Food,43.60 +Transport,30.51 +Transport,21.97 +Food,35.60 +Food,25.50 +Food,47.83 +Housing,357.51 +Transport,25.21 +Housing,1863.67 +Food,46.93 +Food,24.10 +Leisure,30.06 +Transport,43.21 +Food,20.22 +Transport,24.60 +Food,7.60 +Transport,19.25 +Transport,6.02 +Transport,5.60 +Transport,15.06 +Health,251.63 +Leisure,59.91 +Food,31.10 +Transport,18.53 +Transport,52.68 +Food,13.35 +Food,23.20 +Leisure,25.56 +Transport,6.19 +Savings,161.76 +Transport,21.99 +Health,52.32 +Food,6.00 +Transport,12.82 +Transport,79.18 +Leisure,42.22 +Savings,436.59 +Transport,18.96 +Food,64.78 +Transport,14.41 +Food,33.63 +Leisure,82.34 +Health,109.85 +Food,39.36 +Transport,80.47 +Leisure,26.36 +Food,22.04 +Transport,30.82 +Transport,7.89 +Food,76.01 +Food,54.72 +Transport,30.20 +Transport,41.22 +Transport,52.18 +Leisure,48.56 +Food,98.97 +Transport,25.39 +Leisure,41.67 +Food,26.17 +Transport,46.07 +Transport,24.23 +Transport,31.21 +Transport,8.37 +Food,45.24 +Transport,20.66 +Food,24.79 +Transport,10.89 +Food,18.35 +Food,70.00 +Savings,218.26 +Transport,19.55 +Leisure,18.94 +Transport,21.46 +Savings,113.35 +Leisure,9.38 +Food,11.74 +Transport,21.19 +Food,25.79 +Food,61.07 +Food,43.96 +Housing,985.54 +Savings,59.69 +Transport,32.99 +Leisure,34.98 +Food,23.25 +Leisure,10.64 +Food,79.15 +Transport,24.34 +Food,8.92 +Transport,6.86 +Food,18.03 +Food,72.10 +Food,12.95 +Food,77.41 +Transport,27.93 +Transport,17.28 +Health,61.11 +Savings,369.51 +Health,107.70 +Transport,24.33 +Food,20.16 +Savings,247.98 +Food,34.99 +Food,13.52 +Transport,25.65 +Food,32.06 +Housing,320.76 +Transport,7.88 +Leisure,16.17 +Health,143.28 +Food,58.32 +Housing,327.14 +Food,18.05 +Health,52.86 +Food,27.49 +Transport,24.82 +Transport,48.81 +Transport,64.13 +Transport,17.73 +Transport,5.10 +Transport,13.38 +Food,17.60 +Leisure,26.92 +Savings,220.49 +Food,37.33 +Health,129.38 +Food,25.58 +Health,94.46 +Transport,10.72 +Transport,16.89 +Leisure,16.84 +Leisure,77.55 +Leisure,34.02 +Leisure,4.48 +Leisure,67.71 +Leisure,56.53 +Food,61.31 +Leisure,54.95 +Food,9.72 +Savings,186.29 +Transport,21.31 +Leisure,28.49 +Leisure,82.67 +Leisure,26.15 +Food,113.79 +Food,36.93 +Transport,36.62 +Food,77.12 +Savings,149.90 +Transport,6.53 +Transport,5.30 +Transport,6.11 +Savings,268.24 +Food,12.48 +Transport,25.94 +Leisure,1.00 +Health,104.23 +Leisure,58.42 +Savings,347.52 +Transport,57.08 +Transport,111.71 +Savings,305.83 +Transport,19.34 +Health,38.49 +Transport,34.09 +Food,99.53 +Transport,44.62 +Transport,19.32 +Transport,19.74 +Food,8.01 +Food,5.97 +Transport,19.05 +Food,47.92 +Transport,30.33 +Leisure,52.51 +Food,35.40 +Health,65.09 +Leisure,61.24 +Transport,39.83 +Transport,4.20 +Food,49.11 +Transport,44.07 +Food,42.87 +Food,7.66 +Transport,16.55 +Food,61.82 +Food,28.45 +Food,46.16 +Housing,1916.07 +Health,36.47 +Transport,16.92 +Food,22.91 +Housing,390.67 +Transport,14.35 +Transport,14.98 +Food,17.05 +Transport,73.86 +Leisure,50.75 +Transport,12.09 +Food,41.30 +Transport,14.63 +Food,19.82 +Health,56.73 +Transport,8.77 +Transport,11.58 +Food,79.42 +Food,39.60 +Food,90.06 +Food,13.29 +Transport,85.06 +Housing,644.77 +Savings,201.07 +Leisure,56.26 +Transport,8.05 +Food,31.23 +Transport,33.96 +Transport,6.87 +Health,51.15 +Health,28.55 +Transport,20.24 +Leisure,31.27 +Food,46.67 +Leisure,63.23 +Food,123.54 +Transport,5.68 +Leisure,14.69 +Food,99.05 +Leisure,22.92 +Food,5.58 +Food,29.66 +Food,35.94 +Transport,9.48 +Transport,3.04 +Leisure,13.96 +Food,63.82 +Transport,24.67 +Leisure,7.66 +Transport,41.16 +Food,7.24 +Savings,430.69 +Transport,46.82 +Food,36.71 +Transport,26.38 +Housing,523.47 +Transport,20.05 +Leisure,10.35 +Transport,8.83 +Food,34.25 +Transport,27.76 +Transport,15.90 +Food,26.95 +Food,31.91 +Leisure,16.20 +Food,45.83 +Transport,11.77 +Transport,64.95 +Transport,20.59 +Food,51.81 +Transport,6.13 +Transport,32.05 +Health,28.92 +Housing,1234.93 +Transport,36.82 +Transport,24.79 +Food,64.32 +Food,59.60 +Food,27.36 +Food,6.63 +Health,150.61 +Food,52.71 +Savings,132.73 +Food,62.73 +Food,25.17 +Transport,8.14 +Transport,16.18 +Food,30.03 +Leisure,28.51 +Food,46.67 +Transport,55.80 +Food,13.77 +Food,75.92 +Leisure,53.48 +Leisure,33.67 +Food,16.53 +Transport,19.68 +Food,12.29 +Food,62.18 +Food,84.11 +Leisure,40.72 +Leisure,85.70 +Food,25.78 +Food,44.73 +Leisure,19.26 +Leisure,72.79 +Savings,42.30 +Food,66.26 +Food,69.76 +Leisure,126.33 +Health,50.17 +Transport,23.98 +Food,52.40 +Transport,33.95 +Transport,21.37 +Food,53.51 +Transport,16.28 +Food,90.73 +Food,14.84 +Leisure,46.90 +Transport,10.13 +Transport,48.01 +Food,53.54 +Food,30.90 +Food,10.96 +Savings,107.89 +Transport,9.02 +Transport,40.13 +Transport,14.95 +Leisure,114.85 +Transport,28.36 +Transport,62.36 +Food,89.22 +Transport,6.26 +Transport,35.38 +Transport,15.46 +Food,98.59 +Food,32.59 +Health,14.69 +Leisure,68.99 +Transport,30.24 +Food,20.75 +Health,15.96 +Housing,841.99 +Transport,37.44 +Leisure,19.62 +Food,24.84 +Health,45.27 +Transport,32.33 +Food,62.88 +Housing,936.60 +Transport,36.03 +Food,44.74 +Savings,643.44 +Food,34.18 +Transport,24.22 +Transport,4.75 +Food,40.80 +Leisure,85.79 +Food,15.00 +Food,23.35 +Housing,992.24 +Food,68.02 +Transport,6.77 +Food,83.40 +Leisure,34.15 +Food,22.25 +Health,96.38 +Transport,9.50 +Transport,17.10 +Transport,13.31 +Transport,21.29 +Food,16.21 +Food,23.32 +Food,19.10 +Food,28.72 +Food,51.55 +Leisure,5.88 +Food,60.90 +Transport,25.28 +Leisure,18.60 +Transport,4.48 +Transport,38.37 +Food,15.86 +Food,21.84 +Savings,176.96 +Health,114.17 +Health,24.02 +Food,38.80 +Transport,25.39 +Food,15.44 +Food,22.01 +Food,40.74 +Transport,36.62 +Food,29.02 +Transport,27.06 +Leisure,26.22 +Food,20.40 +Leisure,63.82 +Savings,60.75 +Food,21.96 +Food,57.39 +Transport,14.44 +Transport,21.76 +Food,17.81 +Food,86.82 +Transport,4.01 +Food,74.59 +Transport,7.69 +Food,14.86 +Food,54.16 +Health,127.37 +Leisure,20.09 +Transport,1.86 +Health,97.95 +Transport,42.17 +Transport,10.93 +Transport,23.43 +Food,36.98 +Transport,14.14 +Food,29.59 +Transport,7.65 +Food,25.42 +Food,18.45 +Savings,408.52 +Transport,15.10 +Food,26.20 +Leisure,22.70 +Food,35.50 +Transport,1.74 +Food,6.05 +Food,26.75 +Transport,21.08 +Leisure,4.83 +Transport,18.61 +Transport,26.36 +Transport,22.79 +Transport,5.22 +Transport,1.18 +Transport,27.35 +Transport,27.69 +Health,9.77 +Food,18.50 +Housing,67.80 +Transport,27.59 +Food,94.16 +Transport,46.52 +Leisure,47.51 +Food,11.24 +Food,112.32 +Transport,25.73 +Food,3.93 +Health,26.97 +Food,28.54 +Food,52.12 +Food,79.64 +Transport,20.50 +Leisure,45.51 +Leisure,26.38 +Food,23.04 +Food,11.00 +Food,13.06 +Leisure,17.46 +Food,16.08 +Leisure,39.27 +Transport,14.75 +Transport,26.11 +Transport,43.64 +Food,9.67 +Food,25.31 +Food,13.75 +Food,47.14 +Leisure,139.72 +Health,21.27 +Transport,18.75 +Food,8.32 +Transport,6.41 +Transport,46.05 +Savings,563.46 +Transport,12.65 +Food,11.96 +Health,31.61 +Food,12.86 +Health,64.03 +Health,165.74 +Transport,7.43 +Food,49.98 +Housing,897.59 +Savings,152.64 +Savings,763.34 +Food,28.52 +Transport,5.48 +Savings,73.57 +Food,39.46 +Food,35.77 +Food,99.73 +Food,44.28 +Transport,52.14 +Transport,23.62 +Food,105.81 +Food,60.90 +Food,21.22 +Transport,14.28 +Food,33.09 +Transport,32.74 +Food,78.52 +Transport,45.02 +Transport,19.87 +Health,12.74 +Leisure,23.10 +Food,17.49 +Transport,14.14 +Savings,117.66 +Transport,44.36 +Leisure,101.34 +Savings,222.89 +Food,70.34 +Transport,22.93 +Transport,10.56 +Transport,8.08 +Leisure,39.30 +Transport,5.62 +Food,4.67 +Transport,14.85 +Savings,502.39 +Transport,20.85 +Food,9.89 +Food,63.39 +Transport,8.80 +Transport,21.39 +Transport,14.59 +Food,16.72 +Leisure,20.89 +Transport,9.61 +Food,25.38 +Health,67.63 +Food,109.64 +Transport,16.56 +Transport,11.49 +Health,15.72 +Food,32.21 +Food,24.59 +Leisure,48.65 +Leisure,66.39 +Food,49.51 +Transport,26.96 +Food,88.10 +Transport,21.21 +Food,19.99 +Health,48.46 +Food,6.98 +Food,87.78 +Transport,26.93 +Transport,23.41 +Food,39.53 +Transport,20.14 +Transport,28.11 +Food,22.11 +Food,42.11 +Transport,49.33 +Leisure,22.77 +Leisure,64.42 +Leisure,86.98 +Food,7.74 +Food,11.64 +Food,81.52 +Transport,2.50 +Leisure,20.23 +Transport,45.68 +Leisure,20.97 +Food,29.48 +Food,29.33 +Leisure,42.42 +Food,4.87 +Health,20.14 +Transport,27.50 +Transport,13.82 +Food,2.24 +Food,24.76 +Food,16.66 +Transport,7.36 +Transport,18.28 +Transport,34.16 +Food,19.92 +Transport,9.77 +Leisure,102.44 +Food,34.49 +Food,26.16 +Leisure,29.19 +Food,8.83 +Leisure,14.66 +Transport,14.00 +Transport,11.41 +Food,42.75 +Leisure,55.71 +Food,78.65 +Transport,31.17 +Transport,17.59 +Food,80.89 +Health,12.82 +Transport,17.90 +Leisure,73.37 +Food,57.92 +Leisure,31.91 +Transport,37.42 +Housing,315.59 +Leisure,14.86 +Food,23.96 +Food,69.68 +Transport,26.37 +Food,36.90 +Food,43.07 +Food,130.93 +Health,24.88 +Food,12.03 +Leisure,87.38 +Health,52.89 +Leisure,122.68 +Transport,17.93 +Food,16.66 +Leisure,28.35 +Transport,4.59 +Leisure,13.13 +Transport,39.25 +Transport,67.58 +Food,13.99 +Leisure,77.76 +Leisure,18.10 +Leisure,10.77 +Transport,18.53 +Health,20.00 +Transport,8.40 +Leisure,67.03 +Transport,8.89 +Health,38.53 +Food,8.90 +Housing,591.63 +Transport,38.41 +Transport,9.60 +Leisure,46.11 +Food,69.80 +Leisure,15.47 +Food,21.13 +Housing,1684.12 +Transport,84.17 +Food,49.71 +Transport,64.16 +Transport,31.53 +Leisure,7.78 +Food,59.94 +Food,80.50 +Food,75.35 +Food,5.15 +Leisure,62.30 +Food,12.81 +Food,54.42 +Transport,4.72 +Transport,19.79 +Leisure,12.96 +Transport,16.67 +Food,27.02 +Transport,24.71 +Leisure,97.60 +Food,37.64 +Food,54.24 +Food,70.22 +Transport,36.89 +Leisure,68.89 +Food,19.75 +Transport,27.06 +Health,32.88 +Transport,12.77 +Transport,4.50 +Leisure,26.57 +Transport,33.35 +Transport,10.38 +Transport,40.91 +Transport,2.88 +Transport,7.03 +Food,6.12 +Transport,11.71 +Leisure,88.79 +Transport,20.84 +Transport,10.73 +Food,47.03 +Transport,37.49 +Transport,1.93 +Leisure,31.26 +Food,79.04 +Food,31.63 +Food,31.34 +Transport,18.86 +Transport,103.13 +Transport,34.80 +Leisure,118.66 +Food,13.06 +Food,10.95 +Transport,8.15 +Transport,16.34 +Food,14.96 +Leisure,12.21 +Transport,18.54 +Food,27.34 +Food,12.34 +Food,16.89 +Transport,27.93 +Food,2.83 +Food,12.70 +Food,14.60 +Leisure,12.08 +Transport,4.34 +Savings,110.04 +Food,21.90 +Food,20.29 +Transport,27.21 +Food,53.00 +Food,14.03 +Health,9.05 +Transport,14.53 +Transport,39.98 +Housing,2240.41 +Leisure,56.73 +Transport,18.89 +Food,12.22 +Savings,94.83 +Transport,46.78 +Transport,26.25 +Health,24.23 +Transport,8.04 +Food,18.48 +Transport,7.40 +Transport,11.18 +Transport,43.63 +Transport,28.71 +Leisure,103.22 +Leisure,22.61 +Food,4.85 +Transport,17.98 +Food,21.34 +Transport,13.36 +Leisure,23.57 +Housing,878.80 +Transport,51.36 +Transport,42.33 +Food,11.55 +Housing,901.87 +Food,40.25 +Food,6.51 +Food,14.68 +Transport,13.38 +Leisure,14.95 +Food,62.50 +Food,24.34 +Transport,6.92 +Transport,39.00 +Leisure,41.99 +Food,149.79 +Food,57.67 +Transport,44.28 +Savings,292.60 +Food,15.11 +Leisure,59.20 +Food,99.00 +Food,2.61 +Food,29.08 +Housing,957.63 +Transport,43.21 +Food,60.38 +Leisure,92.17 +Transport,30.87 +Transport,18.48 +Health,40.60 +Food,36.15 +Food,20.79 +Food,20.49 +Transport,4.94 +Housing,65.99 +Leisure,2.65 +Food,68.32 +Food,25.72 +Leisure,54.52 +Food,20.90 +Food,33.00 +Housing,557.46 +Transport,83.42 +Food,1.87 +Food,66.16 +Transport,7.09 +Food,33.13 +Transport,6.06 +Transport,18.60 +Health,53.51 +Health,64.93 +Food,8.11 +Food,30.50 +Housing,740.55 +Food,23.73 +Leisure,47.34 +Transport,76.94 +Food,7.47 +Leisure,33.14 +Food,111.70 +Food,55.53 +Transport,28.94 +Leisure,43.76 +Leisure,2.53 +Transport,41.90 +Transport,25.75 +Leisure,84.99 +Leisure,49.93 +Leisure,16.37 +Food,79.48 +Health,64.87 +Food,26.88 +Transport,14.09 +Leisure,63.35 +Food,24.36 +Food,49.89 +Food,27.78 +Transport,16.41 +Food,85.25 +Transport,17.16 +Transport,1.71 +Leisure,11.33 +Food,48.52 +Food,36.72 +Savings,776.70 +Transport,42.95 +Leisure,33.77 +Health,177.33 +Food,35.63 +Transport,8.79 +Food,15.13 +Food,36.10 +Transport,19.22 +Transport,16.93 +Food,27.96 +Transport,31.94 +Health,69.33 +Transport,6.16 +Food,14.22 +Transport,24.91 +Housing,1517.71 +Leisure,61.91 +Leisure,10.88 +Leisure,9.48 +Food,36.23 +Food,29.20 +Health,105.74 +Transport,14.44 +Health,56.50 +Food,33.20 +Food,9.37 +Food,59.55 +Transport,15.14 +Transport,13.78 +Food,51.46 +Transport,28.51 +Food,24.16 +Transport,42.29 +Food,20.24 +Transport,13.22 +Transport,14.21 +Health,85.58 +Housing,222.64 +Food,38.04 +Food,26.91 +Transport,13.14 +Transport,15.30 +Housing,819.84 +Transport,6.25 +Leisure,32.48 +Transport,31.49 +Food,26.58 +Leisure,111.93 +Transport,7.20 +Leisure,80.99 +Transport,9.58 +Food,20.02 +Leisure,25.19 +Housing,742.76 +Food,11.70 +Transport,13.44 +Food,26.14 +Transport,16.09 +Transport,10.40 +Transport,13.93 +Health,129.99 +Transport,11.84 +Leisure,45.36 +Transport,45.39 +Transport,55.72 +Transport,63.14 +Transport,19.90 +Food,97.01 +Transport,38.27 +Transport,20.44 +Transport,19.82 +Food,16.49 +Transport,12.41 +Transport,20.77 +Health,104.76 +Food,33.15 +Transport,8.47 +Transport,21.11 +Food,29.72 +Food,96.86 +Food,53.42 +Health,153.28 +Savings,676.37 +Transport,21.86 +Transport,23.84 +Food,35.65 +Transport,24.39 +Health,19.42 +Food,16.12 +Housing,659.22 +Leisure,5.88 +Transport,26.39 +Food,55.67 +Food,44.53 +Food,167.08 +Transport,38.60 +Transport,34.07 +Transport,1.40 +Transport,93.53 +Food,13.99 +Food,31.03 +Food,14.50 +Transport,57.52 +Transport,56.39 +Food,22.78 +Leisure,33.93 +Food,9.93 +Food,1.51 +Housing,986.81 +Food,39.55 +Leisure,16.03 +Leisure,60.85 +Transport,17.25 +Transport,17.07 +Transport,52.68 +Leisure,24.95 +Transport,19.80 +Transport,24.80 +Leisure,49.03 +Leisure,22.57 +Food,36.55 +Leisure,84.01 +Transport,1.50 +Health,12.51 +Leisure,56.59 +Transport,20.20 +Savings,492.85 +Food,44.62 +Transport,10.15 +Transport,6.13 +Leisure,47.39 +Food,26.73 +Transport,86.12 +Transport,3.13 +Transport,28.88 +Transport,10.30 +Leisure,39.53 +Savings,229.54 +Food,23.40 +Transport,27.00 +Transport,15.99 +Leisure,14.98 +Food,14.17 +Transport,25.96 +Savings,569.13 +Transport,26.08 +Food,76.06 +Housing,1388.51 +Food,23.39 +Food,41.54 +Leisure,21.60 +Food,36.68 +Food,8.96 +Transport,28.19 +Food,22.51 +Food,35.71 +Leisure,19.49 +Food,60.44 +Leisure,29.36 +Leisure,41.76 +Savings,284.57 +Leisure,32.63 +Food,61.40 +Transport,11.29 +Transport,32.33 +Food,20.46 +Food,109.18 +Health,109.24 +Transport,23.77 +Transport,25.88 +Leisure,38.04 +Transport,6.82 +Food,72.46 +Food,41.23 +Health,37.66 +Leisure,62.00 +Food,77.21 +Health,30.18 +Housing,2577.01 +Transport,1.52 +Food,28.93 +Food,76.19 +Transport,21.51 +Transport,46.05 +Transport,31.51 +Savings,165.18 +Food,131.17 +Leisure,43.92 +Food,6.53 +Health,45.71 +Transport,2.61 +Transport,6.56 +Food,22.69 +Food,9.56 +Food,83.90 +Food,43.83 +Food,46.23 +Transport,18.78 +Food,48.89 +Food,87.90 +Food,86.86 +Food,31.34 +Housing,2787.64 +Savings,198.98 +Transport,18.01 +Food,145.83 +Leisure,104.60 +Transport,6.10 +Transport,11.49 +Transport,38.99 +Food,29.46 +Transport,37.34 +Health,42.18 +Leisure,15.86 +Transport,21.50 +Transport,13.23 +Transport,19.60 +Housing,1166.25 +Food,2.60 +Transport,34.99 +Transport,4.68 +Transport,20.46 +Food,93.72 +Leisure,9.22 +Food,55.29 +Leisure,12.18 +Food,14.29 +Transport,9.03 +Housing,443.11 +Leisure,15.97 +Health,180.55 +Transport,4.70 +Food,51.58 +Food,23.04 +Health,6.98 +Leisure,138.00 +Food,4.09 +Health,63.15 +Food,26.40 +Food,75.14 +Food,36.29 +Leisure,47.20 +Food,19.00 +Food,19.43 +Food,83.73 +Food,17.23 +Transport,4.03 +Leisure,70.46 +Food,32.67 +Food,9.96 +Food,13.15 +Food,15.27 +Leisure,40.23 +Transport,21.08 +Food,22.91 +Savings,89.12 +Food,74.55 +Leisure,24.55 +Transport,16.14 +Transport,34.45 +Leisure,45.49 +Food,25.64 +Transport,14.40 +Leisure,50.72 +Food,8.98 +Food,11.15 +Food,40.64 +Savings,449.22 +Food,71.47 +Transport,33.01 +Housing,671.78 +Transport,22.14 +Food,49.90 +Food,3.47 +Transport,76.35 +Food,27.27 +Health,93.06 +Food,28.90 +Transport,20.22 +Housing,610.79 +Transport,8.37 +Savings,323.12 +Food,9.32 +Health,68.25 +Transport,14.72 +Transport,17.36 +Leisure,8.48 +Leisure,28.58 +Leisure,93.09 +Food,10.07 +Transport,29.32 +Transport,15.01 +Savings,483.99 +Leisure,7.93 +Transport,20.80 +Food,47.69 +Food,44.42 +Transport,29.10 +Health,115.84 +Food,30.74 +Food,87.32 +Transport,24.20 +Food,39.17 +Food,17.11 +Transport,18.39 +Transport,32.39 +Food,60.31 +Leisure,24.43 +Leisure,53.32 +Food,101.07 +Food,11.78 +Leisure,20.42 +Food,47.83 +Transport,13.55 +Transport,12.72 +Transport,15.50 +Food,29.88 +Transport,4.10 +Food,114.28 +Leisure,44.38 +Food,81.62 +Leisure,42.74 +Leisure,41.77 +Transport,33.05 +Transport,6.78 +Transport,27.95 +Food,9.88 +Transport,40.32 +Transport,4.99 +Food,18.38 +Transport,30.36 +Leisure,69.91 +Food,25.56 +Food,8.53 +Transport,34.80 +Leisure,37.18 +Health,66.96 +Transport,33.60 +Transport,11.37 +Housing,1688.35 +Savings,139.09 +Transport,31.03 +Food,47.18 +Food,34.43 +Health,66.67 +Health,34.74 +Food,39.77 +Food,93.47 +Food,18.10 +Food,111.47 +Transport,18.40 +Transport,17.08 +Food,69.70 +Food,78.51 +Food,27.75 +Savings,379.86 +Transport,47.21 +Food,33.42 +Food,22.10 +Food,47.73 +Leisure,38.35 +Food,25.71 +Food,33.20 +Food,80.62 +Transport,8.90 +Food,22.95 +Transport,40.43 +Transport,1.32 +Transport,13.68 +Food,21.15 +Food,131.06 +Transport,19.89 +Food,50.30 +Transport,5.35 +Food,25.97 +Leisure,14.44 +Transport,18.87 +Food,17.14 +Health,93.88 +Transport,23.99 +Food,30.48 +Food,23.17 +Food,8.42 +Health,44.79 +Health,105.06 +Food,33.43 +Food,69.76 +Transport,61.94 +Food,45.51 +Food,23.84 +Food,46.17 +Leisure,31.34 +Food,17.54 +Health,62.78 +Food,6.59 +Food,15.31 +Food,26.72 +Food,1.52 +Transport,8.78 +Leisure,15.04 +Food,67.44 +Transport,16.00 +Transport,30.21 +Leisure,197.96 +Health,72.94 +Food,16.13 +Housing,555.51 +Leisure,100.05 +Food,42.88 +Transport,18.39 +Health,129.82 +Leisure,29.92 +Transport,27.31 +Health,51.67 +Food,38.60 +Transport,34.53 +Food,21.95 +Transport,26.04 +Health,30.79 +Transport,10.61 +Transport,9.16 +Food,12.37 +Leisure,53.78 +Health,53.57 +Transport,11.73 +Food,92.72 +Transport,8.51 +Transport,15.48 +Leisure,54.09 +Food,142.13 +Food,43.46 +Transport,19.09 +Transport,27.74 +Transport,24.72 +Transport,2.59 +Transport,13.37 +Food,25.37 +Leisure,29.05 +Transport,26.62 +Transport,9.21 +Transport,32.18 +Food,33.27 +Housing,340.35 +Health,109.78 +Transport,18.02 +Housing,1685.99 +Food,138.23 +Food,26.34 +Transport,24.41 +Food,10.35 +Food,32.65 +Transport,46.84 +Transport,12.44 +Food,14.86 +Transport,34.23 +Leisure,29.78 +Housing,39.42 +Transport,38.67 +Food,31.90 +Savings,304.49 +Food,48.80 +Food,7.72 +Leisure,20.98 +Housing,843.32 +Transport,49.65 +Health,131.51 +Food,16.53 +Food,20.80 +Food,9.20 +Transport,4.50 +Food,60.77 +Leisure,35.07 +Transport,32.32 +Food,44.14 +Health,30.14 +Health,101.51 +Transport,35.06 +Transport,53.35 +Food,4.17 +Transport,22.69 +Transport,24.19 +Transport,6.04 +Leisure,71.85 +Leisure,25.26 +Transport,43.73 +Transport,54.04 +Leisure,50.74 +Food,22.52 +Food,32.79 +Food,25.17 +Food,22.08 +Transport,27.74 +Transport,6.84 +Food,32.64 +Leisure,10.17 +Transport,20.81 +Food,30.66 +Food,45.08 +Food,50.75 +Transport,14.02 +Leisure,86.38 +Transport,25.53 +Food,38.40 +Food,65.68 +Savings,394.67 +Health,99.07 +Transport,2.13 +Transport,8.29 +Health,57.87 +Transport,22.02 +Food,22.68 +Housing,364.08 +Food,55.26 +Transport,10.57 +Health,22.06 +Leisure,14.61 +Food,4.29 +Leisure,5.05 +Food,92.35 +Food,73.67 +Transport,21.71 +Health,31.33 +Savings,317.13 +Food,29.69 +Food,35.69 +Food,38.64 +Food,21.62 +Leisure,26.76 +Food,13.35 +Leisure,23.06 +Food,48.35 +Leisure,38.42 +Transport,12.95 +Food,31.18 +Transport,38.61 +Transport,22.49 +Transport,9.32 +Food,56.01 +Savings,1314.59 +Transport,34.89 +Transport,20.69 +Food,21.27 +Health,92.83 +Transport,10.43 +Transport,11.50 +Food,12.39 +Health,48.52 +Transport,1.00 +Housing,1226.99 +Food,4.02 +Transport,6.57 +Leisure,32.56 +Leisure,57.76 +Food,13.63 +Food,34.48 +Transport,13.56 +Transport,21.16 +Food,25.00 +Food,5.98 +Food,80.77 +Savings,415.70 +Transport,19.60 +Food,61.50 +Health,7.30 +Food,24.02 +Food,67.41 +Transport,22.67 +Leisure,19.68 +Food,67.78 +Food,24.65 +Leisure,42.51 +Health,153.38 +Food,47.52 +Food,86.85 +Transport,22.23 +Food,36.76 +Food,5.28 +Transport,15.45 +Food,22.66 +Food,195.94 +Housing,745.92 +Food,21.16 +Transport,47.51 +Food,45.61 +Transport,28.89 +Food,55.20 +Food,16.11 +Food,28.56 +Transport,21.92 +Transport,15.39 +Health,39.99 +Leisure,14.02 +Transport,27.99 +Food,16.20 +Food,23.27 +Transport,34.05 +Food,33.30 +Health,14.89 +Food,34.56 +Food,11.77 +Health,109.13 +Savings,127.33 +Food,19.51 +Leisure,12.72 +Transport,13.99 +Transport,2.33 +Food,43.38 +Health,102.79 +Food,23.25 +Transport,30.06 +Savings,53.90 +Food,93.90 +Transport,26.98 +Health,143.98 +Leisure,54.68 +Transport,38.69 +Transport,55.97 +Food,16.92 +Food,9.81 +Leisure,23.26 +Leisure,57.28 +Transport,8.05 +Food,14.41 +Leisure,27.01 +Food,29.12 +Transport,21.87 +Food,39.46 +Transport,26.82 +Food,13.74 +Food,13.01 +Transport,32.00 +Leisure,65.03 +Food,52.14 +Housing,2000.29 +Food,9.86 +Food,44.63 +Housing,966.93 +Food,36.52 +Health,81.60 +Food,2.79 +Leisure,29.75 +Food,35.62 +Transport,19.86 +Food,30.61 +Transport,47.46 +Savings,156.33 +Food,38.98 +Health,21.43 +Leisure,97.83 +Food,17.33 +Transport,14.31 +Transport,27.63 +Transport,26.49 +Food,30.14 +Food,25.69 +Transport,32.50 +Leisure,9.94 +Food,33.84 +Leisure,12.83 +Food,71.84 +Food,33.28 +Transport,40.30 +Leisure,62.66 +Transport,25.60 +Transport,39.34 +Food,87.81 +Savings,144.05 +Savings,49.69 +Food,65.66 +Food,76.69 +Transport,23.01 +Health,89.13 +Transport,20.77 +Food,23.61 +Health,74.95 +Health,25.63 +Housing,639.29 +Transport,18.04 +Transport,3.15 +Transport,15.51 +Transport,15.44 +Food,5.17 +Food,8.97 +Transport,5.50 +Food,58.43 +Transport,14.88 +Food,29.28 +Food,33.50 +Transport,18.15 +Savings,244.71 +Health,61.65 +Transport,7.96 +Transport,18.43 +Health,58.28 +Health,30.48 +Transport,4.45 +Health,37.44 +Food,71.07 +Leisure,13.53 +Transport,26.87 +Transport,38.20 +Leisure,53.77 +Savings,239.13 +Transport,7.78 +Food,26.14 +Food,17.72 +Transport,29.43 +Food,17.96 +Food,31.39 +Food,32.88 +Leisure,25.11 +Food,34.29 +Savings,189.57 +Leisure,69.09 +Transport,33.00 +Food,12.04 +Leisure,67.96 +Transport,9.26 +Transport,35.32 +Transport,14.98 +Leisure,28.39 +Transport,29.56 +Housing,216.31 +Food,20.56 +Food,27.80 +Transport,104.98 +Transport,52.00 +Food,54.95 +Transport,18.65 +Transport,14.73 +Housing,416.48 +Leisure,9.32 +Food,61.95 +Transport,38.45 +Transport,17.73 +Food,6.78 +Food,46.27 +Transport,9.76 +Housing,353.08 +Leisure,47.54 +Food,39.58 +Food,16.38 +Food,75.88 +Transport,15.20 +Leisure,47.76 +Food,22.27 +Transport,9.45 +Transport,24.14 +Leisure,12.34 +Transport,50.68 +Food,18.76 +Health,32.98 +Transport,30.78 +Food,29.35 +Food,99.36 +Transport,29.50 +Leisure,84.70 +Transport,10.87 +Housing,745.04 +Food,42.33 +Food,84.51 +Transport,46.84 +Transport,41.12 +Transport,18.79 +Transport,31.34 +Food,46.60 +Food,26.56 +Leisure,74.62 +Food,20.53 +Health,53.70 +Food,36.65 +Housing,836.20 +Food,70.23 +Food,77.25 +Transport,21.32 +Leisure,25.17 +Transport,43.41 +Food,9.68 +Transport,7.03 +Leisure,59.97 +Food,84.60 +Transport,8.23 +Transport,16.32 +Transport,35.56 +Food,18.93 +Transport,32.89 +Food,30.22 +Food,30.59 +Transport,22.26 +Food,37.34 +Food,28.14 +Transport,28.63 +Leisure,33.54 +Transport,32.26 +Transport,1.85 +Food,21.10 +Food,38.05 +Transport,3.63 +Food,24.87 +Leisure,24.91 +Food,73.00 +Transport,39.57 +Leisure,18.62 +Food,59.68 +Food,58.56 +Transport,42.37 +Transport,33.86 +Transport,69.69 +Leisure,30.24 +Food,43.05 +Food,76.85 +Food,19.69 +Savings,110.25 +Transport,40.60 +Transport,10.03 +Transport,9.65 +Food,44.11 +Transport,39.37 +Food,99.74 +Health,74.36 +Leisure,3.51 +Food,45.21 +Food,65.22 +Food,31.58 +Transport,19.03 +Transport,15.45 +Savings,55.71 +Transport,5.99 +Transport,10.63 +Food,23.67 +Transport,4.54 +Food,79.48 +Transport,37.79 +Health,14.85 +Savings,132.45 +Leisure,90.42 +Transport,13.36 +Food,24.09 +Health,40.93 +Food,19.13 +Leisure,39.06 +Food,46.40 +Transport,44.22 +Leisure,84.10 +Leisure,14.58 +Transport,27.99 +Food,18.65 +Health,11.03 +Food,60.84 +Food,17.25 +Transport,30.94 +Transport,12.10 +Food,27.01 +Transport,19.15 +Food,80.86 +Food,28.10 +Transport,13.44 +Food,27.12 +Leisure,29.62 +Food,32.03 +Health,31.98 +Transport,8.94 +Food,67.38 +Leisure,3.92 +Leisure,112.15 +Transport,46.41 +Food,11.87 +Leisure,27.71 +Health,42.24 +Leisure,28.66 +Transport,38.50 +Savings,247.57 +Food,49.51 +Food,47.63 +Transport,11.90 +Leisure,44.14 +Transport,9.33 +Transport,67.31 +Food,26.62 +Transport,15.38 +Transport,8.57 +Transport,25.16 +Food,18.63 +Housing,643.30 +Transport,14.92 +Transport,17.12 +Food,8.69 +Transport,17.20 +Leisure,97.36 +Transport,54.92 +Leisure,24.09 +Food,20.20 +Food,19.65 +Leisure,41.60 +Transport,7.49 +Transport,10.77 +Transport,25.50 +Transport,10.88 +Leisure,55.20 +Health,106.37 +Transport,6.02 +Transport,39.92 +Food,10.45 +Health,43.25 +Food,23.67 +Food,34.68 +Transport,9.79 +Transport,32.71 +Transport,14.19 +Food,39.72 +Transport,24.43 +Transport,17.11 +Transport,14.55 +Transport,15.39 +Transport,22.52 +Health,91.35 +Health,18.61 +Food,58.21 +Food,65.64 +Food,25.65 +Food,39.39 +Transport,32.91 +Food,34.11 +Food,17.31 +Transport,41.51 +Leisure,75.59 +Food,17.01 +Food,22.02 +Health,24.80 +Leisure,12.24 +Housing,346.55 +Leisure,113.48 +Transport,7.67 +Savings,324.48 +Leisure,26.04 +Leisure,29.94 +Leisure,57.11 +Food,42.88 +Food,52.50 +Transport,19.39 +Food,46.14 +Food,18.04 +Leisure,55.66 +Transport,36.51 +Transport,19.52 +Food,68.19 +Food,31.02 +Leisure,25.31 +Transport,51.78 +Health,28.33 +Transport,5.69 +Health,105.46 +Leisure,8.73 +Health,20.79 +Transport,10.37 +Food,19.28 +Food,14.04 +Food,37.84 +Transport,27.77 +Housing,1027.07 +Transport,20.83 +Food,48.07 +Food,91.99 +Leisure,97.29 +Transport,17.75 +Transport,8.73 +Leisure,76.70 +Transport,20.12 +Transport,19.76 +Savings,330.50 +Health,26.42 +Food,113.19 +Transport,33.67 +Food,46.39 +Transport,42.48 +Food,16.57 +Savings,106.86 +Food,12.16 +Health,2.83 +Transport,28.34 +Food,44.17 +Transport,29.82 +Transport,20.86 +Transport,28.62 +Food,28.01 +Food,43.66 +Leisure,50.96 +Food,65.92 +Food,35.84 +Food,25.63 +Food,11.68 +Transport,64.12 +Health,99.12 +Food,32.21 +Food,20.94 +Food,37.07 +Food,23.93 +Leisure,13.99 +Food,29.05 +Leisure,69.57 +Transport,4.00 +Food,59.78 +Leisure,29.57 +Food,13.80 +Food,49.47 +Transport,12.05 +Food,20.73 +Food,33.90 +Transport,9.28 +Food,34.69 +Leisure,6.11 +Savings,433.11 +Transport,37.04 +Leisure,108.76 +Leisure,30.90 +Food,48.12 +Food,30.05 +Food,47.20 +Transport,2.09 +Food,81.69 +Leisure,43.51 +Transport,58.41 +Food,21.48 +Transport,29.50 +Savings,338.28 +Transport,9.33 +Transport,33.73 +Food,28.44 +Leisure,89.53 +Transport,10.22 +Food,36.94 +Food,6.66 +Housing,735.62 +Transport,38.80 +Food,33.38 +Food,11.83 +Food,65.40 +Transport,75.68 +Food,32.92 +Leisure,45.57 +Transport,21.34 +Leisure,58.15 +Transport,2.49 +Food,34.64 +Food,58.62 +Transport,18.63 +Transport,9.07 +Transport,13.32 +Food,80.69 +Health,39.77 +Food,21.67 +Food,106.91 +Leisure,5.35 +Leisure,82.06 +Transport,30.85 +Transport,34.16 +Transport,24.18 +Transport,8.49 +Housing,407.16 +Leisure,45.35 +Transport,54.09 +Leisure,20.21 +Food,28.83 +Transport,28.58 +Transport,6.05 +Transport,23.82 +Transport,14.24 +Leisure,61.79 +Leisure,32.71 +Health,84.53 +Food,39.76 +Housing,101.73 +Transport,14.66 +Food,19.63 +Health,115.32 +Transport,15.39 +Transport,30.67 +Food,22.56 +Leisure,13.14 +Transport,39.53 +Housing,1978.89 +Housing,3161.63 +Transport,33.22 +Transport,28.96 +Health,82.83 +Leisure,30.61 +Leisure,27.78 +Leisure,146.28 +Transport,6.08 +Food,32.80 +Leisure,76.13 +Savings,465.96 +Food,31.35 +Food,25.03 +Transport,8.74 +Housing,207.72 +Transport,30.46 +Transport,24.51 +Leisure,44.61 +Health,79.23 +Food,18.82 +Health,61.15 +Health,91.39 +Food,48.80 +Savings,265.56 +Food,77.85 +Transport,23.20 +Food,62.38 +Transport,27.44 +Leisure,42.46 +Food,80.39 +Food,50.97 +Food,3.29 +Transport,4.56 +Food,40.82 +Health,195.22 +Transport,41.46 +Leisure,24.77 +Leisure,24.70 +Transport,9.03 +Health,33.26 +Food,36.55 +Health,127.52 +Leisure,37.63 +Transport,4.80 +Food,76.01 +Transport,45.92 +Transport,34.49 +Food,32.29 +Food,41.31 +Transport,50.31 +Health,82.31 +Food,57.15 +Transport,22.37 +Transport,23.60 +Food,44.61 +Transport,18.56 +Food,123.95 +Health,83.31 +Transport,52.34 +Transport,18.40 +Food,57.61 +Leisure,36.48 +Leisure,79.26 +Food,60.43 +Health,64.01 +Food,5.38 +Housing,1187.74 +Transport,21.44 +Leisure,85.03 +Transport,46.19 +Food,21.74 +Food,15.48 +Savings,354.34 +Food,4.30 +Food,51.30 +Food,39.49 +Food,25.01 +Transport,45.79 +Leisure,58.02 +Leisure,4.71 +Transport,20.52 +Health,37.98 +Transport,19.22 +Leisure,95.75 +Transport,15.47 +Leisure,76.49 +Leisure,115.72 +Transport,10.09 +Food,104.21 +Transport,23.72 +Food,36.34 +Transport,22.05 +Transport,26.32 +Health,45.42 +Transport,28.57 +Food,23.33 +Transport,21.51 +Food,23.67 +Transport,61.89 +Food,26.00 +Leisure,63.70 +Transport,28.16 +Food,32.20 +Health,52.94 +Health,51.83 +Leisure,16.62 +Transport,22.06 +Food,86.25 +Leisure,65.42 +Transport,32.82 +Transport,11.03 +Food,6.12 +Transport,21.40 +Transport,36.88 +Health,89.53 +Food,19.84 +Leisure,187.74 +Transport,30.44 +Health,67.57 +Transport,24.59 +Transport,28.88 +Food,20.82 +Leisure,91.22 +Leisure,61.24 +Leisure,105.41 +Leisure,44.17 +Transport,16.42 +Leisure,40.67 +Food,35.10 +Transport,15.53 +Food,11.12 +Savings,519.62 +Food,9.68 +Leisure,51.05 +Food,18.98 +Transport,29.24 +Transport,25.02 +Food,20.93 +Savings,248.18 +Transport,19.61 +Leisure,30.14 +Transport,21.96 +Food,45.76 +Food,86.18 +Food,79.05 +Food,13.37 +Food,18.22 +Leisure,71.81 +Health,44.13 +Transport,37.21 +Food,13.00 +Leisure,33.22 +Transport,51.06 +Transport,13.44 +Food,24.20 +Housing,2233.32 +Leisure,41.37 +Food,67.60 +Transport,66.64 +Food,32.36 +Food,44.75 +Transport,10.52 +Transport,5.75 +Food,115.48 +Food,12.36 +Transport,69.12 +Food,14.34 +Housing,210.95 +Transport,2.91 +Transport,8.18 +Food,38.96 +Transport,30.03 +Food,87.45 +Food,50.41 +Transport,13.42 +Leisure,24.71 +Transport,46.98 +Transport,30.30 +Health,64.71 +Food,35.63 +Savings,412.31 +Food,19.52 +Health,43.38 +Food,25.46 +Transport,29.38 +Food,13.25 +Leisure,14.24 +Transport,14.54 +Health,96.14 +Food,51.71 +Transport,34.24 +Food,20.03 +Transport,56.34 +Leisure,20.91 +Food,6.15 +Health,57.12 +Health,91.67 +Transport,65.21 +Food,39.32 +Food,50.41 +Transport,7.13 +Transport,32.06 +Health,25.01 +Health,10.17 +Transport,6.00 +Leisure,64.93 +Transport,55.63 +Food,5.48 +Food,36.32 +Health,37.01 +Food,46.56 +Food,101.16 +Leisure,56.61 +Transport,8.15 +Food,18.10 +Health,102.24 +Transport,37.31 +Transport,36.13 +Transport,27.34 +Leisure,55.34 +Leisure,69.72 +Food,44.04 +Leisure,36.03 +Leisure,45.20 +Food,17.39 +Leisure,73.23 +Transport,12.25 +Food,16.69 +Transport,12.22 +Health,28.62 +Transport,29.51 +Transport,54.89 +Leisure,54.52 +Food,15.17 +Transport,14.82 +Food,3.78 +Transport,10.13 +Leisure,44.32 +Food,60.71 +Food,28.56 +Transport,8.58 +Savings,202.88 +Transport,24.40 +Food,17.15 +Transport,9.62 +Savings,523.34 +Transport,24.49 +Transport,40.03 +Leisure,24.05 +Food,36.89 +Transport,13.95 +Transport,8.26 +Food,28.60 +Food,60.30 +Transport,49.68 +Food,84.23 +Leisure,51.01 +Food,30.02 +Health,133.28 +Food,58.05 +Transport,19.81 +Transport,12.54 +Transport,8.75 +Transport,56.80 +Food,77.94 +Transport,10.65 +Transport,16.60 +Transport,42.96 +Transport,13.65 +Transport,29.21 +Transport,13.82 +Food,42.83 +Food,32.32 +Health,28.76 +Food,25.86 +Transport,23.82 +Housing,361.70 +Food,10.39 +Transport,44.37 +Food,29.89 +Leisure,24.58 +Leisure,73.59 +Transport,20.38 +Transport,37.73 +Food,52.57 +Food,29.10 +Leisure,2.50 +Food,12.31 +Food,21.51 +Housing,380.31 +Transport,19.34 +Food,18.51 +Health,13.59 +Health,190.58 +Food,58.38 +Health,38.37 +Transport,23.68 +Food,10.59 +Transport,4.60 +Transport,7.12 +Food,42.66 +Leisure,48.13 +Leisure,98.06 +Food,26.59 +Health,150.36 +Food,32.06 +Transport,20.78 +Transport,54.34 +Leisure,20.96 +Transport,11.18 +Food,22.86 +Food,83.97 +Food,7.69 +Food,36.21 +Transport,17.07 +Leisure,13.79 +Food,45.17 +Food,15.42 +Health,72.44 +Transport,47.19 +Transport,35.94 +Transport,10.99 +Transport,8.21 +Transport,28.57 +Health,62.74 +Health,35.22 +Transport,17.60 +Transport,17.76 +Food,54.12 +Transport,31.72 +Food,8.36 +Food,19.50 +Leisure,19.62 +Savings,253.81 +Leisure,131.15 +Food,21.60 +Transport,14.89 +Food,47.81 +Food,61.42 +Transport,18.01 +Food,52.62 +Transport,8.78 +Food,73.99 +Health,72.02 +Transport,43.51 +Food,32.28 +Transport,31.75 +Leisure,9.90 +Health,28.09 +Food,14.37 +Housing,1153.68 +Leisure,26.46 +Transport,11.70 +Food,41.17 +Transport,41.36 +Leisure,47.12 +Health,52.57 +Food,60.89 +Transport,9.85 +Food,29.91 +Health,87.74 +Transport,24.20 +Leisure,24.22 +Food,28.46 +Food,36.03 +Leisure,40.42 +Food,17.80 +Health,109.49 +Leisure,47.10 +Leisure,34.81 +Health,121.29 +Health,52.15 +Leisure,43.67 +Food,45.77 +Leisure,59.75 +Food,16.92 +Food,28.90 +Food,34.33 +Transport,42.68 +Food,16.92 +Leisure,56.62 +Food,47.10 +Leisure,33.09 +Health,5.70 +Leisure,49.76 +Food,30.54 +Savings,422.99 +Food,48.89 +Food,103.93 +Health,71.31 +Transport,21.79 +Food,41.26 +Food,83.57 +Food,23.82 +Savings,109.84 +Food,50.72 +Food,82.92 +Transport,38.18 +Food,37.10 +Leisure,100.27 +Savings,92.08 +Food,25.97 +Food,20.22 +Leisure,127.62 +Savings,57.32 +Transport,18.38 +Transport,5.91 +Transport,5.15 +Food,15.09 +Leisure,15.15 +Food,2.17 +Transport,5.82 +Transport,37.02 +Food,28.53 +Transport,41.33 +Housing,1123.34 +Transport,14.52 +Health,61.21 +Transport,11.48 +Housing,650.70 +Transport,24.99 +Transport,11.38 +Food,58.42 +Transport,52.95 +Transport,43.56 +Food,34.25 +Food,11.44 +Transport,2.78 +Food,28.89 +Housing,71.44 +Transport,11.57 +Transport,22.13 +Food,47.24 +Leisure,119.44 +Transport,5.93 +Transport,21.92 +Health,90.15 +Food,51.76 +Food,42.41 +Leisure,106.42 +Transport,24.74 +Health,63.67 +Food,45.55 +Leisure,4.55 +Food,45.05 +Food,12.09 +Leisure,20.99 +Transport,18.30 +Transport,4.06 +Savings,151.05 +Transport,28.99 +Transport,8.90 +Savings,205.64 +Transport,8.80 +Transport,23.59 +Leisure,46.08 +Food,69.75 +Transport,4.56 +Leisure,30.02 +Housing,800.11 +Food,31.15 +Food,12.08 +Food,36.24 +Food,11.72 +Food,114.49 +Food,43.45 +Leisure,37.67 +Transport,5.93 +Leisure,33.44 +Food,28.01 +Leisure,25.09 +Food,53.09 +Food,83.84 +Food,15.42 +Transport,3.38 +Health,90.88 +Transport,2.11 +Food,36.12 +Food,64.12 +Savings,206.98 +Transport,8.60 +Transport,45.53 +Housing,1295.05 +Food,14.25 +Food,4.39 +Transport,23.95 +Transport,20.28 +Transport,35.29 +Savings,198.44 +Food,51.64 +Food,39.59 +Leisure,46.41 +Food,78.96 +Transport,53.33 +Transport,13.39 +Transport,47.24 +Food,60.81 +Transport,36.81 +Food,14.60 +Transport,27.61 +Food,11.43 +Food,27.07 +Health,34.02 +Transport,10.14 +Food,1.37 +Food,17.00 +Food,87.72 +Leisure,23.98 +Food,20.75 +Transport,18.83 +Transport,7.39 +Leisure,83.02 +Food,11.33 +Transport,9.77 +Transport,16.66 +Transport,13.39 +Leisure,6.66 +Leisure,52.68 +Transport,87.30 +Food,36.02 +Transport,4.52 +Food,27.72 +Food,53.81 +Transport,4.76 +Food,68.44 +Food,88.49 +Food,41.52 +Transport,16.40 +Transport,15.00 +Food,34.97 +Food,17.80 +Leisure,76.40 +Transport,6.30 +Transport,25.48 +Food,44.49 +Transport,32.69 +Leisure,32.59 +Transport,43.82 +Transport,28.09 +Transport,11.27 +Food,18.37 +Food,34.80 +Housing,1237.70 +Transport,19.03 +Food,6.49 +Transport,39.77 +Leisure,9.88 +Food,80.46 +Food,43.16 +Food,17.23 +Transport,14.46 +Transport,59.47 +Food,25.62 +Food,9.80 +Health,59.78 +Leisure,44.99 +Transport,7.67 +Savings,593.53 +Transport,22.96 +Leisure,34.08 +Food,30.02 +Transport,9.87 +Food,91.36 +Leisure,11.00 +Food,35.64 +Transport,2.66 +Transport,48.33 +Food,26.25 +Leisure,35.95 +Transport,28.00 +Transport,18.98 +Transport,43.07 +Food,38.45 +Food,106.55 +Transport,11.28 +Transport,48.97 +Transport,3.20 +Savings,176.18 +Savings,124.91 +Housing,161.10 +Food,43.83 +Leisure,29.53 +Food,10.16 +Food,28.52 +Transport,10.71 +Transport,29.38 +Food,25.24 +Transport,26.63 +Leisure,45.89 +Savings,497.30 +Food,42.30 +Transport,6.58 +Food,59.94 +Transport,20.92 +Housing,175.47 +Health,86.17 +Health,48.44 +Leisure,20.78 +Food,24.91 +Health,47.36 +Housing,656.55 +Transport,11.43 +Food,2.83 +Housing,810.76 +Housing,816.22 +Transport,25.14 +Food,32.45 +Leisure,38.09 +Food,14.09 +Food,36.68 +Transport,57.64 +Leisure,26.90 +Food,40.88 +Food,27.98 +Transport,11.30 +Housing,614.17 +Transport,1.00 +Food,18.39 +Food,21.35 +Health,110.20 +Food,56.89 +Food,12.97 +Leisure,57.08 +Transport,9.16 +Food,139.83 +Housing,2252.62 +Food,24.62 +Food,61.95 +Transport,19.75 +Food,7.91 +Savings,558.30 +Transport,10.39 +Savings,405.79 +Transport,15.39 +Transport,30.57 +Food,53.23 +Transport,26.24 +Food,63.96 +Leisure,131.71 +Food,32.56 +Food,17.47 +Transport,14.78 +Leisure,11.58 +Leisure,16.71 +Food,2.78 +Food,11.21 +Food,27.21 +Health,64.00 +Food,10.28 +Housing,309.23 +Health,19.30 +Transport,2.96 +Transport,28.93 +Food,7.29 +Transport,60.20 +Transport,17.88 +Food,23.17 +Transport,13.02 +Food,19.43 +Leisure,44.44 +Food,45.34 +Food,33.08 +Transport,4.71 +Transport,72.17 +Transport,13.33 +Transport,12.33 +Food,12.28 +Food,31.95 +Food,63.24 +Leisure,14.03 +Food,28.25 +Leisure,62.14 +Health,20.06 +Transport,9.27 +Savings,22.38 +Food,6.76 +Transport,63.83 +Food,29.65 +Transport,24.00 +Food,52.74 +Health,107.15 +Leisure,112.75 +Leisure,34.62 +Food,20.69 +Transport,38.94 +Food,10.16 +Transport,21.87 +Food,28.19 +Food,49.99 +Food,52.93 +Transport,29.55 +Leisure,50.01 +Leisure,28.29 +Food,25.87 +Health,66.80 +Leisure,93.58 +Leisure,15.75 +Food,42.60 +Food,7.87 +Transport,7.98 +Food,82.61 +Food,53.32 +Transport,12.17 +Food,48.26 +Transport,9.15 +Housing,1978.26 +Housing,396.07 +Leisure,17.17 +Food,33.44 +Health,20.95 +Leisure,47.32 +Transport,16.75 +Health,58.19 +Food,152.76 +Leisure,32.81 +Food,75.74 +Food,95.33 +Savings,115.75 +Housing,738.72 +Transport,9.92 +Health,64.72 +Transport,11.51 +Health,44.20 +Food,83.47 +Leisure,13.94 +Food,31.61 +Food,40.75 +Food,17.97 +Savings,433.61 +Food,11.01 +Food,28.23 +Food,21.08 +Leisure,9.65 +Transport,39.30 +Food,68.71 +Health,29.00 +Transport,22.07 +Leisure,48.11 +Leisure,24.47 +Food,8.09 +Transport,2.41 +Leisure,28.59 +Transport,6.56 +Leisure,22.25 +Food,3.84 +Transport,6.45 +Transport,45.22 +Transport,10.41 +Food,10.47 +Transport,7.88 +Food,21.19 +Transport,35.43 +Food,20.46 +Transport,6.53 +Transport,23.66 +Food,20.65 +Food,22.17 +Food,37.97 +Transport,15.68 +Food,32.58 +Savings,190.15 +Leisure,114.96 +Transport,14.60 +Transport,49.98 +Transport,26.92 +Transport,31.75 +Food,27.80 +Food,24.16 +Transport,18.10 +Leisure,20.70 +Leisure,55.90 +Transport,15.59 +Food,109.48 +Savings,585.53 +Leisure,65.99 +Leisure,3.57 +Leisure,25.28 +Leisure,27.28 +Transport,17.26 +Savings,332.57 +Leisure,45.31 +Food,64.97 +Food,37.12 +Transport,47.34 +Food,23.84 +Health,55.89 +Food,22.56 +Leisure,12.90 +Food,78.80 +Food,10.67 +Leisure,8.13 +Food,22.10 +Transport,30.18 +Transport,36.58 +Health,30.72 +Transport,3.70 +Food,54.86 +Health,44.09 +Health,52.25 +Savings,117.68 +Food,58.30 +Transport,6.92 +Transport,20.21 +Food,24.84 +Leisure,53.39 +Food,18.90 +Leisure,56.68 +Transport,43.92 +Food,52.08 +Leisure,11.36 +Health,55.20 +Transport,16.86 +Food,14.76 +Food,35.95 +Transport,18.19 +Transport,21.14 +Food,60.79 +Food,40.74 +Transport,32.58 +Food,23.46 +Transport,15.99 +Food,43.75 +Food,26.38 +Food,90.58 +Food,12.50 +Transport,5.03 +Food,52.70 +Leisure,103.94 +Food,32.48 +Transport,27.74 +Food,15.38 +Transport,21.63 +Leisure,70.17 +Health,17.17 +Transport,18.61 +Leisure,115.13 +Food,46.31 +Housing,606.74 +Transport,21.64 +Food,31.32 +Food,22.18 +Savings,131.25 +Food,149.25 +Transport,60.00 +Leisure,32.29 +Leisure,59.20 +Food,25.91 +Transport,13.35 +Food,95.23 +Transport,9.21 +Food,26.61 +Leisure,27.49 +Leisure,49.99 +Transport,17.06 +Leisure,78.39 +Leisure,9.70 +Transport,20.72 +Transport,3.31 +Leisure,25.38 +Food,47.97 +Transport,6.47 +Health,92.11 +Leisure,21.02 +Health,7.98 +Transport,17.08 +Food,26.49 +Transport,10.67 +Transport,33.41 +Savings,66.14 +Housing,505.36 +Transport,5.31 +Food,13.40 +Transport,5.36 +Food,24.20 +Transport,39.37 +Food,101.65 +Leisure,13.48 +Food,108.85 +Housing,101.13 +Savings,86.66 +Transport,21.59 +Transport,14.89 +Transport,5.78 +Health,107.95 +Transport,74.63 +Leisure,14.21 +Health,35.50 +Transport,101.47 +Transport,40.38 +Savings,344.68 +Food,8.15 +Transport,15.80 +Food,88.24 +Food,14.76 +Health,18.29 +Transport,43.81 +Food,33.16 +Transport,26.66 +Housing,630.18 +Transport,11.79 +Health,63.64 +Food,43.91 +Health,79.82 +Transport,52.26 +Housing,474.66 +Food,24.63 +Food,8.82 +Food,81.74 +Food,72.09 +Transport,53.10 +Leisure,44.14 +Food,37.09 +Food,23.66 +Health,71.73 +Health,88.03 +Health,38.07 +Transport,35.67 +Food,34.28 +Food,37.89 +Food,11.76 +Transport,11.54 +Leisure,28.04 +Food,8.45 +Food,63.45 +Food,17.66 +Leisure,74.25 diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-renamed/case.json b/agents/evals/fixtures/cases/pie-basic-pygal-renamed/case.json new file mode 100644 index 00000000000..49d40a02281 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-renamed/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "pie-basic", + "library": "pygal", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "category", + "column": "Ausgabenposten" + }, + { + "role": "value", + "column": "Betrag CHF" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "renamed", + "synthetic", + "renamed-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, renamed)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-renamed/data.csv b/agents/evals/fixtures/cases/pie-basic-pygal-renamed/data.csv new file mode 100644 index 00000000000..e8f468eb775 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-renamed/data.csv @@ -0,0 +1,7 @@ +Ausgabenposten,Betrag CHF +Housing,1913.25 +Food,692.31 +Transport,402.45 +Leisure,337.19 +Health,244.50 +Savings,648.13 diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-x10/case.json b/agents/evals/fixtures/cases/pie-basic-pygal-x10/case.json new file mode 100644 index 00000000000..8609d2dfad0 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "pie-basic", + "library": "pygal", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "category", + "column": "Expense Category" + }, + { + "role": "value", + "column": "Amount (CHF)" + } + ], + "expected": "accepted", + "tags": [ + "pie", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 909, x10)" +} diff --git a/agents/evals/fixtures/cases/pie-basic-pygal-x10/data.csv b/agents/evals/fixtures/cases/pie-basic-pygal-x10/data.csv new file mode 100644 index 00000000000..5d1b1cfa042 --- /dev/null +++ b/agents/evals/fixtures/cases/pie-basic-pygal-x10/data.csv @@ -0,0 +1,7 @@ +Expense Category,Amount (CHF) +Housing,19132.53 +Food,6923.09 +Transport,4024.49 +Leisure,3371.93 +Health,2445.05 +Savings,6481.28 diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-date/case.json b/agents/evals/fixtures/cases/scatter-basic-letsplot-date/case.json new file mode 100644 index 00000000000..93d098ecb19 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "scatter-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "x", + "column": "Ad Spend (kCHF)" + }, + { + "role": "y", + "column": "Revenue (kCHF)" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, date)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-date/data.csv b/agents/evals/fixtures/cases/scatter-basic-letsplot-date/data.csv new file mode 100644 index 00000000000..734bcb23431 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-date/data.csv @@ -0,0 +1,151 @@ +Store,Ad Spend (kCHF),Revenue (kCHF),Campaign Start,Reported On +S0001,113.5,277.1,01.07.2026,2026-07-01 +S0002,46.3,100.9,10.05.2026,2026-05-12 +S0003,95.3,228.4,05.06.2026,2026-06-08 +S0004,73.0,210.7,19.05.2026,2026-05-19 +S0005,38.8,9.2,08.02.2026,2026-02-09 +S0006,111.1,211.6,07.04.2026,2026-04-11 +S0007,105.0,169.0,19.05.2026,2026-05-21 +S0008,46.9,5.0,01.05.2026,2026-05-04 +S0009,116.9,354.9,09.05.2026,2026-05-11 +S0010,30.8,206.6,25.01.2026,2026-01-25 +S0011,97.6,329.5,18.02.2026,2026-02-20 +S0012,83.3,88.6,15.01.2026,2026-01-19 +S0013,59.2,192.4,28.02.2026,2026-02-28 +S0014,8.5,106.1,13.06.2026,2026-06-13 +S0015,107.9,225.7,01.06.2026,2026-06-02 +S0016,71.0,246.9,30.05.2026,2026-05-30 +S0017,49.9,65.0,26.01.2026,2026-01-26 +S0018,45.8,59.4,20.01.2026,2026-01-24 +S0019,80.0,148.3,29.03.2026,2026-04-01 +S0020,44.9,82.6,09.04.2026,2026-04-11 +S0021,63.4,101.0,28.02.2026,2026-03-01 +S0022,47.7,208.1,30.01.2026,2026-02-03 +S0023,11.3,5.0,03.05.2026,2026-05-05 +S0024,33.8,77.6,11.03.2026,2026-03-13 +S0025,101.7,207.9,31.05.2026,2026-06-03 +S0026,99.1,404.2,19.05.2026,2026-05-20 +S0027,81.7,147.5,12.04.2026,2026-04-13 +S0028,59.1,197.3,09.02.2026,2026-02-10 +S0029,116.5,413.5,31.01.2026,2026-01-31 +S0030,101.6,169.0,08.01.2026,2026-01-11 +S0031,33.2,50.3,23.04.2026,2026-04-24 +S0032,70.3,163.8,24.06.2026,2026-06-25 +S0033,114.9,187.1,13.04.2026,2026-04-16 +S0034,95.3,326.8,20.05.2026,2026-05-23 +S0035,47.5,105.7,21.03.2026,2026-03-21 +S0036,59.0,238.2,01.04.2026,2026-04-04 +S0037,64.6,213.0,27.02.2026,2026-03-01 +S0038,108.7,269.5,24.05.2026,2026-05-28 +S0039,87.1,290.5,16.01.2026,2026-01-17 +S0040,50.8,125.0,20.02.2026,2026-02-24 +S0041,58.1,236.4,12.02.2026,2026-02-12 +S0042,15.6,5.0,21.02.2026,2026-02-22 +S0043,61.6,116.5,06.02.2026,2026-02-06 +S0044,31.3,190.8,13.03.2026,2026-03-13 +S0045,15.7,5.0,28.04.2026,2026-05-01 +S0046,15.5,105.9,24.04.2026,2026-04-26 +S0047,29.8,73.5,08.04.2026,2026-04-09 +S0048,85.4,180.7,18.06.2026,2026-06-20 +S0049,25.6,44.4,14.03.2026,2026-03-18 +S0050,70.4,278.1,06.02.2026,2026-02-08 +S0051,74.3,88.4,14.03.2026,2026-03-16 +S0052,116.1,342.3,11.04.2026,2026-04-14 +S0053,57.7,194.6,25.02.2026,2026-02-28 +S0054,94.1,207.5,16.03.2026,2026-03-16 +S0055,9.0,52.7,27.03.2026,2026-03-30 +S0056,79.1,255.7,17.04.2026,2026-04-17 +S0057,117.7,245.4,14.06.2026,2026-06-14 +S0058,10.4,5.0,22.02.2026,2026-02-26 +S0059,109.4,289.4,16.05.2026,2026-05-19 +S0060,22.9,28.9,29.01.2026,2026-02-02 +S0061,82.7,184.7,16.04.2026,2026-04-20 +S0062,7.9,60.3,11.02.2026,2026-02-15 +S0063,12.1,117.0,30.06.2026,2026-07-04 +S0064,20.5,210.2,07.03.2026,2026-03-10 +S0065,108.7,292.1,21.04.2026,2026-04-23 +S0066,95.0,247.6,12.06.2026,2026-06-16 +S0067,81.1,267.7,14.03.2026,2026-03-18 +S0068,79.7,227.3,09.04.2026,2026-04-09 +S0069,38.8,5.0,12.05.2026,2026-05-13 +S0070,65.7,135.8,04.06.2026,2026-06-04 +S0071,60.4,80.1,02.07.2026,2026-07-04 +S0072,114.4,329.0,09.02.2026,2026-02-11 +S0073,57.2,249.3,09.03.2026,2026-03-13 +S0074,90.9,255.8,17.02.2026,2026-02-18 +S0075,46.2,64.9,05.02.2026,2026-02-09 +S0076,111.4,330.1,20.04.2026,2026-04-20 +S0077,103.0,188.9,02.06.2026,2026-06-06 +S0078,119.1,307.8,27.01.2026,2026-01-28 +S0079,31.1,21.3,03.05.2026,2026-05-07 +S0080,105.1,163.6,25.05.2026,2026-05-26 +S0081,59.9,67.4,03.03.2026,2026-03-07 +S0082,63.6,174.7,18.05.2026,2026-05-20 +S0083,67.3,135.0,23.03.2026,2026-03-24 +S0084,15.6,103.2,26.04.2026,2026-04-29 +S0085,106.3,172.3,08.05.2026,2026-05-08 +S0086,74.5,230.8,09.02.2026,2026-02-11 +S0087,17.1,32.6,23.01.2026,2026-01-24 +S0088,90.0,316.7,18.03.2026,2026-03-18 +S0089,18.0,149.3,28.06.2026,2026-06-29 +S0090,48.8,127.4,28.01.2026,2026-01-31 +S0091,82.0,219.8,02.02.2026,2026-02-02 +S0092,58.5,179.9,21.02.2026,2026-02-21 +S0093,12.5,98.7,22.06.2026,2026-06-22 +S0094,76.6,181.6,25.04.2026,2026-04-29 +S0095,47.2,215.8,01.02.2026,2026-02-01 +S0096,48.9,107.0,17.02.2026,2026-02-19 +S0097,23.7,5.0,11.05.2026,2026-05-13 +S0098,26.1,112.2,19.01.2026,2026-01-19 +S0099,119.2,282.7,15.04.2026,2026-04-18 +S0100,74.5,254.7,17.06.2026,2026-06-19 +S0101,72.6,234.1,17.06.2026,2026-06-19 +S0102,94.8,248.2,24.05.2026,2026-05-24 +S0103,49.1,150.6,08.01.2026,2026-01-11 +S0104,22.7,96.6,27.05.2026,2026-05-28 +S0105,74.8,151.0,01.05.2026,2026-05-04 +S0106,51.6,63.0,09.06.2026,2026-06-10 +S0107,51.4,90.5,30.01.2026,2026-01-30 +S0108,15.1,65.3,08.03.2026,2026-03-10 +S0109,53.4,5.0,30.04.2026,2026-05-02 +S0110,11.0,32.5,22.04.2026,2026-04-22 +S0111,108.7,199.6,27.04.2026,2026-04-28 +S0112,48.1,134.9,03.07.2026,2026-07-04 +S0113,87.3,166.3,02.06.2026,2026-06-06 +S0114,72.7,196.9,26.06.2026,2026-06-28 +S0115,55.6,140.8,08.04.2026,2026-04-12 +S0116,43.9,223.0,10.04.2026,2026-04-11 +S0117,8.7,34.2,05.04.2026,2026-04-06 +S0118,80.3,191.5,27.04.2026,2026-04-27 +S0119,16.4,76.3,27.01.2026,2026-01-30 +S0120,32.0,5.0,12.01.2026,2026-01-13 +S0121,115.3,207.0,26.02.2026,2026-02-28 +S0122,48.2,241.8,12.01.2026,2026-01-15 +S0123,46.7,174.2,11.02.2026,2026-02-12 +S0124,84.3,223.0,01.02.2026,2026-02-03 +S0125,36.0,191.4,07.04.2026,2026-04-09 +S0126,47.3,126.8,26.01.2026,2026-01-30 +S0127,40.4,107.3,14.05.2026,2026-05-18 +S0128,85.0,197.2,16.02.2026,2026-02-18 +S0129,13.9,5.0,02.07.2026,2026-07-04 +S0130,48.8,208.2,20.01.2026,2026-01-23 +S0131,119.7,278.1,19.06.2026,2026-06-23 +S0132,78.7,198.7,02.06.2026,2026-06-02 +S0133,59.6,141.9,24.03.2026,2026-03-27 +S0134,38.3,75.9,07.04.2026,2026-04-10 +S0135,7.6,5.0,07.01.2026,2026-01-09 +S0136,109.6,280.7,06.06.2026,2026-06-09 +S0137,110.9,425.5,01.07.2026,2026-07-05 +S0138,117.5,356.0,02.05.2026,2026-05-05 +S0139,60.1,146.1,11.06.2026,2026-06-15 +S0140,73.2,129.1,11.06.2026,2026-06-11 +S0141,38.2,122.1,16.01.2026,2026-01-20 +S0142,100.3,276.5,15.03.2026,2026-03-15 +S0143,72.0,182.8,24.05.2026,2026-05-28 +S0144,39.1,180.5,22.06.2026,2026-06-26 +S0145,38.9,55.0,10.05.2026,2026-05-11 +S0146,46.0,211.3,22.05.2026,2026-05-24 +S0147,82.1,223.3,26.03.2026,2026-03-30 +S0148,93.5,197.9,22.01.2026,2026-01-26 +S0149,16.9,55.7,19.03.2026,2026-03-19 +S0150,111.8,299.1,21.01.2026,2026-01-21 diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-decimal-comma/case.json b/agents/evals/fixtures/cases/scatter-basic-letsplot-decimal-comma/case.json new file mode 100644 index 00000000000..96e09bcfd4d --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "scatter-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "x", + "column": "Ad Spend (kCHF)" + }, + { + "role": "y", + "column": "Revenue (kCHF)" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-decimal-comma/data.csv b/agents/evals/fixtures/cases/scatter-basic-letsplot-decimal-comma/data.csv new file mode 100644 index 00000000000..af311d49fbc --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-decimal-comma/data.csv @@ -0,0 +1,151 @@ +Store;Ad Spend (kCHF);Revenue (kCHF) +S0001;113,5;277,1 +S0002;46,3;100,9 +S0003;95,3;228,4 +S0004;73,0;210,7 +S0005;38,8;9,2 +S0006;111,1;211,6 +S0007;105,0;169,0 +S0008;46,9;5,0 +S0009;116,9;354,9 +S0010;30,8;206,6 +S0011;97,6;329,5 +S0012;83,3;88,6 +S0013;59,2;192,4 +S0014;8,5;106,1 +S0015;107,9;225,7 +S0016;71,0;246,9 +S0017;49,9;65,0 +S0018;45,8;59,4 +S0019;80,0;148,3 +S0020;44,9;82,6 +S0021;63,4;101,0 +S0022;47,7;208,1 +S0023;11,3;5,0 +S0024;33,8;77,6 +S0025;101,7;207,9 +S0026;99,1;404,2 +S0027;81,7;147,5 +S0028;59,1;197,3 +S0029;116,5;413,5 +S0030;101,6;169,0 +S0031;33,2;50,3 +S0032;70,3;163,8 +S0033;114,9;187,1 +S0034;95,3;326,8 +S0035;47,5;105,7 +S0036;59,0;238,2 +S0037;64,6;213,0 +S0038;108,7;269,5 +S0039;87,1;290,5 +S0040;50,8;125,0 +S0041;58,1;236,4 +S0042;15,6;5,0 +S0043;61,6;116,5 +S0044;31,3;190,8 +S0045;15,7;5,0 +S0046;15,5;105,9 +S0047;29,8;73,5 +S0048;85,4;180,7 +S0049;25,6;44,4 +S0050;70,4;278,1 +S0051;74,3;88,4 +S0052;116,1;342,3 +S0053;57,7;194,6 +S0054;94,1;207,5 +S0055;9,0;52,7 +S0056;79,1;255,7 +S0057;117,7;245,4 +S0058;10,4;5,0 +S0059;109,4;289,4 +S0060;22,9;28,9 +S0061;82,7;184,7 +S0062;7,9;60,3 +S0063;12,1;117,0 +S0064;20,5;210,2 +S0065;108,7;292,1 +S0066;95,0;247,6 +S0067;81,1;267,7 +S0068;79,7;227,3 +S0069;38,8;5,0 +S0070;65,7;135,8 +S0071;60,4;80,1 +S0072;114,4;329,0 +S0073;57,2;249,3 +S0074;90,9;255,8 +S0075;46,2;64,9 +S0076;111,4;330,1 +S0077;103,0;188,9 +S0078;119,1;307,8 +S0079;31,1;21,3 +S0080;105,1;163,6 +S0081;59,9;67,4 +S0082;63,6;174,7 +S0083;67,3;135,0 +S0084;15,6;103,2 +S0085;106,3;172,3 +S0086;74,5;230,8 +S0087;17,1;32,6 +S0088;90,0;316,7 +S0089;18,0;149,3 +S0090;48,8;127,4 +S0091;82,0;219,8 +S0092;58,5;179,9 +S0093;12,5;98,7 +S0094;76,6;181,6 +S0095;47,2;215,8 +S0096;48,9;107,0 +S0097;23,7;5,0 +S0098;26,1;112,2 +S0099;119,2;282,7 +S0100;74,5;254,7 +S0101;72,6;234,1 +S0102;94,8;248,2 +S0103;49,1;150,6 +S0104;22,7;96,6 +S0105;74,8;151,0 +S0106;51,6;63,0 +S0107;51,4;90,5 +S0108;15,1;65,3 +S0109;53,4;5,0 +S0110;11,0;32,5 +S0111;108,7;199,6 +S0112;48,1;134,9 +S0113;87,3;166,3 +S0114;72,7;196,9 +S0115;55,6;140,8 +S0116;43,9;223,0 +S0117;8,7;34,2 +S0118;80,3;191,5 +S0119;16,4;76,3 +S0120;32,0;5,0 +S0121;115,3;207,0 +S0122;48,2;241,8 +S0123;46,7;174,2 +S0124;84,3;223,0 +S0125;36,0;191,4 +S0126;47,3;126,8 +S0127;40,4;107,3 +S0128;85,0;197,2 +S0129;13,9;5,0 +S0130;48,8;208,2 +S0131;119,7;278,1 +S0132;78,7;198,7 +S0133;59,6;141,9 +S0134;38,3;75,9 +S0135;7,6;5,0 +S0136;109,6;280,7 +S0137;110,9;425,5 +S0138;117,5;356,0 +S0139;60,1;146,1 +S0140;73,2;129,1 +S0141;38,2;122,1 +S0142;100,3;276,5 +S0143;72,0;182,8 +S0144;39,1;180,5 +S0145;38,9;55,0 +S0146;46,0;211,3 +S0147;82,1;223,3 +S0148;93,5;197,9 +S0149;16,9;55,7 +S0150;111,8;299,1 diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-n12/case.json b/agents/evals/fixtures/cases/scatter-basic-letsplot-n12/case.json new file mode 100644 index 00000000000..5ce5f819a8a --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "scatter-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "x", + "column": "Ad Spend (kCHF)" + }, + { + "role": "y", + "column": "Revenue (kCHF)" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, n12)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-n12/data.csv b/agents/evals/fixtures/cases/scatter-basic-letsplot-n12/data.csv new file mode 100644 index 00000000000..5c1c20f3ee8 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-n12/data.csv @@ -0,0 +1,13 @@ +Store,Ad Spend (kCHF),Revenue (kCHF) +S0001,101.7,199.9 +S0002,7.6,35.7 +S0003,80.9,321.5 +S0004,46.0,157.9 +S0005,57.2,183.1 +S0006,98.5,184.3 +S0007,29.4,61.1 +S0008,99.9,371.0 +S0009,98.3,214.7 +S0010,50.6,121.0 +S0011,106.5,196.8 +S0012,24.7,186.3 diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-n5000/case.json b/agents/evals/fixtures/cases/scatter-basic-letsplot-n5000/case.json new file mode 100644 index 00000000000..3d57e668e12 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "scatter-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "x", + "column": "Ad Spend (kCHF)" + }, + { + "role": "y", + "column": "Revenue (kCHF)" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, n5000)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-n5000/data.csv b/agents/evals/fixtures/cases/scatter-basic-letsplot-n5000/data.csv new file mode 100644 index 00000000000..873d2f00821 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-n5000/data.csv @@ -0,0 +1,5001 @@ +Store,Ad Spend (kCHF),Revenue (kCHF) +S0001,72.1,313.3 +S0002,90.3,179.9 +S0003,71.7,201.6 +S0004,51.9,188.1 +S0005,105.6,296.8 +S0006,100.5,236.5 +S0007,110.1,320.5 +S0008,119.3,274.2 +S0009,40.4,131.5 +S0010,79.0,345.7 +S0011,39.0,155.4 +S0012,17.4,38.3 +S0013,79.6,234.3 +S0014,89.6,183.2 +S0015,54.0,202.4 +S0016,42.2,9.9 +S0017,112.8,354.2 +S0018,82.7,144.5 +S0019,66.3,227.8 +S0020,91.5,124.4 +S0021,72.3,216.9 +S0022,23.4,15.8 +S0023,96.2,213.5 +S0024,60.0,146.8 +S0025,104.4,173.5 +S0026,76.1,285.7 +S0027,33.7,70.9 +S0028,17.2,68.9 +S0029,30.0,114.3 +S0030,26.5,148.9 +S0031,50.4,45.1 +S0032,49.1,201.2 +S0033,119.5,371.6 +S0034,76.6,360.6 +S0035,56.2,125.0 +S0036,45.3,104.2 +S0037,7.8,38.6 +S0038,7.4,113.0 +S0039,18.3,35.3 +S0040,56.3,163.1 +S0041,84.4,99.9 +S0042,62.1,198.8 +S0043,7.4,5.0 +S0044,114.6,280.4 +S0045,75.1,141.6 +S0046,37.2,157.0 +S0047,25.9,56.2 +S0048,100.6,230.9 +S0049,16.1,74.2 +S0050,114.3,200.2 +S0051,103.8,235.1 +S0052,37.2,271.1 +S0053,114.8,337.2 +S0054,48.4,192.7 +S0055,76.6,169.4 +S0056,54.6,274.1 +S0057,89.4,372.0 +S0058,32.6,105.0 +S0059,65.8,213.0 +S0060,62.8,91.9 +S0061,54.7,138.1 +S0062,15.4,229.3 +S0063,37.2,172.1 +S0064,67.3,38.0 +S0065,90.8,226.9 +S0066,30.6,74.1 +S0067,42.5,130.0 +S0068,101.5,220.1 +S0069,59.4,156.6 +S0070,59.9,107.3 +S0071,82.5,374.7 +S0072,73.3,163.6 +S0073,118.8,276.7 +S0074,76.9,81.4 +S0075,10.4,68.0 +S0076,101.7,205.4 +S0077,89.8,87.3 +S0078,6.1,63.7 +S0079,65.6,151.7 +S0080,94.4,249.7 +S0081,116.7,364.1 +S0082,39.5,176.1 +S0083,75.2,43.9 +S0084,56.4,122.4 +S0085,75.4,44.9 +S0086,68.1,242.3 +S0087,82.9,222.3 +S0088,58.2,139.3 +S0089,86.8,353.6 +S0090,109.6,296.3 +S0091,57.4,287.9 +S0092,105.4,294.4 +S0093,102.5,370.4 +S0094,64.0,194.2 +S0095,16.6,5.0 +S0096,29.5,28.9 +S0097,87.8,201.6 +S0098,14.7,110.9 +S0099,98.1,151.6 +S0100,75.0,162.6 +S0101,102.7,316.7 +S0102,70.6,135.4 +S0103,97.7,269.9 +S0104,44.9,142.7 +S0105,110.6,393.8 +S0106,97.6,291.9 +S0107,81.1,289.0 +S0108,80.3,275.0 +S0109,96.8,96.8 +S0110,45.9,157.6 +S0111,81.0,198.0 +S0112,46.4,263.2 +S0113,68.0,205.0 +S0114,57.6,110.3 +S0115,40.7,208.4 +S0116,35.9,88.5 +S0117,72.1,180.4 +S0118,115.2,329.7 +S0119,60.3,206.4 +S0120,112.8,260.5 +S0121,51.9,147.8 +S0122,30.1,5.0 +S0123,118.6,356.6 +S0124,30.9,158.4 +S0125,45.6,166.9 +S0126,98.8,227.7 +S0127,39.0,144.2 +S0128,107.3,255.4 +S0129,78.0,251.4 +S0130,34.6,121.4 +S0131,62.0,141.0 +S0132,53.8,243.9 +S0133,88.4,338.2 +S0134,30.6,110.6 +S0135,67.2,113.5 +S0136,54.0,255.5 +S0137,30.8,119.5 +S0138,82.9,165.5 +S0139,24.4,98.2 +S0140,60.9,196.6 +S0141,58.9,179.6 +S0142,56.5,218.1 +S0143,46.5,123.4 +S0144,97.7,148.6 +S0145,18.5,5.0 +S0146,29.9,62.2 +S0147,109.4,233.2 +S0148,90.2,124.6 +S0149,61.6,224.9 +S0150,29.7,90.5 +S0151,53.4,99.9 +S0152,58.3,234.5 +S0153,97.3,252.5 +S0154,109.3,383.0 +S0155,104.6,212.3 +S0156,19.1,48.6 +S0157,71.6,213.7 +S0158,26.1,62.5 +S0159,94.6,222.3 +S0160,48.1,140.4 +S0161,108.0,374.0 +S0162,103.2,234.2 +S0163,53.3,171.7 +S0164,89.1,251.3 +S0165,70.4,195.1 +S0166,64.4,198.9 +S0167,41.1,175.5 +S0168,72.5,17.3 +S0169,84.4,282.0 +S0170,98.0,300.5 +S0171,6.7,5.0 +S0172,76.0,227.2 +S0173,12.0,79.4 +S0174,81.7,133.9 +S0175,47.6,130.9 +S0176,42.7,153.6 +S0177,105.4,122.9 +S0178,55.0,110.2 +S0179,84.3,268.8 +S0180,22.7,68.7 +S0181,28.1,126.5 +S0182,8.4,22.5 +S0183,38.7,103.6 +S0184,35.1,130.8 +S0185,50.6,222.4 +S0186,105.8,292.9 +S0187,95.2,201.9 +S0188,118.7,268.7 +S0189,37.0,74.7 +S0190,12.8,45.3 +S0191,7.4,5.0 +S0192,44.8,201.1 +S0193,39.9,178.2 +S0194,55.9,238.2 +S0195,35.3,103.8 +S0196,115.3,310.1 +S0197,81.0,132.6 +S0198,34.3,16.3 +S0199,83.7,174.1 +S0200,38.3,128.7 +S0201,105.6,240.5 +S0202,117.3,253.9 +S0203,81.1,354.8 +S0204,58.1,212.6 +S0205,97.1,248.4 +S0206,36.2,5.0 +S0207,5.7,99.4 +S0208,96.2,199.8 +S0209,13.0,106.4 +S0210,40.0,238.7 +S0211,87.6,193.9 +S0212,11.8,28.7 +S0213,97.1,361.7 +S0214,26.5,157.3 +S0215,48.3,62.5 +S0216,73.1,263.1 +S0217,53.2,236.0 +S0218,94.8,392.4 +S0219,99.1,392.3 +S0220,72.0,195.0 +S0221,55.5,184.0 +S0222,85.8,293.1 +S0223,68.6,137.3 +S0224,39.6,90.0 +S0225,115.0,389.8 +S0226,44.5,5.0 +S0227,27.0,189.4 +S0228,105.6,233.6 +S0229,39.7,246.9 +S0230,10.3,108.7 +S0231,70.2,195.8 +S0232,75.4,110.5 +S0233,66.8,262.6 +S0234,68.5,259.3 +S0235,32.7,5.0 +S0236,18.0,123.4 +S0237,62.8,52.9 +S0238,56.2,273.3 +S0239,28.7,13.6 +S0240,69.0,297.6 +S0241,99.4,277.4 +S0242,83.2,200.3 +S0243,113.4,140.8 +S0244,111.6,374.9 +S0245,116.1,402.0 +S0246,77.6,332.8 +S0247,93.0,184.2 +S0248,118.3,344.4 +S0249,80.8,98.0 +S0250,50.8,152.7 +S0251,21.7,152.2 +S0252,83.8,253.5 +S0253,13.2,49.9 +S0254,11.7,122.5 +S0255,61.1,198.1 +S0256,89.5,300.8 +S0257,25.5,122.2 +S0258,96.4,267.7 +S0259,73.6,156.8 +S0260,7.4,173.3 +S0261,109.7,324.1 +S0262,98.6,123.7 +S0263,48.8,152.1 +S0264,9.1,5.0 +S0265,102.6,213.5 +S0266,78.2,190.5 +S0267,109.0,359.8 +S0268,34.0,36.2 +S0269,103.4,357.4 +S0270,78.7,189.0 +S0271,115.6,324.2 +S0272,29.3,5.0 +S0273,104.0,268.1 +S0274,66.8,193.9 +S0275,40.9,57.0 +S0276,58.4,170.6 +S0277,83.5,247.8 +S0278,68.5,341.3 +S0279,52.7,100.2 +S0280,65.8,184.8 +S0281,73.2,255.6 +S0282,97.5,107.1 +S0283,65.2,172.6 +S0284,38.9,146.1 +S0285,68.1,145.2 +S0286,5.9,5.0 +S0287,58.5,75.1 +S0288,61.7,182.6 +S0289,41.2,184.0 +S0290,11.1,6.7 +S0291,21.3,75.6 +S0292,115.8,348.0 +S0293,25.1,197.3 +S0294,109.3,247.5 +S0295,21.3,6.7 +S0296,28.7,5.0 +S0297,9.6,5.0 +S0298,48.5,170.0 +S0299,102.6,204.5 +S0300,72.9,196.6 +S0301,83.5,300.2 +S0302,40.1,264.0 +S0303,48.6,115.4 +S0304,56.2,74.5 +S0305,93.1,345.4 +S0306,88.5,272.3 +S0307,23.5,132.5 +S0308,66.5,198.1 +S0309,46.9,83.0 +S0310,45.6,53.2 +S0311,82.7,323.6 +S0312,92.4,248.2 +S0313,59.2,161.5 +S0314,17.0,78.9 +S0315,29.8,103.3 +S0316,12.4,41.1 +S0317,21.9,186.6 +S0318,90.1,263.3 +S0319,20.5,217.7 +S0320,12.3,88.2 +S0321,17.8,79.1 +S0322,96.2,285.5 +S0323,10.3,111.1 +S0324,90.5,279.6 +S0325,34.7,195.3 +S0326,86.3,254.4 +S0327,28.3,75.3 +S0328,51.7,106.1 +S0329,13.5,5.0 +S0330,48.9,227.1 +S0331,70.3,149.7 +S0332,8.8,5.0 +S0333,12.2,89.4 +S0334,114.6,313.3 +S0335,86.7,221.6 +S0336,49.1,222.7 +S0337,96.8,201.6 +S0338,44.9,52.3 +S0339,34.2,27.7 +S0340,58.7,101.7 +S0341,27.1,64.3 +S0342,77.3,211.8 +S0343,119.0,167.3 +S0344,100.1,158.9 +S0345,20.8,5.0 +S0346,33.7,156.1 +S0347,34.4,55.3 +S0348,35.1,143.4 +S0349,57.5,195.7 +S0350,51.6,63.1 +S0351,21.3,30.8 +S0352,95.1,186.7 +S0353,39.6,133.2 +S0354,22.7,140.7 +S0355,109.6,279.1 +S0356,71.2,295.8 +S0357,32.3,124.9 +S0358,99.8,249.8 +S0359,70.9,167.2 +S0360,71.6,238.5 +S0361,10.0,13.0 +S0362,37.8,69.9 +S0363,92.4,383.6 +S0364,66.7,182.9 +S0365,12.8,62.8 +S0366,100.7,221.6 +S0367,9.2,111.0 +S0368,82.6,208.4 +S0369,102.0,220.5 +S0370,82.3,235.3 +S0371,81.8,269.1 +S0372,117.8,379.7 +S0373,80.3,48.9 +S0374,72.5,210.7 +S0375,57.4,171.1 +S0376,114.2,361.1 +S0377,18.1,5.0 +S0378,52.3,217.5 +S0379,100.2,339.6 +S0380,57.5,155.9 +S0381,41.6,93.1 +S0382,32.7,43.2 +S0383,104.7,168.3 +S0384,34.2,212.2 +S0385,91.8,58.9 +S0386,106.3,244.0 +S0387,82.4,252.9 +S0388,62.2,185.7 +S0389,67.4,245.9 +S0390,27.2,234.7 +S0391,76.6,168.6 +S0392,56.3,74.4 +S0393,7.9,5.0 +S0394,77.0,109.6 +S0395,32.8,141.1 +S0396,5.6,5.0 +S0397,77.4,245.4 +S0398,117.2,285.4 +S0399,80.8,189.9 +S0400,54.7,182.1 +S0401,107.8,353.6 +S0402,72.1,234.6 +S0403,99.4,147.3 +S0404,29.2,171.1 +S0405,115.8,286.3 +S0406,83.3,201.9 +S0407,69.6,140.0 +S0408,49.3,90.3 +S0409,42.6,135.7 +S0410,119.4,140.8 +S0411,104.9,359.3 +S0412,13.5,229.3 +S0413,21.6,5.0 +S0414,18.2,67.2 +S0415,112.1,266.6 +S0416,35.4,5.0 +S0417,9.2,249.4 +S0418,107.4,354.2 +S0419,70.7,79.7 +S0420,94.7,225.8 +S0421,74.8,159.3 +S0422,23.3,177.1 +S0423,99.4,288.1 +S0424,117.1,281.3 +S0425,54.9,65.9 +S0426,29.3,141.2 +S0427,42.8,134.0 +S0428,102.8,291.7 +S0429,41.2,158.7 +S0430,105.4,305.1 +S0431,85.9,198.8 +S0432,31.2,79.2 +S0433,82.1,157.2 +S0434,48.8,128.0 +S0435,105.1,172.6 +S0436,37.4,203.8 +S0437,21.7,188.1 +S0438,72.5,277.4 +S0439,29.4,143.9 +S0440,90.9,184.4 +S0441,104.3,363.2 +S0442,58.7,252.7 +S0443,73.3,174.6 +S0444,37.2,89.0 +S0445,57.1,89.1 +S0446,48.3,245.6 +S0447,71.4,301.8 +S0448,94.3,250.5 +S0449,119.1,267.4 +S0450,20.8,113.5 +S0451,107.1,195.8 +S0452,81.6,347.0 +S0453,47.1,210.5 +S0454,66.3,299.8 +S0455,47.5,33.5 +S0456,110.3,260.3 +S0457,79.7,213.9 +S0458,43.9,121.2 +S0459,35.9,32.2 +S0460,70.3,379.4 +S0461,45.6,114.6 +S0462,31.2,140.6 +S0463,37.7,149.8 +S0464,17.8,9.3 +S0465,98.7,350.4 +S0466,22.2,35.8 +S0467,101.5,289.2 +S0468,60.8,187.8 +S0469,33.9,52.7 +S0470,101.5,236.7 +S0471,43.9,96.1 +S0472,31.4,203.7 +S0473,62.6,198.9 +S0474,109.1,378.5 +S0475,23.0,40.1 +S0476,106.8,309.6 +S0477,71.6,191.9 +S0478,63.9,194.3 +S0479,83.9,189.6 +S0480,71.1,57.9 +S0481,103.7,240.4 +S0482,61.1,257.8 +S0483,73.5,285.2 +S0484,50.1,73.9 +S0485,55.9,78.3 +S0486,107.4,289.4 +S0487,10.9,83.9 +S0488,38.6,42.4 +S0489,82.5,172.3 +S0490,43.3,167.4 +S0491,57.7,104.4 +S0492,33.2,68.5 +S0493,40.6,205.6 +S0494,43.1,223.3 +S0495,19.4,57.6 +S0496,24.7,32.5 +S0497,104.1,245.9 +S0498,113.4,223.4 +S0499,80.3,178.0 +S0500,105.9,192.6 +S0501,28.1,5.0 +S0502,81.7,217.3 +S0503,30.3,201.3 +S0504,29.0,162.4 +S0505,7.5,5.0 +S0506,90.1,277.2 +S0507,102.1,305.4 +S0508,68.7,229.5 +S0509,24.1,35.8 +S0510,99.6,340.2 +S0511,100.5,229.1 +S0512,8.5,176.9 +S0513,98.7,198.1 +S0514,114.4,220.1 +S0515,79.0,177.3 +S0516,55.0,137.4 +S0517,5.3,64.7 +S0518,47.6,189.5 +S0519,35.4,106.8 +S0520,47.1,62.2 +S0521,84.8,182.4 +S0522,68.0,170.7 +S0523,70.5,108.1 +S0524,54.9,247.1 +S0525,90.0,297.1 +S0526,42.6,84.8 +S0527,106.2,254.4 +S0528,114.0,250.1 +S0529,60.5,130.6 +S0530,107.6,160.2 +S0531,50.3,260.7 +S0532,55.3,185.7 +S0533,18.9,22.7 +S0534,10.9,82.2 +S0535,106.8,204.4 +S0536,39.2,149.3 +S0537,102.4,227.4 +S0538,110.7,381.5 +S0539,23.6,87.7 +S0540,17.4,5.0 +S0541,72.1,130.7 +S0542,9.9,11.0 +S0543,9.8,42.9 +S0544,50.3,205.5 +S0545,29.3,199.1 +S0546,102.7,396.8 +S0547,78.9,251.9 +S0548,59.1,71.7 +S0549,7.3,56.3 +S0550,62.0,187.6 +S0551,44.8,76.8 +S0552,6.0,5.0 +S0553,106.6,280.6 +S0554,105.1,340.9 +S0555,23.1,99.1 +S0556,19.0,137.0 +S0557,66.3,254.7 +S0558,110.1,179.1 +S0559,119.8,215.9 +S0560,92.9,219.2 +S0561,116.2,293.2 +S0562,90.7,181.7 +S0563,78.4,203.5 +S0564,99.0,193.0 +S0565,22.6,127.7 +S0566,20.8,83.0 +S0567,15.5,109.0 +S0568,33.2,117.9 +S0569,21.7,68.2 +S0570,75.5,220.0 +S0571,79.4,316.6 +S0572,85.5,115.2 +S0573,108.9,317.1 +S0574,118.8,255.7 +S0575,89.9,242.3 +S0576,115.4,169.8 +S0577,35.5,76.0 +S0578,60.6,209.4 +S0579,38.9,218.9 +S0580,55.7,94.0 +S0581,65.3,211.2 +S0582,23.8,180.2 +S0583,119.0,340.5 +S0584,25.2,149.2 +S0585,99.5,230.6 +S0586,15.5,5.0 +S0587,24.1,36.3 +S0588,105.2,171.0 +S0589,38.2,213.9 +S0590,109.0,217.6 +S0591,38.1,207.3 +S0592,98.1,142.6 +S0593,37.7,5.0 +S0594,13.6,137.8 +S0595,34.1,163.9 +S0596,116.3,176.6 +S0597,52.6,115.3 +S0598,13.9,25.0 +S0599,118.0,325.5 +S0600,46.4,109.3 +S0601,26.3,67.1 +S0602,110.7,167.9 +S0603,102.7,257.0 +S0604,14.9,66.2 +S0605,9.1,117.1 +S0606,33.6,115.3 +S0607,59.3,201.7 +S0608,39.7,148.1 +S0609,39.7,64.8 +S0610,30.4,252.0 +S0611,96.5,284.1 +S0612,92.5,200.1 +S0613,81.4,213.1 +S0614,96.7,325.2 +S0615,106.4,298.5 +S0616,33.5,55.7 +S0617,26.5,118.5 +S0618,6.6,57.0 +S0619,82.8,296.2 +S0620,102.8,276.9 +S0621,97.5,295.7 +S0622,21.3,115.0 +S0623,31.5,181.8 +S0624,117.1,255.8 +S0625,110.7,272.2 +S0626,85.1,355.3 +S0627,107.7,253.5 +S0628,90.1,218.2 +S0629,40.1,90.8 +S0630,47.4,162.1 +S0631,110.6,308.7 +S0632,50.4,161.8 +S0633,29.5,31.3 +S0634,11.2,103.9 +S0635,100.7,155.3 +S0636,117.5,154.3 +S0637,59.6,103.4 +S0638,119.1,315.4 +S0639,119.1,275.3 +S0640,91.2,255.2 +S0641,15.0,64.5 +S0642,25.8,65.1 +S0643,81.0,190.6 +S0644,44.4,166.9 +S0645,93.1,205.5 +S0646,30.8,204.5 +S0647,46.9,82.2 +S0648,70.3,118.1 +S0649,17.0,18.6 +S0650,39.8,157.2 +S0651,103.7,130.6 +S0652,93.5,191.6 +S0653,87.7,231.4 +S0654,54.7,29.7 +S0655,63.0,203.1 +S0656,23.3,36.1 +S0657,89.9,337.4 +S0658,67.1,111.1 +S0659,97.9,186.8 +S0660,70.0,29.5 +S0661,72.3,137.1 +S0662,34.4,63.4 +S0663,81.7,223.9 +S0664,51.1,110.8 +S0665,103.7,367.6 +S0666,79.9,6.0 +S0667,32.9,133.5 +S0668,14.1,5.0 +S0669,44.5,118.6 +S0670,49.2,234.4 +S0671,35.4,300.1 +S0672,111.5,225.1 +S0673,95.4,181.6 +S0674,65.0,198.1 +S0675,24.3,36.3 +S0676,64.1,119.9 +S0677,56.5,130.1 +S0678,60.9,194.3 +S0679,17.2,41.5 +S0680,18.3,5.0 +S0681,109.9,306.2 +S0682,103.9,209.3 +S0683,50.5,123.8 +S0684,22.2,267.6 +S0685,81.8,145.4 +S0686,91.9,244.7 +S0687,25.6,128.5 +S0688,54.3,121.8 +S0689,82.4,222.6 +S0690,114.8,184.7 +S0691,61.7,35.6 +S0692,99.0,237.6 +S0693,13.0,5.0 +S0694,91.5,346.9 +S0695,43.6,38.2 +S0696,42.8,118.0 +S0697,111.3,416.6 +S0698,37.9,114.9 +S0699,18.8,10.8 +S0700,54.9,59.5 +S0701,31.7,133.9 +S0702,61.2,207.3 +S0703,71.4,110.6 +S0704,9.8,5.0 +S0705,34.6,84.3 +S0706,110.5,238.4 +S0707,117.7,422.0 +S0708,47.7,97.4 +S0709,63.7,191.4 +S0710,117.4,221.2 +S0711,80.8,206.2 +S0712,92.4,174.4 +S0713,95.5,261.4 +S0714,70.0,112.0 +S0715,91.1,344.5 +S0716,25.4,97.7 +S0717,49.9,81.6 +S0718,48.0,112.4 +S0719,39.4,166.3 +S0720,79.7,69.0 +S0721,38.0,69.0 +S0722,36.6,87.4 +S0723,93.1,220.3 +S0724,53.5,149.0 +S0725,6.8,110.1 +S0726,118.4,335.9 +S0727,9.7,68.8 +S0728,119.3,292.1 +S0729,42.4,270.1 +S0730,16.3,63.9 +S0731,24.2,60.0 +S0732,108.6,259.9 +S0733,36.1,5.0 +S0734,90.4,302.7 +S0735,10.3,40.6 +S0736,15.8,60.8 +S0737,6.0,23.1 +S0738,93.7,282.0 +S0739,95.4,164.3 +S0740,87.7,338.7 +S0741,75.7,162.8 +S0742,71.9,296.2 +S0743,75.5,214.2 +S0744,102.9,218.7 +S0745,76.9,284.5 +S0746,52.2,199.2 +S0747,28.4,67.5 +S0748,86.0,189.9 +S0749,84.7,227.2 +S0750,111.7,290.6 +S0751,37.0,70.3 +S0752,7.1,5.0 +S0753,108.9,256.7 +S0754,40.2,53.9 +S0755,44.0,160.5 +S0756,22.8,79.9 +S0757,60.7,171.2 +S0758,27.2,59.1 +S0759,89.5,143.6 +S0760,12.6,22.9 +S0761,97.0,391.4 +S0762,116.4,315.7 +S0763,38.6,151.2 +S0764,96.6,203.6 +S0765,11.0,159.4 +S0766,97.9,310.3 +S0767,11.5,5.0 +S0768,107.4,281.4 +S0769,111.1,346.1 +S0770,22.6,92.9 +S0771,109.1,204.1 +S0772,72.5,167.0 +S0773,31.3,142.0 +S0774,59.7,178.6 +S0775,64.3,220.5 +S0776,66.7,389.7 +S0777,87.5,171.5 +S0778,68.2,66.7 +S0779,23.3,99.1 +S0780,115.7,380.4 +S0781,72.5,12.6 +S0782,53.7,130.6 +S0783,31.1,253.6 +S0784,67.8,191.0 +S0785,103.7,250.8 +S0786,103.7,166.3 +S0787,24.0,142.5 +S0788,18.7,168.3 +S0789,41.2,161.5 +S0790,76.6,180.0 +S0791,65.7,157.1 +S0792,113.7,220.6 +S0793,69.5,187.8 +S0794,93.0,310.6 +S0795,114.4,356.1 +S0796,91.6,266.4 +S0797,48.0,95.0 +S0798,28.7,107.2 +S0799,41.6,212.2 +S0800,53.9,134.8 +S0801,38.8,107.0 +S0802,40.4,250.7 +S0803,110.5,205.8 +S0804,48.3,201.4 +S0805,71.7,189.6 +S0806,27.0,138.3 +S0807,66.7,30.5 +S0808,13.4,188.8 +S0809,65.3,241.2 +S0810,56.2,87.4 +S0811,64.4,237.2 +S0812,68.8,93.0 +S0813,88.4,242.9 +S0814,14.8,159.2 +S0815,116.8,191.7 +S0816,68.5,193.0 +S0817,20.6,125.5 +S0818,59.2,196.6 +S0819,118.7,401.4 +S0820,66.1,209.6 +S0821,55.7,158.7 +S0822,59.6,69.1 +S0823,66.7,145.2 +S0824,98.3,259.6 +S0825,91.1,304.4 +S0826,86.4,174.5 +S0827,14.2,5.0 +S0828,11.6,92.7 +S0829,60.1,213.7 +S0830,81.8,190.2 +S0831,51.5,152.1 +S0832,76.5,94.8 +S0833,47.9,173.9 +S0834,90.4,168.5 +S0835,62.4,226.0 +S0836,66.9,73.9 +S0837,6.8,5.0 +S0838,35.4,13.5 +S0839,102.8,94.6 +S0840,112.4,214.3 +S0841,94.1,167.0 +S0842,68.7,185.4 +S0843,13.5,84.3 +S0844,81.0,295.5 +S0845,63.6,145.4 +S0846,7.4,64.4 +S0847,95.6,204.5 +S0848,40.8,5.0 +S0849,100.4,291.4 +S0850,80.1,179.4 +S0851,92.0,164.4 +S0852,45.1,176.3 +S0853,8.1,52.9 +S0854,96.7,306.4 +S0855,119.9,306.4 +S0856,89.1,194.0 +S0857,17.5,29.9 +S0858,16.6,107.7 +S0859,46.9,72.0 +S0860,19.7,96.3 +S0861,78.6,197.8 +S0862,85.4,243.6 +S0863,102.2,209.4 +S0864,111.1,326.8 +S0865,82.2,253.6 +S0866,9.8,100.1 +S0867,77.0,91.8 +S0868,13.9,94.3 +S0869,39.9,50.4 +S0870,41.3,63.0 +S0871,58.0,306.0 +S0872,72.8,188.9 +S0873,83.5,223.3 +S0874,11.5,15.0 +S0875,80.8,241.0 +S0876,60.0,150.9 +S0877,23.4,59.9 +S0878,18.3,41.3 +S0879,109.5,189.0 +S0880,37.9,207.3 +S0881,111.4,268.2 +S0882,88.7,126.9 +S0883,75.9,178.9 +S0884,97.6,266.3 +S0885,116.4,284.5 +S0886,32.4,287.4 +S0887,15.3,41.0 +S0888,77.4,178.5 +S0889,103.5,256.3 +S0890,103.9,227.8 +S0891,110.2,211.6 +S0892,114.6,242.8 +S0893,46.0,170.2 +S0894,84.4,129.8 +S0895,79.7,185.4 +S0896,95.9,253.8 +S0897,48.4,218.8 +S0898,94.1,172.0 +S0899,98.5,227.6 +S0900,91.2,206.8 +S0901,103.4,323.2 +S0902,101.4,195.5 +S0903,81.1,160.6 +S0904,28.4,47.3 +S0905,57.3,157.1 +S0906,62.3,185.5 +S0907,93.4,279.0 +S0908,113.2,257.4 +S0909,92.8,183.2 +S0910,117.8,329.1 +S0911,110.9,356.6 +S0912,36.0,114.3 +S0913,101.8,228.5 +S0914,59.3,72.9 +S0915,88.7,155.3 +S0916,95.2,290.8 +S0917,63.3,198.4 +S0918,101.1,220.7 +S0919,112.5,404.0 +S0920,83.2,387.3 +S0921,119.8,432.6 +S0922,100.9,202.0 +S0923,87.1,114.4 +S0924,26.1,11.5 +S0925,87.8,102.9 +S0926,103.7,424.3 +S0927,75.6,68.2 +S0928,84.9,176.3 +S0929,85.3,142.8 +S0930,18.9,5.0 +S0931,24.9,127.4 +S0932,88.4,189.7 +S0933,93.5,273.1 +S0934,27.3,73.0 +S0935,27.4,111.6 +S0936,38.2,128.4 +S0937,113.9,257.7 +S0938,19.2,71.4 +S0939,117.1,296.3 +S0940,118.4,265.1 +S0941,52.0,253.8 +S0942,38.4,190.9 +S0943,104.6,337.2 +S0944,68.1,174.8 +S0945,114.2,309.7 +S0946,93.5,254.5 +S0947,32.3,5.0 +S0948,55.1,330.6 +S0949,95.7,306.8 +S0950,45.3,149.1 +S0951,86.4,258.7 +S0952,99.8,174.9 +S0953,97.9,345.9 +S0954,94.8,217.8 +S0955,73.3,147.9 +S0956,88.1,244.4 +S0957,76.7,223.8 +S0958,36.5,7.4 +S0959,51.2,198.1 +S0960,30.3,87.3 +S0961,63.9,86.0 +S0962,72.7,195.7 +S0963,69.7,283.0 +S0964,96.1,168.9 +S0965,12.1,78.6 +S0966,95.4,220.4 +S0967,72.6,254.3 +S0968,86.3,121.4 +S0969,66.5,219.0 +S0970,29.2,170.9 +S0971,102.3,327.5 +S0972,12.2,49.7 +S0973,86.2,302.7 +S0974,74.8,229.4 +S0975,101.1,314.7 +S0976,85.7,250.6 +S0977,8.1,44.1 +S0978,116.7,269.9 +S0979,70.8,130.7 +S0980,27.3,117.3 +S0981,52.1,113.4 +S0982,86.0,278.7 +S0983,84.5,371.2 +S0984,11.1,100.9 +S0985,90.9,288.2 +S0986,27.7,130.4 +S0987,112.9,361.1 +S0988,98.5,223.1 +S0989,37.2,116.2 +S0990,78.2,199.5 +S0991,48.8,141.8 +S0992,52.2,152.1 +S0993,19.0,145.6 +S0994,65.1,44.9 +S0995,98.2,195.1 +S0996,71.6,116.2 +S0997,37.8,279.3 +S0998,40.9,172.0 +S0999,71.6,262.6 +S1000,29.6,238.6 +S1001,86.4,242.8 +S1002,72.8,288.8 +S1003,65.1,115.1 +S1004,13.0,122.9 +S1005,82.1,196.0 +S1006,47.6,123.9 +S1007,84.3,159.8 +S1008,24.8,14.6 +S1009,60.5,276.8 +S1010,60.8,150.2 +S1011,38.8,152.1 +S1012,116.1,347.5 +S1013,107.2,260.4 +S1014,33.4,5.0 +S1015,70.0,152.8 +S1016,66.9,151.7 +S1017,35.2,72.7 +S1018,83.6,134.3 +S1019,90.0,269.1 +S1020,16.2,64.1 +S1021,79.2,243.2 +S1022,119.9,303.0 +S1023,84.5,167.8 +S1024,76.0,301.7 +S1025,40.2,155.1 +S1026,22.9,37.9 +S1027,90.0,247.8 +S1028,40.6,133.8 +S1029,8.5,48.5 +S1030,46.0,52.0 +S1031,25.5,47.8 +S1032,36.8,132.7 +S1033,114.6,327.8 +S1034,88.7,167.2 +S1035,43.1,116.6 +S1036,78.3,320.0 +S1037,15.3,26.2 +S1038,7.7,31.3 +S1039,34.9,103.9 +S1040,21.1,50.7 +S1041,100.2,272.3 +S1042,58.1,258.0 +S1043,49.6,5.0 +S1044,87.8,200.2 +S1045,20.7,133.6 +S1046,44.0,124.3 +S1047,15.3,5.0 +S1048,6.1,103.4 +S1049,52.6,161.7 +S1050,119.9,104.7 +S1051,81.5,117.1 +S1052,64.6,142.7 +S1053,65.2,222.8 +S1054,16.6,33.3 +S1055,60.4,261.2 +S1056,36.3,5.0 +S1057,77.8,123.3 +S1058,80.2,237.8 +S1059,13.8,10.9 +S1060,86.8,371.4 +S1061,39.3,148.2 +S1062,115.6,198.5 +S1063,101.9,328.2 +S1064,56.4,130.7 +S1065,21.0,83.2 +S1066,58.2,207.2 +S1067,98.7,184.6 +S1068,30.2,131.8 +S1069,67.9,280.1 +S1070,19.1,241.5 +S1071,105.5,199.9 +S1072,74.3,214.4 +S1073,96.8,204.1 +S1074,47.2,134.8 +S1075,43.6,252.7 +S1076,107.3,365.3 +S1077,110.0,259.5 +S1078,5.3,128.2 +S1079,112.2,355.1 +S1080,65.4,70.3 +S1081,23.3,5.6 +S1082,52.2,142.4 +S1083,16.7,154.9 +S1084,88.2,284.4 +S1085,45.4,108.0 +S1086,51.0,87.8 +S1087,60.4,310.8 +S1088,97.9,212.5 +S1089,81.6,204.8 +S1090,12.5,5.0 +S1091,9.4,150.5 +S1092,103.0,229.3 +S1093,73.3,203.5 +S1094,64.2,241.4 +S1095,87.0,165.7 +S1096,33.0,70.9 +S1097,90.0,276.2 +S1098,110.4,301.1 +S1099,31.1,196.1 +S1100,52.7,141.4 +S1101,23.8,78.9 +S1102,54.6,204.2 +S1103,80.6,193.5 +S1104,111.6,201.1 +S1105,59.0,174.9 +S1106,106.5,281.8 +S1107,117.8,368.2 +S1108,38.3,85.3 +S1109,100.9,144.2 +S1110,37.0,171.4 +S1111,24.4,99.7 +S1112,101.8,258.9 +S1113,109.1,359.1 +S1114,109.6,375.6 +S1115,111.9,312.3 +S1116,101.3,271.4 +S1117,117.2,388.9 +S1118,27.6,134.2 +S1119,83.2,266.2 +S1120,91.7,233.9 +S1121,99.9,199.8 +S1122,105.0,269.5 +S1123,55.0,77.3 +S1124,66.8,202.3 +S1125,83.4,265.7 +S1126,73.6,349.2 +S1127,27.9,233.5 +S1128,17.8,105.9 +S1129,23.4,58.8 +S1130,43.8,271.5 +S1131,74.3,127.0 +S1132,110.1,153.7 +S1133,102.2,210.9 +S1134,17.4,54.7 +S1135,109.6,309.8 +S1136,63.2,80.8 +S1137,104.6,159.7 +S1138,15.5,38.4 +S1139,99.1,238.0 +S1140,84.3,174.2 +S1141,23.1,126.2 +S1142,10.5,81.0 +S1143,37.7,21.2 +S1144,84.1,156.3 +S1145,20.4,38.0 +S1146,21.6,36.8 +S1147,85.7,213.5 +S1148,89.7,9.5 +S1149,49.5,175.0 +S1150,41.2,90.1 +S1151,93.6,264.8 +S1152,108.3,297.0 +S1153,52.4,121.7 +S1154,82.0,241.6 +S1155,67.4,100.2 +S1156,5.0,141.2 +S1157,30.8,116.7 +S1158,107.2,296.3 +S1159,55.0,41.1 +S1160,33.9,5.0 +S1161,40.9,218.2 +S1162,9.1,84.6 +S1163,5.6,26.4 +S1164,119.5,236.0 +S1165,99.7,198.1 +S1166,57.8,79.9 +S1167,21.4,11.7 +S1168,119.0,260.1 +S1169,35.7,143.5 +S1170,45.4,256.7 +S1171,39.4,84.4 +S1172,115.2,277.4 +S1173,51.5,124.0 +S1174,12.1,52.4 +S1175,87.9,238.2 +S1176,56.0,24.6 +S1177,66.4,148.9 +S1178,78.5,263.1 +S1179,34.0,182.4 +S1180,60.1,87.0 +S1181,45.6,214.8 +S1182,23.4,5.0 +S1183,104.4,309.6 +S1184,89.5,256.3 +S1185,108.9,253.0 +S1186,11.2,151.1 +S1187,89.0,283.5 +S1188,56.5,151.5 +S1189,66.5,371.2 +S1190,9.7,72.7 +S1191,82.0,107.3 +S1192,44.7,77.3 +S1193,28.4,49.0 +S1194,97.9,140.9 +S1195,31.6,5.0 +S1196,85.1,341.3 +S1197,89.3,146.4 +S1198,66.7,179.3 +S1199,105.7,196.4 +S1200,107.7,347.6 +S1201,82.1,304.9 +S1202,79.3,206.3 +S1203,93.3,161.8 +S1204,13.8,103.2 +S1205,10.9,145.8 +S1206,63.7,37.1 +S1207,28.5,128.1 +S1208,119.6,296.4 +S1209,15.8,5.0 +S1210,24.9,82.2 +S1211,104.5,202.9 +S1212,116.1,319.9 +S1213,40.1,156.9 +S1214,116.7,357.0 +S1215,34.2,117.6 +S1216,65.9,262.7 +S1217,96.3,443.4 +S1218,87.2,247.1 +S1219,100.9,273.3 +S1220,54.2,294.5 +S1221,9.5,73.3 +S1222,113.8,114.6 +S1223,53.6,158.1 +S1224,46.0,142.4 +S1225,115.1,185.6 +S1226,91.6,215.7 +S1227,66.0,202.0 +S1228,55.9,170.3 +S1229,64.7,132.9 +S1230,21.0,140.0 +S1231,57.8,210.8 +S1232,109.6,256.8 +S1233,114.7,321.8 +S1234,91.5,361.1 +S1235,50.4,108.4 +S1236,114.3,373.3 +S1237,13.0,123.3 +S1238,59.4,150.7 +S1239,31.3,203.1 +S1240,92.8,154.6 +S1241,112.5,251.5 +S1242,49.0,137.5 +S1243,105.6,307.6 +S1244,5.6,64.6 +S1245,24.3,86.1 +S1246,103.7,267.8 +S1247,46.4,189.1 +S1248,95.5,173.3 +S1249,99.9,207.4 +S1250,113.0,338.8 +S1251,107.1,297.1 +S1252,97.5,335.9 +S1253,32.5,196.8 +S1254,43.8,130.8 +S1255,66.3,176.1 +S1256,75.4,99.2 +S1257,12.2,136.6 +S1258,34.5,147.6 +S1259,78.8,99.5 +S1260,7.2,92.6 +S1261,36.7,239.4 +S1262,83.1,189.6 +S1263,111.7,321.6 +S1264,27.3,169.2 +S1265,55.3,264.7 +S1266,102.7,257.2 +S1267,28.2,136.6 +S1268,91.8,234.4 +S1269,31.3,76.0 +S1270,116.7,338.2 +S1271,37.3,75.3 +S1272,104.8,262.7 +S1273,86.2,103.1 +S1274,62.4,151.0 +S1275,103.5,292.3 +S1276,16.4,25.4 +S1277,50.4,146.8 +S1278,99.8,251.8 +S1279,96.1,308.2 +S1280,57.4,107.6 +S1281,111.0,253.6 +S1282,79.5,54.3 +S1283,58.3,63.8 +S1284,75.3,170.3 +S1285,71.1,296.9 +S1286,94.9,277.6 +S1287,17.9,265.4 +S1288,82.3,125.4 +S1289,23.5,113.9 +S1290,12.5,117.6 +S1291,7.1,79.7 +S1292,43.7,196.0 +S1293,106.9,213.4 +S1294,38.1,87.6 +S1295,86.3,277.9 +S1296,66.9,276.7 +S1297,88.0,320.3 +S1298,7.6,50.6 +S1299,34.6,109.4 +S1300,30.4,127.6 +S1301,63.2,305.0 +S1302,22.4,38.3 +S1303,118.5,233.1 +S1304,49.4,200.5 +S1305,119.3,301.9 +S1306,80.0,200.3 +S1307,21.8,98.6 +S1308,50.8,183.7 +S1309,47.7,113.3 +S1310,61.3,171.4 +S1311,98.9,141.5 +S1312,14.4,53.6 +S1313,33.6,210.3 +S1314,21.5,238.0 +S1315,115.1,227.4 +S1316,40.6,194.0 +S1317,5.9,64.5 +S1318,60.0,95.9 +S1319,56.1,204.8 +S1320,97.1,242.7 +S1321,22.8,251.1 +S1322,84.1,325.8 +S1323,77.8,288.4 +S1324,21.8,134.5 +S1325,83.5,177.3 +S1326,119.9,282.2 +S1327,105.8,189.4 +S1328,29.9,118.6 +S1329,37.4,175.3 +S1330,111.5,109.4 +S1331,74.7,264.4 +S1332,73.2,169.3 +S1333,99.2,125.8 +S1334,45.9,240.6 +S1335,6.4,20.9 +S1336,108.7,349.3 +S1337,94.1,79.4 +S1338,52.3,131.2 +S1339,89.5,167.3 +S1340,62.2,275.4 +S1341,57.2,216.1 +S1342,77.1,166.2 +S1343,14.0,5.0 +S1344,67.8,104.7 +S1345,44.4,180.5 +S1346,53.9,232.3 +S1347,114.9,98.6 +S1348,114.8,348.2 +S1349,112.1,399.2 +S1350,27.0,10.8 +S1351,65.9,191.8 +S1352,114.1,329.9 +S1353,93.4,250.3 +S1354,113.6,99.6 +S1355,7.5,62.7 +S1356,78.6,95.6 +S1357,57.9,239.1 +S1358,87.9,186.0 +S1359,75.3,159.7 +S1360,13.2,122.9 +S1361,70.8,266.3 +S1362,53.6,201.1 +S1363,81.3,131.8 +S1364,62.6,5.0 +S1365,58.9,147.5 +S1366,42.3,37.5 +S1367,41.2,108.0 +S1368,114.6,242.1 +S1369,22.7,88.3 +S1370,108.5,278.8 +S1371,35.6,14.5 +S1372,43.6,208.7 +S1373,28.2,172.9 +S1374,11.4,92.1 +S1375,83.8,250.8 +S1376,110.7,324.6 +S1377,114.3,359.9 +S1378,107.8,140.8 +S1379,81.8,226.5 +S1380,22.3,100.8 +S1381,58.1,174.1 +S1382,29.6,21.6 +S1383,39.5,5.0 +S1384,111.6,228.0 +S1385,41.6,67.2 +S1386,63.8,187.2 +S1387,66.1,189.6 +S1388,50.8,153.5 +S1389,99.2,369.7 +S1390,115.7,247.3 +S1391,46.0,143.9 +S1392,75.1,61.2 +S1393,60.5,152.3 +S1394,108.2,248.8 +S1395,6.9,5.0 +S1396,15.8,62.7 +S1397,100.3,303.8 +S1398,96.0,326.7 +S1399,43.5,176.4 +S1400,86.5,151.7 +S1401,117.8,329.4 +S1402,49.2,133.0 +S1403,41.8,185.6 +S1404,19.3,139.3 +S1405,101.3,111.1 +S1406,54.0,186.0 +S1407,80.5,115.0 +S1408,71.5,211.3 +S1409,118.3,335.3 +S1410,99.8,355.9 +S1411,56.2,180.3 +S1412,48.4,205.0 +S1413,60.4,201.7 +S1414,29.6,194.4 +S1415,62.3,74.4 +S1416,24.3,25.0 +S1417,76.0,127.9 +S1418,37.4,199.0 +S1419,5.8,252.2 +S1420,46.1,158.2 +S1421,56.4,216.5 +S1422,85.1,303.3 +S1423,94.8,157.3 +S1424,32.2,136.6 +S1425,83.5,209.0 +S1426,29.0,65.9 +S1427,88.7,209.2 +S1428,25.8,164.4 +S1429,10.7,97.7 +S1430,34.6,140.0 +S1431,27.8,124.4 +S1432,17.8,43.1 +S1433,84.0,318.6 +S1434,113.6,269.1 +S1435,84.6,262.5 +S1436,104.3,327.8 +S1437,44.3,107.5 +S1438,86.0,260.3 +S1439,92.6,213.5 +S1440,27.6,7.4 +S1441,25.8,147.1 +S1442,66.5,233.2 +S1443,88.3,230.0 +S1444,108.5,353.5 +S1445,44.0,90.5 +S1446,93.5,191.1 +S1447,8.9,35.6 +S1448,54.1,5.0 +S1449,91.8,273.2 +S1450,40.2,106.3 +S1451,31.9,250.3 +S1452,25.4,5.0 +S1453,35.0,114.9 +S1454,59.3,96.7 +S1455,39.7,62.0 +S1456,119.4,201.3 +S1457,51.8,36.8 +S1458,94.2,252.1 +S1459,79.2,212.8 +S1460,38.5,93.2 +S1461,116.3,372.9 +S1462,85.7,200.4 +S1463,49.0,124.7 +S1464,14.2,5.0 +S1465,34.3,185.8 +S1466,29.4,178.1 +S1467,80.5,272.2 +S1468,41.7,77.9 +S1469,52.0,97.3 +S1470,81.9,281.7 +S1471,22.3,154.2 +S1472,31.8,153.8 +S1473,34.3,168.7 +S1474,98.7,327.8 +S1475,61.8,162.9 +S1476,64.6,193.2 +S1477,18.4,56.3 +S1478,31.4,37.1 +S1479,113.6,147.2 +S1480,63.5,163.8 +S1481,88.4,288.9 +S1482,31.4,54.0 +S1483,92.4,187.3 +S1484,64.1,192.6 +S1485,45.1,195.6 +S1486,82.9,345.7 +S1487,119.3,346.5 +S1488,85.7,224.3 +S1489,15.1,83.4 +S1490,41.7,111.6 +S1491,10.8,88.2 +S1492,106.3,186.7 +S1493,25.8,87.7 +S1494,119.7,204.5 +S1495,117.5,160.4 +S1496,54.0,139.7 +S1497,57.6,195.8 +S1498,24.2,129.6 +S1499,11.2,5.0 +S1500,85.7,170.7 +S1501,116.4,176.0 +S1502,76.1,120.7 +S1503,66.3,230.7 +S1504,109.3,179.7 +S1505,87.9,253.9 +S1506,86.8,225.9 +S1507,111.7,347.2 +S1508,101.8,269.3 +S1509,32.1,157.8 +S1510,86.0,272.6 +S1511,112.3,292.8 +S1512,57.6,221.9 +S1513,76.1,199.2 +S1514,79.3,135.2 +S1515,73.9,291.9 +S1516,118.3,311.8 +S1517,83.4,183.8 +S1518,28.6,170.8 +S1519,23.7,32.9 +S1520,46.8,154.0 +S1521,62.8,335.8 +S1522,63.4,201.8 +S1523,97.2,250.0 +S1524,107.8,286.9 +S1525,98.3,208.9 +S1526,64.9,146.9 +S1527,9.1,5.0 +S1528,44.9,87.7 +S1529,68.1,245.0 +S1530,63.2,176.0 +S1531,29.3,58.7 +S1532,113.7,348.7 +S1533,48.5,179.0 +S1534,90.4,125.8 +S1535,93.8,192.1 +S1536,49.3,171.3 +S1537,102.1,177.4 +S1538,21.8,88.2 +S1539,111.3,322.8 +S1540,14.7,70.8 +S1541,68.8,228.6 +S1542,23.3,116.0 +S1543,12.0,50.7 +S1544,39.7,5.0 +S1545,19.7,104.8 +S1546,78.8,257.8 +S1547,65.9,238.0 +S1548,39.9,147.7 +S1549,27.3,156.2 +S1550,98.0,288.9 +S1551,117.7,236.9 +S1552,109.1,230.0 +S1553,13.3,139.9 +S1554,97.2,221.9 +S1555,15.1,47.4 +S1556,109.1,205.9 +S1557,60.3,127.2 +S1558,14.4,59.8 +S1559,52.5,145.2 +S1560,40.5,146.0 +S1561,117.0,182.9 +S1562,67.3,146.2 +S1563,94.6,290.2 +S1564,110.8,363.9 +S1565,90.9,337.2 +S1566,86.0,261.9 +S1567,107.1,244.2 +S1568,50.3,145.0 +S1569,64.4,91.0 +S1570,65.0,248.2 +S1571,83.6,250.8 +S1572,34.4,186.5 +S1573,61.0,144.6 +S1574,33.8,231.0 +S1575,52.0,49.9 +S1576,74.9,81.9 +S1577,54.0,226.9 +S1578,59.7,79.1 +S1579,108.6,208.1 +S1580,61.8,136.5 +S1581,68.3,172.7 +S1582,102.6,394.8 +S1583,79.2,248.4 +S1584,118.7,299.9 +S1585,106.9,287.9 +S1586,43.4,115.6 +S1587,93.4,180.6 +S1588,25.8,87.9 +S1589,51.4,182.3 +S1590,87.4,192.0 +S1591,12.3,98.6 +S1592,76.3,196.0 +S1593,100.7,274.3 +S1594,50.3,81.1 +S1595,65.1,149.4 +S1596,46.6,63.8 +S1597,93.4,238.4 +S1598,40.3,51.6 +S1599,7.5,8.1 +S1600,15.6,5.0 +S1601,89.0,219.4 +S1602,102.5,348.6 +S1603,105.5,268.9 +S1604,23.1,123.3 +S1605,100.4,421.5 +S1606,102.7,267.1 +S1607,32.9,5.0 +S1608,9.0,97.0 +S1609,115.1,302.9 +S1610,14.6,5.0 +S1611,85.3,162.3 +S1612,89.6,313.7 +S1613,81.2,122.9 +S1614,91.3,287.8 +S1615,97.8,310.8 +S1616,94.1,202.2 +S1617,91.5,187.7 +S1618,66.0,207.2 +S1619,41.8,33.0 +S1620,88.8,280.1 +S1621,107.5,194.3 +S1622,31.0,36.6 +S1623,37.5,113.9 +S1624,82.2,295.2 +S1625,71.4,57.7 +S1626,95.9,142.9 +S1627,79.4,216.9 +S1628,117.3,174.4 +S1629,70.7,222.4 +S1630,58.1,104.2 +S1631,39.2,124.0 +S1632,46.8,55.7 +S1633,61.8,155.5 +S1634,116.3,354.1 +S1635,85.7,197.9 +S1636,83.6,289.9 +S1637,56.0,5.0 +S1638,99.3,288.7 +S1639,22.1,5.0 +S1640,39.7,204.5 +S1641,92.0,268.1 +S1642,101.2,212.4 +S1643,80.0,149.3 +S1644,105.1,218.2 +S1645,26.1,238.4 +S1646,87.0,229.0 +S1647,15.5,77.0 +S1648,88.2,285.3 +S1649,40.3,158.1 +S1650,70.1,140.7 +S1651,51.7,165.3 +S1652,9.9,119.0 +S1653,26.6,184.1 +S1654,50.6,129.5 +S1655,7.3,93.2 +S1656,75.8,233.7 +S1657,113.0,246.9 +S1658,67.8,289.6 +S1659,78.9,205.5 +S1660,69.4,251.7 +S1661,104.0,234.9 +S1662,37.7,253.3 +S1663,108.9,343.7 +S1664,78.6,320.9 +S1665,72.8,267.0 +S1666,103.3,161.1 +S1667,52.6,293.4 +S1668,19.9,182.5 +S1669,74.2,114.3 +S1670,84.7,403.6 +S1671,26.0,135.9 +S1672,50.2,136.0 +S1673,65.5,203.7 +S1674,43.4,165.2 +S1675,59.4,76.4 +S1676,87.3,178.4 +S1677,98.2,245.8 +S1678,86.3,194.0 +S1679,103.5,244.2 +S1680,52.5,144.6 +S1681,103.8,178.5 +S1682,74.1,165.7 +S1683,22.2,60.2 +S1684,49.1,191.4 +S1685,79.0,202.4 +S1686,46.0,88.5 +S1687,58.7,176.5 +S1688,57.9,50.6 +S1689,19.9,83.7 +S1690,117.3,330.9 +S1691,33.4,81.6 +S1692,9.9,35.9 +S1693,89.9,172.1 +S1694,52.9,264.6 +S1695,62.4,257.6 +S1696,50.0,75.9 +S1697,69.4,313.2 +S1698,43.8,106.8 +S1699,102.0,110.1 +S1700,66.5,167.5 +S1701,77.0,401.8 +S1702,60.3,151.3 +S1703,101.4,230.1 +S1704,23.7,107.3 +S1705,48.7,90.5 +S1706,38.9,76.4 +S1707,91.6,246.5 +S1708,113.3,290.2 +S1709,78.2,251.2 +S1710,116.5,258.9 +S1711,42.0,224.3 +S1712,79.8,188.2 +S1713,38.3,175.1 +S1714,73.3,183.2 +S1715,57.1,68.0 +S1716,84.9,271.6 +S1717,21.1,190.6 +S1718,6.5,114.3 +S1719,101.0,199.9 +S1720,20.0,41.7 +S1721,76.6,241.3 +S1722,17.2,5.0 +S1723,107.5,236.8 +S1724,29.4,62.7 +S1725,116.6,333.5 +S1726,95.6,335.4 +S1727,66.5,132.3 +S1728,56.4,151.4 +S1729,76.7,87.6 +S1730,17.1,81.1 +S1731,101.8,209.9 +S1732,23.2,69.9 +S1733,47.7,85.9 +S1734,76.7,136.2 +S1735,11.6,5.0 +S1736,63.7,186.3 +S1737,87.2,283.6 +S1738,13.3,177.5 +S1739,57.3,174.3 +S1740,26.3,195.2 +S1741,82.7,156.1 +S1742,51.1,111.7 +S1743,113.6,221.9 +S1744,102.2,229.3 +S1745,46.9,5.0 +S1746,14.7,64.4 +S1747,40.7,158.5 +S1748,33.0,64.1 +S1749,23.3,14.8 +S1750,68.7,194.1 +S1751,76.2,237.7 +S1752,105.7,279.5 +S1753,55.3,5.1 +S1754,78.2,152.3 +S1755,78.2,183.3 +S1756,41.3,238.2 +S1757,36.9,190.8 +S1758,119.6,284.9 +S1759,35.6,168.5 +S1760,86.5,179.4 +S1761,48.1,84.2 +S1762,50.3,86.1 +S1763,64.8,188.2 +S1764,67.2,309.7 +S1765,14.0,5.0 +S1766,15.9,129.6 +S1767,28.3,31.0 +S1768,53.8,126.9 +S1769,12.4,94.9 +S1770,15.9,12.4 +S1771,29.0,30.3 +S1772,65.2,229.7 +S1773,51.2,117.4 +S1774,115.3,353.2 +S1775,16.7,156.7 +S1776,60.1,72.1 +S1777,53.8,12.7 +S1778,25.3,56.2 +S1779,110.2,279.2 +S1780,110.6,316.2 +S1781,102.5,269.4 +S1782,98.6,74.9 +S1783,32.5,60.0 +S1784,64.4,97.6 +S1785,111.7,334.4 +S1786,91.3,198.6 +S1787,69.0,250.5 +S1788,65.8,122.0 +S1789,32.9,73.2 +S1790,18.6,46.1 +S1791,82.5,138.5 +S1792,56.3,150.7 +S1793,41.3,148.9 +S1794,18.1,5.0 +S1795,72.5,179.1 +S1796,79.1,250.0 +S1797,111.7,221.2 +S1798,10.3,108.8 +S1799,117.2,273.0 +S1800,11.2,137.9 +S1801,89.0,371.3 +S1802,36.9,144.6 +S1803,23.8,25.4 +S1804,98.0,182.6 +S1805,107.2,242.4 +S1806,79.8,110.3 +S1807,114.9,274.2 +S1808,112.9,215.5 +S1809,66.0,185.0 +S1810,115.0,425.2 +S1811,52.6,178.3 +S1812,35.8,59.7 +S1813,29.3,115.5 +S1814,79.0,154.0 +S1815,80.8,249.8 +S1816,46.6,89.2 +S1817,65.2,260.7 +S1818,104.9,347.5 +S1819,62.9,291.6 +S1820,55.1,259.2 +S1821,109.4,199.4 +S1822,85.4,235.7 +S1823,51.5,168.1 +S1824,97.0,250.4 +S1825,92.8,104.9 +S1826,39.1,70.2 +S1827,82.9,178.5 +S1828,32.5,179.1 +S1829,72.3,157.1 +S1830,86.4,269.5 +S1831,17.7,22.0 +S1832,113.7,317.3 +S1833,27.0,71.0 +S1834,102.7,260.2 +S1835,74.7,98.2 +S1836,23.2,211.9 +S1837,23.3,120.3 +S1838,118.3,314.1 +S1839,10.1,68.1 +S1840,87.3,152.9 +S1841,28.4,134.6 +S1842,114.8,198.9 +S1843,48.1,106.9 +S1844,99.4,228.6 +S1845,118.2,300.9 +S1846,46.8,11.5 +S1847,61.8,56.4 +S1848,33.7,91.5 +S1849,69.7,194.9 +S1850,119.4,222.3 +S1851,6.9,5.0 +S1852,55.4,209.9 +S1853,52.6,265.3 +S1854,14.9,36.4 +S1855,62.7,129.4 +S1856,83.8,280.5 +S1857,98.5,211.0 +S1858,89.8,289.6 +S1859,110.3,322.7 +S1860,25.8,144.5 +S1861,64.5,302.8 +S1862,50.7,178.3 +S1863,38.8,123.0 +S1864,94.5,307.5 +S1865,46.7,156.3 +S1866,14.8,5.0 +S1867,87.9,324.3 +S1868,35.1,140.3 +S1869,5.2,145.3 +S1870,71.4,263.6 +S1871,35.5,276.5 +S1872,14.1,96.8 +S1873,16.5,163.1 +S1874,22.0,77.9 +S1875,90.9,210.2 +S1876,93.7,198.9 +S1877,89.8,188.7 +S1878,59.0,63.9 +S1879,80.8,180.0 +S1880,103.3,314.3 +S1881,96.3,272.8 +S1882,54.0,181.2 +S1883,24.9,40.0 +S1884,46.6,189.8 +S1885,90.6,216.9 +S1886,40.4,230.3 +S1887,108.6,216.2 +S1888,27.4,17.9 +S1889,35.2,152.0 +S1890,17.2,142.3 +S1891,88.2,274.6 +S1892,48.5,202.9 +S1893,54.5,260.9 +S1894,95.5,242.6 +S1895,12.6,56.3 +S1896,26.0,90.6 +S1897,85.6,224.9 +S1898,119.7,259.1 +S1899,61.3,137.6 +S1900,107.5,173.7 +S1901,60.2,122.7 +S1902,36.8,148.9 +S1903,7.6,161.1 +S1904,22.5,152.6 +S1905,85.5,294.7 +S1906,36.7,204.9 +S1907,94.2,261.9 +S1908,21.3,5.0 +S1909,95.8,231.7 +S1910,73.2,261.5 +S1911,46.5,208.4 +S1912,106.9,212.3 +S1913,69.0,204.1 +S1914,37.8,146.9 +S1915,101.7,273.1 +S1916,67.7,154.0 +S1917,78.5,270.3 +S1918,94.6,256.2 +S1919,87.3,143.5 +S1920,88.2,197.4 +S1921,101.0,288.6 +S1922,36.1,100.8 +S1923,100.5,144.2 +S1924,44.8,236.5 +S1925,7.8,5.0 +S1926,41.8,192.2 +S1927,64.2,77.8 +S1928,77.1,265.9 +S1929,94.4,296.8 +S1930,52.2,194.2 +S1931,87.0,253.3 +S1932,41.2,120.2 +S1933,93.9,196.8 +S1934,93.1,195.6 +S1935,115.3,297.8 +S1936,119.8,347.7 +S1937,49.9,132.6 +S1938,74.5,54.1 +S1939,28.8,25.1 +S1940,40.4,137.8 +S1941,69.7,262.9 +S1942,71.0,33.4 +S1943,32.1,199.9 +S1944,48.3,131.4 +S1945,34.1,156.9 +S1946,105.8,268.8 +S1947,54.6,67.1 +S1948,96.1,86.5 +S1949,89.3,211.4 +S1950,6.9,149.2 +S1951,70.3,111.1 +S1952,89.8,190.5 +S1953,37.6,19.9 +S1954,117.0,269.8 +S1955,15.2,45.4 +S1956,83.2,229.3 +S1957,43.4,94.7 +S1958,32.3,94.1 +S1959,39.1,33.5 +S1960,67.9,190.8 +S1961,112.2,359.1 +S1962,69.4,211.9 +S1963,35.1,45.8 +S1964,47.3,145.1 +S1965,18.5,86.5 +S1966,90.9,237.9 +S1967,94.3,267.3 +S1968,65.7,129.3 +S1969,116.1,293.0 +S1970,25.6,5.0 +S1971,91.2,238.4 +S1972,54.9,141.3 +S1973,94.2,190.7 +S1974,22.3,65.5 +S1975,64.4,157.1 +S1976,76.1,232.3 +S1977,117.2,283.8 +S1978,117.7,307.9 +S1979,15.1,53.8 +S1980,97.7,230.0 +S1981,100.4,275.0 +S1982,75.1,101.7 +S1983,105.6,207.3 +S1984,108.1,197.1 +S1985,118.9,138.1 +S1986,92.3,178.4 +S1987,79.4,105.8 +S1988,82.6,200.8 +S1989,28.1,209.7 +S1990,8.4,52.4 +S1991,57.7,221.6 +S1992,79.1,250.6 +S1993,15.2,121.0 +S1994,32.9,137.9 +S1995,6.7,25.5 +S1996,113.9,245.3 +S1997,35.2,81.2 +S1998,55.3,159.5 +S1999,89.5,369.9 +S2000,59.4,77.1 +S2001,80.7,240.5 +S2002,7.3,33.3 +S2003,41.9,24.5 +S2004,17.7,5.0 +S2005,66.0,123.8 +S2006,83.4,216.5 +S2007,30.9,87.5 +S2008,73.9,300.4 +S2009,18.3,5.0 +S2010,56.6,139.3 +S2011,57.0,125.8 +S2012,79.5,194.9 +S2013,29.3,113.2 +S2014,40.6,150.8 +S2015,83.6,245.2 +S2016,118.1,201.4 +S2017,10.8,5.0 +S2018,46.1,126.5 +S2019,112.6,225.9 +S2020,44.1,5.0 +S2021,28.0,80.6 +S2022,71.0,84.5 +S2023,119.8,255.1 +S2024,15.3,5.0 +S2025,64.4,127.8 +S2026,108.3,160.1 +S2027,77.1,160.2 +S2028,106.2,284.7 +S2029,13.3,99.9 +S2030,6.9,116.7 +S2031,33.5,197.5 +S2032,54.3,98.5 +S2033,25.4,140.6 +S2034,77.6,144.9 +S2035,7.6,61.0 +S2036,15.2,181.2 +S2037,30.3,68.2 +S2038,21.8,223.2 +S2039,60.3,146.6 +S2040,79.4,259.7 +S2041,85.8,130.3 +S2042,107.7,317.7 +S2043,10.8,16.7 +S2044,24.8,110.6 +S2045,26.2,90.8 +S2046,105.9,381.0 +S2047,115.0,328.6 +S2048,79.4,146.8 +S2049,86.8,169.9 +S2050,73.8,231.1 +S2051,110.2,274.4 +S2052,117.0,381.0 +S2053,39.3,81.2 +S2054,84.8,125.3 +S2055,83.5,358.9 +S2056,54.7,372.7 +S2057,11.7,5.0 +S2058,101.6,259.1 +S2059,40.3,135.8 +S2060,118.5,234.0 +S2061,21.7,78.4 +S2062,6.3,22.2 +S2063,8.0,185.7 +S2064,31.8,56.5 +S2065,112.2,247.5 +S2066,49.8,254.6 +S2067,78.8,345.0 +S2068,14.9,151.8 +S2069,104.3,258.5 +S2070,82.7,266.0 +S2071,44.2,211.4 +S2072,6.6,5.0 +S2073,86.8,174.1 +S2074,79.6,163.8 +S2075,74.9,98.0 +S2076,21.1,72.7 +S2077,57.0,119.6 +S2078,35.3,5.0 +S2079,79.1,316.4 +S2080,18.0,74.1 +S2081,66.6,198.9 +S2082,114.0,267.1 +S2083,103.9,357.7 +S2084,29.5,87.2 +S2085,106.0,258.1 +S2086,89.9,180.8 +S2087,12.8,25.0 +S2088,50.2,208.4 +S2089,115.4,267.0 +S2090,73.0,159.9 +S2091,104.2,254.2 +S2092,44.0,126.7 +S2093,74.1,209.2 +S2094,33.1,5.0 +S2095,108.8,267.7 +S2096,92.8,100.5 +S2097,116.4,274.6 +S2098,118.4,189.2 +S2099,7.5,5.0 +S2100,27.2,51.1 +S2101,44.6,280.9 +S2102,53.4,63.3 +S2103,19.9,134.2 +S2104,71.2,199.8 +S2105,18.4,157.5 +S2106,92.2,242.9 +S2107,41.9,241.7 +S2108,61.6,179.8 +S2109,38.4,31.2 +S2110,98.1,243.1 +S2111,105.3,217.5 +S2112,105.1,272.0 +S2113,58.8,221.2 +S2114,86.9,241.4 +S2115,19.8,85.4 +S2116,91.7,301.8 +S2117,77.9,271.4 +S2118,117.0,278.5 +S2119,12.0,5.0 +S2120,26.9,129.4 +S2121,95.8,192.3 +S2122,117.3,328.9 +S2123,65.4,102.7 +S2124,87.0,313.1 +S2125,119.6,380.4 +S2126,76.7,285.0 +S2127,85.2,154.2 +S2128,60.4,225.8 +S2129,92.1,315.9 +S2130,56.2,8.2 +S2131,39.7,166.8 +S2132,93.4,333.0 +S2133,63.0,117.8 +S2134,38.0,239.9 +S2135,14.2,178.8 +S2136,95.9,299.1 +S2137,49.7,121.2 +S2138,52.5,181.1 +S2139,24.5,52.1 +S2140,56.6,207.2 +S2141,54.8,214.9 +S2142,118.7,308.0 +S2143,72.3,212.0 +S2144,32.9,31.2 +S2145,16.6,24.4 +S2146,20.2,10.8 +S2147,86.2,104.9 +S2148,19.7,69.7 +S2149,50.3,135.0 +S2150,92.3,292.7 +S2151,85.3,259.1 +S2152,39.5,85.5 +S2153,110.1,375.1 +S2154,89.0,366.4 +S2155,115.5,332.4 +S2156,40.0,115.5 +S2157,99.8,185.6 +S2158,111.6,417.7 +S2159,115.9,379.4 +S2160,60.0,245.2 +S2161,9.3,143.0 +S2162,106.9,317.6 +S2163,11.1,13.5 +S2164,48.6,128.8 +S2165,35.9,117.6 +S2166,30.4,107.3 +S2167,110.7,251.1 +S2168,70.5,180.6 +S2169,60.2,232.9 +S2170,5.8,87.9 +S2171,14.4,154.1 +S2172,66.0,132.5 +S2173,5.2,50.7 +S2174,14.3,74.9 +S2175,11.5,78.9 +S2176,107.1,86.4 +S2177,26.6,102.0 +S2178,114.5,344.3 +S2179,41.3,86.6 +S2180,37.8,137.1 +S2181,48.6,64.4 +S2182,19.6,74.7 +S2183,9.4,123.0 +S2184,48.3,101.0 +S2185,84.6,197.3 +S2186,22.5,137.6 +S2187,59.2,42.1 +S2188,87.4,261.1 +S2189,29.8,174.4 +S2190,14.9,126.5 +S2191,60.8,162.4 +S2192,17.6,144.7 +S2193,116.8,268.6 +S2194,75.6,174.9 +S2195,81.7,193.4 +S2196,12.5,62.8 +S2197,84.5,139.4 +S2198,113.5,288.8 +S2199,48.1,235.3 +S2200,75.2,215.6 +S2201,35.7,122.4 +S2202,67.7,179.2 +S2203,93.5,165.9 +S2204,15.4,76.8 +S2205,58.5,64.9 +S2206,83.3,177.7 +S2207,58.7,284.1 +S2208,111.9,91.9 +S2209,105.1,219.5 +S2210,17.4,5.0 +S2211,62.3,149.6 +S2212,70.3,316.2 +S2213,118.0,280.0 +S2214,72.3,207.3 +S2215,40.5,281.3 +S2216,89.8,263.1 +S2217,65.2,298.9 +S2218,76.6,313.6 +S2219,7.0,37.8 +S2220,88.7,126.2 +S2221,66.4,176.2 +S2222,79.5,235.2 +S2223,11.2,80.4 +S2224,54.1,207.2 +S2225,86.0,144.8 +S2226,12.0,29.3 +S2227,84.1,267.4 +S2228,89.2,231.1 +S2229,104.3,90.8 +S2230,58.4,44.6 +S2231,26.2,231.1 +S2232,14.7,84.2 +S2233,97.0,309.3 +S2234,49.7,177.1 +S2235,111.2,108.6 +S2236,23.6,153.7 +S2237,76.1,149.8 +S2238,115.0,459.2 +S2239,22.5,33.4 +S2240,111.3,213.6 +S2241,93.7,336.9 +S2242,88.6,223.0 +S2243,102.2,303.7 +S2244,60.2,294.5 +S2245,33.6,89.8 +S2246,32.0,108.0 +S2247,29.4,161.5 +S2248,7.2,5.0 +S2249,44.9,219.6 +S2250,33.2,279.6 +S2251,104.3,292.9 +S2252,8.4,38.8 +S2253,68.0,139.6 +S2254,105.4,307.1 +S2255,90.9,238.6 +S2256,49.8,176.4 +S2257,64.6,133.1 +S2258,15.0,11.9 +S2259,70.1,244.9 +S2260,8.2,5.0 +S2261,72.2,76.1 +S2262,46.1,196.7 +S2263,75.7,252.4 +S2264,17.8,131.7 +S2265,36.2,101.6 +S2266,49.3,242.5 +S2267,107.4,282.2 +S2268,36.2,189.4 +S2269,90.0,172.9 +S2270,35.5,164.4 +S2271,108.5,222.6 +S2272,118.1,324.8 +S2273,27.6,176.6 +S2274,62.9,256.6 +S2275,106.4,172.6 +S2276,17.2,5.6 +S2277,29.2,37.8 +S2278,63.8,150.8 +S2279,118.6,342.7 +S2280,116.4,195.6 +S2281,111.4,261.6 +S2282,80.5,145.2 +S2283,88.3,247.7 +S2284,108.6,249.5 +S2285,110.4,302.2 +S2286,99.1,189.0 +S2287,103.1,204.6 +S2288,96.0,141.1 +S2289,75.5,183.1 +S2290,69.2,120.4 +S2291,113.7,276.5 +S2292,37.5,110.8 +S2293,49.9,95.6 +S2294,61.6,176.3 +S2295,99.8,205.7 +S2296,15.2,51.9 +S2297,18.1,131.8 +S2298,112.5,204.8 +S2299,90.9,294.3 +S2300,96.3,358.6 +S2301,81.7,135.4 +S2302,93.4,281.1 +S2303,46.7,151.1 +S2304,63.4,142.7 +S2305,98.3,344.8 +S2306,28.4,42.3 +S2307,64.2,230.8 +S2308,105.5,309.1 +S2309,107.2,258.0 +S2310,71.0,191.8 +S2311,89.6,304.3 +S2312,67.4,190.8 +S2313,102.8,252.0 +S2314,70.8,140.5 +S2315,88.3,271.1 +S2316,71.4,156.3 +S2317,95.7,392.7 +S2318,5.7,263.1 +S2319,102.9,302.3 +S2320,37.3,63.1 +S2321,71.2,144.8 +S2322,101.0,95.7 +S2323,89.5,231.0 +S2324,73.5,202.1 +S2325,43.7,226.6 +S2326,5.0,116.4 +S2327,119.1,234.2 +S2328,44.0,237.3 +S2329,40.2,16.5 +S2330,12.6,174.2 +S2331,103.6,214.4 +S2332,55.4,277.4 +S2333,15.5,162.5 +S2334,103.4,269.3 +S2335,41.9,109.6 +S2336,117.7,76.0 +S2337,70.3,140.2 +S2338,80.0,252.8 +S2339,119.5,254.9 +S2340,37.1,39.1 +S2341,11.3,114.4 +S2342,44.7,163.1 +S2343,56.1,224.6 +S2344,113.9,226.0 +S2345,72.8,163.2 +S2346,11.6,9.4 +S2347,18.3,5.0 +S2348,51.8,50.9 +S2349,106.8,308.6 +S2350,68.5,117.1 +S2351,7.7,5.0 +S2352,6.5,72.4 +S2353,33.7,166.9 +S2354,97.9,278.6 +S2355,80.9,285.9 +S2356,46.0,148.2 +S2357,29.3,109.6 +S2358,94.4,270.9 +S2359,38.3,150.7 +S2360,104.5,280.8 +S2361,17.4,59.7 +S2362,34.9,123.0 +S2363,52.9,85.9 +S2364,70.9,158.4 +S2365,65.8,161.0 +S2366,78.1,274.1 +S2367,31.6,96.7 +S2368,107.0,149.8 +S2369,94.2,259.7 +S2370,87.0,300.6 +S2371,45.6,210.0 +S2372,110.5,279.8 +S2373,18.6,58.4 +S2374,104.3,174.2 +S2375,41.6,32.5 +S2376,31.1,112.1 +S2377,68.5,59.4 +S2378,30.3,100.3 +S2379,46.7,122.9 +S2380,113.3,194.4 +S2381,6.8,16.7 +S2382,99.4,256.9 +S2383,9.2,5.0 +S2384,102.4,142.8 +S2385,37.9,146.0 +S2386,38.5,231.7 +S2387,114.5,293.2 +S2388,52.2,285.9 +S2389,64.7,122.7 +S2390,55.4,170.0 +S2391,84.4,223.8 +S2392,12.6,195.0 +S2393,8.1,153.2 +S2394,116.5,297.1 +S2395,72.2,217.7 +S2396,119.9,242.0 +S2397,61.0,124.2 +S2398,47.0,242.4 +S2399,99.9,321.4 +S2400,26.0,40.3 +S2401,78.3,162.5 +S2402,72.2,57.4 +S2403,72.1,291.5 +S2404,100.8,198.8 +S2405,54.8,178.9 +S2406,112.9,293.1 +S2407,109.4,113.4 +S2408,23.7,67.5 +S2409,102.4,185.6 +S2410,82.8,159.6 +S2411,71.8,255.5 +S2412,112.6,256.0 +S2413,34.7,65.2 +S2414,31.6,11.8 +S2415,67.8,103.0 +S2416,117.0,259.5 +S2417,71.9,273.7 +S2418,33.1,80.0 +S2419,50.5,152.6 +S2420,47.0,202.8 +S2421,54.9,281.0 +S2422,61.0,283.6 +S2423,56.2,5.0 +S2424,116.9,350.5 +S2425,111.9,288.1 +S2426,39.9,124.5 +S2427,28.9,164.7 +S2428,60.7,170.1 +S2429,116.3,210.6 +S2430,115.6,185.0 +S2431,56.0,255.1 +S2432,90.9,160.1 +S2433,66.4,109.6 +S2434,96.9,274.4 +S2435,113.1,217.7 +S2436,19.0,71.4 +S2437,31.0,52.7 +S2438,74.5,201.6 +S2439,20.2,101.6 +S2440,32.2,114.7 +S2441,91.9,275.7 +S2442,63.9,180.2 +S2443,73.2,215.5 +S2444,37.0,176.6 +S2445,29.1,167.1 +S2446,101.9,332.4 +S2447,77.3,217.5 +S2448,72.8,157.1 +S2449,76.8,168.6 +S2450,108.2,219.1 +S2451,17.9,5.0 +S2452,80.2,216.6 +S2453,88.3,278.9 +S2454,77.2,350.0 +S2455,23.7,63.1 +S2456,54.2,79.1 +S2457,39.7,181.5 +S2458,39.1,139.3 +S2459,51.9,89.6 +S2460,19.9,134.9 +S2461,10.0,35.3 +S2462,14.1,60.6 +S2463,70.5,344.3 +S2464,111.7,140.0 +S2465,111.1,247.2 +S2466,14.1,69.1 +S2467,107.1,322.9 +S2468,114.3,357.9 +S2469,74.1,192.8 +S2470,80.5,220.2 +S2471,44.6,181.4 +S2472,96.7,334.3 +S2473,52.1,74.8 +S2474,102.5,283.3 +S2475,97.0,231.1 +S2476,5.4,81.5 +S2477,12.8,132.2 +S2478,45.4,74.1 +S2479,64.7,80.5 +S2480,48.0,150.7 +S2481,39.5,142.2 +S2482,51.7,188.7 +S2483,94.1,194.5 +S2484,117.4,143.2 +S2485,104.7,154.8 +S2486,103.1,299.0 +S2487,51.8,100.2 +S2488,26.6,41.9 +S2489,105.6,337.1 +S2490,53.3,249.6 +S2491,36.7,87.8 +S2492,10.1,49.9 +S2493,108.1,308.7 +S2494,82.0,247.8 +S2495,82.4,187.9 +S2496,36.5,214.8 +S2497,85.6,264.4 +S2498,37.8,26.4 +S2499,82.0,233.2 +S2500,64.6,197.5 +S2501,97.2,182.3 +S2502,58.3,143.0 +S2503,105.1,251.6 +S2504,117.2,336.9 +S2505,87.8,235.9 +S2506,11.7,51.1 +S2507,112.6,259.7 +S2508,114.7,335.1 +S2509,107.8,276.5 +S2510,119.5,321.7 +S2511,31.7,235.9 +S2512,96.6,300.7 +S2513,75.5,159.7 +S2514,77.8,192.0 +S2515,91.3,209.7 +S2516,39.3,35.2 +S2517,118.7,385.3 +S2518,116.1,338.5 +S2519,8.9,122.5 +S2520,69.2,223.8 +S2521,88.1,230.9 +S2522,51.3,208.4 +S2523,32.5,40.3 +S2524,36.9,99.8 +S2525,114.7,257.4 +S2526,106.9,342.6 +S2527,84.4,206.4 +S2528,71.0,212.2 +S2529,44.0,149.3 +S2530,80.7,260.1 +S2531,36.6,164.8 +S2532,26.4,95.1 +S2533,76.5,315.0 +S2534,52.3,13.5 +S2535,98.8,66.3 +S2536,115.4,306.7 +S2537,86.5,191.2 +S2538,63.7,149.8 +S2539,56.3,181.1 +S2540,92.3,83.8 +S2541,112.4,280.2 +S2542,21.7,143.0 +S2543,52.3,39.6 +S2544,31.9,75.7 +S2545,104.2,103.3 +S2546,65.1,250.1 +S2547,79.2,166.0 +S2548,88.3,192.2 +S2549,20.8,101.6 +S2550,39.5,61.0 +S2551,36.7,241.2 +S2552,102.6,223.7 +S2553,112.9,196.1 +S2554,75.4,174.5 +S2555,100.7,294.4 +S2556,95.7,345.8 +S2557,14.2,56.9 +S2558,59.4,289.5 +S2559,32.2,202.2 +S2560,69.3,85.3 +S2561,117.7,293.3 +S2562,63.8,202.9 +S2563,49.7,158.0 +S2564,25.9,61.9 +S2565,68.7,221.6 +S2566,76.5,140.2 +S2567,30.4,78.2 +S2568,83.2,260.8 +S2569,100.9,444.2 +S2570,88.9,166.8 +S2571,91.4,299.4 +S2572,20.9,93.1 +S2573,13.2,84.4 +S2574,54.1,235.4 +S2575,52.2,149.5 +S2576,90.4,240.2 +S2577,28.5,224.0 +S2578,73.1,196.7 +S2579,76.7,176.5 +S2580,43.2,183.0 +S2581,79.1,338.7 +S2582,81.5,204.1 +S2583,10.5,63.4 +S2584,42.9,235.5 +S2585,92.5,212.6 +S2586,109.9,233.5 +S2587,13.4,99.1 +S2588,85.7,295.5 +S2589,25.3,18.8 +S2590,53.6,60.6 +S2591,71.4,292.5 +S2592,94.7,243.4 +S2593,38.9,130.5 +S2594,42.9,85.4 +S2595,89.1,299.8 +S2596,22.0,132.6 +S2597,56.8,207.0 +S2598,61.1,178.5 +S2599,118.2,224.2 +S2600,72.6,116.0 +S2601,11.6,101.8 +S2602,94.1,266.4 +S2603,25.1,94.9 +S2604,102.3,384.1 +S2605,45.9,170.9 +S2606,71.7,184.1 +S2607,71.6,110.8 +S2608,37.7,94.9 +S2609,30.9,133.2 +S2610,88.0,218.2 +S2611,91.2,171.8 +S2612,118.2,331.5 +S2613,50.5,5.0 +S2614,33.4,21.9 +S2615,113.4,279.6 +S2616,35.6,5.0 +S2617,97.9,224.5 +S2618,101.0,177.3 +S2619,19.7,66.0 +S2620,78.2,133.5 +S2621,38.0,44.8 +S2622,41.8,204.2 +S2623,78.7,261.8 +S2624,43.9,204.7 +S2625,30.0,106.8 +S2626,36.4,89.1 +S2627,111.9,243.2 +S2628,62.4,47.6 +S2629,10.2,12.6 +S2630,105.1,391.4 +S2631,6.0,77.5 +S2632,19.7,82.4 +S2633,40.3,5.0 +S2634,84.1,170.6 +S2635,78.7,282.1 +S2636,112.0,180.2 +S2637,87.2,214.3 +S2638,56.0,179.3 +S2639,82.8,241.0 +S2640,66.6,269.3 +S2641,91.7,251.9 +S2642,90.0,88.0 +S2643,103.5,222.0 +S2644,60.5,137.4 +S2645,71.0,257.6 +S2646,39.9,54.0 +S2647,7.0,128.7 +S2648,22.3,49.1 +S2649,37.5,191.7 +S2650,18.6,5.0 +S2651,7.2,43.7 +S2652,59.0,247.1 +S2653,81.4,311.0 +S2654,112.9,238.0 +S2655,117.1,173.5 +S2656,42.8,58.4 +S2657,93.7,223.0 +S2658,38.5,12.0 +S2659,29.2,5.0 +S2660,79.3,249.0 +S2661,24.3,63.6 +S2662,111.6,276.7 +S2663,99.9,216.2 +S2664,33.1,150.2 +S2665,107.8,256.5 +S2666,79.5,214.2 +S2667,20.5,246.7 +S2668,24.5,66.3 +S2669,25.2,5.0 +S2670,22.4,5.0 +S2671,116.0,230.9 +S2672,10.0,198.3 +S2673,33.5,120.0 +S2674,64.2,150.0 +S2675,60.4,231.2 +S2676,55.5,108.3 +S2677,13.6,5.0 +S2678,43.6,101.4 +S2679,80.3,284.0 +S2680,60.8,219.3 +S2681,53.3,101.3 +S2682,23.7,47.1 +S2683,42.1,92.8 +S2684,7.0,5.0 +S2685,78.2,308.7 +S2686,105.2,251.9 +S2687,108.0,283.3 +S2688,89.9,252.2 +S2689,22.6,41.3 +S2690,117.5,290.2 +S2691,105.3,249.3 +S2692,77.5,222.0 +S2693,64.0,109.7 +S2694,118.9,177.9 +S2695,38.4,116.9 +S2696,32.1,5.0 +S2697,69.9,153.9 +S2698,13.6,123.1 +S2699,25.5,182.8 +S2700,86.1,264.0 +S2701,119.3,272.8 +S2702,38.8,177.4 +S2703,71.6,205.1 +S2704,109.0,168.0 +S2705,40.7,91.2 +S2706,44.8,216.7 +S2707,41.2,97.3 +S2708,38.3,190.8 +S2709,54.9,240.6 +S2710,14.2,107.7 +S2711,59.4,186.4 +S2712,91.0,221.6 +S2713,97.8,224.5 +S2714,82.2,173.7 +S2715,6.5,116.8 +S2716,7.7,127.4 +S2717,99.1,212.9 +S2718,90.1,243.2 +S2719,56.4,121.8 +S2720,89.0,231.9 +S2721,61.1,121.4 +S2722,45.5,105.9 +S2723,69.4,205.4 +S2724,104.2,234.9 +S2725,88.9,169.7 +S2726,8.3,81.0 +S2727,102.4,140.2 +S2728,96.8,324.0 +S2729,17.2,130.1 +S2730,50.8,117.3 +S2731,61.8,193.0 +S2732,6.0,25.4 +S2733,81.8,229.6 +S2734,90.7,325.1 +S2735,24.8,12.2 +S2736,82.8,206.2 +S2737,78.5,190.3 +S2738,18.4,5.0 +S2739,110.5,322.2 +S2740,72.7,164.9 +S2741,93.4,194.1 +S2742,8.5,71.0 +S2743,15.6,45.8 +S2744,22.8,140.7 +S2745,119.0,287.0 +S2746,84.1,111.7 +S2747,22.3,97.2 +S2748,48.0,142.1 +S2749,31.2,116.9 +S2750,91.8,103.1 +S2751,47.9,241.1 +S2752,112.5,376.4 +S2753,22.0,5.0 +S2754,20.3,155.4 +S2755,19.3,119.9 +S2756,21.1,5.0 +S2757,66.4,124.6 +S2758,72.2,447.0 +S2759,6.2,8.7 +S2760,73.1,342.2 +S2761,87.6,169.0 +S2762,118.7,367.6 +S2763,92.7,261.6 +S2764,78.3,287.3 +S2765,94.5,200.0 +S2766,45.2,84.4 +S2767,84.0,200.0 +S2768,62.3,121.1 +S2769,7.5,35.3 +S2770,117.0,317.1 +S2771,49.4,114.6 +S2772,63.3,138.9 +S2773,23.2,116.4 +S2774,62.4,23.9 +S2775,37.0,143.2 +S2776,82.6,243.1 +S2777,90.8,159.9 +S2778,79.6,320.6 +S2779,60.3,181.5 +S2780,17.5,5.0 +S2781,11.6,5.0 +S2782,33.0,96.1 +S2783,55.1,223.5 +S2784,54.1,101.6 +S2785,61.3,62.2 +S2786,44.5,152.1 +S2787,18.6,167.1 +S2788,109.5,270.8 +S2789,8.8,86.9 +S2790,69.6,269.2 +S2791,101.0,136.1 +S2792,25.8,131.1 +S2793,14.7,200.0 +S2794,6.0,25.6 +S2795,15.0,124.2 +S2796,49.2,132.0 +S2797,107.1,283.7 +S2798,78.2,149.7 +S2799,107.2,439.6 +S2800,17.9,72.7 +S2801,82.3,240.7 +S2802,45.8,160.2 +S2803,44.2,107.6 +S2804,62.2,206.8 +S2805,109.8,213.1 +S2806,39.3,63.0 +S2807,97.1,222.2 +S2808,25.9,5.0 +S2809,74.5,186.2 +S2810,60.5,227.3 +S2811,10.7,87.2 +S2812,91.4,141.7 +S2813,90.3,163.7 +S2814,61.7,181.7 +S2815,17.7,89.2 +S2816,32.6,108.2 +S2817,12.2,20.9 +S2818,88.2,301.3 +S2819,92.7,319.2 +S2820,37.7,137.7 +S2821,118.9,283.8 +S2822,97.8,394.8 +S2823,48.1,8.0 +S2824,34.9,213.5 +S2825,91.9,288.6 +S2826,59.1,176.6 +S2827,61.5,122.6 +S2828,28.0,82.1 +S2829,62.5,117.3 +S2830,82.6,150.9 +S2831,50.5,163.5 +S2832,84.2,301.1 +S2833,11.3,62.7 +S2834,117.4,261.6 +S2835,40.8,199.9 +S2836,8.0,5.0 +S2837,102.2,111.9 +S2838,55.9,96.6 +S2839,26.1,5.0 +S2840,58.0,189.2 +S2841,111.0,241.0 +S2842,70.7,181.9 +S2843,34.4,183.0 +S2844,118.0,267.1 +S2845,22.2,123.4 +S2846,94.6,277.6 +S2847,77.7,186.3 +S2848,52.2,200.9 +S2849,6.0,151.0 +S2850,84.3,154.9 +S2851,70.1,216.2 +S2852,80.5,316.4 +S2853,72.2,200.2 +S2854,75.3,309.6 +S2855,69.3,167.0 +S2856,38.1,125.9 +S2857,109.1,234.1 +S2858,68.8,235.8 +S2859,103.3,213.4 +S2860,71.9,164.6 +S2861,97.8,232.9 +S2862,74.4,275.9 +S2863,116.4,232.5 +S2864,102.7,115.0 +S2865,78.6,260.1 +S2866,6.1,5.0 +S2867,95.7,215.0 +S2868,65.7,184.8 +S2869,108.9,259.1 +S2870,31.8,134.4 +S2871,13.9,9.4 +S2872,107.5,294.6 +S2873,21.3,122.3 +S2874,76.0,107.5 +S2875,18.3,5.0 +S2876,74.1,161.3 +S2877,89.6,253.9 +S2878,99.9,337.0 +S2879,65.3,68.3 +S2880,86.4,411.6 +S2881,96.1,209.8 +S2882,38.1,70.5 +S2883,81.7,272.4 +S2884,9.9,9.0 +S2885,14.4,5.0 +S2886,101.1,294.4 +S2887,17.5,200.6 +S2888,18.3,124.7 +S2889,13.8,41.4 +S2890,81.7,170.5 +S2891,7.0,5.0 +S2892,111.2,175.6 +S2893,108.2,269.3 +S2894,68.8,175.9 +S2895,56.2,148.3 +S2896,83.8,279.9 +S2897,88.6,135.0 +S2898,116.4,267.1 +S2899,16.5,5.0 +S2900,59.5,298.4 +S2901,21.5,5.0 +S2902,21.2,98.1 +S2903,10.8,5.0 +S2904,118.3,331.3 +S2905,78.4,114.0 +S2906,111.4,389.3 +S2907,69.2,96.5 +S2908,118.6,290.8 +S2909,32.1,200.5 +S2910,91.4,235.8 +S2911,92.6,188.2 +S2912,29.2,5.7 +S2913,104.5,217.8 +S2914,94.9,265.5 +S2915,54.5,129.1 +S2916,113.5,244.7 +S2917,111.3,251.9 +S2918,77.8,227.4 +S2919,11.8,43.8 +S2920,83.2,172.4 +S2921,108.6,296.0 +S2922,47.4,194.5 +S2923,92.3,308.7 +S2924,45.9,163.7 +S2925,103.0,250.3 +S2926,43.6,155.3 +S2927,9.5,9.2 +S2928,22.9,84.2 +S2929,102.4,271.3 +S2930,20.8,34.7 +S2931,114.6,175.2 +S2932,26.2,125.5 +S2933,16.6,50.6 +S2934,88.1,185.1 +S2935,48.9,237.2 +S2936,21.1,178.0 +S2937,83.2,285.8 +S2938,107.4,224.4 +S2939,50.9,105.9 +S2940,99.0,288.9 +S2941,76.3,213.3 +S2942,78.4,241.3 +S2943,61.9,267.8 +S2944,81.5,303.4 +S2945,64.0,55.4 +S2946,24.7,118.7 +S2947,110.4,266.4 +S2948,49.0,5.0 +S2949,68.7,178.8 +S2950,67.0,166.9 +S2951,24.2,119.3 +S2952,67.3,225.5 +S2953,61.4,237.1 +S2954,102.5,181.6 +S2955,54.7,62.6 +S2956,73.0,173.5 +S2957,68.2,149.9 +S2958,99.9,371.3 +S2959,49.5,89.3 +S2960,11.9,186.4 +S2961,84.2,252.8 +S2962,114.5,350.7 +S2963,49.7,102.8 +S2964,100.2,245.5 +S2965,43.0,93.6 +S2966,97.4,216.4 +S2967,28.9,145.5 +S2968,111.0,347.1 +S2969,113.0,197.6 +S2970,35.1,234.5 +S2971,49.4,197.1 +S2972,9.1,86.4 +S2973,32.0,36.6 +S2974,60.2,98.1 +S2975,100.9,280.5 +S2976,63.6,138.9 +S2977,96.0,102.7 +S2978,44.9,306.3 +S2979,115.0,235.7 +S2980,42.7,5.0 +S2981,32.3,84.1 +S2982,56.4,248.7 +S2983,68.8,224.3 +S2984,110.2,384.1 +S2985,32.7,163.6 +S2986,25.8,102.3 +S2987,32.9,244.8 +S2988,18.0,5.0 +S2989,25.0,90.1 +S2990,69.9,232.9 +S2991,84.3,327.0 +S2992,70.8,148.9 +S2993,58.1,122.1 +S2994,80.2,161.8 +S2995,37.3,142.6 +S2996,94.0,296.5 +S2997,6.9,76.7 +S2998,104.7,319.6 +S2999,26.0,93.6 +S3000,41.4,166.7 +S3001,73.5,110.1 +S3002,109.5,256.9 +S3003,21.1,106.0 +S3004,15.7,30.0 +S3005,97.0,275.1 +S3006,41.3,5.0 +S3007,100.6,243.8 +S3008,24.4,135.6 +S3009,17.2,160.6 +S3010,110.4,265.1 +S3011,102.9,198.8 +S3012,57.4,212.5 +S3013,39.7,106.6 +S3014,10.0,80.2 +S3015,32.7,5.0 +S3016,114.0,146.7 +S3017,59.1,278.6 +S3018,17.7,179.1 +S3019,39.4,5.0 +S3020,36.1,5.0 +S3021,38.9,228.1 +S3022,31.9,132.6 +S3023,63.3,245.2 +S3024,77.2,208.1 +S3025,87.7,377.2 +S3026,25.2,67.1 +S3027,69.3,184.2 +S3028,101.7,144.1 +S3029,40.3,94.1 +S3030,73.9,56.0 +S3031,76.4,137.9 +S3032,25.2,100.5 +S3033,80.9,174.3 +S3034,6.4,5.0 +S3035,43.2,268.0 +S3036,85.2,266.7 +S3037,52.1,232.6 +S3038,6.6,5.0 +S3039,57.5,81.5 +S3040,45.0,146.8 +S3041,10.1,110.3 +S3042,50.1,89.2 +S3043,114.8,294.7 +S3044,19.3,5.0 +S3045,103.8,109.7 +S3046,5.2,76.6 +S3047,87.5,249.5 +S3048,104.8,265.0 +S3049,69.8,165.6 +S3050,49.9,183.8 +S3051,9.8,48.1 +S3052,15.7,92.9 +S3053,34.3,5.0 +S3054,8.4,32.1 +S3055,27.3,60.4 +S3056,76.2,347.5 +S3057,34.2,220.4 +S3058,30.0,63.4 +S3059,55.2,170.3 +S3060,104.4,275.4 +S3061,74.2,263.4 +S3062,17.3,44.5 +S3063,84.1,216.9 +S3064,59.3,199.2 +S3065,53.7,62.5 +S3066,37.7,97.4 +S3067,43.8,118.2 +S3068,63.2,195.0 +S3069,78.3,27.1 +S3070,26.3,11.8 +S3071,49.8,167.5 +S3072,12.5,24.1 +S3073,36.7,187.6 +S3074,49.6,196.2 +S3075,9.8,80.4 +S3076,71.4,315.0 +S3077,68.4,68.3 +S3078,86.3,376.6 +S3079,7.8,39.4 +S3080,32.7,151.6 +S3081,96.3,227.3 +S3082,102.3,370.4 +S3083,40.1,28.6 +S3084,83.9,251.4 +S3085,95.9,262.9 +S3086,41.3,170.6 +S3087,7.7,5.0 +S3088,114.7,207.3 +S3089,102.3,204.5 +S3090,76.3,182.2 +S3091,43.6,72.7 +S3092,106.1,151.3 +S3093,64.8,154.4 +S3094,41.1,246.1 +S3095,38.2,39.1 +S3096,70.1,172.5 +S3097,113.1,227.2 +S3098,73.3,178.9 +S3099,8.1,136.5 +S3100,119.6,166.6 +S3101,6.7,5.0 +S3102,6.9,5.0 +S3103,24.1,78.5 +S3104,54.6,201.4 +S3105,29.7,73.4 +S3106,72.7,239.8 +S3107,72.6,54.0 +S3108,94.4,373.5 +S3109,15.3,70.6 +S3110,73.3,143.4 +S3111,108.6,276.9 +S3112,29.8,186.2 +S3113,116.4,240.8 +S3114,25.2,78.7 +S3115,41.5,131.8 +S3116,109.0,308.7 +S3117,23.9,48.3 +S3118,36.4,121.9 +S3119,98.0,363.7 +S3120,68.9,216.5 +S3121,82.7,236.4 +S3122,114.7,279.2 +S3123,41.1,26.1 +S3124,99.2,270.6 +S3125,70.6,206.7 +S3126,74.7,286.3 +S3127,34.8,255.9 +S3128,47.9,121.4 +S3129,112.5,223.7 +S3130,55.1,133.2 +S3131,118.7,196.1 +S3132,101.7,289.1 +S3133,29.9,100.0 +S3134,52.1,113.0 +S3135,16.3,26.4 +S3136,87.5,252.0 +S3137,67.9,128.5 +S3138,33.1,102.8 +S3139,24.1,126.5 +S3140,79.9,250.4 +S3141,8.5,72.2 +S3142,70.1,175.3 +S3143,33.0,157.7 +S3144,102.1,208.5 +S3145,108.7,225.1 +S3146,12.7,5.0 +S3147,114.2,274.0 +S3148,119.8,340.9 +S3149,83.9,203.3 +S3150,116.2,366.4 +S3151,21.6,84.6 +S3152,46.0,79.6 +S3153,22.3,16.1 +S3154,89.6,294.8 +S3155,21.7,55.5 +S3156,23.7,70.6 +S3157,99.3,352.6 +S3158,107.2,328.7 +S3159,74.8,297.5 +S3160,13.7,83.9 +S3161,108.8,122.1 +S3162,42.0,172.6 +S3163,82.6,119.1 +S3164,91.0,64.1 +S3165,32.3,170.3 +S3166,84.7,202.7 +S3167,119.7,84.0 +S3168,6.3,186.7 +S3169,114.8,263.8 +S3170,68.7,251.2 +S3171,68.3,238.3 +S3172,95.5,279.3 +S3173,108.1,197.7 +S3174,117.7,297.8 +S3175,63.2,69.8 +S3176,22.0,140.0 +S3177,78.2,144.8 +S3178,60.5,85.1 +S3179,39.8,87.2 +S3180,17.3,5.0 +S3181,39.6,103.6 +S3182,74.1,281.3 +S3183,65.3,165.9 +S3184,15.7,42.6 +S3185,70.1,124.6 +S3186,99.3,212.5 +S3187,58.0,174.9 +S3188,39.9,103.3 +S3189,77.6,156.4 +S3190,98.3,284.1 +S3191,43.8,144.0 +S3192,29.5,166.0 +S3193,98.9,199.2 +S3194,88.6,268.2 +S3195,45.7,83.5 +S3196,14.3,5.0 +S3197,32.9,5.0 +S3198,110.8,290.0 +S3199,62.8,219.9 +S3200,22.9,174.9 +S3201,27.4,226.8 +S3202,95.5,397.5 +S3203,90.1,98.2 +S3204,43.2,142.5 +S3205,7.5,5.0 +S3206,73.1,261.4 +S3207,39.3,92.8 +S3208,32.4,136.9 +S3209,86.2,256.5 +S3210,58.4,118.6 +S3211,28.6,148.5 +S3212,93.8,271.7 +S3213,34.0,149.5 +S3214,111.4,251.5 +S3215,39.3,15.2 +S3216,34.0,177.7 +S3217,67.0,284.4 +S3218,17.9,67.0 +S3219,20.9,58.1 +S3220,45.5,261.6 +S3221,8.2,33.7 +S3222,75.6,128.8 +S3223,117.1,184.2 +S3224,17.5,20.5 +S3225,93.1,174.9 +S3226,50.8,159.4 +S3227,116.7,233.5 +S3228,84.2,182.9 +S3229,82.6,259.6 +S3230,30.4,14.0 +S3231,32.0,227.7 +S3232,64.0,184.2 +S3233,23.4,172.1 +S3234,68.3,224.8 +S3235,22.4,35.1 +S3236,65.8,132.3 +S3237,91.3,193.0 +S3238,22.0,122.9 +S3239,20.5,116.4 +S3240,112.6,139.2 +S3241,92.4,292.7 +S3242,112.7,317.1 +S3243,59.4,153.9 +S3244,30.4,66.7 +S3245,27.8,162.6 +S3246,58.9,152.0 +S3247,64.9,234.7 +S3248,91.0,183.1 +S3249,41.0,156.7 +S3250,77.8,263.4 +S3251,110.0,298.2 +S3252,27.4,120.1 +S3253,104.6,162.8 +S3254,104.7,327.0 +S3255,21.2,54.9 +S3256,47.4,247.1 +S3257,34.8,5.0 +S3258,74.1,217.4 +S3259,89.8,283.6 +S3260,79.2,195.8 +S3261,114.0,320.9 +S3262,66.4,180.3 +S3263,60.3,177.6 +S3264,112.0,288.9 +S3265,118.0,220.5 +S3266,109.2,147.4 +S3267,90.1,170.3 +S3268,111.7,173.9 +S3269,88.6,156.7 +S3270,87.4,214.9 +S3271,14.5,143.0 +S3272,15.7,175.3 +S3273,6.5,195.9 +S3274,5.2,32.0 +S3275,52.3,5.0 +S3276,61.7,258.1 +S3277,56.8,265.0 +S3278,15.8,260.7 +S3279,54.8,138.5 +S3280,36.1,34.1 +S3281,33.8,24.6 +S3282,55.7,69.9 +S3283,90.6,248.7 +S3284,33.5,18.4 +S3285,74.4,209.5 +S3286,78.3,274.2 +S3287,74.3,215.1 +S3288,58.0,250.9 +S3289,89.6,290.8 +S3290,91.2,359.1 +S3291,75.2,147.4 +S3292,89.6,317.2 +S3293,41.1,85.7 +S3294,77.7,200.9 +S3295,105.5,215.9 +S3296,6.9,5.0 +S3297,5.7,79.1 +S3298,20.1,70.0 +S3299,84.9,160.0 +S3300,47.7,214.9 +S3301,109.3,239.4 +S3302,103.8,236.0 +S3303,28.0,141.0 +S3304,47.3,102.8 +S3305,66.7,208.7 +S3306,63.4,287.9 +S3307,51.9,100.8 +S3308,37.8,86.9 +S3309,72.0,230.1 +S3310,13.5,19.0 +S3311,58.5,127.7 +S3312,11.7,48.3 +S3313,66.9,264.2 +S3314,22.1,5.0 +S3315,72.1,333.6 +S3316,29.0,5.0 +S3317,6.6,5.0 +S3318,118.9,318.3 +S3319,85.0,308.8 +S3320,119.9,289.1 +S3321,80.0,227.7 +S3322,112.3,424.3 +S3323,61.7,222.7 +S3324,64.4,222.6 +S3325,67.5,263.1 +S3326,57.0,137.1 +S3327,58.0,239.4 +S3328,45.2,203.8 +S3329,95.8,269.8 +S3330,81.5,223.7 +S3331,89.8,204.4 +S3332,21.3,55.3 +S3333,28.0,138.6 +S3334,88.4,217.4 +S3335,62.5,190.5 +S3336,28.2,92.6 +S3337,110.5,356.8 +S3338,96.9,320.9 +S3339,103.8,244.1 +S3340,10.7,120.4 +S3341,114.9,198.8 +S3342,61.0,153.6 +S3343,53.5,214.1 +S3344,111.8,337.9 +S3345,80.6,173.7 +S3346,59.7,181.2 +S3347,67.4,236.5 +S3348,25.2,5.0 +S3349,37.1,172.8 +S3350,56.1,176.9 +S3351,16.2,5.0 +S3352,16.3,122.9 +S3353,84.4,224.4 +S3354,87.9,216.4 +S3355,49.5,104.8 +S3356,106.6,220.7 +S3357,37.3,245.7 +S3358,52.1,135.2 +S3359,9.3,50.5 +S3360,67.7,154.5 +S3361,67.6,206.1 +S3362,108.7,218.5 +S3363,56.3,236.4 +S3364,17.0,196.3 +S3365,74.7,194.0 +S3366,11.3,5.0 +S3367,78.7,153.3 +S3368,72.9,111.5 +S3369,27.4,106.7 +S3370,113.0,233.0 +S3371,29.0,222.5 +S3372,112.3,233.6 +S3373,85.1,267.0 +S3374,115.8,195.7 +S3375,111.9,191.8 +S3376,34.6,45.7 +S3377,47.7,123.3 +S3378,70.0,66.7 +S3379,52.2,173.3 +S3380,109.5,249.9 +S3381,105.8,293.0 +S3382,22.2,79.8 +S3383,21.4,146.0 +S3384,79.0,129.6 +S3385,35.9,15.4 +S3386,55.6,193.6 +S3387,92.0,356.5 +S3388,6.8,5.0 +S3389,43.5,20.1 +S3390,57.0,139.3 +S3391,37.6,107.7 +S3392,91.1,281.1 +S3393,66.7,255.1 +S3394,71.4,138.7 +S3395,94.6,361.9 +S3396,116.5,386.4 +S3397,26.9,22.0 +S3398,20.2,5.0 +S3399,90.2,163.1 +S3400,53.7,191.9 +S3401,66.4,240.1 +S3402,80.4,28.3 +S3403,26.9,236.6 +S3404,24.4,33.4 +S3405,36.8,89.0 +S3406,33.7,66.9 +S3407,27.2,173.7 +S3408,6.9,46.4 +S3409,51.8,47.4 +S3410,88.1,204.0 +S3411,20.6,45.7 +S3412,39.5,204.9 +S3413,35.7,120.7 +S3414,27.5,211.8 +S3415,107.3,263.4 +S3416,56.7,125.4 +S3417,18.7,5.0 +S3418,118.6,260.4 +S3419,105.3,441.7 +S3420,101.7,267.1 +S3421,33.7,170.9 +S3422,51.1,126.0 +S3423,67.2,277.3 +S3424,12.7,267.6 +S3425,65.3,259.0 +S3426,15.9,75.1 +S3427,23.7,105.8 +S3428,79.8,162.5 +S3429,27.0,113.1 +S3430,118.0,329.8 +S3431,103.6,141.9 +S3432,41.0,134.7 +S3433,28.9,79.8 +S3434,8.8,154.5 +S3435,66.7,160.7 +S3436,46.5,5.0 +S3437,25.9,71.6 +S3438,108.7,250.7 +S3439,47.1,234.1 +S3440,65.0,206.4 +S3441,106.6,216.3 +S3442,57.7,129.5 +S3443,15.0,72.8 +S3444,75.6,216.0 +S3445,49.8,240.3 +S3446,93.4,369.0 +S3447,10.2,106.2 +S3448,107.1,178.1 +S3449,8.5,210.9 +S3450,39.7,70.9 +S3451,84.7,207.8 +S3452,30.1,191.9 +S3453,99.6,189.1 +S3454,18.9,64.1 +S3455,70.2,125.0 +S3456,106.2,335.3 +S3457,99.0,109.0 +S3458,18.6,5.0 +S3459,108.9,242.9 +S3460,24.7,118.0 +S3461,90.9,215.9 +S3462,82.7,272.6 +S3463,60.2,128.6 +S3464,116.1,296.0 +S3465,6.9,153.9 +S3466,28.8,130.2 +S3467,39.6,116.1 +S3468,55.9,237.3 +S3469,36.2,128.7 +S3470,70.9,225.9 +S3471,50.4,98.2 +S3472,40.0,215.6 +S3473,75.2,197.1 +S3474,12.2,113.9 +S3475,37.5,175.8 +S3476,24.6,68.9 +S3477,118.8,124.3 +S3478,48.7,83.7 +S3479,42.1,153.8 +S3480,81.9,275.1 +S3481,24.4,150.4 +S3482,117.6,214.0 +S3483,70.6,304.2 +S3484,106.3,212.5 +S3485,5.4,44.9 +S3486,111.5,217.4 +S3487,39.2,74.3 +S3488,105.1,178.5 +S3489,107.5,216.2 +S3490,12.1,189.6 +S3491,8.8,5.0 +S3492,112.4,405.4 +S3493,36.9,166.3 +S3494,35.7,134.3 +S3495,104.1,202.5 +S3496,19.4,82.8 +S3497,71.8,128.4 +S3498,29.1,238.8 +S3499,101.7,195.9 +S3500,116.5,270.1 +S3501,97.0,178.7 +S3502,39.6,241.2 +S3503,80.4,205.4 +S3504,14.0,115.2 +S3505,32.4,61.6 +S3506,116.3,324.2 +S3507,15.5,166.3 +S3508,62.7,37.1 +S3509,41.4,161.7 +S3510,6.5,126.3 +S3511,34.1,5.0 +S3512,98.3,452.9 +S3513,13.7,33.4 +S3514,103.6,161.7 +S3515,107.0,379.6 +S3516,62.0,204.5 +S3517,51.0,157.2 +S3518,17.5,229.2 +S3519,82.2,244.3 +S3520,31.8,83.8 +S3521,105.9,237.5 +S3522,68.2,172.7 +S3523,72.0,232.2 +S3524,107.8,335.7 +S3525,13.0,96.1 +S3526,32.6,212.7 +S3527,86.5,165.4 +S3528,8.8,5.0 +S3529,51.8,161.6 +S3530,110.5,247.1 +S3531,37.2,235.3 +S3532,78.1,227.2 +S3533,81.0,288.9 +S3534,6.9,23.2 +S3535,51.0,81.1 +S3536,95.1,184.3 +S3537,72.2,201.0 +S3538,37.8,51.4 +S3539,95.9,344.0 +S3540,17.5,5.0 +S3541,58.1,200.3 +S3542,67.9,159.1 +S3543,90.3,229.3 +S3544,42.3,99.2 +S3545,95.5,219.0 +S3546,67.3,194.2 +S3547,13.0,5.0 +S3548,76.0,94.6 +S3549,109.4,138.6 +S3550,70.7,141.1 +S3551,10.2,102.8 +S3552,26.5,108.2 +S3553,91.8,261.6 +S3554,19.9,38.1 +S3555,86.0,276.6 +S3556,7.8,155.8 +S3557,81.7,285.3 +S3558,54.8,32.0 +S3559,56.9,241.8 +S3560,58.3,92.0 +S3561,61.5,147.4 +S3562,84.6,302.8 +S3563,37.7,180.2 +S3564,48.7,217.4 +S3565,69.8,223.6 +S3566,48.5,118.0 +S3567,105.4,217.0 +S3568,107.4,323.0 +S3569,97.6,137.5 +S3570,77.7,186.5 +S3571,64.7,314.0 +S3572,113.8,352.3 +S3573,63.6,192.6 +S3574,17.5,25.6 +S3575,111.9,223.6 +S3576,51.4,58.9 +S3577,117.1,250.0 +S3578,38.8,195.0 +S3579,58.9,126.3 +S3580,18.7,155.9 +S3581,88.2,186.6 +S3582,13.0,5.0 +S3583,96.0,288.1 +S3584,82.1,228.5 +S3585,69.5,246.8 +S3586,75.4,228.0 +S3587,65.6,127.6 +S3588,57.7,47.7 +S3589,78.9,167.9 +S3590,62.0,42.5 +S3591,107.6,282.0 +S3592,58.3,131.3 +S3593,102.1,263.8 +S3594,110.9,209.1 +S3595,77.9,346.6 +S3596,96.5,216.5 +S3597,30.0,76.5 +S3598,118.9,287.0 +S3599,26.5,212.6 +S3600,83.8,160.1 +S3601,79.5,243.0 +S3602,10.0,5.0 +S3603,40.2,242.5 +S3604,6.3,36.5 +S3605,65.8,253.8 +S3606,73.7,269.6 +S3607,117.6,456.0 +S3608,34.3,57.5 +S3609,17.6,81.0 +S3610,74.4,343.0 +S3611,35.8,114.5 +S3612,98.8,329.2 +S3613,59.4,144.4 +S3614,104.0,303.8 +S3615,17.2,124.1 +S3616,66.5,123.1 +S3617,89.1,168.0 +S3618,29.0,18.8 +S3619,41.1,5.0 +S3620,71.2,141.7 +S3621,45.3,5.0 +S3622,92.5,235.9 +S3623,61.5,211.0 +S3624,110.6,194.7 +S3625,81.9,227.2 +S3626,12.5,116.3 +S3627,54.9,135.1 +S3628,33.7,158.2 +S3629,66.3,92.7 +S3630,91.5,176.7 +S3631,24.9,48.8 +S3632,36.0,116.0 +S3633,105.6,319.0 +S3634,88.7,122.7 +S3635,108.2,281.7 +S3636,13.6,5.0 +S3637,94.8,256.2 +S3638,93.2,238.3 +S3639,92.4,203.5 +S3640,16.1,102.5 +S3641,26.7,100.0 +S3642,21.0,16.0 +S3643,52.5,167.2 +S3644,102.0,208.3 +S3645,85.6,278.4 +S3646,59.4,195.3 +S3647,69.3,119.7 +S3648,55.5,75.6 +S3649,51.4,155.0 +S3650,23.1,147.9 +S3651,20.2,61.5 +S3652,52.9,116.6 +S3653,85.1,135.8 +S3654,59.3,224.8 +S3655,69.7,365.2 +S3656,45.8,215.8 +S3657,48.2,66.5 +S3658,17.5,5.0 +S3659,48.5,60.3 +S3660,36.0,106.5 +S3661,67.2,152.8 +S3662,76.1,149.7 +S3663,61.9,106.7 +S3664,51.9,155.5 +S3665,64.3,131.3 +S3666,5.1,81.1 +S3667,81.0,342.0 +S3668,49.7,216.1 +S3669,100.2,231.9 +S3670,56.4,29.5 +S3671,83.8,350.0 +S3672,96.7,231.8 +S3673,61.4,143.3 +S3674,26.9,125.4 +S3675,50.2,101.9 +S3676,43.3,45.6 +S3677,7.5,57.2 +S3678,109.6,244.2 +S3679,26.5,128.3 +S3680,24.8,196.1 +S3681,82.0,167.4 +S3682,64.5,54.5 +S3683,17.2,140.9 +S3684,62.6,111.7 +S3685,84.2,139.0 +S3686,94.7,256.7 +S3687,12.7,5.0 +S3688,109.3,151.3 +S3689,28.6,101.0 +S3690,119.5,215.5 +S3691,33.1,228.6 +S3692,37.9,159.6 +S3693,70.1,286.8 +S3694,11.8,258.4 +S3695,21.7,104.0 +S3696,25.0,5.0 +S3697,20.8,32.3 +S3698,110.3,315.0 +S3699,91.0,335.6 +S3700,18.8,42.9 +S3701,118.0,272.2 +S3702,63.3,248.2 +S3703,11.2,5.5 +S3704,33.6,152.6 +S3705,18.3,77.8 +S3706,108.0,402.4 +S3707,42.9,117.2 +S3708,119.4,151.2 +S3709,80.1,248.8 +S3710,37.9,145.6 +S3711,32.3,27.3 +S3712,14.2,96.3 +S3713,16.1,40.7 +S3714,29.0,95.4 +S3715,87.5,183.5 +S3716,7.0,5.0 +S3717,46.1,67.6 +S3718,116.0,200.7 +S3719,88.2,343.2 +S3720,6.5,5.0 +S3721,83.9,125.7 +S3722,102.5,296.5 +S3723,54.0,110.4 +S3724,41.9,141.0 +S3725,17.1,69.5 +S3726,102.0,301.7 +S3727,42.4,140.0 +S3728,12.3,135.4 +S3729,35.3,134.0 +S3730,46.2,168.5 +S3731,119.9,244.6 +S3732,79.1,215.8 +S3733,15.7,92.9 +S3734,55.9,111.1 +S3735,93.1,228.1 +S3736,54.3,183.7 +S3737,68.4,163.1 +S3738,50.9,83.2 +S3739,51.3,186.1 +S3740,36.6,112.7 +S3741,100.5,28.4 +S3742,76.0,138.3 +S3743,94.2,224.9 +S3744,91.3,207.5 +S3745,102.4,301.0 +S3746,13.4,153.7 +S3747,111.1,262.9 +S3748,27.8,160.6 +S3749,34.9,72.0 +S3750,12.6,69.7 +S3751,115.6,345.2 +S3752,74.4,213.7 +S3753,108.4,250.1 +S3754,24.7,160.1 +S3755,46.6,312.8 +S3756,57.4,158.2 +S3757,118.3,318.6 +S3758,96.2,311.6 +S3759,67.1,78.5 +S3760,83.4,240.3 +S3761,55.5,147.1 +S3762,58.5,5.0 +S3763,56.3,63.9 +S3764,103.2,171.1 +S3765,101.4,310.6 +S3766,72.7,104.6 +S3767,115.7,319.7 +S3768,56.2,186.8 +S3769,103.4,257.8 +S3770,117.7,284.6 +S3771,70.2,204.0 +S3772,9.4,157.7 +S3773,10.0,44.6 +S3774,54.7,122.2 +S3775,26.8,138.4 +S3776,62.4,103.1 +S3777,62.6,268.4 +S3778,103.9,311.1 +S3779,115.3,311.6 +S3780,118.9,320.5 +S3781,81.8,247.3 +S3782,116.0,287.6 +S3783,65.3,167.6 +S3784,6.6,5.0 +S3785,79.3,174.3 +S3786,103.0,305.0 +S3787,113.5,195.8 +S3788,66.4,191.1 +S3789,56.7,142.4 +S3790,90.1,111.8 +S3791,93.7,354.8 +S3792,87.7,214.1 +S3793,17.6,30.5 +S3794,82.5,271.4 +S3795,88.1,209.3 +S3796,59.2,153.7 +S3797,16.5,156.2 +S3798,38.1,55.1 +S3799,24.1,79.5 +S3800,86.5,207.3 +S3801,105.0,346.9 +S3802,65.3,180.5 +S3803,87.8,261.8 +S3804,64.5,45.8 +S3805,31.3,35.8 +S3806,80.3,173.9 +S3807,52.0,224.6 +S3808,6.0,109.3 +S3809,117.3,353.0 +S3810,24.3,86.4 +S3811,58.8,23.6 +S3812,93.0,316.5 +S3813,66.5,251.8 +S3814,105.9,332.7 +S3815,27.4,127.1 +S3816,14.6,36.0 +S3817,74.1,153.5 +S3818,26.5,112.2 +S3819,64.8,228.3 +S3820,101.3,234.4 +S3821,94.5,351.0 +S3822,62.9,92.1 +S3823,8.5,19.2 +S3824,58.3,149.9 +S3825,71.6,294.7 +S3826,27.0,208.3 +S3827,40.2,30.5 +S3828,110.4,296.5 +S3829,108.4,264.4 +S3830,52.5,60.6 +S3831,75.8,160.4 +S3832,102.1,203.2 +S3833,106.2,145.4 +S3834,13.1,102.1 +S3835,110.1,262.8 +S3836,64.4,237.7 +S3837,68.4,316.0 +S3838,116.8,343.3 +S3839,59.8,129.3 +S3840,117.4,324.2 +S3841,70.6,181.3 +S3842,71.4,79.8 +S3843,63.3,203.3 +S3844,116.5,277.1 +S3845,64.3,256.7 +S3846,42.5,241.1 +S3847,7.7,47.9 +S3848,104.0,290.1 +S3849,85.0,125.9 +S3850,95.4,314.7 +S3851,93.3,344.4 +S3852,35.4,131.1 +S3853,77.3,237.9 +S3854,28.9,94.2 +S3855,98.7,150.3 +S3856,57.2,214.7 +S3857,49.9,134.4 +S3858,109.6,275.3 +S3859,97.0,99.2 +S3860,95.1,293.1 +S3861,103.4,372.3 +S3862,100.3,237.1 +S3863,61.7,123.9 +S3864,55.8,102.3 +S3865,100.8,252.5 +S3866,90.1,208.7 +S3867,78.4,111.3 +S3868,30.6,150.8 +S3869,28.1,73.0 +S3870,16.5,133.0 +S3871,116.6,328.2 +S3872,46.7,88.4 +S3873,9.3,99.6 +S3874,40.1,122.4 +S3875,119.3,266.5 +S3876,116.3,150.7 +S3877,39.6,167.6 +S3878,30.1,128.1 +S3879,84.9,291.1 +S3880,41.5,290.3 +S3881,37.9,79.4 +S3882,9.8,67.3 +S3883,39.5,45.8 +S3884,85.9,256.2 +S3885,87.9,221.5 +S3886,82.1,115.1 +S3887,21.4,182.5 +S3888,93.0,288.9 +S3889,88.8,112.9 +S3890,44.0,134.7 +S3891,38.8,145.2 +S3892,36.6,155.6 +S3893,60.7,193.4 +S3894,93.2,242.8 +S3895,41.6,118.3 +S3896,48.6,168.2 +S3897,23.6,11.3 +S3898,16.1,88.9 +S3899,80.6,173.1 +S3900,60.2,258.1 +S3901,27.9,135.8 +S3902,62.5,183.7 +S3903,105.1,239.6 +S3904,116.0,246.1 +S3905,113.5,341.8 +S3906,44.4,202.0 +S3907,98.5,237.3 +S3908,83.9,268.3 +S3909,117.4,294.2 +S3910,20.8,150.4 +S3911,82.6,212.7 +S3912,99.3,238.3 +S3913,116.4,381.7 +S3914,111.5,381.7 +S3915,62.9,230.7 +S3916,69.6,262.7 +S3917,30.7,111.1 +S3918,50.6,109.1 +S3919,15.6,68.1 +S3920,68.9,142.6 +S3921,61.4,194.8 +S3922,30.5,72.5 +S3923,37.6,216.6 +S3924,113.1,167.2 +S3925,89.8,260.6 +S3926,107.3,244.1 +S3927,119.1,337.4 +S3928,61.5,240.4 +S3929,61.9,52.4 +S3930,113.7,338.1 +S3931,29.5,171.4 +S3932,58.9,207.4 +S3933,41.5,174.1 +S3934,22.7,5.0 +S3935,91.3,168.8 +S3936,91.7,168.8 +S3937,66.4,194.9 +S3938,116.9,329.2 +S3939,24.0,31.5 +S3940,33.3,107.8 +S3941,68.5,135.9 +S3942,23.8,142.7 +S3943,35.5,209.1 +S3944,75.9,62.4 +S3945,92.7,159.4 +S3946,116.6,307.7 +S3947,98.6,101.4 +S3948,31.4,132.2 +S3949,41.8,194.3 +S3950,31.8,155.4 +S3951,74.8,237.8 +S3952,44.5,151.8 +S3953,101.0,230.0 +S3954,16.1,5.0 +S3955,34.9,124.9 +S3956,90.1,218.4 +S3957,113.7,405.7 +S3958,98.9,393.8 +S3959,109.6,349.3 +S3960,62.0,200.9 +S3961,58.7,222.4 +S3962,40.0,175.6 +S3963,70.2,157.2 +S3964,23.8,208.1 +S3965,62.9,288.9 +S3966,117.6,385.4 +S3967,72.8,216.0 +S3968,29.5,134.6 +S3969,116.2,355.5 +S3970,51.1,180.2 +S3971,43.7,165.8 +S3972,26.9,86.5 +S3973,51.1,167.2 +S3974,28.7,159.1 +S3975,50.2,246.1 +S3976,44.6,81.8 +S3977,81.4,289.1 +S3978,45.7,193.3 +S3979,24.7,101.1 +S3980,68.9,140.0 +S3981,98.1,197.8 +S3982,38.7,85.9 +S3983,58.2,27.9 +S3984,36.7,149.5 +S3985,57.3,168.4 +S3986,70.9,243.8 +S3987,69.6,241.3 +S3988,9.0,37.6 +S3989,28.7,5.0 +S3990,12.3,5.0 +S3991,111.8,166.4 +S3992,117.7,314.6 +S3993,104.7,198.0 +S3994,89.4,234.0 +S3995,56.0,140.6 +S3996,107.1,222.2 +S3997,77.4,196.8 +S3998,11.9,13.9 +S3999,16.0,52.6 +S4000,15.3,76.7 +S4001,107.8,242.2 +S4002,94.3,210.9 +S4003,59.6,133.4 +S4004,13.1,198.9 +S4005,118.6,312.2 +S4006,34.3,5.0 +S4007,20.8,98.1 +S4008,71.1,206.5 +S4009,21.2,157.8 +S4010,40.0,111.6 +S4011,104.3,210.5 +S4012,6.7,5.0 +S4013,14.7,34.5 +S4014,109.6,414.5 +S4015,48.6,95.0 +S4016,68.7,271.7 +S4017,115.8,371.2 +S4018,95.7,333.0 +S4019,27.2,29.3 +S4020,45.0,128.8 +S4021,13.8,121.6 +S4022,44.9,171.2 +S4023,41.0,210.0 +S4024,15.3,190.0 +S4025,57.1,223.5 +S4026,51.8,243.7 +S4027,50.8,113.0 +S4028,93.1,259.5 +S4029,69.7,203.5 +S4030,100.8,274.3 +S4031,12.9,80.0 +S4032,33.7,150.9 +S4033,61.9,157.7 +S4034,99.4,316.6 +S4035,74.0,226.0 +S4036,78.6,231.6 +S4037,83.6,281.2 +S4038,69.2,247.0 +S4039,54.0,246.1 +S4040,29.8,91.0 +S4041,62.5,145.8 +S4042,82.1,67.2 +S4043,102.5,321.8 +S4044,71.6,103.9 +S4045,102.9,233.3 +S4046,99.1,383.2 +S4047,99.2,222.9 +S4048,20.7,133.4 +S4049,83.8,262.3 +S4050,17.0,94.4 +S4051,15.0,57.8 +S4052,34.1,171.9 +S4053,94.2,178.1 +S4054,8.8,82.9 +S4055,16.4,9.3 +S4056,88.6,267.4 +S4057,74.0,194.3 +S4058,114.3,286.3 +S4059,31.4,155.7 +S4060,63.4,165.8 +S4061,77.9,199.1 +S4062,89.6,266.5 +S4063,29.1,79.2 +S4064,29.4,93.5 +S4065,41.4,81.2 +S4066,89.2,208.1 +S4067,36.7,44.0 +S4068,65.2,232.0 +S4069,22.0,148.7 +S4070,88.8,233.7 +S4071,31.2,29.7 +S4072,112.0,214.9 +S4073,65.5,94.6 +S4074,73.9,231.2 +S4075,97.7,154.0 +S4076,108.9,397.9 +S4077,59.7,167.2 +S4078,16.7,41.6 +S4079,116.6,384.6 +S4080,93.0,276.2 +S4081,89.4,167.1 +S4082,31.4,154.8 +S4083,52.8,90.1 +S4084,11.9,27.3 +S4085,61.8,85.3 +S4086,57.3,290.0 +S4087,103.6,215.1 +S4088,118.0,280.9 +S4089,61.3,248.2 +S4090,37.4,170.4 +S4091,67.6,155.4 +S4092,72.2,233.6 +S4093,98.9,328.2 +S4094,32.2,131.8 +S4095,30.7,47.6 +S4096,43.6,16.6 +S4097,92.7,176.5 +S4098,75.3,123.7 +S4099,30.4,78.9 +S4100,111.4,193.2 +S4101,13.1,5.0 +S4102,88.7,192.1 +S4103,76.1,96.8 +S4104,78.9,193.7 +S4105,90.0,260.3 +S4106,48.8,124.2 +S4107,88.8,243.5 +S4108,77.4,158.4 +S4109,118.4,396.4 +S4110,49.6,104.8 +S4111,94.0,127.3 +S4112,44.1,79.5 +S4113,66.7,185.3 +S4114,113.3,238.0 +S4115,110.4,253.0 +S4116,55.7,174.8 +S4117,38.2,85.7 +S4118,88.9,176.6 +S4119,110.5,359.6 +S4120,20.7,65.7 +S4121,13.9,132.6 +S4122,59.1,160.2 +S4123,66.5,211.8 +S4124,27.0,83.0 +S4125,112.4,212.2 +S4126,37.7,203.9 +S4127,100.0,322.1 +S4128,99.6,181.9 +S4129,116.2,261.0 +S4130,14.0,76.6 +S4131,54.2,139.8 +S4132,48.4,146.9 +S4133,61.2,77.7 +S4134,99.9,207.6 +S4135,91.3,200.2 +S4136,91.0,286.0 +S4137,35.3,56.9 +S4138,68.4,117.9 +S4139,46.4,287.4 +S4140,8.8,155.3 +S4141,47.2,169.9 +S4142,50.4,153.2 +S4143,12.8,51.3 +S4144,22.4,187.6 +S4145,38.3,55.8 +S4146,56.0,146.3 +S4147,103.5,267.0 +S4148,37.2,109.6 +S4149,95.1,186.8 +S4150,6.1,87.5 +S4151,88.2,306.5 +S4152,8.3,5.0 +S4153,17.2,47.7 +S4154,86.0,347.3 +S4155,82.1,275.5 +S4156,106.8,337.4 +S4157,11.4,84.2 +S4158,13.8,65.0 +S4159,51.8,125.0 +S4160,98.3,347.1 +S4161,46.6,140.3 +S4162,31.9,97.3 +S4163,64.0,197.5 +S4164,13.7,5.0 +S4165,111.7,233.5 +S4166,19.6,183.4 +S4167,77.5,146.2 +S4168,57.4,124.5 +S4169,76.4,251.8 +S4170,28.7,170.5 +S4171,102.7,359.3 +S4172,90.3,347.1 +S4173,87.5,219.3 +S4174,30.2,64.4 +S4175,45.5,139.3 +S4176,61.6,197.3 +S4177,14.0,78.7 +S4178,43.4,71.5 +S4179,14.6,32.3 +S4180,62.9,189.8 +S4181,55.5,266.3 +S4182,99.1,451.2 +S4183,33.5,5.0 +S4184,18.3,167.5 +S4185,99.1,343.5 +S4186,20.2,90.7 +S4187,46.2,96.2 +S4188,12.5,55.5 +S4189,78.6,212.9 +S4190,96.8,463.4 +S4191,102.0,258.0 +S4192,42.4,108.0 +S4193,100.1,294.1 +S4194,26.3,66.3 +S4195,70.4,123.2 +S4196,54.0,103.0 +S4197,54.9,74.3 +S4198,80.8,62.6 +S4199,105.1,355.4 +S4200,77.2,347.0 +S4201,69.9,227.4 +S4202,63.2,331.8 +S4203,8.3,23.1 +S4204,45.9,110.1 +S4205,71.5,268.0 +S4206,58.1,69.7 +S4207,19.4,108.8 +S4208,111.1,239.2 +S4209,87.3,196.6 +S4210,10.9,87.0 +S4211,40.6,277.5 +S4212,46.6,155.8 +S4213,76.4,193.8 +S4214,51.1,122.8 +S4215,100.1,276.5 +S4216,22.5,7.4 +S4217,23.8,143.9 +S4218,84.0,276.8 +S4219,76.2,328.4 +S4220,26.0,86.0 +S4221,39.4,146.0 +S4222,71.7,221.3 +S4223,110.9,194.3 +S4224,21.4,152.0 +S4225,5.5,147.8 +S4226,33.2,129.4 +S4227,111.8,296.0 +S4228,85.6,258.0 +S4229,38.1,5.0 +S4230,74.8,161.9 +S4231,79.1,306.4 +S4232,38.5,139.7 +S4233,68.9,5.0 +S4234,75.7,161.6 +S4235,41.8,235.5 +S4236,11.5,207.4 +S4237,56.6,243.1 +S4238,49.2,150.3 +S4239,38.1,197.2 +S4240,67.1,203.2 +S4241,52.1,165.7 +S4242,25.3,191.7 +S4243,50.9,175.1 +S4244,73.2,205.1 +S4245,94.7,172.9 +S4246,74.2,222.9 +S4247,83.2,150.2 +S4248,19.0,130.6 +S4249,34.8,45.7 +S4250,6.4,52.2 +S4251,86.8,252.1 +S4252,21.6,140.8 +S4253,20.2,82.2 +S4254,76.0,258.0 +S4255,55.8,85.9 +S4256,86.6,215.6 +S4257,54.3,320.1 +S4258,56.4,190.6 +S4259,18.0,8.6 +S4260,101.0,256.4 +S4261,62.7,281.3 +S4262,46.8,250.3 +S4263,84.7,102.4 +S4264,81.6,162.9 +S4265,10.2,88.7 +S4266,50.4,65.8 +S4267,54.7,234.5 +S4268,46.9,219.3 +S4269,61.0,82.2 +S4270,63.7,121.8 +S4271,25.2,31.1 +S4272,83.4,304.2 +S4273,73.5,272.6 +S4274,65.7,257.1 +S4275,47.6,175.2 +S4276,14.4,68.5 +S4277,17.6,5.0 +S4278,7.1,5.0 +S4279,80.5,174.3 +S4280,90.0,130.1 +S4281,55.3,201.1 +S4282,106.7,298.3 +S4283,39.5,136.1 +S4284,106.9,264.8 +S4285,79.2,201.3 +S4286,90.0,175.5 +S4287,85.2,176.7 +S4288,47.7,170.8 +S4289,105.0,354.9 +S4290,73.4,317.8 +S4291,82.8,191.0 +S4292,113.0,228.0 +S4293,39.8,137.6 +S4294,72.0,180.8 +S4295,82.6,200.8 +S4296,86.3,185.4 +S4297,114.2,320.1 +S4298,27.3,69.5 +S4299,81.8,95.5 +S4300,102.7,302.5 +S4301,93.0,236.3 +S4302,40.5,56.9 +S4303,102.3,159.6 +S4304,11.9,94.3 +S4305,65.1,343.1 +S4306,33.8,144.5 +S4307,93.1,249.8 +S4308,25.8,5.0 +S4309,17.3,42.1 +S4310,65.5,131.4 +S4311,17.5,5.0 +S4312,62.1,213.2 +S4313,104.7,237.8 +S4314,91.5,347.2 +S4315,26.6,153.6 +S4316,119.5,397.7 +S4317,49.6,136.8 +S4318,6.1,41.4 +S4319,8.3,27.3 +S4320,35.4,43.0 +S4321,10.5,116.1 +S4322,95.2,211.5 +S4323,112.2,267.7 +S4324,114.9,247.5 +S4325,83.1,274.0 +S4326,12.4,63.6 +S4327,36.2,108.5 +S4328,107.9,121.6 +S4329,19.2,80.0 +S4330,57.4,84.3 +S4331,109.4,232.2 +S4332,42.9,177.4 +S4333,49.1,171.3 +S4334,29.1,86.6 +S4335,115.0,175.2 +S4336,62.1,301.3 +S4337,107.8,242.8 +S4338,64.9,196.0 +S4339,76.4,163.1 +S4340,50.9,57.4 +S4341,33.0,204.8 +S4342,96.8,266.5 +S4343,92.0,261.3 +S4344,63.0,134.4 +S4345,15.7,128.7 +S4346,28.6,126.1 +S4347,55.8,116.8 +S4348,19.7,86.2 +S4349,14.4,99.7 +S4350,103.2,342.7 +S4351,51.9,170.1 +S4352,7.5,5.0 +S4353,68.2,266.7 +S4354,7.0,79.3 +S4355,73.0,298.6 +S4356,96.0,268.7 +S4357,115.5,240.0 +S4358,43.3,13.5 +S4359,67.4,65.5 +S4360,91.9,244.8 +S4361,8.5,49.8 +S4362,74.7,244.3 +S4363,24.2,70.0 +S4364,47.3,31.9 +S4365,70.2,167.5 +S4366,23.3,54.2 +S4367,13.7,82.1 +S4368,53.2,5.0 +S4369,98.4,112.3 +S4370,62.3,112.5 +S4371,13.3,5.0 +S4372,25.3,29.4 +S4373,117.8,222.1 +S4374,93.7,225.7 +S4375,82.0,300.3 +S4376,115.4,272.5 +S4377,37.8,119.6 +S4378,22.8,56.1 +S4379,36.3,78.3 +S4380,111.5,217.2 +S4381,74.2,223.4 +S4382,25.0,140.0 +S4383,103.0,310.4 +S4384,71.4,120.5 +S4385,11.4,23.4 +S4386,18.3,183.8 +S4387,50.6,77.0 +S4388,114.7,222.0 +S4389,92.1,272.8 +S4390,102.4,179.4 +S4391,19.1,60.7 +S4392,26.2,157.3 +S4393,69.3,239.8 +S4394,62.1,161.8 +S4395,64.4,216.7 +S4396,99.3,278.5 +S4397,16.7,55.1 +S4398,79.3,197.1 +S4399,5.7,94.6 +S4400,58.4,186.1 +S4401,48.0,143.0 +S4402,67.5,186.5 +S4403,102.4,266.3 +S4404,96.7,241.0 +S4405,8.2,88.1 +S4406,69.3,174.9 +S4407,77.8,190.5 +S4408,91.7,259.6 +S4409,14.8,5.0 +S4410,34.3,84.5 +S4411,58.5,130.9 +S4412,84.7,163.3 +S4413,27.2,84.8 +S4414,96.2,162.0 +S4415,106.8,354.9 +S4416,114.5,112.7 +S4417,42.6,63.6 +S4418,70.1,264.5 +S4419,49.9,85.1 +S4420,47.7,115.8 +S4421,65.3,178.8 +S4422,9.6,23.6 +S4423,97.5,238.0 +S4424,34.2,37.3 +S4425,12.6,21.1 +S4426,38.1,111.6 +S4427,111.9,222.6 +S4428,59.6,228.9 +S4429,42.6,37.9 +S4430,105.5,316.6 +S4431,107.2,179.3 +S4432,11.3,5.0 +S4433,8.8,95.4 +S4434,94.2,223.2 +S4435,97.5,281.5 +S4436,57.9,16.8 +S4437,108.2,318.6 +S4438,14.1,114.1 +S4439,55.3,206.9 +S4440,74.0,248.5 +S4441,100.2,266.9 +S4442,64.0,88.0 +S4443,56.2,209.3 +S4444,113.1,172.6 +S4445,110.1,201.9 +S4446,78.5,292.3 +S4447,12.0,78.7 +S4448,103.2,318.5 +S4449,99.6,144.3 +S4450,9.9,141.3 +S4451,13.1,5.0 +S4452,99.1,69.6 +S4453,56.6,20.6 +S4454,98.4,176.7 +S4455,63.4,192.3 +S4456,61.0,192.3 +S4457,81.8,247.2 +S4458,96.1,190.5 +S4459,104.6,316.7 +S4460,23.2,140.1 +S4461,33.4,52.3 +S4462,86.5,218.7 +S4463,83.0,183.7 +S4464,35.4,24.7 +S4465,57.1,262.9 +S4466,37.6,223.6 +S4467,31.8,54.8 +S4468,110.7,186.1 +S4469,105.3,334.8 +S4470,52.1,141.3 +S4471,23.0,136.9 +S4472,5.4,7.5 +S4473,45.0,160.6 +S4474,20.3,21.1 +S4475,71.0,289.1 +S4476,6.6,58.7 +S4477,94.8,309.1 +S4478,47.0,75.3 +S4479,107.3,190.5 +S4480,73.6,62.8 +S4481,19.5,123.4 +S4482,45.9,59.7 +S4483,78.7,157.2 +S4484,79.4,296.9 +S4485,43.6,102.3 +S4486,66.5,235.3 +S4487,117.8,289.3 +S4488,79.0,69.4 +S4489,30.9,161.5 +S4490,15.9,108.4 +S4491,95.2,456.6 +S4492,62.8,125.0 +S4493,42.1,278.3 +S4494,71.4,261.6 +S4495,49.8,162.2 +S4496,53.2,16.2 +S4497,80.1,60.0 +S4498,44.5,78.4 +S4499,81.4,281.8 +S4500,57.9,289.6 +S4501,102.5,285.1 +S4502,43.6,50.5 +S4503,38.5,128.9 +S4504,98.3,458.6 +S4505,81.5,254.4 +S4506,96.5,250.5 +S4507,42.4,204.6 +S4508,100.5,335.4 +S4509,27.5,33.2 +S4510,56.2,142.6 +S4511,101.1,365.9 +S4512,67.5,239.4 +S4513,110.7,252.8 +S4514,51.8,187.1 +S4515,114.1,400.6 +S4516,40.8,93.0 +S4517,12.8,5.0 +S4518,20.6,129.8 +S4519,86.9,160.2 +S4520,95.7,207.6 +S4521,91.3,335.7 +S4522,64.1,191.7 +S4523,87.6,206.0 +S4524,83.3,211.4 +S4525,81.6,276.5 +S4526,108.1,241.5 +S4527,57.9,141.3 +S4528,8.3,51.8 +S4529,29.4,213.1 +S4530,90.3,160.7 +S4531,90.1,113.3 +S4532,69.0,163.5 +S4533,70.1,165.2 +S4534,8.8,89.6 +S4535,29.6,76.3 +S4536,84.5,123.2 +S4537,53.0,61.0 +S4538,11.9,14.7 +S4539,60.8,208.0 +S4540,106.6,196.3 +S4541,88.1,151.9 +S4542,94.9,196.1 +S4543,25.1,136.7 +S4544,67.6,131.8 +S4545,58.9,181.2 +S4546,102.9,259.6 +S4547,84.0,227.4 +S4548,111.2,397.2 +S4549,98.3,271.5 +S4550,36.3,5.0 +S4551,54.1,109.6 +S4552,56.6,156.0 +S4553,50.3,85.1 +S4554,61.6,242.5 +S4555,11.0,232.3 +S4556,9.5,5.0 +S4557,26.1,182.1 +S4558,88.9,239.8 +S4559,54.0,165.4 +S4560,36.9,210.2 +S4561,98.6,175.5 +S4562,10.2,181.8 +S4563,43.3,78.3 +S4564,91.6,143.7 +S4565,6.0,23.3 +S4566,114.5,328.0 +S4567,23.8,69.7 +S4568,45.5,201.4 +S4569,79.8,272.2 +S4570,55.9,197.7 +S4571,8.4,14.9 +S4572,29.0,75.8 +S4573,109.5,365.1 +S4574,110.6,277.0 +S4575,58.0,198.4 +S4576,6.7,213.2 +S4577,45.6,177.6 +S4578,63.5,221.9 +S4579,101.9,281.3 +S4580,62.3,150.0 +S4581,21.6,182.8 +S4582,71.2,131.6 +S4583,38.7,166.5 +S4584,21.3,50.2 +S4585,39.9,160.2 +S4586,47.2,198.6 +S4587,61.5,230.7 +S4588,10.3,83.4 +S4589,104.4,308.3 +S4590,95.0,225.8 +S4591,51.7,76.6 +S4592,48.7,256.0 +S4593,62.5,136.6 +S4594,19.2,34.0 +S4595,77.7,129.8 +S4596,109.4,258.2 +S4597,83.5,212.5 +S4598,37.8,209.3 +S4599,17.2,83.4 +S4600,15.1,14.6 +S4601,91.7,150.5 +S4602,95.2,278.4 +S4603,24.3,117.4 +S4604,119.4,356.8 +S4605,13.6,5.0 +S4606,115.1,280.2 +S4607,16.9,36.4 +S4608,113.5,275.0 +S4609,97.2,305.4 +S4610,45.1,128.7 +S4611,103.0,224.7 +S4612,86.2,415.8 +S4613,40.0,182.8 +S4614,112.4,379.2 +S4615,9.7,67.5 +S4616,78.7,224.4 +S4617,106.8,301.5 +S4618,27.0,56.0 +S4619,99.0,224.7 +S4620,75.2,151.6 +S4621,70.7,210.7 +S4622,84.5,204.5 +S4623,55.5,95.3 +S4624,70.0,129.0 +S4625,47.1,151.0 +S4626,75.2,216.9 +S4627,31.2,210.9 +S4628,67.8,138.2 +S4629,10.5,5.0 +S4630,75.4,119.9 +S4631,52.3,166.3 +S4632,60.6,117.9 +S4633,39.6,78.2 +S4634,50.5,87.7 +S4635,28.4,103.2 +S4636,82.0,205.0 +S4637,67.5,200.4 +S4638,83.2,224.2 +S4639,77.5,127.3 +S4640,76.5,258.5 +S4641,61.5,51.7 +S4642,98.2,281.8 +S4643,42.9,5.0 +S4644,38.1,115.1 +S4645,113.1,232.5 +S4646,80.0,320.9 +S4647,85.9,244.4 +S4648,41.6,225.2 +S4649,38.7,103.9 +S4650,28.3,145.7 +S4651,44.1,72.9 +S4652,25.5,155.4 +S4653,76.2,98.7 +S4654,76.8,138.9 +S4655,42.8,180.9 +S4656,56.3,106.0 +S4657,20.3,5.0 +S4658,11.0,85.1 +S4659,95.7,276.7 +S4660,13.2,197.8 +S4661,30.4,160.6 +S4662,16.8,100.0 +S4663,104.9,328.6 +S4664,27.9,113.2 +S4665,91.7,301.7 +S4666,55.4,62.9 +S4667,35.5,69.4 +S4668,116.7,397.9 +S4669,19.6,102.0 +S4670,114.7,247.7 +S4671,52.8,123.7 +S4672,97.9,279.1 +S4673,54.6,298.8 +S4674,112.7,318.2 +S4675,99.7,121.3 +S4676,15.1,166.1 +S4677,61.9,270.9 +S4678,49.2,168.3 +S4679,89.3,231.6 +S4680,82.5,242.7 +S4681,109.3,312.6 +S4682,85.2,272.6 +S4683,102.3,415.6 +S4684,81.5,234.3 +S4685,33.2,83.6 +S4686,50.9,41.1 +S4687,68.7,88.0 +S4688,17.7,185.2 +S4689,51.4,164.9 +S4690,72.4,204.5 +S4691,111.5,327.6 +S4692,63.0,220.8 +S4693,42.7,180.5 +S4694,60.1,163.4 +S4695,5.6,95.7 +S4696,32.8,229.7 +S4697,22.8,72.0 +S4698,26.6,103.8 +S4699,57.8,66.6 +S4700,66.8,167.1 +S4701,71.2,224.2 +S4702,105.2,316.6 +S4703,75.6,276.1 +S4704,87.3,204.5 +S4705,44.4,51.7 +S4706,32.1,139.6 +S4707,94.2,201.9 +S4708,81.7,247.9 +S4709,82.5,114.1 +S4710,81.7,192.4 +S4711,49.4,147.2 +S4712,93.2,201.1 +S4713,21.7,169.2 +S4714,99.1,218.5 +S4715,10.4,13.7 +S4716,39.0,224.0 +S4717,105.9,216.0 +S4718,110.9,289.4 +S4719,65.8,62.8 +S4720,74.5,249.1 +S4721,34.8,176.4 +S4722,11.8,23.5 +S4723,90.7,216.2 +S4724,39.1,161.3 +S4725,80.6,139.0 +S4726,95.8,332.4 +S4727,55.1,183.7 +S4728,34.0,38.7 +S4729,83.5,206.4 +S4730,87.7,314.1 +S4731,43.2,91.6 +S4732,74.6,156.1 +S4733,7.5,5.0 +S4734,103.3,333.9 +S4735,28.0,134.0 +S4736,80.7,98.1 +S4737,76.2,212.9 +S4738,22.9,5.0 +S4739,79.6,166.0 +S4740,114.4,294.3 +S4741,46.5,54.3 +S4742,56.9,70.1 +S4743,55.7,261.7 +S4744,116.6,315.5 +S4745,43.9,85.2 +S4746,32.4,182.7 +S4747,14.9,21.2 +S4748,47.6,8.0 +S4749,39.7,111.1 +S4750,88.8,153.5 +S4751,110.5,196.7 +S4752,29.3,5.0 +S4753,13.1,31.1 +S4754,78.1,86.8 +S4755,52.5,224.0 +S4756,29.8,54.8 +S4757,110.4,164.1 +S4758,89.0,143.3 +S4759,33.9,125.2 +S4760,21.9,135.3 +S4761,32.5,163.0 +S4762,117.9,260.3 +S4763,44.4,66.0 +S4764,67.8,152.9 +S4765,33.8,158.9 +S4766,79.1,201.1 +S4767,116.6,281.7 +S4768,73.7,78.2 +S4769,92.1,286.6 +S4770,89.1,244.4 +S4771,67.7,168.5 +S4772,108.4,303.5 +S4773,59.1,185.2 +S4774,58.0,122.5 +S4775,34.2,59.3 +S4776,106.5,231.1 +S4777,53.2,234.0 +S4778,72.1,236.0 +S4779,117.8,230.2 +S4780,103.0,212.4 +S4781,66.5,80.7 +S4782,27.7,52.1 +S4783,62.3,248.1 +S4784,66.2,249.9 +S4785,62.5,348.1 +S4786,114.1,311.1 +S4787,79.9,276.3 +S4788,44.9,175.0 +S4789,45.5,116.7 +S4790,72.4,93.3 +S4791,90.0,124.2 +S4792,29.4,100.7 +S4793,52.7,196.3 +S4794,72.2,188.6 +S4795,53.3,158.7 +S4796,110.0,138.6 +S4797,97.7,273.0 +S4798,55.5,181.8 +S4799,96.5,239.4 +S4800,101.4,312.2 +S4801,85.6,163.5 +S4802,100.5,84.1 +S4803,46.3,109.8 +S4804,63.9,139.0 +S4805,11.8,5.0 +S4806,16.5,216.5 +S4807,47.4,159.0 +S4808,72.3,156.6 +S4809,117.2,426.5 +S4810,16.6,73.4 +S4811,69.3,212.6 +S4812,108.7,356.1 +S4813,95.8,12.6 +S4814,113.6,280.0 +S4815,13.8,7.7 +S4816,20.5,36.2 +S4817,34.3,5.0 +S4818,31.5,154.1 +S4819,26.9,5.0 +S4820,65.8,284.4 +S4821,74.6,226.6 +S4822,19.4,58.5 +S4823,29.6,137.9 +S4824,54.0,129.0 +S4825,36.8,134.6 +S4826,111.7,197.5 +S4827,7.3,5.0 +S4828,106.7,288.2 +S4829,13.2,133.0 +S4830,95.8,207.6 +S4831,10.7,14.6 +S4832,95.4,128.7 +S4833,119.2,276.4 +S4834,17.1,90.7 +S4835,94.4,189.7 +S4836,18.9,144.3 +S4837,6.2,39.2 +S4838,108.0,300.6 +S4839,46.1,212.7 +S4840,45.3,179.3 +S4841,45.9,38.8 +S4842,10.8,83.8 +S4843,118.3,317.9 +S4844,119.4,340.6 +S4845,52.3,147.8 +S4846,114.5,219.8 +S4847,42.2,117.4 +S4848,83.0,368.2 +S4849,42.6,300.0 +S4850,28.1,130.9 +S4851,55.0,199.9 +S4852,113.2,146.0 +S4853,94.1,219.6 +S4854,46.3,96.3 +S4855,14.8,13.0 +S4856,17.3,102.6 +S4857,57.7,86.1 +S4858,115.2,333.8 +S4859,44.5,95.6 +S4860,84.3,266.1 +S4861,117.0,240.9 +S4862,50.8,144.0 +S4863,73.1,223.6 +S4864,63.2,286.1 +S4865,48.4,179.9 +S4866,92.9,256.8 +S4867,98.4,328.2 +S4868,104.5,260.5 +S4869,106.8,238.6 +S4870,38.1,134.8 +S4871,15.8,43.1 +S4872,65.3,53.2 +S4873,12.9,41.1 +S4874,105.2,223.4 +S4875,88.6,323.1 +S4876,118.2,284.9 +S4877,70.6,215.5 +S4878,40.2,178.6 +S4879,5.2,85.3 +S4880,107.9,278.9 +S4881,82.5,237.0 +S4882,27.5,39.7 +S4883,85.6,228.9 +S4884,88.5,292.0 +S4885,94.5,163.7 +S4886,103.3,266.3 +S4887,49.7,261.7 +S4888,63.3,190.9 +S4889,104.1,197.7 +S4890,16.1,63.0 +S4891,76.6,165.8 +S4892,10.7,95.7 +S4893,73.8,381.3 +S4894,86.8,178.8 +S4895,109.3,272.5 +S4896,69.8,261.3 +S4897,46.1,19.5 +S4898,118.2,375.9 +S4899,10.4,5.0 +S4900,47.3,136.5 +S4901,36.5,184.8 +S4902,7.2,5.0 +S4903,34.7,194.0 +S4904,25.8,59.1 +S4905,66.5,220.6 +S4906,110.7,319.9 +S4907,15.6,104.4 +S4908,70.2,68.0 +S4909,101.2,134.1 +S4910,16.0,105.5 +S4911,69.5,269.4 +S4912,35.2,38.1 +S4913,13.3,5.0 +S4914,25.3,112.6 +S4915,105.6,345.1 +S4916,78.9,117.0 +S4917,83.7,162.8 +S4918,96.8,379.8 +S4919,58.0,77.6 +S4920,18.2,124.0 +S4921,110.1,240.5 +S4922,79.8,153.4 +S4923,60.6,126.8 +S4924,74.5,200.3 +S4925,107.8,251.7 +S4926,8.2,5.0 +S4927,92.2,310.9 +S4928,87.3,227.3 +S4929,26.4,16.3 +S4930,91.1,104.9 +S4931,69.1,220.6 +S4932,32.6,103.5 +S4933,28.5,103.0 +S4934,62.2,180.8 +S4935,76.0,128.2 +S4936,50.0,174.4 +S4937,54.6,224.1 +S4938,89.3,249.2 +S4939,116.3,351.5 +S4940,12.7,114.6 +S4941,79.1,137.3 +S4942,63.3,109.4 +S4943,90.5,248.8 +S4944,56.7,174.2 +S4945,54.4,95.0 +S4946,11.8,120.5 +S4947,21.4,115.9 +S4948,33.5,5.0 +S4949,53.8,160.4 +S4950,45.1,5.0 +S4951,21.9,5.0 +S4952,117.7,365.8 +S4953,50.1,251.8 +S4954,117.6,322.7 +S4955,25.2,125.8 +S4956,110.2,224.4 +S4957,37.9,66.2 +S4958,97.3,216.9 +S4959,68.4,95.8 +S4960,94.3,59.7 +S4961,109.0,347.7 +S4962,67.4,153.5 +S4963,95.8,147.8 +S4964,106.9,266.8 +S4965,65.9,212.8 +S4966,20.7,93.6 +S4967,97.5,279.6 +S4968,27.9,99.9 +S4969,61.2,175.0 +S4970,18.4,5.0 +S4971,74.8,157.3 +S4972,107.2,277.7 +S4973,111.1,292.1 +S4974,25.4,36.8 +S4975,56.8,142.5 +S4976,78.2,126.3 +S4977,85.0,147.4 +S4978,6.5,5.0 +S4979,94.2,315.6 +S4980,112.4,275.6 +S4981,61.4,188.6 +S4982,77.7,236.2 +S4983,58.0,211.9 +S4984,103.8,316.9 +S4985,94.3,167.6 +S4986,10.2,197.0 +S4987,16.2,195.7 +S4988,97.4,336.6 +S4989,116.0,324.7 +S4990,89.3,117.6 +S4991,109.0,239.9 +S4992,20.7,95.3 +S4993,102.1,313.9 +S4994,22.7,58.8 +S4995,69.0,175.5 +S4996,108.5,312.3 +S4997,89.4,180.0 +S4998,44.8,256.5 +S4999,53.9,153.7 +S5000,27.7,5.0 diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-renamed/case.json b/agents/evals/fixtures/cases/scatter-basic-letsplot-renamed/case.json new file mode 100644 index 00000000000..1fa3dcd5d89 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-renamed/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "scatter-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "x", + "column": "Werbebudget in Tsd. CHF" + }, + { + "role": "y", + "column": "Umsatz in Tsd. CHF" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "renamed", + "synthetic", + "renamed-headers", + "smoke" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, renamed)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-renamed/data.csv b/agents/evals/fixtures/cases/scatter-basic-letsplot-renamed/data.csv new file mode 100644 index 00000000000..a0cf2f9f329 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-renamed/data.csv @@ -0,0 +1,151 @@ +Filiale,Werbebudget in Tsd. CHF,Umsatz in Tsd. CHF +S0001,113.5,277.1 +S0002,46.3,100.9 +S0003,95.3,228.4 +S0004,73.0,210.7 +S0005,38.8,9.2 +S0006,111.1,211.6 +S0007,105.0,169.0 +S0008,46.9,5.0 +S0009,116.9,354.9 +S0010,30.8,206.6 +S0011,97.6,329.5 +S0012,83.3,88.6 +S0013,59.2,192.4 +S0014,8.5,106.1 +S0015,107.9,225.7 +S0016,71.0,246.9 +S0017,49.9,65.0 +S0018,45.8,59.4 +S0019,80.0,148.3 +S0020,44.9,82.6 +S0021,63.4,101.0 +S0022,47.7,208.1 +S0023,11.3,5.0 +S0024,33.8,77.6 +S0025,101.7,207.9 +S0026,99.1,404.2 +S0027,81.7,147.5 +S0028,59.1,197.3 +S0029,116.5,413.5 +S0030,101.6,169.0 +S0031,33.2,50.3 +S0032,70.3,163.8 +S0033,114.9,187.1 +S0034,95.3,326.8 +S0035,47.5,105.7 +S0036,59.0,238.2 +S0037,64.6,213.0 +S0038,108.7,269.5 +S0039,87.1,290.5 +S0040,50.8,125.0 +S0041,58.1,236.4 +S0042,15.6,5.0 +S0043,61.6,116.5 +S0044,31.3,190.8 +S0045,15.7,5.0 +S0046,15.5,105.9 +S0047,29.8,73.5 +S0048,85.4,180.7 +S0049,25.6,44.4 +S0050,70.4,278.1 +S0051,74.3,88.4 +S0052,116.1,342.3 +S0053,57.7,194.6 +S0054,94.1,207.5 +S0055,9.0,52.7 +S0056,79.1,255.7 +S0057,117.7,245.4 +S0058,10.4,5.0 +S0059,109.4,289.4 +S0060,22.9,28.9 +S0061,82.7,184.7 +S0062,7.9,60.3 +S0063,12.1,117.0 +S0064,20.5,210.2 +S0065,108.7,292.1 +S0066,95.0,247.6 +S0067,81.1,267.7 +S0068,79.7,227.3 +S0069,38.8,5.0 +S0070,65.7,135.8 +S0071,60.4,80.1 +S0072,114.4,329.0 +S0073,57.2,249.3 +S0074,90.9,255.8 +S0075,46.2,64.9 +S0076,111.4,330.1 +S0077,103.0,188.9 +S0078,119.1,307.8 +S0079,31.1,21.3 +S0080,105.1,163.6 +S0081,59.9,67.4 +S0082,63.6,174.7 +S0083,67.3,135.0 +S0084,15.6,103.2 +S0085,106.3,172.3 +S0086,74.5,230.8 +S0087,17.1,32.6 +S0088,90.0,316.7 +S0089,18.0,149.3 +S0090,48.8,127.4 +S0091,82.0,219.8 +S0092,58.5,179.9 +S0093,12.5,98.7 +S0094,76.6,181.6 +S0095,47.2,215.8 +S0096,48.9,107.0 +S0097,23.7,5.0 +S0098,26.1,112.2 +S0099,119.2,282.7 +S0100,74.5,254.7 +S0101,72.6,234.1 +S0102,94.8,248.2 +S0103,49.1,150.6 +S0104,22.7,96.6 +S0105,74.8,151.0 +S0106,51.6,63.0 +S0107,51.4,90.5 +S0108,15.1,65.3 +S0109,53.4,5.0 +S0110,11.0,32.5 +S0111,108.7,199.6 +S0112,48.1,134.9 +S0113,87.3,166.3 +S0114,72.7,196.9 +S0115,55.6,140.8 +S0116,43.9,223.0 +S0117,8.7,34.2 +S0118,80.3,191.5 +S0119,16.4,76.3 +S0120,32.0,5.0 +S0121,115.3,207.0 +S0122,48.2,241.8 +S0123,46.7,174.2 +S0124,84.3,223.0 +S0125,36.0,191.4 +S0126,47.3,126.8 +S0127,40.4,107.3 +S0128,85.0,197.2 +S0129,13.9,5.0 +S0130,48.8,208.2 +S0131,119.7,278.1 +S0132,78.7,198.7 +S0133,59.6,141.9 +S0134,38.3,75.9 +S0135,7.6,5.0 +S0136,109.6,280.7 +S0137,110.9,425.5 +S0138,117.5,356.0 +S0139,60.1,146.1 +S0140,73.2,129.1 +S0141,38.2,122.1 +S0142,100.3,276.5 +S0143,72.0,182.8 +S0144,39.1,180.5 +S0145,38.9,55.0 +S0146,46.0,211.3 +S0147,82.1,223.3 +S0148,93.5,197.9 +S0149,16.9,55.7 +S0150,111.8,299.1 diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-x10/case.json b/agents/evals/fixtures/cases/scatter-basic-letsplot-x10/case.json new file mode 100644 index 00000000000..4322b033b3f --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "scatter-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "x", + "column": "Ad Spend (kCHF)" + }, + { + "role": "y", + "column": "Revenue (kCHF)" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, x10)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-letsplot-x10/data.csv b/agents/evals/fixtures/cases/scatter-basic-letsplot-x10/data.csv new file mode 100644 index 00000000000..069cc23cad1 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-letsplot-x10/data.csv @@ -0,0 +1,151 @@ +Store,Ad Spend (kCHF),Revenue (kCHF) +S0001,1135.1,2770.7 +S0002,463.3,1009.4 +S0003,952.5,2284.1 +S0004,730.0,2107.0 +S0005,388.5,91.6 +S0006,1111.1,2115.7 +S0007,1049.7,1689.9 +S0008,468.8,50.0 +S0009,1169.2,3548.7 +S0010,308.2,2066.1 +S0011,976.3,3294.7 +S0012,833.0,885.5 +S0013,591.7,1924.0 +S0014,85.4,1060.6 +S0015,1079.0,2257.1 +S0016,709.7,2469.3 +S0017,498.9,649.9 +S0018,457.9,593.6 +S0019,799.8,1483.2 +S0020,449.1,826.5 +S0021,633.7,1010.0 +S0022,476.6,2081.4 +S0023,113.5,50.0 +S0024,338.0,775.7 +S0025,1017.1,2079.3 +S0026,990.9,4041.5 +S0027,817.4,1474.7 +S0028,591.2,1973.3 +S0029,1165.3,4135.3 +S0030,1016.3,1690.1 +S0031,331.8,503.1 +S0032,702.7,1637.9 +S0033,1149.3,1870.6 +S0034,953.5,3267.8 +S0035,474.8,1057.1 +S0036,590.4,2382.1 +S0037,645.5,2129.6 +S0038,1087.2,2695.4 +S0039,871.4,2905.2 +S0040,507.9,1249.6 +S0041,581.3,2363.6 +S0042,156.2,50.0 +S0043,615.8,1165.1 +S0044,313.4,1907.8 +S0045,157.1,50.0 +S0046,155.0,1058.9 +S0047,298.2,734.5 +S0048,854.0,1806.7 +S0049,256.1,444.2 +S0050,703.6,2781.2 +S0051,743.0,883.8 +S0052,1161.2,3423.2 +S0053,576.9,1945.6 +S0054,940.7,2074.7 +S0055,90.1,527.2 +S0056,791.3,2556.6 +S0057,1177.3,2453.9 +S0058,104.5,50.0 +S0059,1093.8,2894.4 +S0060,229.1,288.5 +S0061,826.5,1846.6 +S0062,79.1,602.8 +S0063,120.7,1169.5 +S0064,204.9,2102.0 +S0065,1086.5,2921.5 +S0066,950.3,2476.3 +S0067,811.1,2676.9 +S0068,796.9,2273.5 +S0069,387.8,50.0 +S0070,657.3,1358.4 +S0071,604.1,800.9 +S0072,1143.8,3289.6 +S0073,572.3,2493.3 +S0074,909.0,2558.2 +S0075,462.5,649.1 +S0076,1114.2,3300.7 +S0077,1030.2,1889.0 +S0078,1190.7,3077.7 +S0079,311.1,213.4 +S0080,1050.9,1636.0 +S0081,598.5,673.8 +S0082,635.8,1747.3 +S0083,673.1,1350.1 +S0084,155.6,1032.3 +S0085,1063.2,1723.3 +S0086,745.1,2307.8 +S0087,171.1,325.9 +S0088,899.9,3166.6 +S0089,180.5,1492.8 +S0090,488.4,1274.3 +S0091,820.0,2197.7 +S0092,585.1,1799.1 +S0093,124.7,986.5 +S0094,765.6,1815.8 +S0095,471.7,2157.6 +S0096,488.5,1070.0 +S0097,237.4,50.0 +S0098,261.5,1121.6 +S0099,1192.1,2827.4 +S0100,745.1,2547.4 +S0101,725.5,2340.8 +S0102,948.1,2481.7 +S0103,491.1,1506.3 +S0104,227.3,966.0 +S0105,748.2,1509.8 +S0106,515.6,630.5 +S0107,514.0,904.7 +S0108,151.0,653.2 +S0109,534.0,50.0 +S0110,109.7,325.4 +S0111,1087.3,1995.9 +S0112,481.1,1348.5 +S0113,872.6,1663.1 +S0114,726.6,1969.4 +S0115,556.2,1408.2 +S0116,439.2,2229.6 +S0117,86.7,341.9 +S0118,802.8,1915.4 +S0119,164.4,763.2 +S0120,320.0,50.0 +S0121,1152.7,2070.2 +S0122,482.2,2418.0 +S0123,466.9,1742.0 +S0124,843.4,2230.1 +S0125,360.2,1913.5 +S0126,473.4,1268.0 +S0127,403.6,1073.2 +S0128,849.6,1972.3 +S0129,138.9,50.0 +S0130,488.0,2082.3 +S0131,1196.9,2781.0 +S0132,787.1,1987.0 +S0133,596.4,1418.5 +S0134,382.6,758.9 +S0135,76.1,50.0 +S0136,1095.9,2807.2 +S0137,1108.9,4255.5 +S0138,1175.3,3559.8 +S0139,601.4,1461.2 +S0140,732.3,1290.5 +S0141,382.3,1220.9 +S0142,1002.7,2765.2 +S0143,720.1,1827.9 +S0144,391.2,1805.3 +S0145,389.3,550.4 +S0146,459.7,2112.7 +S0147,821.3,2233.3 +S0148,935.0,1979.1 +S0149,169.3,556.9 +S0150,1118.2,2991.4 diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-date/case.json b/agents/evals/fixtures/cases/scatter-basic-pygal-date/case.json new file mode 100644 index 00000000000..325cabf71dd --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "scatter-basic", + "library": "pygal", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "x", + "column": "Ad Spend (kCHF)" + }, + { + "role": "y", + "column": "Revenue (kCHF)" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, date)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-date/data.csv b/agents/evals/fixtures/cases/scatter-basic-pygal-date/data.csv new file mode 100644 index 00000000000..734bcb23431 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-date/data.csv @@ -0,0 +1,151 @@ +Store,Ad Spend (kCHF),Revenue (kCHF),Campaign Start,Reported On +S0001,113.5,277.1,01.07.2026,2026-07-01 +S0002,46.3,100.9,10.05.2026,2026-05-12 +S0003,95.3,228.4,05.06.2026,2026-06-08 +S0004,73.0,210.7,19.05.2026,2026-05-19 +S0005,38.8,9.2,08.02.2026,2026-02-09 +S0006,111.1,211.6,07.04.2026,2026-04-11 +S0007,105.0,169.0,19.05.2026,2026-05-21 +S0008,46.9,5.0,01.05.2026,2026-05-04 +S0009,116.9,354.9,09.05.2026,2026-05-11 +S0010,30.8,206.6,25.01.2026,2026-01-25 +S0011,97.6,329.5,18.02.2026,2026-02-20 +S0012,83.3,88.6,15.01.2026,2026-01-19 +S0013,59.2,192.4,28.02.2026,2026-02-28 +S0014,8.5,106.1,13.06.2026,2026-06-13 +S0015,107.9,225.7,01.06.2026,2026-06-02 +S0016,71.0,246.9,30.05.2026,2026-05-30 +S0017,49.9,65.0,26.01.2026,2026-01-26 +S0018,45.8,59.4,20.01.2026,2026-01-24 +S0019,80.0,148.3,29.03.2026,2026-04-01 +S0020,44.9,82.6,09.04.2026,2026-04-11 +S0021,63.4,101.0,28.02.2026,2026-03-01 +S0022,47.7,208.1,30.01.2026,2026-02-03 +S0023,11.3,5.0,03.05.2026,2026-05-05 +S0024,33.8,77.6,11.03.2026,2026-03-13 +S0025,101.7,207.9,31.05.2026,2026-06-03 +S0026,99.1,404.2,19.05.2026,2026-05-20 +S0027,81.7,147.5,12.04.2026,2026-04-13 +S0028,59.1,197.3,09.02.2026,2026-02-10 +S0029,116.5,413.5,31.01.2026,2026-01-31 +S0030,101.6,169.0,08.01.2026,2026-01-11 +S0031,33.2,50.3,23.04.2026,2026-04-24 +S0032,70.3,163.8,24.06.2026,2026-06-25 +S0033,114.9,187.1,13.04.2026,2026-04-16 +S0034,95.3,326.8,20.05.2026,2026-05-23 +S0035,47.5,105.7,21.03.2026,2026-03-21 +S0036,59.0,238.2,01.04.2026,2026-04-04 +S0037,64.6,213.0,27.02.2026,2026-03-01 +S0038,108.7,269.5,24.05.2026,2026-05-28 +S0039,87.1,290.5,16.01.2026,2026-01-17 +S0040,50.8,125.0,20.02.2026,2026-02-24 +S0041,58.1,236.4,12.02.2026,2026-02-12 +S0042,15.6,5.0,21.02.2026,2026-02-22 +S0043,61.6,116.5,06.02.2026,2026-02-06 +S0044,31.3,190.8,13.03.2026,2026-03-13 +S0045,15.7,5.0,28.04.2026,2026-05-01 +S0046,15.5,105.9,24.04.2026,2026-04-26 +S0047,29.8,73.5,08.04.2026,2026-04-09 +S0048,85.4,180.7,18.06.2026,2026-06-20 +S0049,25.6,44.4,14.03.2026,2026-03-18 +S0050,70.4,278.1,06.02.2026,2026-02-08 +S0051,74.3,88.4,14.03.2026,2026-03-16 +S0052,116.1,342.3,11.04.2026,2026-04-14 +S0053,57.7,194.6,25.02.2026,2026-02-28 +S0054,94.1,207.5,16.03.2026,2026-03-16 +S0055,9.0,52.7,27.03.2026,2026-03-30 +S0056,79.1,255.7,17.04.2026,2026-04-17 +S0057,117.7,245.4,14.06.2026,2026-06-14 +S0058,10.4,5.0,22.02.2026,2026-02-26 +S0059,109.4,289.4,16.05.2026,2026-05-19 +S0060,22.9,28.9,29.01.2026,2026-02-02 +S0061,82.7,184.7,16.04.2026,2026-04-20 +S0062,7.9,60.3,11.02.2026,2026-02-15 +S0063,12.1,117.0,30.06.2026,2026-07-04 +S0064,20.5,210.2,07.03.2026,2026-03-10 +S0065,108.7,292.1,21.04.2026,2026-04-23 +S0066,95.0,247.6,12.06.2026,2026-06-16 +S0067,81.1,267.7,14.03.2026,2026-03-18 +S0068,79.7,227.3,09.04.2026,2026-04-09 +S0069,38.8,5.0,12.05.2026,2026-05-13 +S0070,65.7,135.8,04.06.2026,2026-06-04 +S0071,60.4,80.1,02.07.2026,2026-07-04 +S0072,114.4,329.0,09.02.2026,2026-02-11 +S0073,57.2,249.3,09.03.2026,2026-03-13 +S0074,90.9,255.8,17.02.2026,2026-02-18 +S0075,46.2,64.9,05.02.2026,2026-02-09 +S0076,111.4,330.1,20.04.2026,2026-04-20 +S0077,103.0,188.9,02.06.2026,2026-06-06 +S0078,119.1,307.8,27.01.2026,2026-01-28 +S0079,31.1,21.3,03.05.2026,2026-05-07 +S0080,105.1,163.6,25.05.2026,2026-05-26 +S0081,59.9,67.4,03.03.2026,2026-03-07 +S0082,63.6,174.7,18.05.2026,2026-05-20 +S0083,67.3,135.0,23.03.2026,2026-03-24 +S0084,15.6,103.2,26.04.2026,2026-04-29 +S0085,106.3,172.3,08.05.2026,2026-05-08 +S0086,74.5,230.8,09.02.2026,2026-02-11 +S0087,17.1,32.6,23.01.2026,2026-01-24 +S0088,90.0,316.7,18.03.2026,2026-03-18 +S0089,18.0,149.3,28.06.2026,2026-06-29 +S0090,48.8,127.4,28.01.2026,2026-01-31 +S0091,82.0,219.8,02.02.2026,2026-02-02 +S0092,58.5,179.9,21.02.2026,2026-02-21 +S0093,12.5,98.7,22.06.2026,2026-06-22 +S0094,76.6,181.6,25.04.2026,2026-04-29 +S0095,47.2,215.8,01.02.2026,2026-02-01 +S0096,48.9,107.0,17.02.2026,2026-02-19 +S0097,23.7,5.0,11.05.2026,2026-05-13 +S0098,26.1,112.2,19.01.2026,2026-01-19 +S0099,119.2,282.7,15.04.2026,2026-04-18 +S0100,74.5,254.7,17.06.2026,2026-06-19 +S0101,72.6,234.1,17.06.2026,2026-06-19 +S0102,94.8,248.2,24.05.2026,2026-05-24 +S0103,49.1,150.6,08.01.2026,2026-01-11 +S0104,22.7,96.6,27.05.2026,2026-05-28 +S0105,74.8,151.0,01.05.2026,2026-05-04 +S0106,51.6,63.0,09.06.2026,2026-06-10 +S0107,51.4,90.5,30.01.2026,2026-01-30 +S0108,15.1,65.3,08.03.2026,2026-03-10 +S0109,53.4,5.0,30.04.2026,2026-05-02 +S0110,11.0,32.5,22.04.2026,2026-04-22 +S0111,108.7,199.6,27.04.2026,2026-04-28 +S0112,48.1,134.9,03.07.2026,2026-07-04 +S0113,87.3,166.3,02.06.2026,2026-06-06 +S0114,72.7,196.9,26.06.2026,2026-06-28 +S0115,55.6,140.8,08.04.2026,2026-04-12 +S0116,43.9,223.0,10.04.2026,2026-04-11 +S0117,8.7,34.2,05.04.2026,2026-04-06 +S0118,80.3,191.5,27.04.2026,2026-04-27 +S0119,16.4,76.3,27.01.2026,2026-01-30 +S0120,32.0,5.0,12.01.2026,2026-01-13 +S0121,115.3,207.0,26.02.2026,2026-02-28 +S0122,48.2,241.8,12.01.2026,2026-01-15 +S0123,46.7,174.2,11.02.2026,2026-02-12 +S0124,84.3,223.0,01.02.2026,2026-02-03 +S0125,36.0,191.4,07.04.2026,2026-04-09 +S0126,47.3,126.8,26.01.2026,2026-01-30 +S0127,40.4,107.3,14.05.2026,2026-05-18 +S0128,85.0,197.2,16.02.2026,2026-02-18 +S0129,13.9,5.0,02.07.2026,2026-07-04 +S0130,48.8,208.2,20.01.2026,2026-01-23 +S0131,119.7,278.1,19.06.2026,2026-06-23 +S0132,78.7,198.7,02.06.2026,2026-06-02 +S0133,59.6,141.9,24.03.2026,2026-03-27 +S0134,38.3,75.9,07.04.2026,2026-04-10 +S0135,7.6,5.0,07.01.2026,2026-01-09 +S0136,109.6,280.7,06.06.2026,2026-06-09 +S0137,110.9,425.5,01.07.2026,2026-07-05 +S0138,117.5,356.0,02.05.2026,2026-05-05 +S0139,60.1,146.1,11.06.2026,2026-06-15 +S0140,73.2,129.1,11.06.2026,2026-06-11 +S0141,38.2,122.1,16.01.2026,2026-01-20 +S0142,100.3,276.5,15.03.2026,2026-03-15 +S0143,72.0,182.8,24.05.2026,2026-05-28 +S0144,39.1,180.5,22.06.2026,2026-06-26 +S0145,38.9,55.0,10.05.2026,2026-05-11 +S0146,46.0,211.3,22.05.2026,2026-05-24 +S0147,82.1,223.3,26.03.2026,2026-03-30 +S0148,93.5,197.9,22.01.2026,2026-01-26 +S0149,16.9,55.7,19.03.2026,2026-03-19 +S0150,111.8,299.1,21.01.2026,2026-01-21 diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-decimal-comma/case.json b/agents/evals/fixtures/cases/scatter-basic-pygal-decimal-comma/case.json new file mode 100644 index 00000000000..f03333633a6 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "scatter-basic", + "library": "pygal", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "x", + "column": "Ad Spend (kCHF)" + }, + { + "role": "y", + "column": "Revenue (kCHF)" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-decimal-comma/data.csv b/agents/evals/fixtures/cases/scatter-basic-pygal-decimal-comma/data.csv new file mode 100644 index 00000000000..af311d49fbc --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-decimal-comma/data.csv @@ -0,0 +1,151 @@ +Store;Ad Spend (kCHF);Revenue (kCHF) +S0001;113,5;277,1 +S0002;46,3;100,9 +S0003;95,3;228,4 +S0004;73,0;210,7 +S0005;38,8;9,2 +S0006;111,1;211,6 +S0007;105,0;169,0 +S0008;46,9;5,0 +S0009;116,9;354,9 +S0010;30,8;206,6 +S0011;97,6;329,5 +S0012;83,3;88,6 +S0013;59,2;192,4 +S0014;8,5;106,1 +S0015;107,9;225,7 +S0016;71,0;246,9 +S0017;49,9;65,0 +S0018;45,8;59,4 +S0019;80,0;148,3 +S0020;44,9;82,6 +S0021;63,4;101,0 +S0022;47,7;208,1 +S0023;11,3;5,0 +S0024;33,8;77,6 +S0025;101,7;207,9 +S0026;99,1;404,2 +S0027;81,7;147,5 +S0028;59,1;197,3 +S0029;116,5;413,5 +S0030;101,6;169,0 +S0031;33,2;50,3 +S0032;70,3;163,8 +S0033;114,9;187,1 +S0034;95,3;326,8 +S0035;47,5;105,7 +S0036;59,0;238,2 +S0037;64,6;213,0 +S0038;108,7;269,5 +S0039;87,1;290,5 +S0040;50,8;125,0 +S0041;58,1;236,4 +S0042;15,6;5,0 +S0043;61,6;116,5 +S0044;31,3;190,8 +S0045;15,7;5,0 +S0046;15,5;105,9 +S0047;29,8;73,5 +S0048;85,4;180,7 +S0049;25,6;44,4 +S0050;70,4;278,1 +S0051;74,3;88,4 +S0052;116,1;342,3 +S0053;57,7;194,6 +S0054;94,1;207,5 +S0055;9,0;52,7 +S0056;79,1;255,7 +S0057;117,7;245,4 +S0058;10,4;5,0 +S0059;109,4;289,4 +S0060;22,9;28,9 +S0061;82,7;184,7 +S0062;7,9;60,3 +S0063;12,1;117,0 +S0064;20,5;210,2 +S0065;108,7;292,1 +S0066;95,0;247,6 +S0067;81,1;267,7 +S0068;79,7;227,3 +S0069;38,8;5,0 +S0070;65,7;135,8 +S0071;60,4;80,1 +S0072;114,4;329,0 +S0073;57,2;249,3 +S0074;90,9;255,8 +S0075;46,2;64,9 +S0076;111,4;330,1 +S0077;103,0;188,9 +S0078;119,1;307,8 +S0079;31,1;21,3 +S0080;105,1;163,6 +S0081;59,9;67,4 +S0082;63,6;174,7 +S0083;67,3;135,0 +S0084;15,6;103,2 +S0085;106,3;172,3 +S0086;74,5;230,8 +S0087;17,1;32,6 +S0088;90,0;316,7 +S0089;18,0;149,3 +S0090;48,8;127,4 +S0091;82,0;219,8 +S0092;58,5;179,9 +S0093;12,5;98,7 +S0094;76,6;181,6 +S0095;47,2;215,8 +S0096;48,9;107,0 +S0097;23,7;5,0 +S0098;26,1;112,2 +S0099;119,2;282,7 +S0100;74,5;254,7 +S0101;72,6;234,1 +S0102;94,8;248,2 +S0103;49,1;150,6 +S0104;22,7;96,6 +S0105;74,8;151,0 +S0106;51,6;63,0 +S0107;51,4;90,5 +S0108;15,1;65,3 +S0109;53,4;5,0 +S0110;11,0;32,5 +S0111;108,7;199,6 +S0112;48,1;134,9 +S0113;87,3;166,3 +S0114;72,7;196,9 +S0115;55,6;140,8 +S0116;43,9;223,0 +S0117;8,7;34,2 +S0118;80,3;191,5 +S0119;16,4;76,3 +S0120;32,0;5,0 +S0121;115,3;207,0 +S0122;48,2;241,8 +S0123;46,7;174,2 +S0124;84,3;223,0 +S0125;36,0;191,4 +S0126;47,3;126,8 +S0127;40,4;107,3 +S0128;85,0;197,2 +S0129;13,9;5,0 +S0130;48,8;208,2 +S0131;119,7;278,1 +S0132;78,7;198,7 +S0133;59,6;141,9 +S0134;38,3;75,9 +S0135;7,6;5,0 +S0136;109,6;280,7 +S0137;110,9;425,5 +S0138;117,5;356,0 +S0139;60,1;146,1 +S0140;73,2;129,1 +S0141;38,2;122,1 +S0142;100,3;276,5 +S0143;72,0;182,8 +S0144;39,1;180,5 +S0145;38,9;55,0 +S0146;46,0;211,3 +S0147;82,1;223,3 +S0148;93,5;197,9 +S0149;16,9;55,7 +S0150;111,8;299,1 diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-n12/case.json b/agents/evals/fixtures/cases/scatter-basic-pygal-n12/case.json new file mode 100644 index 00000000000..28cf8c54ab5 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "scatter-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "x", + "column": "Ad Spend (kCHF)" + }, + { + "role": "y", + "column": "Revenue (kCHF)" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, n12)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-n12/data.csv b/agents/evals/fixtures/cases/scatter-basic-pygal-n12/data.csv new file mode 100644 index 00000000000..5c1c20f3ee8 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-n12/data.csv @@ -0,0 +1,13 @@ +Store,Ad Spend (kCHF),Revenue (kCHF) +S0001,101.7,199.9 +S0002,7.6,35.7 +S0003,80.9,321.5 +S0004,46.0,157.9 +S0005,57.2,183.1 +S0006,98.5,184.3 +S0007,29.4,61.1 +S0008,99.9,371.0 +S0009,98.3,214.7 +S0010,50.6,121.0 +S0011,106.5,196.8 +S0012,24.7,186.3 diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-n5000/case.json b/agents/evals/fixtures/cases/scatter-basic-pygal-n5000/case.json new file mode 100644 index 00000000000..8f3cb5089b1 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "scatter-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "x", + "column": "Ad Spend (kCHF)" + }, + { + "role": "y", + "column": "Revenue (kCHF)" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, n5000)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-n5000/data.csv b/agents/evals/fixtures/cases/scatter-basic-pygal-n5000/data.csv new file mode 100644 index 00000000000..873d2f00821 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-n5000/data.csv @@ -0,0 +1,5001 @@ +Store,Ad Spend (kCHF),Revenue (kCHF) +S0001,72.1,313.3 +S0002,90.3,179.9 +S0003,71.7,201.6 +S0004,51.9,188.1 +S0005,105.6,296.8 +S0006,100.5,236.5 +S0007,110.1,320.5 +S0008,119.3,274.2 +S0009,40.4,131.5 +S0010,79.0,345.7 +S0011,39.0,155.4 +S0012,17.4,38.3 +S0013,79.6,234.3 +S0014,89.6,183.2 +S0015,54.0,202.4 +S0016,42.2,9.9 +S0017,112.8,354.2 +S0018,82.7,144.5 +S0019,66.3,227.8 +S0020,91.5,124.4 +S0021,72.3,216.9 +S0022,23.4,15.8 +S0023,96.2,213.5 +S0024,60.0,146.8 +S0025,104.4,173.5 +S0026,76.1,285.7 +S0027,33.7,70.9 +S0028,17.2,68.9 +S0029,30.0,114.3 +S0030,26.5,148.9 +S0031,50.4,45.1 +S0032,49.1,201.2 +S0033,119.5,371.6 +S0034,76.6,360.6 +S0035,56.2,125.0 +S0036,45.3,104.2 +S0037,7.8,38.6 +S0038,7.4,113.0 +S0039,18.3,35.3 +S0040,56.3,163.1 +S0041,84.4,99.9 +S0042,62.1,198.8 +S0043,7.4,5.0 +S0044,114.6,280.4 +S0045,75.1,141.6 +S0046,37.2,157.0 +S0047,25.9,56.2 +S0048,100.6,230.9 +S0049,16.1,74.2 +S0050,114.3,200.2 +S0051,103.8,235.1 +S0052,37.2,271.1 +S0053,114.8,337.2 +S0054,48.4,192.7 +S0055,76.6,169.4 +S0056,54.6,274.1 +S0057,89.4,372.0 +S0058,32.6,105.0 +S0059,65.8,213.0 +S0060,62.8,91.9 +S0061,54.7,138.1 +S0062,15.4,229.3 +S0063,37.2,172.1 +S0064,67.3,38.0 +S0065,90.8,226.9 +S0066,30.6,74.1 +S0067,42.5,130.0 +S0068,101.5,220.1 +S0069,59.4,156.6 +S0070,59.9,107.3 +S0071,82.5,374.7 +S0072,73.3,163.6 +S0073,118.8,276.7 +S0074,76.9,81.4 +S0075,10.4,68.0 +S0076,101.7,205.4 +S0077,89.8,87.3 +S0078,6.1,63.7 +S0079,65.6,151.7 +S0080,94.4,249.7 +S0081,116.7,364.1 +S0082,39.5,176.1 +S0083,75.2,43.9 +S0084,56.4,122.4 +S0085,75.4,44.9 +S0086,68.1,242.3 +S0087,82.9,222.3 +S0088,58.2,139.3 +S0089,86.8,353.6 +S0090,109.6,296.3 +S0091,57.4,287.9 +S0092,105.4,294.4 +S0093,102.5,370.4 +S0094,64.0,194.2 +S0095,16.6,5.0 +S0096,29.5,28.9 +S0097,87.8,201.6 +S0098,14.7,110.9 +S0099,98.1,151.6 +S0100,75.0,162.6 +S0101,102.7,316.7 +S0102,70.6,135.4 +S0103,97.7,269.9 +S0104,44.9,142.7 +S0105,110.6,393.8 +S0106,97.6,291.9 +S0107,81.1,289.0 +S0108,80.3,275.0 +S0109,96.8,96.8 +S0110,45.9,157.6 +S0111,81.0,198.0 +S0112,46.4,263.2 +S0113,68.0,205.0 +S0114,57.6,110.3 +S0115,40.7,208.4 +S0116,35.9,88.5 +S0117,72.1,180.4 +S0118,115.2,329.7 +S0119,60.3,206.4 +S0120,112.8,260.5 +S0121,51.9,147.8 +S0122,30.1,5.0 +S0123,118.6,356.6 +S0124,30.9,158.4 +S0125,45.6,166.9 +S0126,98.8,227.7 +S0127,39.0,144.2 +S0128,107.3,255.4 +S0129,78.0,251.4 +S0130,34.6,121.4 +S0131,62.0,141.0 +S0132,53.8,243.9 +S0133,88.4,338.2 +S0134,30.6,110.6 +S0135,67.2,113.5 +S0136,54.0,255.5 +S0137,30.8,119.5 +S0138,82.9,165.5 +S0139,24.4,98.2 +S0140,60.9,196.6 +S0141,58.9,179.6 +S0142,56.5,218.1 +S0143,46.5,123.4 +S0144,97.7,148.6 +S0145,18.5,5.0 +S0146,29.9,62.2 +S0147,109.4,233.2 +S0148,90.2,124.6 +S0149,61.6,224.9 +S0150,29.7,90.5 +S0151,53.4,99.9 +S0152,58.3,234.5 +S0153,97.3,252.5 +S0154,109.3,383.0 +S0155,104.6,212.3 +S0156,19.1,48.6 +S0157,71.6,213.7 +S0158,26.1,62.5 +S0159,94.6,222.3 +S0160,48.1,140.4 +S0161,108.0,374.0 +S0162,103.2,234.2 +S0163,53.3,171.7 +S0164,89.1,251.3 +S0165,70.4,195.1 +S0166,64.4,198.9 +S0167,41.1,175.5 +S0168,72.5,17.3 +S0169,84.4,282.0 +S0170,98.0,300.5 +S0171,6.7,5.0 +S0172,76.0,227.2 +S0173,12.0,79.4 +S0174,81.7,133.9 +S0175,47.6,130.9 +S0176,42.7,153.6 +S0177,105.4,122.9 +S0178,55.0,110.2 +S0179,84.3,268.8 +S0180,22.7,68.7 +S0181,28.1,126.5 +S0182,8.4,22.5 +S0183,38.7,103.6 +S0184,35.1,130.8 +S0185,50.6,222.4 +S0186,105.8,292.9 +S0187,95.2,201.9 +S0188,118.7,268.7 +S0189,37.0,74.7 +S0190,12.8,45.3 +S0191,7.4,5.0 +S0192,44.8,201.1 +S0193,39.9,178.2 +S0194,55.9,238.2 +S0195,35.3,103.8 +S0196,115.3,310.1 +S0197,81.0,132.6 +S0198,34.3,16.3 +S0199,83.7,174.1 +S0200,38.3,128.7 +S0201,105.6,240.5 +S0202,117.3,253.9 +S0203,81.1,354.8 +S0204,58.1,212.6 +S0205,97.1,248.4 +S0206,36.2,5.0 +S0207,5.7,99.4 +S0208,96.2,199.8 +S0209,13.0,106.4 +S0210,40.0,238.7 +S0211,87.6,193.9 +S0212,11.8,28.7 +S0213,97.1,361.7 +S0214,26.5,157.3 +S0215,48.3,62.5 +S0216,73.1,263.1 +S0217,53.2,236.0 +S0218,94.8,392.4 +S0219,99.1,392.3 +S0220,72.0,195.0 +S0221,55.5,184.0 +S0222,85.8,293.1 +S0223,68.6,137.3 +S0224,39.6,90.0 +S0225,115.0,389.8 +S0226,44.5,5.0 +S0227,27.0,189.4 +S0228,105.6,233.6 +S0229,39.7,246.9 +S0230,10.3,108.7 +S0231,70.2,195.8 +S0232,75.4,110.5 +S0233,66.8,262.6 +S0234,68.5,259.3 +S0235,32.7,5.0 +S0236,18.0,123.4 +S0237,62.8,52.9 +S0238,56.2,273.3 +S0239,28.7,13.6 +S0240,69.0,297.6 +S0241,99.4,277.4 +S0242,83.2,200.3 +S0243,113.4,140.8 +S0244,111.6,374.9 +S0245,116.1,402.0 +S0246,77.6,332.8 +S0247,93.0,184.2 +S0248,118.3,344.4 +S0249,80.8,98.0 +S0250,50.8,152.7 +S0251,21.7,152.2 +S0252,83.8,253.5 +S0253,13.2,49.9 +S0254,11.7,122.5 +S0255,61.1,198.1 +S0256,89.5,300.8 +S0257,25.5,122.2 +S0258,96.4,267.7 +S0259,73.6,156.8 +S0260,7.4,173.3 +S0261,109.7,324.1 +S0262,98.6,123.7 +S0263,48.8,152.1 +S0264,9.1,5.0 +S0265,102.6,213.5 +S0266,78.2,190.5 +S0267,109.0,359.8 +S0268,34.0,36.2 +S0269,103.4,357.4 +S0270,78.7,189.0 +S0271,115.6,324.2 +S0272,29.3,5.0 +S0273,104.0,268.1 +S0274,66.8,193.9 +S0275,40.9,57.0 +S0276,58.4,170.6 +S0277,83.5,247.8 +S0278,68.5,341.3 +S0279,52.7,100.2 +S0280,65.8,184.8 +S0281,73.2,255.6 +S0282,97.5,107.1 +S0283,65.2,172.6 +S0284,38.9,146.1 +S0285,68.1,145.2 +S0286,5.9,5.0 +S0287,58.5,75.1 +S0288,61.7,182.6 +S0289,41.2,184.0 +S0290,11.1,6.7 +S0291,21.3,75.6 +S0292,115.8,348.0 +S0293,25.1,197.3 +S0294,109.3,247.5 +S0295,21.3,6.7 +S0296,28.7,5.0 +S0297,9.6,5.0 +S0298,48.5,170.0 +S0299,102.6,204.5 +S0300,72.9,196.6 +S0301,83.5,300.2 +S0302,40.1,264.0 +S0303,48.6,115.4 +S0304,56.2,74.5 +S0305,93.1,345.4 +S0306,88.5,272.3 +S0307,23.5,132.5 +S0308,66.5,198.1 +S0309,46.9,83.0 +S0310,45.6,53.2 +S0311,82.7,323.6 +S0312,92.4,248.2 +S0313,59.2,161.5 +S0314,17.0,78.9 +S0315,29.8,103.3 +S0316,12.4,41.1 +S0317,21.9,186.6 +S0318,90.1,263.3 +S0319,20.5,217.7 +S0320,12.3,88.2 +S0321,17.8,79.1 +S0322,96.2,285.5 +S0323,10.3,111.1 +S0324,90.5,279.6 +S0325,34.7,195.3 +S0326,86.3,254.4 +S0327,28.3,75.3 +S0328,51.7,106.1 +S0329,13.5,5.0 +S0330,48.9,227.1 +S0331,70.3,149.7 +S0332,8.8,5.0 +S0333,12.2,89.4 +S0334,114.6,313.3 +S0335,86.7,221.6 +S0336,49.1,222.7 +S0337,96.8,201.6 +S0338,44.9,52.3 +S0339,34.2,27.7 +S0340,58.7,101.7 +S0341,27.1,64.3 +S0342,77.3,211.8 +S0343,119.0,167.3 +S0344,100.1,158.9 +S0345,20.8,5.0 +S0346,33.7,156.1 +S0347,34.4,55.3 +S0348,35.1,143.4 +S0349,57.5,195.7 +S0350,51.6,63.1 +S0351,21.3,30.8 +S0352,95.1,186.7 +S0353,39.6,133.2 +S0354,22.7,140.7 +S0355,109.6,279.1 +S0356,71.2,295.8 +S0357,32.3,124.9 +S0358,99.8,249.8 +S0359,70.9,167.2 +S0360,71.6,238.5 +S0361,10.0,13.0 +S0362,37.8,69.9 +S0363,92.4,383.6 +S0364,66.7,182.9 +S0365,12.8,62.8 +S0366,100.7,221.6 +S0367,9.2,111.0 +S0368,82.6,208.4 +S0369,102.0,220.5 +S0370,82.3,235.3 +S0371,81.8,269.1 +S0372,117.8,379.7 +S0373,80.3,48.9 +S0374,72.5,210.7 +S0375,57.4,171.1 +S0376,114.2,361.1 +S0377,18.1,5.0 +S0378,52.3,217.5 +S0379,100.2,339.6 +S0380,57.5,155.9 +S0381,41.6,93.1 +S0382,32.7,43.2 +S0383,104.7,168.3 +S0384,34.2,212.2 +S0385,91.8,58.9 +S0386,106.3,244.0 +S0387,82.4,252.9 +S0388,62.2,185.7 +S0389,67.4,245.9 +S0390,27.2,234.7 +S0391,76.6,168.6 +S0392,56.3,74.4 +S0393,7.9,5.0 +S0394,77.0,109.6 +S0395,32.8,141.1 +S0396,5.6,5.0 +S0397,77.4,245.4 +S0398,117.2,285.4 +S0399,80.8,189.9 +S0400,54.7,182.1 +S0401,107.8,353.6 +S0402,72.1,234.6 +S0403,99.4,147.3 +S0404,29.2,171.1 +S0405,115.8,286.3 +S0406,83.3,201.9 +S0407,69.6,140.0 +S0408,49.3,90.3 +S0409,42.6,135.7 +S0410,119.4,140.8 +S0411,104.9,359.3 +S0412,13.5,229.3 +S0413,21.6,5.0 +S0414,18.2,67.2 +S0415,112.1,266.6 +S0416,35.4,5.0 +S0417,9.2,249.4 +S0418,107.4,354.2 +S0419,70.7,79.7 +S0420,94.7,225.8 +S0421,74.8,159.3 +S0422,23.3,177.1 +S0423,99.4,288.1 +S0424,117.1,281.3 +S0425,54.9,65.9 +S0426,29.3,141.2 +S0427,42.8,134.0 +S0428,102.8,291.7 +S0429,41.2,158.7 +S0430,105.4,305.1 +S0431,85.9,198.8 +S0432,31.2,79.2 +S0433,82.1,157.2 +S0434,48.8,128.0 +S0435,105.1,172.6 +S0436,37.4,203.8 +S0437,21.7,188.1 +S0438,72.5,277.4 +S0439,29.4,143.9 +S0440,90.9,184.4 +S0441,104.3,363.2 +S0442,58.7,252.7 +S0443,73.3,174.6 +S0444,37.2,89.0 +S0445,57.1,89.1 +S0446,48.3,245.6 +S0447,71.4,301.8 +S0448,94.3,250.5 +S0449,119.1,267.4 +S0450,20.8,113.5 +S0451,107.1,195.8 +S0452,81.6,347.0 +S0453,47.1,210.5 +S0454,66.3,299.8 +S0455,47.5,33.5 +S0456,110.3,260.3 +S0457,79.7,213.9 +S0458,43.9,121.2 +S0459,35.9,32.2 +S0460,70.3,379.4 +S0461,45.6,114.6 +S0462,31.2,140.6 +S0463,37.7,149.8 +S0464,17.8,9.3 +S0465,98.7,350.4 +S0466,22.2,35.8 +S0467,101.5,289.2 +S0468,60.8,187.8 +S0469,33.9,52.7 +S0470,101.5,236.7 +S0471,43.9,96.1 +S0472,31.4,203.7 +S0473,62.6,198.9 +S0474,109.1,378.5 +S0475,23.0,40.1 +S0476,106.8,309.6 +S0477,71.6,191.9 +S0478,63.9,194.3 +S0479,83.9,189.6 +S0480,71.1,57.9 +S0481,103.7,240.4 +S0482,61.1,257.8 +S0483,73.5,285.2 +S0484,50.1,73.9 +S0485,55.9,78.3 +S0486,107.4,289.4 +S0487,10.9,83.9 +S0488,38.6,42.4 +S0489,82.5,172.3 +S0490,43.3,167.4 +S0491,57.7,104.4 +S0492,33.2,68.5 +S0493,40.6,205.6 +S0494,43.1,223.3 +S0495,19.4,57.6 +S0496,24.7,32.5 +S0497,104.1,245.9 +S0498,113.4,223.4 +S0499,80.3,178.0 +S0500,105.9,192.6 +S0501,28.1,5.0 +S0502,81.7,217.3 +S0503,30.3,201.3 +S0504,29.0,162.4 +S0505,7.5,5.0 +S0506,90.1,277.2 +S0507,102.1,305.4 +S0508,68.7,229.5 +S0509,24.1,35.8 +S0510,99.6,340.2 +S0511,100.5,229.1 +S0512,8.5,176.9 +S0513,98.7,198.1 +S0514,114.4,220.1 +S0515,79.0,177.3 +S0516,55.0,137.4 +S0517,5.3,64.7 +S0518,47.6,189.5 +S0519,35.4,106.8 +S0520,47.1,62.2 +S0521,84.8,182.4 +S0522,68.0,170.7 +S0523,70.5,108.1 +S0524,54.9,247.1 +S0525,90.0,297.1 +S0526,42.6,84.8 +S0527,106.2,254.4 +S0528,114.0,250.1 +S0529,60.5,130.6 +S0530,107.6,160.2 +S0531,50.3,260.7 +S0532,55.3,185.7 +S0533,18.9,22.7 +S0534,10.9,82.2 +S0535,106.8,204.4 +S0536,39.2,149.3 +S0537,102.4,227.4 +S0538,110.7,381.5 +S0539,23.6,87.7 +S0540,17.4,5.0 +S0541,72.1,130.7 +S0542,9.9,11.0 +S0543,9.8,42.9 +S0544,50.3,205.5 +S0545,29.3,199.1 +S0546,102.7,396.8 +S0547,78.9,251.9 +S0548,59.1,71.7 +S0549,7.3,56.3 +S0550,62.0,187.6 +S0551,44.8,76.8 +S0552,6.0,5.0 +S0553,106.6,280.6 +S0554,105.1,340.9 +S0555,23.1,99.1 +S0556,19.0,137.0 +S0557,66.3,254.7 +S0558,110.1,179.1 +S0559,119.8,215.9 +S0560,92.9,219.2 +S0561,116.2,293.2 +S0562,90.7,181.7 +S0563,78.4,203.5 +S0564,99.0,193.0 +S0565,22.6,127.7 +S0566,20.8,83.0 +S0567,15.5,109.0 +S0568,33.2,117.9 +S0569,21.7,68.2 +S0570,75.5,220.0 +S0571,79.4,316.6 +S0572,85.5,115.2 +S0573,108.9,317.1 +S0574,118.8,255.7 +S0575,89.9,242.3 +S0576,115.4,169.8 +S0577,35.5,76.0 +S0578,60.6,209.4 +S0579,38.9,218.9 +S0580,55.7,94.0 +S0581,65.3,211.2 +S0582,23.8,180.2 +S0583,119.0,340.5 +S0584,25.2,149.2 +S0585,99.5,230.6 +S0586,15.5,5.0 +S0587,24.1,36.3 +S0588,105.2,171.0 +S0589,38.2,213.9 +S0590,109.0,217.6 +S0591,38.1,207.3 +S0592,98.1,142.6 +S0593,37.7,5.0 +S0594,13.6,137.8 +S0595,34.1,163.9 +S0596,116.3,176.6 +S0597,52.6,115.3 +S0598,13.9,25.0 +S0599,118.0,325.5 +S0600,46.4,109.3 +S0601,26.3,67.1 +S0602,110.7,167.9 +S0603,102.7,257.0 +S0604,14.9,66.2 +S0605,9.1,117.1 +S0606,33.6,115.3 +S0607,59.3,201.7 +S0608,39.7,148.1 +S0609,39.7,64.8 +S0610,30.4,252.0 +S0611,96.5,284.1 +S0612,92.5,200.1 +S0613,81.4,213.1 +S0614,96.7,325.2 +S0615,106.4,298.5 +S0616,33.5,55.7 +S0617,26.5,118.5 +S0618,6.6,57.0 +S0619,82.8,296.2 +S0620,102.8,276.9 +S0621,97.5,295.7 +S0622,21.3,115.0 +S0623,31.5,181.8 +S0624,117.1,255.8 +S0625,110.7,272.2 +S0626,85.1,355.3 +S0627,107.7,253.5 +S0628,90.1,218.2 +S0629,40.1,90.8 +S0630,47.4,162.1 +S0631,110.6,308.7 +S0632,50.4,161.8 +S0633,29.5,31.3 +S0634,11.2,103.9 +S0635,100.7,155.3 +S0636,117.5,154.3 +S0637,59.6,103.4 +S0638,119.1,315.4 +S0639,119.1,275.3 +S0640,91.2,255.2 +S0641,15.0,64.5 +S0642,25.8,65.1 +S0643,81.0,190.6 +S0644,44.4,166.9 +S0645,93.1,205.5 +S0646,30.8,204.5 +S0647,46.9,82.2 +S0648,70.3,118.1 +S0649,17.0,18.6 +S0650,39.8,157.2 +S0651,103.7,130.6 +S0652,93.5,191.6 +S0653,87.7,231.4 +S0654,54.7,29.7 +S0655,63.0,203.1 +S0656,23.3,36.1 +S0657,89.9,337.4 +S0658,67.1,111.1 +S0659,97.9,186.8 +S0660,70.0,29.5 +S0661,72.3,137.1 +S0662,34.4,63.4 +S0663,81.7,223.9 +S0664,51.1,110.8 +S0665,103.7,367.6 +S0666,79.9,6.0 +S0667,32.9,133.5 +S0668,14.1,5.0 +S0669,44.5,118.6 +S0670,49.2,234.4 +S0671,35.4,300.1 +S0672,111.5,225.1 +S0673,95.4,181.6 +S0674,65.0,198.1 +S0675,24.3,36.3 +S0676,64.1,119.9 +S0677,56.5,130.1 +S0678,60.9,194.3 +S0679,17.2,41.5 +S0680,18.3,5.0 +S0681,109.9,306.2 +S0682,103.9,209.3 +S0683,50.5,123.8 +S0684,22.2,267.6 +S0685,81.8,145.4 +S0686,91.9,244.7 +S0687,25.6,128.5 +S0688,54.3,121.8 +S0689,82.4,222.6 +S0690,114.8,184.7 +S0691,61.7,35.6 +S0692,99.0,237.6 +S0693,13.0,5.0 +S0694,91.5,346.9 +S0695,43.6,38.2 +S0696,42.8,118.0 +S0697,111.3,416.6 +S0698,37.9,114.9 +S0699,18.8,10.8 +S0700,54.9,59.5 +S0701,31.7,133.9 +S0702,61.2,207.3 +S0703,71.4,110.6 +S0704,9.8,5.0 +S0705,34.6,84.3 +S0706,110.5,238.4 +S0707,117.7,422.0 +S0708,47.7,97.4 +S0709,63.7,191.4 +S0710,117.4,221.2 +S0711,80.8,206.2 +S0712,92.4,174.4 +S0713,95.5,261.4 +S0714,70.0,112.0 +S0715,91.1,344.5 +S0716,25.4,97.7 +S0717,49.9,81.6 +S0718,48.0,112.4 +S0719,39.4,166.3 +S0720,79.7,69.0 +S0721,38.0,69.0 +S0722,36.6,87.4 +S0723,93.1,220.3 +S0724,53.5,149.0 +S0725,6.8,110.1 +S0726,118.4,335.9 +S0727,9.7,68.8 +S0728,119.3,292.1 +S0729,42.4,270.1 +S0730,16.3,63.9 +S0731,24.2,60.0 +S0732,108.6,259.9 +S0733,36.1,5.0 +S0734,90.4,302.7 +S0735,10.3,40.6 +S0736,15.8,60.8 +S0737,6.0,23.1 +S0738,93.7,282.0 +S0739,95.4,164.3 +S0740,87.7,338.7 +S0741,75.7,162.8 +S0742,71.9,296.2 +S0743,75.5,214.2 +S0744,102.9,218.7 +S0745,76.9,284.5 +S0746,52.2,199.2 +S0747,28.4,67.5 +S0748,86.0,189.9 +S0749,84.7,227.2 +S0750,111.7,290.6 +S0751,37.0,70.3 +S0752,7.1,5.0 +S0753,108.9,256.7 +S0754,40.2,53.9 +S0755,44.0,160.5 +S0756,22.8,79.9 +S0757,60.7,171.2 +S0758,27.2,59.1 +S0759,89.5,143.6 +S0760,12.6,22.9 +S0761,97.0,391.4 +S0762,116.4,315.7 +S0763,38.6,151.2 +S0764,96.6,203.6 +S0765,11.0,159.4 +S0766,97.9,310.3 +S0767,11.5,5.0 +S0768,107.4,281.4 +S0769,111.1,346.1 +S0770,22.6,92.9 +S0771,109.1,204.1 +S0772,72.5,167.0 +S0773,31.3,142.0 +S0774,59.7,178.6 +S0775,64.3,220.5 +S0776,66.7,389.7 +S0777,87.5,171.5 +S0778,68.2,66.7 +S0779,23.3,99.1 +S0780,115.7,380.4 +S0781,72.5,12.6 +S0782,53.7,130.6 +S0783,31.1,253.6 +S0784,67.8,191.0 +S0785,103.7,250.8 +S0786,103.7,166.3 +S0787,24.0,142.5 +S0788,18.7,168.3 +S0789,41.2,161.5 +S0790,76.6,180.0 +S0791,65.7,157.1 +S0792,113.7,220.6 +S0793,69.5,187.8 +S0794,93.0,310.6 +S0795,114.4,356.1 +S0796,91.6,266.4 +S0797,48.0,95.0 +S0798,28.7,107.2 +S0799,41.6,212.2 +S0800,53.9,134.8 +S0801,38.8,107.0 +S0802,40.4,250.7 +S0803,110.5,205.8 +S0804,48.3,201.4 +S0805,71.7,189.6 +S0806,27.0,138.3 +S0807,66.7,30.5 +S0808,13.4,188.8 +S0809,65.3,241.2 +S0810,56.2,87.4 +S0811,64.4,237.2 +S0812,68.8,93.0 +S0813,88.4,242.9 +S0814,14.8,159.2 +S0815,116.8,191.7 +S0816,68.5,193.0 +S0817,20.6,125.5 +S0818,59.2,196.6 +S0819,118.7,401.4 +S0820,66.1,209.6 +S0821,55.7,158.7 +S0822,59.6,69.1 +S0823,66.7,145.2 +S0824,98.3,259.6 +S0825,91.1,304.4 +S0826,86.4,174.5 +S0827,14.2,5.0 +S0828,11.6,92.7 +S0829,60.1,213.7 +S0830,81.8,190.2 +S0831,51.5,152.1 +S0832,76.5,94.8 +S0833,47.9,173.9 +S0834,90.4,168.5 +S0835,62.4,226.0 +S0836,66.9,73.9 +S0837,6.8,5.0 +S0838,35.4,13.5 +S0839,102.8,94.6 +S0840,112.4,214.3 +S0841,94.1,167.0 +S0842,68.7,185.4 +S0843,13.5,84.3 +S0844,81.0,295.5 +S0845,63.6,145.4 +S0846,7.4,64.4 +S0847,95.6,204.5 +S0848,40.8,5.0 +S0849,100.4,291.4 +S0850,80.1,179.4 +S0851,92.0,164.4 +S0852,45.1,176.3 +S0853,8.1,52.9 +S0854,96.7,306.4 +S0855,119.9,306.4 +S0856,89.1,194.0 +S0857,17.5,29.9 +S0858,16.6,107.7 +S0859,46.9,72.0 +S0860,19.7,96.3 +S0861,78.6,197.8 +S0862,85.4,243.6 +S0863,102.2,209.4 +S0864,111.1,326.8 +S0865,82.2,253.6 +S0866,9.8,100.1 +S0867,77.0,91.8 +S0868,13.9,94.3 +S0869,39.9,50.4 +S0870,41.3,63.0 +S0871,58.0,306.0 +S0872,72.8,188.9 +S0873,83.5,223.3 +S0874,11.5,15.0 +S0875,80.8,241.0 +S0876,60.0,150.9 +S0877,23.4,59.9 +S0878,18.3,41.3 +S0879,109.5,189.0 +S0880,37.9,207.3 +S0881,111.4,268.2 +S0882,88.7,126.9 +S0883,75.9,178.9 +S0884,97.6,266.3 +S0885,116.4,284.5 +S0886,32.4,287.4 +S0887,15.3,41.0 +S0888,77.4,178.5 +S0889,103.5,256.3 +S0890,103.9,227.8 +S0891,110.2,211.6 +S0892,114.6,242.8 +S0893,46.0,170.2 +S0894,84.4,129.8 +S0895,79.7,185.4 +S0896,95.9,253.8 +S0897,48.4,218.8 +S0898,94.1,172.0 +S0899,98.5,227.6 +S0900,91.2,206.8 +S0901,103.4,323.2 +S0902,101.4,195.5 +S0903,81.1,160.6 +S0904,28.4,47.3 +S0905,57.3,157.1 +S0906,62.3,185.5 +S0907,93.4,279.0 +S0908,113.2,257.4 +S0909,92.8,183.2 +S0910,117.8,329.1 +S0911,110.9,356.6 +S0912,36.0,114.3 +S0913,101.8,228.5 +S0914,59.3,72.9 +S0915,88.7,155.3 +S0916,95.2,290.8 +S0917,63.3,198.4 +S0918,101.1,220.7 +S0919,112.5,404.0 +S0920,83.2,387.3 +S0921,119.8,432.6 +S0922,100.9,202.0 +S0923,87.1,114.4 +S0924,26.1,11.5 +S0925,87.8,102.9 +S0926,103.7,424.3 +S0927,75.6,68.2 +S0928,84.9,176.3 +S0929,85.3,142.8 +S0930,18.9,5.0 +S0931,24.9,127.4 +S0932,88.4,189.7 +S0933,93.5,273.1 +S0934,27.3,73.0 +S0935,27.4,111.6 +S0936,38.2,128.4 +S0937,113.9,257.7 +S0938,19.2,71.4 +S0939,117.1,296.3 +S0940,118.4,265.1 +S0941,52.0,253.8 +S0942,38.4,190.9 +S0943,104.6,337.2 +S0944,68.1,174.8 +S0945,114.2,309.7 +S0946,93.5,254.5 +S0947,32.3,5.0 +S0948,55.1,330.6 +S0949,95.7,306.8 +S0950,45.3,149.1 +S0951,86.4,258.7 +S0952,99.8,174.9 +S0953,97.9,345.9 +S0954,94.8,217.8 +S0955,73.3,147.9 +S0956,88.1,244.4 +S0957,76.7,223.8 +S0958,36.5,7.4 +S0959,51.2,198.1 +S0960,30.3,87.3 +S0961,63.9,86.0 +S0962,72.7,195.7 +S0963,69.7,283.0 +S0964,96.1,168.9 +S0965,12.1,78.6 +S0966,95.4,220.4 +S0967,72.6,254.3 +S0968,86.3,121.4 +S0969,66.5,219.0 +S0970,29.2,170.9 +S0971,102.3,327.5 +S0972,12.2,49.7 +S0973,86.2,302.7 +S0974,74.8,229.4 +S0975,101.1,314.7 +S0976,85.7,250.6 +S0977,8.1,44.1 +S0978,116.7,269.9 +S0979,70.8,130.7 +S0980,27.3,117.3 +S0981,52.1,113.4 +S0982,86.0,278.7 +S0983,84.5,371.2 +S0984,11.1,100.9 +S0985,90.9,288.2 +S0986,27.7,130.4 +S0987,112.9,361.1 +S0988,98.5,223.1 +S0989,37.2,116.2 +S0990,78.2,199.5 +S0991,48.8,141.8 +S0992,52.2,152.1 +S0993,19.0,145.6 +S0994,65.1,44.9 +S0995,98.2,195.1 +S0996,71.6,116.2 +S0997,37.8,279.3 +S0998,40.9,172.0 +S0999,71.6,262.6 +S1000,29.6,238.6 +S1001,86.4,242.8 +S1002,72.8,288.8 +S1003,65.1,115.1 +S1004,13.0,122.9 +S1005,82.1,196.0 +S1006,47.6,123.9 +S1007,84.3,159.8 +S1008,24.8,14.6 +S1009,60.5,276.8 +S1010,60.8,150.2 +S1011,38.8,152.1 +S1012,116.1,347.5 +S1013,107.2,260.4 +S1014,33.4,5.0 +S1015,70.0,152.8 +S1016,66.9,151.7 +S1017,35.2,72.7 +S1018,83.6,134.3 +S1019,90.0,269.1 +S1020,16.2,64.1 +S1021,79.2,243.2 +S1022,119.9,303.0 +S1023,84.5,167.8 +S1024,76.0,301.7 +S1025,40.2,155.1 +S1026,22.9,37.9 +S1027,90.0,247.8 +S1028,40.6,133.8 +S1029,8.5,48.5 +S1030,46.0,52.0 +S1031,25.5,47.8 +S1032,36.8,132.7 +S1033,114.6,327.8 +S1034,88.7,167.2 +S1035,43.1,116.6 +S1036,78.3,320.0 +S1037,15.3,26.2 +S1038,7.7,31.3 +S1039,34.9,103.9 +S1040,21.1,50.7 +S1041,100.2,272.3 +S1042,58.1,258.0 +S1043,49.6,5.0 +S1044,87.8,200.2 +S1045,20.7,133.6 +S1046,44.0,124.3 +S1047,15.3,5.0 +S1048,6.1,103.4 +S1049,52.6,161.7 +S1050,119.9,104.7 +S1051,81.5,117.1 +S1052,64.6,142.7 +S1053,65.2,222.8 +S1054,16.6,33.3 +S1055,60.4,261.2 +S1056,36.3,5.0 +S1057,77.8,123.3 +S1058,80.2,237.8 +S1059,13.8,10.9 +S1060,86.8,371.4 +S1061,39.3,148.2 +S1062,115.6,198.5 +S1063,101.9,328.2 +S1064,56.4,130.7 +S1065,21.0,83.2 +S1066,58.2,207.2 +S1067,98.7,184.6 +S1068,30.2,131.8 +S1069,67.9,280.1 +S1070,19.1,241.5 +S1071,105.5,199.9 +S1072,74.3,214.4 +S1073,96.8,204.1 +S1074,47.2,134.8 +S1075,43.6,252.7 +S1076,107.3,365.3 +S1077,110.0,259.5 +S1078,5.3,128.2 +S1079,112.2,355.1 +S1080,65.4,70.3 +S1081,23.3,5.6 +S1082,52.2,142.4 +S1083,16.7,154.9 +S1084,88.2,284.4 +S1085,45.4,108.0 +S1086,51.0,87.8 +S1087,60.4,310.8 +S1088,97.9,212.5 +S1089,81.6,204.8 +S1090,12.5,5.0 +S1091,9.4,150.5 +S1092,103.0,229.3 +S1093,73.3,203.5 +S1094,64.2,241.4 +S1095,87.0,165.7 +S1096,33.0,70.9 +S1097,90.0,276.2 +S1098,110.4,301.1 +S1099,31.1,196.1 +S1100,52.7,141.4 +S1101,23.8,78.9 +S1102,54.6,204.2 +S1103,80.6,193.5 +S1104,111.6,201.1 +S1105,59.0,174.9 +S1106,106.5,281.8 +S1107,117.8,368.2 +S1108,38.3,85.3 +S1109,100.9,144.2 +S1110,37.0,171.4 +S1111,24.4,99.7 +S1112,101.8,258.9 +S1113,109.1,359.1 +S1114,109.6,375.6 +S1115,111.9,312.3 +S1116,101.3,271.4 +S1117,117.2,388.9 +S1118,27.6,134.2 +S1119,83.2,266.2 +S1120,91.7,233.9 +S1121,99.9,199.8 +S1122,105.0,269.5 +S1123,55.0,77.3 +S1124,66.8,202.3 +S1125,83.4,265.7 +S1126,73.6,349.2 +S1127,27.9,233.5 +S1128,17.8,105.9 +S1129,23.4,58.8 +S1130,43.8,271.5 +S1131,74.3,127.0 +S1132,110.1,153.7 +S1133,102.2,210.9 +S1134,17.4,54.7 +S1135,109.6,309.8 +S1136,63.2,80.8 +S1137,104.6,159.7 +S1138,15.5,38.4 +S1139,99.1,238.0 +S1140,84.3,174.2 +S1141,23.1,126.2 +S1142,10.5,81.0 +S1143,37.7,21.2 +S1144,84.1,156.3 +S1145,20.4,38.0 +S1146,21.6,36.8 +S1147,85.7,213.5 +S1148,89.7,9.5 +S1149,49.5,175.0 +S1150,41.2,90.1 +S1151,93.6,264.8 +S1152,108.3,297.0 +S1153,52.4,121.7 +S1154,82.0,241.6 +S1155,67.4,100.2 +S1156,5.0,141.2 +S1157,30.8,116.7 +S1158,107.2,296.3 +S1159,55.0,41.1 +S1160,33.9,5.0 +S1161,40.9,218.2 +S1162,9.1,84.6 +S1163,5.6,26.4 +S1164,119.5,236.0 +S1165,99.7,198.1 +S1166,57.8,79.9 +S1167,21.4,11.7 +S1168,119.0,260.1 +S1169,35.7,143.5 +S1170,45.4,256.7 +S1171,39.4,84.4 +S1172,115.2,277.4 +S1173,51.5,124.0 +S1174,12.1,52.4 +S1175,87.9,238.2 +S1176,56.0,24.6 +S1177,66.4,148.9 +S1178,78.5,263.1 +S1179,34.0,182.4 +S1180,60.1,87.0 +S1181,45.6,214.8 +S1182,23.4,5.0 +S1183,104.4,309.6 +S1184,89.5,256.3 +S1185,108.9,253.0 +S1186,11.2,151.1 +S1187,89.0,283.5 +S1188,56.5,151.5 +S1189,66.5,371.2 +S1190,9.7,72.7 +S1191,82.0,107.3 +S1192,44.7,77.3 +S1193,28.4,49.0 +S1194,97.9,140.9 +S1195,31.6,5.0 +S1196,85.1,341.3 +S1197,89.3,146.4 +S1198,66.7,179.3 +S1199,105.7,196.4 +S1200,107.7,347.6 +S1201,82.1,304.9 +S1202,79.3,206.3 +S1203,93.3,161.8 +S1204,13.8,103.2 +S1205,10.9,145.8 +S1206,63.7,37.1 +S1207,28.5,128.1 +S1208,119.6,296.4 +S1209,15.8,5.0 +S1210,24.9,82.2 +S1211,104.5,202.9 +S1212,116.1,319.9 +S1213,40.1,156.9 +S1214,116.7,357.0 +S1215,34.2,117.6 +S1216,65.9,262.7 +S1217,96.3,443.4 +S1218,87.2,247.1 +S1219,100.9,273.3 +S1220,54.2,294.5 +S1221,9.5,73.3 +S1222,113.8,114.6 +S1223,53.6,158.1 +S1224,46.0,142.4 +S1225,115.1,185.6 +S1226,91.6,215.7 +S1227,66.0,202.0 +S1228,55.9,170.3 +S1229,64.7,132.9 +S1230,21.0,140.0 +S1231,57.8,210.8 +S1232,109.6,256.8 +S1233,114.7,321.8 +S1234,91.5,361.1 +S1235,50.4,108.4 +S1236,114.3,373.3 +S1237,13.0,123.3 +S1238,59.4,150.7 +S1239,31.3,203.1 +S1240,92.8,154.6 +S1241,112.5,251.5 +S1242,49.0,137.5 +S1243,105.6,307.6 +S1244,5.6,64.6 +S1245,24.3,86.1 +S1246,103.7,267.8 +S1247,46.4,189.1 +S1248,95.5,173.3 +S1249,99.9,207.4 +S1250,113.0,338.8 +S1251,107.1,297.1 +S1252,97.5,335.9 +S1253,32.5,196.8 +S1254,43.8,130.8 +S1255,66.3,176.1 +S1256,75.4,99.2 +S1257,12.2,136.6 +S1258,34.5,147.6 +S1259,78.8,99.5 +S1260,7.2,92.6 +S1261,36.7,239.4 +S1262,83.1,189.6 +S1263,111.7,321.6 +S1264,27.3,169.2 +S1265,55.3,264.7 +S1266,102.7,257.2 +S1267,28.2,136.6 +S1268,91.8,234.4 +S1269,31.3,76.0 +S1270,116.7,338.2 +S1271,37.3,75.3 +S1272,104.8,262.7 +S1273,86.2,103.1 +S1274,62.4,151.0 +S1275,103.5,292.3 +S1276,16.4,25.4 +S1277,50.4,146.8 +S1278,99.8,251.8 +S1279,96.1,308.2 +S1280,57.4,107.6 +S1281,111.0,253.6 +S1282,79.5,54.3 +S1283,58.3,63.8 +S1284,75.3,170.3 +S1285,71.1,296.9 +S1286,94.9,277.6 +S1287,17.9,265.4 +S1288,82.3,125.4 +S1289,23.5,113.9 +S1290,12.5,117.6 +S1291,7.1,79.7 +S1292,43.7,196.0 +S1293,106.9,213.4 +S1294,38.1,87.6 +S1295,86.3,277.9 +S1296,66.9,276.7 +S1297,88.0,320.3 +S1298,7.6,50.6 +S1299,34.6,109.4 +S1300,30.4,127.6 +S1301,63.2,305.0 +S1302,22.4,38.3 +S1303,118.5,233.1 +S1304,49.4,200.5 +S1305,119.3,301.9 +S1306,80.0,200.3 +S1307,21.8,98.6 +S1308,50.8,183.7 +S1309,47.7,113.3 +S1310,61.3,171.4 +S1311,98.9,141.5 +S1312,14.4,53.6 +S1313,33.6,210.3 +S1314,21.5,238.0 +S1315,115.1,227.4 +S1316,40.6,194.0 +S1317,5.9,64.5 +S1318,60.0,95.9 +S1319,56.1,204.8 +S1320,97.1,242.7 +S1321,22.8,251.1 +S1322,84.1,325.8 +S1323,77.8,288.4 +S1324,21.8,134.5 +S1325,83.5,177.3 +S1326,119.9,282.2 +S1327,105.8,189.4 +S1328,29.9,118.6 +S1329,37.4,175.3 +S1330,111.5,109.4 +S1331,74.7,264.4 +S1332,73.2,169.3 +S1333,99.2,125.8 +S1334,45.9,240.6 +S1335,6.4,20.9 +S1336,108.7,349.3 +S1337,94.1,79.4 +S1338,52.3,131.2 +S1339,89.5,167.3 +S1340,62.2,275.4 +S1341,57.2,216.1 +S1342,77.1,166.2 +S1343,14.0,5.0 +S1344,67.8,104.7 +S1345,44.4,180.5 +S1346,53.9,232.3 +S1347,114.9,98.6 +S1348,114.8,348.2 +S1349,112.1,399.2 +S1350,27.0,10.8 +S1351,65.9,191.8 +S1352,114.1,329.9 +S1353,93.4,250.3 +S1354,113.6,99.6 +S1355,7.5,62.7 +S1356,78.6,95.6 +S1357,57.9,239.1 +S1358,87.9,186.0 +S1359,75.3,159.7 +S1360,13.2,122.9 +S1361,70.8,266.3 +S1362,53.6,201.1 +S1363,81.3,131.8 +S1364,62.6,5.0 +S1365,58.9,147.5 +S1366,42.3,37.5 +S1367,41.2,108.0 +S1368,114.6,242.1 +S1369,22.7,88.3 +S1370,108.5,278.8 +S1371,35.6,14.5 +S1372,43.6,208.7 +S1373,28.2,172.9 +S1374,11.4,92.1 +S1375,83.8,250.8 +S1376,110.7,324.6 +S1377,114.3,359.9 +S1378,107.8,140.8 +S1379,81.8,226.5 +S1380,22.3,100.8 +S1381,58.1,174.1 +S1382,29.6,21.6 +S1383,39.5,5.0 +S1384,111.6,228.0 +S1385,41.6,67.2 +S1386,63.8,187.2 +S1387,66.1,189.6 +S1388,50.8,153.5 +S1389,99.2,369.7 +S1390,115.7,247.3 +S1391,46.0,143.9 +S1392,75.1,61.2 +S1393,60.5,152.3 +S1394,108.2,248.8 +S1395,6.9,5.0 +S1396,15.8,62.7 +S1397,100.3,303.8 +S1398,96.0,326.7 +S1399,43.5,176.4 +S1400,86.5,151.7 +S1401,117.8,329.4 +S1402,49.2,133.0 +S1403,41.8,185.6 +S1404,19.3,139.3 +S1405,101.3,111.1 +S1406,54.0,186.0 +S1407,80.5,115.0 +S1408,71.5,211.3 +S1409,118.3,335.3 +S1410,99.8,355.9 +S1411,56.2,180.3 +S1412,48.4,205.0 +S1413,60.4,201.7 +S1414,29.6,194.4 +S1415,62.3,74.4 +S1416,24.3,25.0 +S1417,76.0,127.9 +S1418,37.4,199.0 +S1419,5.8,252.2 +S1420,46.1,158.2 +S1421,56.4,216.5 +S1422,85.1,303.3 +S1423,94.8,157.3 +S1424,32.2,136.6 +S1425,83.5,209.0 +S1426,29.0,65.9 +S1427,88.7,209.2 +S1428,25.8,164.4 +S1429,10.7,97.7 +S1430,34.6,140.0 +S1431,27.8,124.4 +S1432,17.8,43.1 +S1433,84.0,318.6 +S1434,113.6,269.1 +S1435,84.6,262.5 +S1436,104.3,327.8 +S1437,44.3,107.5 +S1438,86.0,260.3 +S1439,92.6,213.5 +S1440,27.6,7.4 +S1441,25.8,147.1 +S1442,66.5,233.2 +S1443,88.3,230.0 +S1444,108.5,353.5 +S1445,44.0,90.5 +S1446,93.5,191.1 +S1447,8.9,35.6 +S1448,54.1,5.0 +S1449,91.8,273.2 +S1450,40.2,106.3 +S1451,31.9,250.3 +S1452,25.4,5.0 +S1453,35.0,114.9 +S1454,59.3,96.7 +S1455,39.7,62.0 +S1456,119.4,201.3 +S1457,51.8,36.8 +S1458,94.2,252.1 +S1459,79.2,212.8 +S1460,38.5,93.2 +S1461,116.3,372.9 +S1462,85.7,200.4 +S1463,49.0,124.7 +S1464,14.2,5.0 +S1465,34.3,185.8 +S1466,29.4,178.1 +S1467,80.5,272.2 +S1468,41.7,77.9 +S1469,52.0,97.3 +S1470,81.9,281.7 +S1471,22.3,154.2 +S1472,31.8,153.8 +S1473,34.3,168.7 +S1474,98.7,327.8 +S1475,61.8,162.9 +S1476,64.6,193.2 +S1477,18.4,56.3 +S1478,31.4,37.1 +S1479,113.6,147.2 +S1480,63.5,163.8 +S1481,88.4,288.9 +S1482,31.4,54.0 +S1483,92.4,187.3 +S1484,64.1,192.6 +S1485,45.1,195.6 +S1486,82.9,345.7 +S1487,119.3,346.5 +S1488,85.7,224.3 +S1489,15.1,83.4 +S1490,41.7,111.6 +S1491,10.8,88.2 +S1492,106.3,186.7 +S1493,25.8,87.7 +S1494,119.7,204.5 +S1495,117.5,160.4 +S1496,54.0,139.7 +S1497,57.6,195.8 +S1498,24.2,129.6 +S1499,11.2,5.0 +S1500,85.7,170.7 +S1501,116.4,176.0 +S1502,76.1,120.7 +S1503,66.3,230.7 +S1504,109.3,179.7 +S1505,87.9,253.9 +S1506,86.8,225.9 +S1507,111.7,347.2 +S1508,101.8,269.3 +S1509,32.1,157.8 +S1510,86.0,272.6 +S1511,112.3,292.8 +S1512,57.6,221.9 +S1513,76.1,199.2 +S1514,79.3,135.2 +S1515,73.9,291.9 +S1516,118.3,311.8 +S1517,83.4,183.8 +S1518,28.6,170.8 +S1519,23.7,32.9 +S1520,46.8,154.0 +S1521,62.8,335.8 +S1522,63.4,201.8 +S1523,97.2,250.0 +S1524,107.8,286.9 +S1525,98.3,208.9 +S1526,64.9,146.9 +S1527,9.1,5.0 +S1528,44.9,87.7 +S1529,68.1,245.0 +S1530,63.2,176.0 +S1531,29.3,58.7 +S1532,113.7,348.7 +S1533,48.5,179.0 +S1534,90.4,125.8 +S1535,93.8,192.1 +S1536,49.3,171.3 +S1537,102.1,177.4 +S1538,21.8,88.2 +S1539,111.3,322.8 +S1540,14.7,70.8 +S1541,68.8,228.6 +S1542,23.3,116.0 +S1543,12.0,50.7 +S1544,39.7,5.0 +S1545,19.7,104.8 +S1546,78.8,257.8 +S1547,65.9,238.0 +S1548,39.9,147.7 +S1549,27.3,156.2 +S1550,98.0,288.9 +S1551,117.7,236.9 +S1552,109.1,230.0 +S1553,13.3,139.9 +S1554,97.2,221.9 +S1555,15.1,47.4 +S1556,109.1,205.9 +S1557,60.3,127.2 +S1558,14.4,59.8 +S1559,52.5,145.2 +S1560,40.5,146.0 +S1561,117.0,182.9 +S1562,67.3,146.2 +S1563,94.6,290.2 +S1564,110.8,363.9 +S1565,90.9,337.2 +S1566,86.0,261.9 +S1567,107.1,244.2 +S1568,50.3,145.0 +S1569,64.4,91.0 +S1570,65.0,248.2 +S1571,83.6,250.8 +S1572,34.4,186.5 +S1573,61.0,144.6 +S1574,33.8,231.0 +S1575,52.0,49.9 +S1576,74.9,81.9 +S1577,54.0,226.9 +S1578,59.7,79.1 +S1579,108.6,208.1 +S1580,61.8,136.5 +S1581,68.3,172.7 +S1582,102.6,394.8 +S1583,79.2,248.4 +S1584,118.7,299.9 +S1585,106.9,287.9 +S1586,43.4,115.6 +S1587,93.4,180.6 +S1588,25.8,87.9 +S1589,51.4,182.3 +S1590,87.4,192.0 +S1591,12.3,98.6 +S1592,76.3,196.0 +S1593,100.7,274.3 +S1594,50.3,81.1 +S1595,65.1,149.4 +S1596,46.6,63.8 +S1597,93.4,238.4 +S1598,40.3,51.6 +S1599,7.5,8.1 +S1600,15.6,5.0 +S1601,89.0,219.4 +S1602,102.5,348.6 +S1603,105.5,268.9 +S1604,23.1,123.3 +S1605,100.4,421.5 +S1606,102.7,267.1 +S1607,32.9,5.0 +S1608,9.0,97.0 +S1609,115.1,302.9 +S1610,14.6,5.0 +S1611,85.3,162.3 +S1612,89.6,313.7 +S1613,81.2,122.9 +S1614,91.3,287.8 +S1615,97.8,310.8 +S1616,94.1,202.2 +S1617,91.5,187.7 +S1618,66.0,207.2 +S1619,41.8,33.0 +S1620,88.8,280.1 +S1621,107.5,194.3 +S1622,31.0,36.6 +S1623,37.5,113.9 +S1624,82.2,295.2 +S1625,71.4,57.7 +S1626,95.9,142.9 +S1627,79.4,216.9 +S1628,117.3,174.4 +S1629,70.7,222.4 +S1630,58.1,104.2 +S1631,39.2,124.0 +S1632,46.8,55.7 +S1633,61.8,155.5 +S1634,116.3,354.1 +S1635,85.7,197.9 +S1636,83.6,289.9 +S1637,56.0,5.0 +S1638,99.3,288.7 +S1639,22.1,5.0 +S1640,39.7,204.5 +S1641,92.0,268.1 +S1642,101.2,212.4 +S1643,80.0,149.3 +S1644,105.1,218.2 +S1645,26.1,238.4 +S1646,87.0,229.0 +S1647,15.5,77.0 +S1648,88.2,285.3 +S1649,40.3,158.1 +S1650,70.1,140.7 +S1651,51.7,165.3 +S1652,9.9,119.0 +S1653,26.6,184.1 +S1654,50.6,129.5 +S1655,7.3,93.2 +S1656,75.8,233.7 +S1657,113.0,246.9 +S1658,67.8,289.6 +S1659,78.9,205.5 +S1660,69.4,251.7 +S1661,104.0,234.9 +S1662,37.7,253.3 +S1663,108.9,343.7 +S1664,78.6,320.9 +S1665,72.8,267.0 +S1666,103.3,161.1 +S1667,52.6,293.4 +S1668,19.9,182.5 +S1669,74.2,114.3 +S1670,84.7,403.6 +S1671,26.0,135.9 +S1672,50.2,136.0 +S1673,65.5,203.7 +S1674,43.4,165.2 +S1675,59.4,76.4 +S1676,87.3,178.4 +S1677,98.2,245.8 +S1678,86.3,194.0 +S1679,103.5,244.2 +S1680,52.5,144.6 +S1681,103.8,178.5 +S1682,74.1,165.7 +S1683,22.2,60.2 +S1684,49.1,191.4 +S1685,79.0,202.4 +S1686,46.0,88.5 +S1687,58.7,176.5 +S1688,57.9,50.6 +S1689,19.9,83.7 +S1690,117.3,330.9 +S1691,33.4,81.6 +S1692,9.9,35.9 +S1693,89.9,172.1 +S1694,52.9,264.6 +S1695,62.4,257.6 +S1696,50.0,75.9 +S1697,69.4,313.2 +S1698,43.8,106.8 +S1699,102.0,110.1 +S1700,66.5,167.5 +S1701,77.0,401.8 +S1702,60.3,151.3 +S1703,101.4,230.1 +S1704,23.7,107.3 +S1705,48.7,90.5 +S1706,38.9,76.4 +S1707,91.6,246.5 +S1708,113.3,290.2 +S1709,78.2,251.2 +S1710,116.5,258.9 +S1711,42.0,224.3 +S1712,79.8,188.2 +S1713,38.3,175.1 +S1714,73.3,183.2 +S1715,57.1,68.0 +S1716,84.9,271.6 +S1717,21.1,190.6 +S1718,6.5,114.3 +S1719,101.0,199.9 +S1720,20.0,41.7 +S1721,76.6,241.3 +S1722,17.2,5.0 +S1723,107.5,236.8 +S1724,29.4,62.7 +S1725,116.6,333.5 +S1726,95.6,335.4 +S1727,66.5,132.3 +S1728,56.4,151.4 +S1729,76.7,87.6 +S1730,17.1,81.1 +S1731,101.8,209.9 +S1732,23.2,69.9 +S1733,47.7,85.9 +S1734,76.7,136.2 +S1735,11.6,5.0 +S1736,63.7,186.3 +S1737,87.2,283.6 +S1738,13.3,177.5 +S1739,57.3,174.3 +S1740,26.3,195.2 +S1741,82.7,156.1 +S1742,51.1,111.7 +S1743,113.6,221.9 +S1744,102.2,229.3 +S1745,46.9,5.0 +S1746,14.7,64.4 +S1747,40.7,158.5 +S1748,33.0,64.1 +S1749,23.3,14.8 +S1750,68.7,194.1 +S1751,76.2,237.7 +S1752,105.7,279.5 +S1753,55.3,5.1 +S1754,78.2,152.3 +S1755,78.2,183.3 +S1756,41.3,238.2 +S1757,36.9,190.8 +S1758,119.6,284.9 +S1759,35.6,168.5 +S1760,86.5,179.4 +S1761,48.1,84.2 +S1762,50.3,86.1 +S1763,64.8,188.2 +S1764,67.2,309.7 +S1765,14.0,5.0 +S1766,15.9,129.6 +S1767,28.3,31.0 +S1768,53.8,126.9 +S1769,12.4,94.9 +S1770,15.9,12.4 +S1771,29.0,30.3 +S1772,65.2,229.7 +S1773,51.2,117.4 +S1774,115.3,353.2 +S1775,16.7,156.7 +S1776,60.1,72.1 +S1777,53.8,12.7 +S1778,25.3,56.2 +S1779,110.2,279.2 +S1780,110.6,316.2 +S1781,102.5,269.4 +S1782,98.6,74.9 +S1783,32.5,60.0 +S1784,64.4,97.6 +S1785,111.7,334.4 +S1786,91.3,198.6 +S1787,69.0,250.5 +S1788,65.8,122.0 +S1789,32.9,73.2 +S1790,18.6,46.1 +S1791,82.5,138.5 +S1792,56.3,150.7 +S1793,41.3,148.9 +S1794,18.1,5.0 +S1795,72.5,179.1 +S1796,79.1,250.0 +S1797,111.7,221.2 +S1798,10.3,108.8 +S1799,117.2,273.0 +S1800,11.2,137.9 +S1801,89.0,371.3 +S1802,36.9,144.6 +S1803,23.8,25.4 +S1804,98.0,182.6 +S1805,107.2,242.4 +S1806,79.8,110.3 +S1807,114.9,274.2 +S1808,112.9,215.5 +S1809,66.0,185.0 +S1810,115.0,425.2 +S1811,52.6,178.3 +S1812,35.8,59.7 +S1813,29.3,115.5 +S1814,79.0,154.0 +S1815,80.8,249.8 +S1816,46.6,89.2 +S1817,65.2,260.7 +S1818,104.9,347.5 +S1819,62.9,291.6 +S1820,55.1,259.2 +S1821,109.4,199.4 +S1822,85.4,235.7 +S1823,51.5,168.1 +S1824,97.0,250.4 +S1825,92.8,104.9 +S1826,39.1,70.2 +S1827,82.9,178.5 +S1828,32.5,179.1 +S1829,72.3,157.1 +S1830,86.4,269.5 +S1831,17.7,22.0 +S1832,113.7,317.3 +S1833,27.0,71.0 +S1834,102.7,260.2 +S1835,74.7,98.2 +S1836,23.2,211.9 +S1837,23.3,120.3 +S1838,118.3,314.1 +S1839,10.1,68.1 +S1840,87.3,152.9 +S1841,28.4,134.6 +S1842,114.8,198.9 +S1843,48.1,106.9 +S1844,99.4,228.6 +S1845,118.2,300.9 +S1846,46.8,11.5 +S1847,61.8,56.4 +S1848,33.7,91.5 +S1849,69.7,194.9 +S1850,119.4,222.3 +S1851,6.9,5.0 +S1852,55.4,209.9 +S1853,52.6,265.3 +S1854,14.9,36.4 +S1855,62.7,129.4 +S1856,83.8,280.5 +S1857,98.5,211.0 +S1858,89.8,289.6 +S1859,110.3,322.7 +S1860,25.8,144.5 +S1861,64.5,302.8 +S1862,50.7,178.3 +S1863,38.8,123.0 +S1864,94.5,307.5 +S1865,46.7,156.3 +S1866,14.8,5.0 +S1867,87.9,324.3 +S1868,35.1,140.3 +S1869,5.2,145.3 +S1870,71.4,263.6 +S1871,35.5,276.5 +S1872,14.1,96.8 +S1873,16.5,163.1 +S1874,22.0,77.9 +S1875,90.9,210.2 +S1876,93.7,198.9 +S1877,89.8,188.7 +S1878,59.0,63.9 +S1879,80.8,180.0 +S1880,103.3,314.3 +S1881,96.3,272.8 +S1882,54.0,181.2 +S1883,24.9,40.0 +S1884,46.6,189.8 +S1885,90.6,216.9 +S1886,40.4,230.3 +S1887,108.6,216.2 +S1888,27.4,17.9 +S1889,35.2,152.0 +S1890,17.2,142.3 +S1891,88.2,274.6 +S1892,48.5,202.9 +S1893,54.5,260.9 +S1894,95.5,242.6 +S1895,12.6,56.3 +S1896,26.0,90.6 +S1897,85.6,224.9 +S1898,119.7,259.1 +S1899,61.3,137.6 +S1900,107.5,173.7 +S1901,60.2,122.7 +S1902,36.8,148.9 +S1903,7.6,161.1 +S1904,22.5,152.6 +S1905,85.5,294.7 +S1906,36.7,204.9 +S1907,94.2,261.9 +S1908,21.3,5.0 +S1909,95.8,231.7 +S1910,73.2,261.5 +S1911,46.5,208.4 +S1912,106.9,212.3 +S1913,69.0,204.1 +S1914,37.8,146.9 +S1915,101.7,273.1 +S1916,67.7,154.0 +S1917,78.5,270.3 +S1918,94.6,256.2 +S1919,87.3,143.5 +S1920,88.2,197.4 +S1921,101.0,288.6 +S1922,36.1,100.8 +S1923,100.5,144.2 +S1924,44.8,236.5 +S1925,7.8,5.0 +S1926,41.8,192.2 +S1927,64.2,77.8 +S1928,77.1,265.9 +S1929,94.4,296.8 +S1930,52.2,194.2 +S1931,87.0,253.3 +S1932,41.2,120.2 +S1933,93.9,196.8 +S1934,93.1,195.6 +S1935,115.3,297.8 +S1936,119.8,347.7 +S1937,49.9,132.6 +S1938,74.5,54.1 +S1939,28.8,25.1 +S1940,40.4,137.8 +S1941,69.7,262.9 +S1942,71.0,33.4 +S1943,32.1,199.9 +S1944,48.3,131.4 +S1945,34.1,156.9 +S1946,105.8,268.8 +S1947,54.6,67.1 +S1948,96.1,86.5 +S1949,89.3,211.4 +S1950,6.9,149.2 +S1951,70.3,111.1 +S1952,89.8,190.5 +S1953,37.6,19.9 +S1954,117.0,269.8 +S1955,15.2,45.4 +S1956,83.2,229.3 +S1957,43.4,94.7 +S1958,32.3,94.1 +S1959,39.1,33.5 +S1960,67.9,190.8 +S1961,112.2,359.1 +S1962,69.4,211.9 +S1963,35.1,45.8 +S1964,47.3,145.1 +S1965,18.5,86.5 +S1966,90.9,237.9 +S1967,94.3,267.3 +S1968,65.7,129.3 +S1969,116.1,293.0 +S1970,25.6,5.0 +S1971,91.2,238.4 +S1972,54.9,141.3 +S1973,94.2,190.7 +S1974,22.3,65.5 +S1975,64.4,157.1 +S1976,76.1,232.3 +S1977,117.2,283.8 +S1978,117.7,307.9 +S1979,15.1,53.8 +S1980,97.7,230.0 +S1981,100.4,275.0 +S1982,75.1,101.7 +S1983,105.6,207.3 +S1984,108.1,197.1 +S1985,118.9,138.1 +S1986,92.3,178.4 +S1987,79.4,105.8 +S1988,82.6,200.8 +S1989,28.1,209.7 +S1990,8.4,52.4 +S1991,57.7,221.6 +S1992,79.1,250.6 +S1993,15.2,121.0 +S1994,32.9,137.9 +S1995,6.7,25.5 +S1996,113.9,245.3 +S1997,35.2,81.2 +S1998,55.3,159.5 +S1999,89.5,369.9 +S2000,59.4,77.1 +S2001,80.7,240.5 +S2002,7.3,33.3 +S2003,41.9,24.5 +S2004,17.7,5.0 +S2005,66.0,123.8 +S2006,83.4,216.5 +S2007,30.9,87.5 +S2008,73.9,300.4 +S2009,18.3,5.0 +S2010,56.6,139.3 +S2011,57.0,125.8 +S2012,79.5,194.9 +S2013,29.3,113.2 +S2014,40.6,150.8 +S2015,83.6,245.2 +S2016,118.1,201.4 +S2017,10.8,5.0 +S2018,46.1,126.5 +S2019,112.6,225.9 +S2020,44.1,5.0 +S2021,28.0,80.6 +S2022,71.0,84.5 +S2023,119.8,255.1 +S2024,15.3,5.0 +S2025,64.4,127.8 +S2026,108.3,160.1 +S2027,77.1,160.2 +S2028,106.2,284.7 +S2029,13.3,99.9 +S2030,6.9,116.7 +S2031,33.5,197.5 +S2032,54.3,98.5 +S2033,25.4,140.6 +S2034,77.6,144.9 +S2035,7.6,61.0 +S2036,15.2,181.2 +S2037,30.3,68.2 +S2038,21.8,223.2 +S2039,60.3,146.6 +S2040,79.4,259.7 +S2041,85.8,130.3 +S2042,107.7,317.7 +S2043,10.8,16.7 +S2044,24.8,110.6 +S2045,26.2,90.8 +S2046,105.9,381.0 +S2047,115.0,328.6 +S2048,79.4,146.8 +S2049,86.8,169.9 +S2050,73.8,231.1 +S2051,110.2,274.4 +S2052,117.0,381.0 +S2053,39.3,81.2 +S2054,84.8,125.3 +S2055,83.5,358.9 +S2056,54.7,372.7 +S2057,11.7,5.0 +S2058,101.6,259.1 +S2059,40.3,135.8 +S2060,118.5,234.0 +S2061,21.7,78.4 +S2062,6.3,22.2 +S2063,8.0,185.7 +S2064,31.8,56.5 +S2065,112.2,247.5 +S2066,49.8,254.6 +S2067,78.8,345.0 +S2068,14.9,151.8 +S2069,104.3,258.5 +S2070,82.7,266.0 +S2071,44.2,211.4 +S2072,6.6,5.0 +S2073,86.8,174.1 +S2074,79.6,163.8 +S2075,74.9,98.0 +S2076,21.1,72.7 +S2077,57.0,119.6 +S2078,35.3,5.0 +S2079,79.1,316.4 +S2080,18.0,74.1 +S2081,66.6,198.9 +S2082,114.0,267.1 +S2083,103.9,357.7 +S2084,29.5,87.2 +S2085,106.0,258.1 +S2086,89.9,180.8 +S2087,12.8,25.0 +S2088,50.2,208.4 +S2089,115.4,267.0 +S2090,73.0,159.9 +S2091,104.2,254.2 +S2092,44.0,126.7 +S2093,74.1,209.2 +S2094,33.1,5.0 +S2095,108.8,267.7 +S2096,92.8,100.5 +S2097,116.4,274.6 +S2098,118.4,189.2 +S2099,7.5,5.0 +S2100,27.2,51.1 +S2101,44.6,280.9 +S2102,53.4,63.3 +S2103,19.9,134.2 +S2104,71.2,199.8 +S2105,18.4,157.5 +S2106,92.2,242.9 +S2107,41.9,241.7 +S2108,61.6,179.8 +S2109,38.4,31.2 +S2110,98.1,243.1 +S2111,105.3,217.5 +S2112,105.1,272.0 +S2113,58.8,221.2 +S2114,86.9,241.4 +S2115,19.8,85.4 +S2116,91.7,301.8 +S2117,77.9,271.4 +S2118,117.0,278.5 +S2119,12.0,5.0 +S2120,26.9,129.4 +S2121,95.8,192.3 +S2122,117.3,328.9 +S2123,65.4,102.7 +S2124,87.0,313.1 +S2125,119.6,380.4 +S2126,76.7,285.0 +S2127,85.2,154.2 +S2128,60.4,225.8 +S2129,92.1,315.9 +S2130,56.2,8.2 +S2131,39.7,166.8 +S2132,93.4,333.0 +S2133,63.0,117.8 +S2134,38.0,239.9 +S2135,14.2,178.8 +S2136,95.9,299.1 +S2137,49.7,121.2 +S2138,52.5,181.1 +S2139,24.5,52.1 +S2140,56.6,207.2 +S2141,54.8,214.9 +S2142,118.7,308.0 +S2143,72.3,212.0 +S2144,32.9,31.2 +S2145,16.6,24.4 +S2146,20.2,10.8 +S2147,86.2,104.9 +S2148,19.7,69.7 +S2149,50.3,135.0 +S2150,92.3,292.7 +S2151,85.3,259.1 +S2152,39.5,85.5 +S2153,110.1,375.1 +S2154,89.0,366.4 +S2155,115.5,332.4 +S2156,40.0,115.5 +S2157,99.8,185.6 +S2158,111.6,417.7 +S2159,115.9,379.4 +S2160,60.0,245.2 +S2161,9.3,143.0 +S2162,106.9,317.6 +S2163,11.1,13.5 +S2164,48.6,128.8 +S2165,35.9,117.6 +S2166,30.4,107.3 +S2167,110.7,251.1 +S2168,70.5,180.6 +S2169,60.2,232.9 +S2170,5.8,87.9 +S2171,14.4,154.1 +S2172,66.0,132.5 +S2173,5.2,50.7 +S2174,14.3,74.9 +S2175,11.5,78.9 +S2176,107.1,86.4 +S2177,26.6,102.0 +S2178,114.5,344.3 +S2179,41.3,86.6 +S2180,37.8,137.1 +S2181,48.6,64.4 +S2182,19.6,74.7 +S2183,9.4,123.0 +S2184,48.3,101.0 +S2185,84.6,197.3 +S2186,22.5,137.6 +S2187,59.2,42.1 +S2188,87.4,261.1 +S2189,29.8,174.4 +S2190,14.9,126.5 +S2191,60.8,162.4 +S2192,17.6,144.7 +S2193,116.8,268.6 +S2194,75.6,174.9 +S2195,81.7,193.4 +S2196,12.5,62.8 +S2197,84.5,139.4 +S2198,113.5,288.8 +S2199,48.1,235.3 +S2200,75.2,215.6 +S2201,35.7,122.4 +S2202,67.7,179.2 +S2203,93.5,165.9 +S2204,15.4,76.8 +S2205,58.5,64.9 +S2206,83.3,177.7 +S2207,58.7,284.1 +S2208,111.9,91.9 +S2209,105.1,219.5 +S2210,17.4,5.0 +S2211,62.3,149.6 +S2212,70.3,316.2 +S2213,118.0,280.0 +S2214,72.3,207.3 +S2215,40.5,281.3 +S2216,89.8,263.1 +S2217,65.2,298.9 +S2218,76.6,313.6 +S2219,7.0,37.8 +S2220,88.7,126.2 +S2221,66.4,176.2 +S2222,79.5,235.2 +S2223,11.2,80.4 +S2224,54.1,207.2 +S2225,86.0,144.8 +S2226,12.0,29.3 +S2227,84.1,267.4 +S2228,89.2,231.1 +S2229,104.3,90.8 +S2230,58.4,44.6 +S2231,26.2,231.1 +S2232,14.7,84.2 +S2233,97.0,309.3 +S2234,49.7,177.1 +S2235,111.2,108.6 +S2236,23.6,153.7 +S2237,76.1,149.8 +S2238,115.0,459.2 +S2239,22.5,33.4 +S2240,111.3,213.6 +S2241,93.7,336.9 +S2242,88.6,223.0 +S2243,102.2,303.7 +S2244,60.2,294.5 +S2245,33.6,89.8 +S2246,32.0,108.0 +S2247,29.4,161.5 +S2248,7.2,5.0 +S2249,44.9,219.6 +S2250,33.2,279.6 +S2251,104.3,292.9 +S2252,8.4,38.8 +S2253,68.0,139.6 +S2254,105.4,307.1 +S2255,90.9,238.6 +S2256,49.8,176.4 +S2257,64.6,133.1 +S2258,15.0,11.9 +S2259,70.1,244.9 +S2260,8.2,5.0 +S2261,72.2,76.1 +S2262,46.1,196.7 +S2263,75.7,252.4 +S2264,17.8,131.7 +S2265,36.2,101.6 +S2266,49.3,242.5 +S2267,107.4,282.2 +S2268,36.2,189.4 +S2269,90.0,172.9 +S2270,35.5,164.4 +S2271,108.5,222.6 +S2272,118.1,324.8 +S2273,27.6,176.6 +S2274,62.9,256.6 +S2275,106.4,172.6 +S2276,17.2,5.6 +S2277,29.2,37.8 +S2278,63.8,150.8 +S2279,118.6,342.7 +S2280,116.4,195.6 +S2281,111.4,261.6 +S2282,80.5,145.2 +S2283,88.3,247.7 +S2284,108.6,249.5 +S2285,110.4,302.2 +S2286,99.1,189.0 +S2287,103.1,204.6 +S2288,96.0,141.1 +S2289,75.5,183.1 +S2290,69.2,120.4 +S2291,113.7,276.5 +S2292,37.5,110.8 +S2293,49.9,95.6 +S2294,61.6,176.3 +S2295,99.8,205.7 +S2296,15.2,51.9 +S2297,18.1,131.8 +S2298,112.5,204.8 +S2299,90.9,294.3 +S2300,96.3,358.6 +S2301,81.7,135.4 +S2302,93.4,281.1 +S2303,46.7,151.1 +S2304,63.4,142.7 +S2305,98.3,344.8 +S2306,28.4,42.3 +S2307,64.2,230.8 +S2308,105.5,309.1 +S2309,107.2,258.0 +S2310,71.0,191.8 +S2311,89.6,304.3 +S2312,67.4,190.8 +S2313,102.8,252.0 +S2314,70.8,140.5 +S2315,88.3,271.1 +S2316,71.4,156.3 +S2317,95.7,392.7 +S2318,5.7,263.1 +S2319,102.9,302.3 +S2320,37.3,63.1 +S2321,71.2,144.8 +S2322,101.0,95.7 +S2323,89.5,231.0 +S2324,73.5,202.1 +S2325,43.7,226.6 +S2326,5.0,116.4 +S2327,119.1,234.2 +S2328,44.0,237.3 +S2329,40.2,16.5 +S2330,12.6,174.2 +S2331,103.6,214.4 +S2332,55.4,277.4 +S2333,15.5,162.5 +S2334,103.4,269.3 +S2335,41.9,109.6 +S2336,117.7,76.0 +S2337,70.3,140.2 +S2338,80.0,252.8 +S2339,119.5,254.9 +S2340,37.1,39.1 +S2341,11.3,114.4 +S2342,44.7,163.1 +S2343,56.1,224.6 +S2344,113.9,226.0 +S2345,72.8,163.2 +S2346,11.6,9.4 +S2347,18.3,5.0 +S2348,51.8,50.9 +S2349,106.8,308.6 +S2350,68.5,117.1 +S2351,7.7,5.0 +S2352,6.5,72.4 +S2353,33.7,166.9 +S2354,97.9,278.6 +S2355,80.9,285.9 +S2356,46.0,148.2 +S2357,29.3,109.6 +S2358,94.4,270.9 +S2359,38.3,150.7 +S2360,104.5,280.8 +S2361,17.4,59.7 +S2362,34.9,123.0 +S2363,52.9,85.9 +S2364,70.9,158.4 +S2365,65.8,161.0 +S2366,78.1,274.1 +S2367,31.6,96.7 +S2368,107.0,149.8 +S2369,94.2,259.7 +S2370,87.0,300.6 +S2371,45.6,210.0 +S2372,110.5,279.8 +S2373,18.6,58.4 +S2374,104.3,174.2 +S2375,41.6,32.5 +S2376,31.1,112.1 +S2377,68.5,59.4 +S2378,30.3,100.3 +S2379,46.7,122.9 +S2380,113.3,194.4 +S2381,6.8,16.7 +S2382,99.4,256.9 +S2383,9.2,5.0 +S2384,102.4,142.8 +S2385,37.9,146.0 +S2386,38.5,231.7 +S2387,114.5,293.2 +S2388,52.2,285.9 +S2389,64.7,122.7 +S2390,55.4,170.0 +S2391,84.4,223.8 +S2392,12.6,195.0 +S2393,8.1,153.2 +S2394,116.5,297.1 +S2395,72.2,217.7 +S2396,119.9,242.0 +S2397,61.0,124.2 +S2398,47.0,242.4 +S2399,99.9,321.4 +S2400,26.0,40.3 +S2401,78.3,162.5 +S2402,72.2,57.4 +S2403,72.1,291.5 +S2404,100.8,198.8 +S2405,54.8,178.9 +S2406,112.9,293.1 +S2407,109.4,113.4 +S2408,23.7,67.5 +S2409,102.4,185.6 +S2410,82.8,159.6 +S2411,71.8,255.5 +S2412,112.6,256.0 +S2413,34.7,65.2 +S2414,31.6,11.8 +S2415,67.8,103.0 +S2416,117.0,259.5 +S2417,71.9,273.7 +S2418,33.1,80.0 +S2419,50.5,152.6 +S2420,47.0,202.8 +S2421,54.9,281.0 +S2422,61.0,283.6 +S2423,56.2,5.0 +S2424,116.9,350.5 +S2425,111.9,288.1 +S2426,39.9,124.5 +S2427,28.9,164.7 +S2428,60.7,170.1 +S2429,116.3,210.6 +S2430,115.6,185.0 +S2431,56.0,255.1 +S2432,90.9,160.1 +S2433,66.4,109.6 +S2434,96.9,274.4 +S2435,113.1,217.7 +S2436,19.0,71.4 +S2437,31.0,52.7 +S2438,74.5,201.6 +S2439,20.2,101.6 +S2440,32.2,114.7 +S2441,91.9,275.7 +S2442,63.9,180.2 +S2443,73.2,215.5 +S2444,37.0,176.6 +S2445,29.1,167.1 +S2446,101.9,332.4 +S2447,77.3,217.5 +S2448,72.8,157.1 +S2449,76.8,168.6 +S2450,108.2,219.1 +S2451,17.9,5.0 +S2452,80.2,216.6 +S2453,88.3,278.9 +S2454,77.2,350.0 +S2455,23.7,63.1 +S2456,54.2,79.1 +S2457,39.7,181.5 +S2458,39.1,139.3 +S2459,51.9,89.6 +S2460,19.9,134.9 +S2461,10.0,35.3 +S2462,14.1,60.6 +S2463,70.5,344.3 +S2464,111.7,140.0 +S2465,111.1,247.2 +S2466,14.1,69.1 +S2467,107.1,322.9 +S2468,114.3,357.9 +S2469,74.1,192.8 +S2470,80.5,220.2 +S2471,44.6,181.4 +S2472,96.7,334.3 +S2473,52.1,74.8 +S2474,102.5,283.3 +S2475,97.0,231.1 +S2476,5.4,81.5 +S2477,12.8,132.2 +S2478,45.4,74.1 +S2479,64.7,80.5 +S2480,48.0,150.7 +S2481,39.5,142.2 +S2482,51.7,188.7 +S2483,94.1,194.5 +S2484,117.4,143.2 +S2485,104.7,154.8 +S2486,103.1,299.0 +S2487,51.8,100.2 +S2488,26.6,41.9 +S2489,105.6,337.1 +S2490,53.3,249.6 +S2491,36.7,87.8 +S2492,10.1,49.9 +S2493,108.1,308.7 +S2494,82.0,247.8 +S2495,82.4,187.9 +S2496,36.5,214.8 +S2497,85.6,264.4 +S2498,37.8,26.4 +S2499,82.0,233.2 +S2500,64.6,197.5 +S2501,97.2,182.3 +S2502,58.3,143.0 +S2503,105.1,251.6 +S2504,117.2,336.9 +S2505,87.8,235.9 +S2506,11.7,51.1 +S2507,112.6,259.7 +S2508,114.7,335.1 +S2509,107.8,276.5 +S2510,119.5,321.7 +S2511,31.7,235.9 +S2512,96.6,300.7 +S2513,75.5,159.7 +S2514,77.8,192.0 +S2515,91.3,209.7 +S2516,39.3,35.2 +S2517,118.7,385.3 +S2518,116.1,338.5 +S2519,8.9,122.5 +S2520,69.2,223.8 +S2521,88.1,230.9 +S2522,51.3,208.4 +S2523,32.5,40.3 +S2524,36.9,99.8 +S2525,114.7,257.4 +S2526,106.9,342.6 +S2527,84.4,206.4 +S2528,71.0,212.2 +S2529,44.0,149.3 +S2530,80.7,260.1 +S2531,36.6,164.8 +S2532,26.4,95.1 +S2533,76.5,315.0 +S2534,52.3,13.5 +S2535,98.8,66.3 +S2536,115.4,306.7 +S2537,86.5,191.2 +S2538,63.7,149.8 +S2539,56.3,181.1 +S2540,92.3,83.8 +S2541,112.4,280.2 +S2542,21.7,143.0 +S2543,52.3,39.6 +S2544,31.9,75.7 +S2545,104.2,103.3 +S2546,65.1,250.1 +S2547,79.2,166.0 +S2548,88.3,192.2 +S2549,20.8,101.6 +S2550,39.5,61.0 +S2551,36.7,241.2 +S2552,102.6,223.7 +S2553,112.9,196.1 +S2554,75.4,174.5 +S2555,100.7,294.4 +S2556,95.7,345.8 +S2557,14.2,56.9 +S2558,59.4,289.5 +S2559,32.2,202.2 +S2560,69.3,85.3 +S2561,117.7,293.3 +S2562,63.8,202.9 +S2563,49.7,158.0 +S2564,25.9,61.9 +S2565,68.7,221.6 +S2566,76.5,140.2 +S2567,30.4,78.2 +S2568,83.2,260.8 +S2569,100.9,444.2 +S2570,88.9,166.8 +S2571,91.4,299.4 +S2572,20.9,93.1 +S2573,13.2,84.4 +S2574,54.1,235.4 +S2575,52.2,149.5 +S2576,90.4,240.2 +S2577,28.5,224.0 +S2578,73.1,196.7 +S2579,76.7,176.5 +S2580,43.2,183.0 +S2581,79.1,338.7 +S2582,81.5,204.1 +S2583,10.5,63.4 +S2584,42.9,235.5 +S2585,92.5,212.6 +S2586,109.9,233.5 +S2587,13.4,99.1 +S2588,85.7,295.5 +S2589,25.3,18.8 +S2590,53.6,60.6 +S2591,71.4,292.5 +S2592,94.7,243.4 +S2593,38.9,130.5 +S2594,42.9,85.4 +S2595,89.1,299.8 +S2596,22.0,132.6 +S2597,56.8,207.0 +S2598,61.1,178.5 +S2599,118.2,224.2 +S2600,72.6,116.0 +S2601,11.6,101.8 +S2602,94.1,266.4 +S2603,25.1,94.9 +S2604,102.3,384.1 +S2605,45.9,170.9 +S2606,71.7,184.1 +S2607,71.6,110.8 +S2608,37.7,94.9 +S2609,30.9,133.2 +S2610,88.0,218.2 +S2611,91.2,171.8 +S2612,118.2,331.5 +S2613,50.5,5.0 +S2614,33.4,21.9 +S2615,113.4,279.6 +S2616,35.6,5.0 +S2617,97.9,224.5 +S2618,101.0,177.3 +S2619,19.7,66.0 +S2620,78.2,133.5 +S2621,38.0,44.8 +S2622,41.8,204.2 +S2623,78.7,261.8 +S2624,43.9,204.7 +S2625,30.0,106.8 +S2626,36.4,89.1 +S2627,111.9,243.2 +S2628,62.4,47.6 +S2629,10.2,12.6 +S2630,105.1,391.4 +S2631,6.0,77.5 +S2632,19.7,82.4 +S2633,40.3,5.0 +S2634,84.1,170.6 +S2635,78.7,282.1 +S2636,112.0,180.2 +S2637,87.2,214.3 +S2638,56.0,179.3 +S2639,82.8,241.0 +S2640,66.6,269.3 +S2641,91.7,251.9 +S2642,90.0,88.0 +S2643,103.5,222.0 +S2644,60.5,137.4 +S2645,71.0,257.6 +S2646,39.9,54.0 +S2647,7.0,128.7 +S2648,22.3,49.1 +S2649,37.5,191.7 +S2650,18.6,5.0 +S2651,7.2,43.7 +S2652,59.0,247.1 +S2653,81.4,311.0 +S2654,112.9,238.0 +S2655,117.1,173.5 +S2656,42.8,58.4 +S2657,93.7,223.0 +S2658,38.5,12.0 +S2659,29.2,5.0 +S2660,79.3,249.0 +S2661,24.3,63.6 +S2662,111.6,276.7 +S2663,99.9,216.2 +S2664,33.1,150.2 +S2665,107.8,256.5 +S2666,79.5,214.2 +S2667,20.5,246.7 +S2668,24.5,66.3 +S2669,25.2,5.0 +S2670,22.4,5.0 +S2671,116.0,230.9 +S2672,10.0,198.3 +S2673,33.5,120.0 +S2674,64.2,150.0 +S2675,60.4,231.2 +S2676,55.5,108.3 +S2677,13.6,5.0 +S2678,43.6,101.4 +S2679,80.3,284.0 +S2680,60.8,219.3 +S2681,53.3,101.3 +S2682,23.7,47.1 +S2683,42.1,92.8 +S2684,7.0,5.0 +S2685,78.2,308.7 +S2686,105.2,251.9 +S2687,108.0,283.3 +S2688,89.9,252.2 +S2689,22.6,41.3 +S2690,117.5,290.2 +S2691,105.3,249.3 +S2692,77.5,222.0 +S2693,64.0,109.7 +S2694,118.9,177.9 +S2695,38.4,116.9 +S2696,32.1,5.0 +S2697,69.9,153.9 +S2698,13.6,123.1 +S2699,25.5,182.8 +S2700,86.1,264.0 +S2701,119.3,272.8 +S2702,38.8,177.4 +S2703,71.6,205.1 +S2704,109.0,168.0 +S2705,40.7,91.2 +S2706,44.8,216.7 +S2707,41.2,97.3 +S2708,38.3,190.8 +S2709,54.9,240.6 +S2710,14.2,107.7 +S2711,59.4,186.4 +S2712,91.0,221.6 +S2713,97.8,224.5 +S2714,82.2,173.7 +S2715,6.5,116.8 +S2716,7.7,127.4 +S2717,99.1,212.9 +S2718,90.1,243.2 +S2719,56.4,121.8 +S2720,89.0,231.9 +S2721,61.1,121.4 +S2722,45.5,105.9 +S2723,69.4,205.4 +S2724,104.2,234.9 +S2725,88.9,169.7 +S2726,8.3,81.0 +S2727,102.4,140.2 +S2728,96.8,324.0 +S2729,17.2,130.1 +S2730,50.8,117.3 +S2731,61.8,193.0 +S2732,6.0,25.4 +S2733,81.8,229.6 +S2734,90.7,325.1 +S2735,24.8,12.2 +S2736,82.8,206.2 +S2737,78.5,190.3 +S2738,18.4,5.0 +S2739,110.5,322.2 +S2740,72.7,164.9 +S2741,93.4,194.1 +S2742,8.5,71.0 +S2743,15.6,45.8 +S2744,22.8,140.7 +S2745,119.0,287.0 +S2746,84.1,111.7 +S2747,22.3,97.2 +S2748,48.0,142.1 +S2749,31.2,116.9 +S2750,91.8,103.1 +S2751,47.9,241.1 +S2752,112.5,376.4 +S2753,22.0,5.0 +S2754,20.3,155.4 +S2755,19.3,119.9 +S2756,21.1,5.0 +S2757,66.4,124.6 +S2758,72.2,447.0 +S2759,6.2,8.7 +S2760,73.1,342.2 +S2761,87.6,169.0 +S2762,118.7,367.6 +S2763,92.7,261.6 +S2764,78.3,287.3 +S2765,94.5,200.0 +S2766,45.2,84.4 +S2767,84.0,200.0 +S2768,62.3,121.1 +S2769,7.5,35.3 +S2770,117.0,317.1 +S2771,49.4,114.6 +S2772,63.3,138.9 +S2773,23.2,116.4 +S2774,62.4,23.9 +S2775,37.0,143.2 +S2776,82.6,243.1 +S2777,90.8,159.9 +S2778,79.6,320.6 +S2779,60.3,181.5 +S2780,17.5,5.0 +S2781,11.6,5.0 +S2782,33.0,96.1 +S2783,55.1,223.5 +S2784,54.1,101.6 +S2785,61.3,62.2 +S2786,44.5,152.1 +S2787,18.6,167.1 +S2788,109.5,270.8 +S2789,8.8,86.9 +S2790,69.6,269.2 +S2791,101.0,136.1 +S2792,25.8,131.1 +S2793,14.7,200.0 +S2794,6.0,25.6 +S2795,15.0,124.2 +S2796,49.2,132.0 +S2797,107.1,283.7 +S2798,78.2,149.7 +S2799,107.2,439.6 +S2800,17.9,72.7 +S2801,82.3,240.7 +S2802,45.8,160.2 +S2803,44.2,107.6 +S2804,62.2,206.8 +S2805,109.8,213.1 +S2806,39.3,63.0 +S2807,97.1,222.2 +S2808,25.9,5.0 +S2809,74.5,186.2 +S2810,60.5,227.3 +S2811,10.7,87.2 +S2812,91.4,141.7 +S2813,90.3,163.7 +S2814,61.7,181.7 +S2815,17.7,89.2 +S2816,32.6,108.2 +S2817,12.2,20.9 +S2818,88.2,301.3 +S2819,92.7,319.2 +S2820,37.7,137.7 +S2821,118.9,283.8 +S2822,97.8,394.8 +S2823,48.1,8.0 +S2824,34.9,213.5 +S2825,91.9,288.6 +S2826,59.1,176.6 +S2827,61.5,122.6 +S2828,28.0,82.1 +S2829,62.5,117.3 +S2830,82.6,150.9 +S2831,50.5,163.5 +S2832,84.2,301.1 +S2833,11.3,62.7 +S2834,117.4,261.6 +S2835,40.8,199.9 +S2836,8.0,5.0 +S2837,102.2,111.9 +S2838,55.9,96.6 +S2839,26.1,5.0 +S2840,58.0,189.2 +S2841,111.0,241.0 +S2842,70.7,181.9 +S2843,34.4,183.0 +S2844,118.0,267.1 +S2845,22.2,123.4 +S2846,94.6,277.6 +S2847,77.7,186.3 +S2848,52.2,200.9 +S2849,6.0,151.0 +S2850,84.3,154.9 +S2851,70.1,216.2 +S2852,80.5,316.4 +S2853,72.2,200.2 +S2854,75.3,309.6 +S2855,69.3,167.0 +S2856,38.1,125.9 +S2857,109.1,234.1 +S2858,68.8,235.8 +S2859,103.3,213.4 +S2860,71.9,164.6 +S2861,97.8,232.9 +S2862,74.4,275.9 +S2863,116.4,232.5 +S2864,102.7,115.0 +S2865,78.6,260.1 +S2866,6.1,5.0 +S2867,95.7,215.0 +S2868,65.7,184.8 +S2869,108.9,259.1 +S2870,31.8,134.4 +S2871,13.9,9.4 +S2872,107.5,294.6 +S2873,21.3,122.3 +S2874,76.0,107.5 +S2875,18.3,5.0 +S2876,74.1,161.3 +S2877,89.6,253.9 +S2878,99.9,337.0 +S2879,65.3,68.3 +S2880,86.4,411.6 +S2881,96.1,209.8 +S2882,38.1,70.5 +S2883,81.7,272.4 +S2884,9.9,9.0 +S2885,14.4,5.0 +S2886,101.1,294.4 +S2887,17.5,200.6 +S2888,18.3,124.7 +S2889,13.8,41.4 +S2890,81.7,170.5 +S2891,7.0,5.0 +S2892,111.2,175.6 +S2893,108.2,269.3 +S2894,68.8,175.9 +S2895,56.2,148.3 +S2896,83.8,279.9 +S2897,88.6,135.0 +S2898,116.4,267.1 +S2899,16.5,5.0 +S2900,59.5,298.4 +S2901,21.5,5.0 +S2902,21.2,98.1 +S2903,10.8,5.0 +S2904,118.3,331.3 +S2905,78.4,114.0 +S2906,111.4,389.3 +S2907,69.2,96.5 +S2908,118.6,290.8 +S2909,32.1,200.5 +S2910,91.4,235.8 +S2911,92.6,188.2 +S2912,29.2,5.7 +S2913,104.5,217.8 +S2914,94.9,265.5 +S2915,54.5,129.1 +S2916,113.5,244.7 +S2917,111.3,251.9 +S2918,77.8,227.4 +S2919,11.8,43.8 +S2920,83.2,172.4 +S2921,108.6,296.0 +S2922,47.4,194.5 +S2923,92.3,308.7 +S2924,45.9,163.7 +S2925,103.0,250.3 +S2926,43.6,155.3 +S2927,9.5,9.2 +S2928,22.9,84.2 +S2929,102.4,271.3 +S2930,20.8,34.7 +S2931,114.6,175.2 +S2932,26.2,125.5 +S2933,16.6,50.6 +S2934,88.1,185.1 +S2935,48.9,237.2 +S2936,21.1,178.0 +S2937,83.2,285.8 +S2938,107.4,224.4 +S2939,50.9,105.9 +S2940,99.0,288.9 +S2941,76.3,213.3 +S2942,78.4,241.3 +S2943,61.9,267.8 +S2944,81.5,303.4 +S2945,64.0,55.4 +S2946,24.7,118.7 +S2947,110.4,266.4 +S2948,49.0,5.0 +S2949,68.7,178.8 +S2950,67.0,166.9 +S2951,24.2,119.3 +S2952,67.3,225.5 +S2953,61.4,237.1 +S2954,102.5,181.6 +S2955,54.7,62.6 +S2956,73.0,173.5 +S2957,68.2,149.9 +S2958,99.9,371.3 +S2959,49.5,89.3 +S2960,11.9,186.4 +S2961,84.2,252.8 +S2962,114.5,350.7 +S2963,49.7,102.8 +S2964,100.2,245.5 +S2965,43.0,93.6 +S2966,97.4,216.4 +S2967,28.9,145.5 +S2968,111.0,347.1 +S2969,113.0,197.6 +S2970,35.1,234.5 +S2971,49.4,197.1 +S2972,9.1,86.4 +S2973,32.0,36.6 +S2974,60.2,98.1 +S2975,100.9,280.5 +S2976,63.6,138.9 +S2977,96.0,102.7 +S2978,44.9,306.3 +S2979,115.0,235.7 +S2980,42.7,5.0 +S2981,32.3,84.1 +S2982,56.4,248.7 +S2983,68.8,224.3 +S2984,110.2,384.1 +S2985,32.7,163.6 +S2986,25.8,102.3 +S2987,32.9,244.8 +S2988,18.0,5.0 +S2989,25.0,90.1 +S2990,69.9,232.9 +S2991,84.3,327.0 +S2992,70.8,148.9 +S2993,58.1,122.1 +S2994,80.2,161.8 +S2995,37.3,142.6 +S2996,94.0,296.5 +S2997,6.9,76.7 +S2998,104.7,319.6 +S2999,26.0,93.6 +S3000,41.4,166.7 +S3001,73.5,110.1 +S3002,109.5,256.9 +S3003,21.1,106.0 +S3004,15.7,30.0 +S3005,97.0,275.1 +S3006,41.3,5.0 +S3007,100.6,243.8 +S3008,24.4,135.6 +S3009,17.2,160.6 +S3010,110.4,265.1 +S3011,102.9,198.8 +S3012,57.4,212.5 +S3013,39.7,106.6 +S3014,10.0,80.2 +S3015,32.7,5.0 +S3016,114.0,146.7 +S3017,59.1,278.6 +S3018,17.7,179.1 +S3019,39.4,5.0 +S3020,36.1,5.0 +S3021,38.9,228.1 +S3022,31.9,132.6 +S3023,63.3,245.2 +S3024,77.2,208.1 +S3025,87.7,377.2 +S3026,25.2,67.1 +S3027,69.3,184.2 +S3028,101.7,144.1 +S3029,40.3,94.1 +S3030,73.9,56.0 +S3031,76.4,137.9 +S3032,25.2,100.5 +S3033,80.9,174.3 +S3034,6.4,5.0 +S3035,43.2,268.0 +S3036,85.2,266.7 +S3037,52.1,232.6 +S3038,6.6,5.0 +S3039,57.5,81.5 +S3040,45.0,146.8 +S3041,10.1,110.3 +S3042,50.1,89.2 +S3043,114.8,294.7 +S3044,19.3,5.0 +S3045,103.8,109.7 +S3046,5.2,76.6 +S3047,87.5,249.5 +S3048,104.8,265.0 +S3049,69.8,165.6 +S3050,49.9,183.8 +S3051,9.8,48.1 +S3052,15.7,92.9 +S3053,34.3,5.0 +S3054,8.4,32.1 +S3055,27.3,60.4 +S3056,76.2,347.5 +S3057,34.2,220.4 +S3058,30.0,63.4 +S3059,55.2,170.3 +S3060,104.4,275.4 +S3061,74.2,263.4 +S3062,17.3,44.5 +S3063,84.1,216.9 +S3064,59.3,199.2 +S3065,53.7,62.5 +S3066,37.7,97.4 +S3067,43.8,118.2 +S3068,63.2,195.0 +S3069,78.3,27.1 +S3070,26.3,11.8 +S3071,49.8,167.5 +S3072,12.5,24.1 +S3073,36.7,187.6 +S3074,49.6,196.2 +S3075,9.8,80.4 +S3076,71.4,315.0 +S3077,68.4,68.3 +S3078,86.3,376.6 +S3079,7.8,39.4 +S3080,32.7,151.6 +S3081,96.3,227.3 +S3082,102.3,370.4 +S3083,40.1,28.6 +S3084,83.9,251.4 +S3085,95.9,262.9 +S3086,41.3,170.6 +S3087,7.7,5.0 +S3088,114.7,207.3 +S3089,102.3,204.5 +S3090,76.3,182.2 +S3091,43.6,72.7 +S3092,106.1,151.3 +S3093,64.8,154.4 +S3094,41.1,246.1 +S3095,38.2,39.1 +S3096,70.1,172.5 +S3097,113.1,227.2 +S3098,73.3,178.9 +S3099,8.1,136.5 +S3100,119.6,166.6 +S3101,6.7,5.0 +S3102,6.9,5.0 +S3103,24.1,78.5 +S3104,54.6,201.4 +S3105,29.7,73.4 +S3106,72.7,239.8 +S3107,72.6,54.0 +S3108,94.4,373.5 +S3109,15.3,70.6 +S3110,73.3,143.4 +S3111,108.6,276.9 +S3112,29.8,186.2 +S3113,116.4,240.8 +S3114,25.2,78.7 +S3115,41.5,131.8 +S3116,109.0,308.7 +S3117,23.9,48.3 +S3118,36.4,121.9 +S3119,98.0,363.7 +S3120,68.9,216.5 +S3121,82.7,236.4 +S3122,114.7,279.2 +S3123,41.1,26.1 +S3124,99.2,270.6 +S3125,70.6,206.7 +S3126,74.7,286.3 +S3127,34.8,255.9 +S3128,47.9,121.4 +S3129,112.5,223.7 +S3130,55.1,133.2 +S3131,118.7,196.1 +S3132,101.7,289.1 +S3133,29.9,100.0 +S3134,52.1,113.0 +S3135,16.3,26.4 +S3136,87.5,252.0 +S3137,67.9,128.5 +S3138,33.1,102.8 +S3139,24.1,126.5 +S3140,79.9,250.4 +S3141,8.5,72.2 +S3142,70.1,175.3 +S3143,33.0,157.7 +S3144,102.1,208.5 +S3145,108.7,225.1 +S3146,12.7,5.0 +S3147,114.2,274.0 +S3148,119.8,340.9 +S3149,83.9,203.3 +S3150,116.2,366.4 +S3151,21.6,84.6 +S3152,46.0,79.6 +S3153,22.3,16.1 +S3154,89.6,294.8 +S3155,21.7,55.5 +S3156,23.7,70.6 +S3157,99.3,352.6 +S3158,107.2,328.7 +S3159,74.8,297.5 +S3160,13.7,83.9 +S3161,108.8,122.1 +S3162,42.0,172.6 +S3163,82.6,119.1 +S3164,91.0,64.1 +S3165,32.3,170.3 +S3166,84.7,202.7 +S3167,119.7,84.0 +S3168,6.3,186.7 +S3169,114.8,263.8 +S3170,68.7,251.2 +S3171,68.3,238.3 +S3172,95.5,279.3 +S3173,108.1,197.7 +S3174,117.7,297.8 +S3175,63.2,69.8 +S3176,22.0,140.0 +S3177,78.2,144.8 +S3178,60.5,85.1 +S3179,39.8,87.2 +S3180,17.3,5.0 +S3181,39.6,103.6 +S3182,74.1,281.3 +S3183,65.3,165.9 +S3184,15.7,42.6 +S3185,70.1,124.6 +S3186,99.3,212.5 +S3187,58.0,174.9 +S3188,39.9,103.3 +S3189,77.6,156.4 +S3190,98.3,284.1 +S3191,43.8,144.0 +S3192,29.5,166.0 +S3193,98.9,199.2 +S3194,88.6,268.2 +S3195,45.7,83.5 +S3196,14.3,5.0 +S3197,32.9,5.0 +S3198,110.8,290.0 +S3199,62.8,219.9 +S3200,22.9,174.9 +S3201,27.4,226.8 +S3202,95.5,397.5 +S3203,90.1,98.2 +S3204,43.2,142.5 +S3205,7.5,5.0 +S3206,73.1,261.4 +S3207,39.3,92.8 +S3208,32.4,136.9 +S3209,86.2,256.5 +S3210,58.4,118.6 +S3211,28.6,148.5 +S3212,93.8,271.7 +S3213,34.0,149.5 +S3214,111.4,251.5 +S3215,39.3,15.2 +S3216,34.0,177.7 +S3217,67.0,284.4 +S3218,17.9,67.0 +S3219,20.9,58.1 +S3220,45.5,261.6 +S3221,8.2,33.7 +S3222,75.6,128.8 +S3223,117.1,184.2 +S3224,17.5,20.5 +S3225,93.1,174.9 +S3226,50.8,159.4 +S3227,116.7,233.5 +S3228,84.2,182.9 +S3229,82.6,259.6 +S3230,30.4,14.0 +S3231,32.0,227.7 +S3232,64.0,184.2 +S3233,23.4,172.1 +S3234,68.3,224.8 +S3235,22.4,35.1 +S3236,65.8,132.3 +S3237,91.3,193.0 +S3238,22.0,122.9 +S3239,20.5,116.4 +S3240,112.6,139.2 +S3241,92.4,292.7 +S3242,112.7,317.1 +S3243,59.4,153.9 +S3244,30.4,66.7 +S3245,27.8,162.6 +S3246,58.9,152.0 +S3247,64.9,234.7 +S3248,91.0,183.1 +S3249,41.0,156.7 +S3250,77.8,263.4 +S3251,110.0,298.2 +S3252,27.4,120.1 +S3253,104.6,162.8 +S3254,104.7,327.0 +S3255,21.2,54.9 +S3256,47.4,247.1 +S3257,34.8,5.0 +S3258,74.1,217.4 +S3259,89.8,283.6 +S3260,79.2,195.8 +S3261,114.0,320.9 +S3262,66.4,180.3 +S3263,60.3,177.6 +S3264,112.0,288.9 +S3265,118.0,220.5 +S3266,109.2,147.4 +S3267,90.1,170.3 +S3268,111.7,173.9 +S3269,88.6,156.7 +S3270,87.4,214.9 +S3271,14.5,143.0 +S3272,15.7,175.3 +S3273,6.5,195.9 +S3274,5.2,32.0 +S3275,52.3,5.0 +S3276,61.7,258.1 +S3277,56.8,265.0 +S3278,15.8,260.7 +S3279,54.8,138.5 +S3280,36.1,34.1 +S3281,33.8,24.6 +S3282,55.7,69.9 +S3283,90.6,248.7 +S3284,33.5,18.4 +S3285,74.4,209.5 +S3286,78.3,274.2 +S3287,74.3,215.1 +S3288,58.0,250.9 +S3289,89.6,290.8 +S3290,91.2,359.1 +S3291,75.2,147.4 +S3292,89.6,317.2 +S3293,41.1,85.7 +S3294,77.7,200.9 +S3295,105.5,215.9 +S3296,6.9,5.0 +S3297,5.7,79.1 +S3298,20.1,70.0 +S3299,84.9,160.0 +S3300,47.7,214.9 +S3301,109.3,239.4 +S3302,103.8,236.0 +S3303,28.0,141.0 +S3304,47.3,102.8 +S3305,66.7,208.7 +S3306,63.4,287.9 +S3307,51.9,100.8 +S3308,37.8,86.9 +S3309,72.0,230.1 +S3310,13.5,19.0 +S3311,58.5,127.7 +S3312,11.7,48.3 +S3313,66.9,264.2 +S3314,22.1,5.0 +S3315,72.1,333.6 +S3316,29.0,5.0 +S3317,6.6,5.0 +S3318,118.9,318.3 +S3319,85.0,308.8 +S3320,119.9,289.1 +S3321,80.0,227.7 +S3322,112.3,424.3 +S3323,61.7,222.7 +S3324,64.4,222.6 +S3325,67.5,263.1 +S3326,57.0,137.1 +S3327,58.0,239.4 +S3328,45.2,203.8 +S3329,95.8,269.8 +S3330,81.5,223.7 +S3331,89.8,204.4 +S3332,21.3,55.3 +S3333,28.0,138.6 +S3334,88.4,217.4 +S3335,62.5,190.5 +S3336,28.2,92.6 +S3337,110.5,356.8 +S3338,96.9,320.9 +S3339,103.8,244.1 +S3340,10.7,120.4 +S3341,114.9,198.8 +S3342,61.0,153.6 +S3343,53.5,214.1 +S3344,111.8,337.9 +S3345,80.6,173.7 +S3346,59.7,181.2 +S3347,67.4,236.5 +S3348,25.2,5.0 +S3349,37.1,172.8 +S3350,56.1,176.9 +S3351,16.2,5.0 +S3352,16.3,122.9 +S3353,84.4,224.4 +S3354,87.9,216.4 +S3355,49.5,104.8 +S3356,106.6,220.7 +S3357,37.3,245.7 +S3358,52.1,135.2 +S3359,9.3,50.5 +S3360,67.7,154.5 +S3361,67.6,206.1 +S3362,108.7,218.5 +S3363,56.3,236.4 +S3364,17.0,196.3 +S3365,74.7,194.0 +S3366,11.3,5.0 +S3367,78.7,153.3 +S3368,72.9,111.5 +S3369,27.4,106.7 +S3370,113.0,233.0 +S3371,29.0,222.5 +S3372,112.3,233.6 +S3373,85.1,267.0 +S3374,115.8,195.7 +S3375,111.9,191.8 +S3376,34.6,45.7 +S3377,47.7,123.3 +S3378,70.0,66.7 +S3379,52.2,173.3 +S3380,109.5,249.9 +S3381,105.8,293.0 +S3382,22.2,79.8 +S3383,21.4,146.0 +S3384,79.0,129.6 +S3385,35.9,15.4 +S3386,55.6,193.6 +S3387,92.0,356.5 +S3388,6.8,5.0 +S3389,43.5,20.1 +S3390,57.0,139.3 +S3391,37.6,107.7 +S3392,91.1,281.1 +S3393,66.7,255.1 +S3394,71.4,138.7 +S3395,94.6,361.9 +S3396,116.5,386.4 +S3397,26.9,22.0 +S3398,20.2,5.0 +S3399,90.2,163.1 +S3400,53.7,191.9 +S3401,66.4,240.1 +S3402,80.4,28.3 +S3403,26.9,236.6 +S3404,24.4,33.4 +S3405,36.8,89.0 +S3406,33.7,66.9 +S3407,27.2,173.7 +S3408,6.9,46.4 +S3409,51.8,47.4 +S3410,88.1,204.0 +S3411,20.6,45.7 +S3412,39.5,204.9 +S3413,35.7,120.7 +S3414,27.5,211.8 +S3415,107.3,263.4 +S3416,56.7,125.4 +S3417,18.7,5.0 +S3418,118.6,260.4 +S3419,105.3,441.7 +S3420,101.7,267.1 +S3421,33.7,170.9 +S3422,51.1,126.0 +S3423,67.2,277.3 +S3424,12.7,267.6 +S3425,65.3,259.0 +S3426,15.9,75.1 +S3427,23.7,105.8 +S3428,79.8,162.5 +S3429,27.0,113.1 +S3430,118.0,329.8 +S3431,103.6,141.9 +S3432,41.0,134.7 +S3433,28.9,79.8 +S3434,8.8,154.5 +S3435,66.7,160.7 +S3436,46.5,5.0 +S3437,25.9,71.6 +S3438,108.7,250.7 +S3439,47.1,234.1 +S3440,65.0,206.4 +S3441,106.6,216.3 +S3442,57.7,129.5 +S3443,15.0,72.8 +S3444,75.6,216.0 +S3445,49.8,240.3 +S3446,93.4,369.0 +S3447,10.2,106.2 +S3448,107.1,178.1 +S3449,8.5,210.9 +S3450,39.7,70.9 +S3451,84.7,207.8 +S3452,30.1,191.9 +S3453,99.6,189.1 +S3454,18.9,64.1 +S3455,70.2,125.0 +S3456,106.2,335.3 +S3457,99.0,109.0 +S3458,18.6,5.0 +S3459,108.9,242.9 +S3460,24.7,118.0 +S3461,90.9,215.9 +S3462,82.7,272.6 +S3463,60.2,128.6 +S3464,116.1,296.0 +S3465,6.9,153.9 +S3466,28.8,130.2 +S3467,39.6,116.1 +S3468,55.9,237.3 +S3469,36.2,128.7 +S3470,70.9,225.9 +S3471,50.4,98.2 +S3472,40.0,215.6 +S3473,75.2,197.1 +S3474,12.2,113.9 +S3475,37.5,175.8 +S3476,24.6,68.9 +S3477,118.8,124.3 +S3478,48.7,83.7 +S3479,42.1,153.8 +S3480,81.9,275.1 +S3481,24.4,150.4 +S3482,117.6,214.0 +S3483,70.6,304.2 +S3484,106.3,212.5 +S3485,5.4,44.9 +S3486,111.5,217.4 +S3487,39.2,74.3 +S3488,105.1,178.5 +S3489,107.5,216.2 +S3490,12.1,189.6 +S3491,8.8,5.0 +S3492,112.4,405.4 +S3493,36.9,166.3 +S3494,35.7,134.3 +S3495,104.1,202.5 +S3496,19.4,82.8 +S3497,71.8,128.4 +S3498,29.1,238.8 +S3499,101.7,195.9 +S3500,116.5,270.1 +S3501,97.0,178.7 +S3502,39.6,241.2 +S3503,80.4,205.4 +S3504,14.0,115.2 +S3505,32.4,61.6 +S3506,116.3,324.2 +S3507,15.5,166.3 +S3508,62.7,37.1 +S3509,41.4,161.7 +S3510,6.5,126.3 +S3511,34.1,5.0 +S3512,98.3,452.9 +S3513,13.7,33.4 +S3514,103.6,161.7 +S3515,107.0,379.6 +S3516,62.0,204.5 +S3517,51.0,157.2 +S3518,17.5,229.2 +S3519,82.2,244.3 +S3520,31.8,83.8 +S3521,105.9,237.5 +S3522,68.2,172.7 +S3523,72.0,232.2 +S3524,107.8,335.7 +S3525,13.0,96.1 +S3526,32.6,212.7 +S3527,86.5,165.4 +S3528,8.8,5.0 +S3529,51.8,161.6 +S3530,110.5,247.1 +S3531,37.2,235.3 +S3532,78.1,227.2 +S3533,81.0,288.9 +S3534,6.9,23.2 +S3535,51.0,81.1 +S3536,95.1,184.3 +S3537,72.2,201.0 +S3538,37.8,51.4 +S3539,95.9,344.0 +S3540,17.5,5.0 +S3541,58.1,200.3 +S3542,67.9,159.1 +S3543,90.3,229.3 +S3544,42.3,99.2 +S3545,95.5,219.0 +S3546,67.3,194.2 +S3547,13.0,5.0 +S3548,76.0,94.6 +S3549,109.4,138.6 +S3550,70.7,141.1 +S3551,10.2,102.8 +S3552,26.5,108.2 +S3553,91.8,261.6 +S3554,19.9,38.1 +S3555,86.0,276.6 +S3556,7.8,155.8 +S3557,81.7,285.3 +S3558,54.8,32.0 +S3559,56.9,241.8 +S3560,58.3,92.0 +S3561,61.5,147.4 +S3562,84.6,302.8 +S3563,37.7,180.2 +S3564,48.7,217.4 +S3565,69.8,223.6 +S3566,48.5,118.0 +S3567,105.4,217.0 +S3568,107.4,323.0 +S3569,97.6,137.5 +S3570,77.7,186.5 +S3571,64.7,314.0 +S3572,113.8,352.3 +S3573,63.6,192.6 +S3574,17.5,25.6 +S3575,111.9,223.6 +S3576,51.4,58.9 +S3577,117.1,250.0 +S3578,38.8,195.0 +S3579,58.9,126.3 +S3580,18.7,155.9 +S3581,88.2,186.6 +S3582,13.0,5.0 +S3583,96.0,288.1 +S3584,82.1,228.5 +S3585,69.5,246.8 +S3586,75.4,228.0 +S3587,65.6,127.6 +S3588,57.7,47.7 +S3589,78.9,167.9 +S3590,62.0,42.5 +S3591,107.6,282.0 +S3592,58.3,131.3 +S3593,102.1,263.8 +S3594,110.9,209.1 +S3595,77.9,346.6 +S3596,96.5,216.5 +S3597,30.0,76.5 +S3598,118.9,287.0 +S3599,26.5,212.6 +S3600,83.8,160.1 +S3601,79.5,243.0 +S3602,10.0,5.0 +S3603,40.2,242.5 +S3604,6.3,36.5 +S3605,65.8,253.8 +S3606,73.7,269.6 +S3607,117.6,456.0 +S3608,34.3,57.5 +S3609,17.6,81.0 +S3610,74.4,343.0 +S3611,35.8,114.5 +S3612,98.8,329.2 +S3613,59.4,144.4 +S3614,104.0,303.8 +S3615,17.2,124.1 +S3616,66.5,123.1 +S3617,89.1,168.0 +S3618,29.0,18.8 +S3619,41.1,5.0 +S3620,71.2,141.7 +S3621,45.3,5.0 +S3622,92.5,235.9 +S3623,61.5,211.0 +S3624,110.6,194.7 +S3625,81.9,227.2 +S3626,12.5,116.3 +S3627,54.9,135.1 +S3628,33.7,158.2 +S3629,66.3,92.7 +S3630,91.5,176.7 +S3631,24.9,48.8 +S3632,36.0,116.0 +S3633,105.6,319.0 +S3634,88.7,122.7 +S3635,108.2,281.7 +S3636,13.6,5.0 +S3637,94.8,256.2 +S3638,93.2,238.3 +S3639,92.4,203.5 +S3640,16.1,102.5 +S3641,26.7,100.0 +S3642,21.0,16.0 +S3643,52.5,167.2 +S3644,102.0,208.3 +S3645,85.6,278.4 +S3646,59.4,195.3 +S3647,69.3,119.7 +S3648,55.5,75.6 +S3649,51.4,155.0 +S3650,23.1,147.9 +S3651,20.2,61.5 +S3652,52.9,116.6 +S3653,85.1,135.8 +S3654,59.3,224.8 +S3655,69.7,365.2 +S3656,45.8,215.8 +S3657,48.2,66.5 +S3658,17.5,5.0 +S3659,48.5,60.3 +S3660,36.0,106.5 +S3661,67.2,152.8 +S3662,76.1,149.7 +S3663,61.9,106.7 +S3664,51.9,155.5 +S3665,64.3,131.3 +S3666,5.1,81.1 +S3667,81.0,342.0 +S3668,49.7,216.1 +S3669,100.2,231.9 +S3670,56.4,29.5 +S3671,83.8,350.0 +S3672,96.7,231.8 +S3673,61.4,143.3 +S3674,26.9,125.4 +S3675,50.2,101.9 +S3676,43.3,45.6 +S3677,7.5,57.2 +S3678,109.6,244.2 +S3679,26.5,128.3 +S3680,24.8,196.1 +S3681,82.0,167.4 +S3682,64.5,54.5 +S3683,17.2,140.9 +S3684,62.6,111.7 +S3685,84.2,139.0 +S3686,94.7,256.7 +S3687,12.7,5.0 +S3688,109.3,151.3 +S3689,28.6,101.0 +S3690,119.5,215.5 +S3691,33.1,228.6 +S3692,37.9,159.6 +S3693,70.1,286.8 +S3694,11.8,258.4 +S3695,21.7,104.0 +S3696,25.0,5.0 +S3697,20.8,32.3 +S3698,110.3,315.0 +S3699,91.0,335.6 +S3700,18.8,42.9 +S3701,118.0,272.2 +S3702,63.3,248.2 +S3703,11.2,5.5 +S3704,33.6,152.6 +S3705,18.3,77.8 +S3706,108.0,402.4 +S3707,42.9,117.2 +S3708,119.4,151.2 +S3709,80.1,248.8 +S3710,37.9,145.6 +S3711,32.3,27.3 +S3712,14.2,96.3 +S3713,16.1,40.7 +S3714,29.0,95.4 +S3715,87.5,183.5 +S3716,7.0,5.0 +S3717,46.1,67.6 +S3718,116.0,200.7 +S3719,88.2,343.2 +S3720,6.5,5.0 +S3721,83.9,125.7 +S3722,102.5,296.5 +S3723,54.0,110.4 +S3724,41.9,141.0 +S3725,17.1,69.5 +S3726,102.0,301.7 +S3727,42.4,140.0 +S3728,12.3,135.4 +S3729,35.3,134.0 +S3730,46.2,168.5 +S3731,119.9,244.6 +S3732,79.1,215.8 +S3733,15.7,92.9 +S3734,55.9,111.1 +S3735,93.1,228.1 +S3736,54.3,183.7 +S3737,68.4,163.1 +S3738,50.9,83.2 +S3739,51.3,186.1 +S3740,36.6,112.7 +S3741,100.5,28.4 +S3742,76.0,138.3 +S3743,94.2,224.9 +S3744,91.3,207.5 +S3745,102.4,301.0 +S3746,13.4,153.7 +S3747,111.1,262.9 +S3748,27.8,160.6 +S3749,34.9,72.0 +S3750,12.6,69.7 +S3751,115.6,345.2 +S3752,74.4,213.7 +S3753,108.4,250.1 +S3754,24.7,160.1 +S3755,46.6,312.8 +S3756,57.4,158.2 +S3757,118.3,318.6 +S3758,96.2,311.6 +S3759,67.1,78.5 +S3760,83.4,240.3 +S3761,55.5,147.1 +S3762,58.5,5.0 +S3763,56.3,63.9 +S3764,103.2,171.1 +S3765,101.4,310.6 +S3766,72.7,104.6 +S3767,115.7,319.7 +S3768,56.2,186.8 +S3769,103.4,257.8 +S3770,117.7,284.6 +S3771,70.2,204.0 +S3772,9.4,157.7 +S3773,10.0,44.6 +S3774,54.7,122.2 +S3775,26.8,138.4 +S3776,62.4,103.1 +S3777,62.6,268.4 +S3778,103.9,311.1 +S3779,115.3,311.6 +S3780,118.9,320.5 +S3781,81.8,247.3 +S3782,116.0,287.6 +S3783,65.3,167.6 +S3784,6.6,5.0 +S3785,79.3,174.3 +S3786,103.0,305.0 +S3787,113.5,195.8 +S3788,66.4,191.1 +S3789,56.7,142.4 +S3790,90.1,111.8 +S3791,93.7,354.8 +S3792,87.7,214.1 +S3793,17.6,30.5 +S3794,82.5,271.4 +S3795,88.1,209.3 +S3796,59.2,153.7 +S3797,16.5,156.2 +S3798,38.1,55.1 +S3799,24.1,79.5 +S3800,86.5,207.3 +S3801,105.0,346.9 +S3802,65.3,180.5 +S3803,87.8,261.8 +S3804,64.5,45.8 +S3805,31.3,35.8 +S3806,80.3,173.9 +S3807,52.0,224.6 +S3808,6.0,109.3 +S3809,117.3,353.0 +S3810,24.3,86.4 +S3811,58.8,23.6 +S3812,93.0,316.5 +S3813,66.5,251.8 +S3814,105.9,332.7 +S3815,27.4,127.1 +S3816,14.6,36.0 +S3817,74.1,153.5 +S3818,26.5,112.2 +S3819,64.8,228.3 +S3820,101.3,234.4 +S3821,94.5,351.0 +S3822,62.9,92.1 +S3823,8.5,19.2 +S3824,58.3,149.9 +S3825,71.6,294.7 +S3826,27.0,208.3 +S3827,40.2,30.5 +S3828,110.4,296.5 +S3829,108.4,264.4 +S3830,52.5,60.6 +S3831,75.8,160.4 +S3832,102.1,203.2 +S3833,106.2,145.4 +S3834,13.1,102.1 +S3835,110.1,262.8 +S3836,64.4,237.7 +S3837,68.4,316.0 +S3838,116.8,343.3 +S3839,59.8,129.3 +S3840,117.4,324.2 +S3841,70.6,181.3 +S3842,71.4,79.8 +S3843,63.3,203.3 +S3844,116.5,277.1 +S3845,64.3,256.7 +S3846,42.5,241.1 +S3847,7.7,47.9 +S3848,104.0,290.1 +S3849,85.0,125.9 +S3850,95.4,314.7 +S3851,93.3,344.4 +S3852,35.4,131.1 +S3853,77.3,237.9 +S3854,28.9,94.2 +S3855,98.7,150.3 +S3856,57.2,214.7 +S3857,49.9,134.4 +S3858,109.6,275.3 +S3859,97.0,99.2 +S3860,95.1,293.1 +S3861,103.4,372.3 +S3862,100.3,237.1 +S3863,61.7,123.9 +S3864,55.8,102.3 +S3865,100.8,252.5 +S3866,90.1,208.7 +S3867,78.4,111.3 +S3868,30.6,150.8 +S3869,28.1,73.0 +S3870,16.5,133.0 +S3871,116.6,328.2 +S3872,46.7,88.4 +S3873,9.3,99.6 +S3874,40.1,122.4 +S3875,119.3,266.5 +S3876,116.3,150.7 +S3877,39.6,167.6 +S3878,30.1,128.1 +S3879,84.9,291.1 +S3880,41.5,290.3 +S3881,37.9,79.4 +S3882,9.8,67.3 +S3883,39.5,45.8 +S3884,85.9,256.2 +S3885,87.9,221.5 +S3886,82.1,115.1 +S3887,21.4,182.5 +S3888,93.0,288.9 +S3889,88.8,112.9 +S3890,44.0,134.7 +S3891,38.8,145.2 +S3892,36.6,155.6 +S3893,60.7,193.4 +S3894,93.2,242.8 +S3895,41.6,118.3 +S3896,48.6,168.2 +S3897,23.6,11.3 +S3898,16.1,88.9 +S3899,80.6,173.1 +S3900,60.2,258.1 +S3901,27.9,135.8 +S3902,62.5,183.7 +S3903,105.1,239.6 +S3904,116.0,246.1 +S3905,113.5,341.8 +S3906,44.4,202.0 +S3907,98.5,237.3 +S3908,83.9,268.3 +S3909,117.4,294.2 +S3910,20.8,150.4 +S3911,82.6,212.7 +S3912,99.3,238.3 +S3913,116.4,381.7 +S3914,111.5,381.7 +S3915,62.9,230.7 +S3916,69.6,262.7 +S3917,30.7,111.1 +S3918,50.6,109.1 +S3919,15.6,68.1 +S3920,68.9,142.6 +S3921,61.4,194.8 +S3922,30.5,72.5 +S3923,37.6,216.6 +S3924,113.1,167.2 +S3925,89.8,260.6 +S3926,107.3,244.1 +S3927,119.1,337.4 +S3928,61.5,240.4 +S3929,61.9,52.4 +S3930,113.7,338.1 +S3931,29.5,171.4 +S3932,58.9,207.4 +S3933,41.5,174.1 +S3934,22.7,5.0 +S3935,91.3,168.8 +S3936,91.7,168.8 +S3937,66.4,194.9 +S3938,116.9,329.2 +S3939,24.0,31.5 +S3940,33.3,107.8 +S3941,68.5,135.9 +S3942,23.8,142.7 +S3943,35.5,209.1 +S3944,75.9,62.4 +S3945,92.7,159.4 +S3946,116.6,307.7 +S3947,98.6,101.4 +S3948,31.4,132.2 +S3949,41.8,194.3 +S3950,31.8,155.4 +S3951,74.8,237.8 +S3952,44.5,151.8 +S3953,101.0,230.0 +S3954,16.1,5.0 +S3955,34.9,124.9 +S3956,90.1,218.4 +S3957,113.7,405.7 +S3958,98.9,393.8 +S3959,109.6,349.3 +S3960,62.0,200.9 +S3961,58.7,222.4 +S3962,40.0,175.6 +S3963,70.2,157.2 +S3964,23.8,208.1 +S3965,62.9,288.9 +S3966,117.6,385.4 +S3967,72.8,216.0 +S3968,29.5,134.6 +S3969,116.2,355.5 +S3970,51.1,180.2 +S3971,43.7,165.8 +S3972,26.9,86.5 +S3973,51.1,167.2 +S3974,28.7,159.1 +S3975,50.2,246.1 +S3976,44.6,81.8 +S3977,81.4,289.1 +S3978,45.7,193.3 +S3979,24.7,101.1 +S3980,68.9,140.0 +S3981,98.1,197.8 +S3982,38.7,85.9 +S3983,58.2,27.9 +S3984,36.7,149.5 +S3985,57.3,168.4 +S3986,70.9,243.8 +S3987,69.6,241.3 +S3988,9.0,37.6 +S3989,28.7,5.0 +S3990,12.3,5.0 +S3991,111.8,166.4 +S3992,117.7,314.6 +S3993,104.7,198.0 +S3994,89.4,234.0 +S3995,56.0,140.6 +S3996,107.1,222.2 +S3997,77.4,196.8 +S3998,11.9,13.9 +S3999,16.0,52.6 +S4000,15.3,76.7 +S4001,107.8,242.2 +S4002,94.3,210.9 +S4003,59.6,133.4 +S4004,13.1,198.9 +S4005,118.6,312.2 +S4006,34.3,5.0 +S4007,20.8,98.1 +S4008,71.1,206.5 +S4009,21.2,157.8 +S4010,40.0,111.6 +S4011,104.3,210.5 +S4012,6.7,5.0 +S4013,14.7,34.5 +S4014,109.6,414.5 +S4015,48.6,95.0 +S4016,68.7,271.7 +S4017,115.8,371.2 +S4018,95.7,333.0 +S4019,27.2,29.3 +S4020,45.0,128.8 +S4021,13.8,121.6 +S4022,44.9,171.2 +S4023,41.0,210.0 +S4024,15.3,190.0 +S4025,57.1,223.5 +S4026,51.8,243.7 +S4027,50.8,113.0 +S4028,93.1,259.5 +S4029,69.7,203.5 +S4030,100.8,274.3 +S4031,12.9,80.0 +S4032,33.7,150.9 +S4033,61.9,157.7 +S4034,99.4,316.6 +S4035,74.0,226.0 +S4036,78.6,231.6 +S4037,83.6,281.2 +S4038,69.2,247.0 +S4039,54.0,246.1 +S4040,29.8,91.0 +S4041,62.5,145.8 +S4042,82.1,67.2 +S4043,102.5,321.8 +S4044,71.6,103.9 +S4045,102.9,233.3 +S4046,99.1,383.2 +S4047,99.2,222.9 +S4048,20.7,133.4 +S4049,83.8,262.3 +S4050,17.0,94.4 +S4051,15.0,57.8 +S4052,34.1,171.9 +S4053,94.2,178.1 +S4054,8.8,82.9 +S4055,16.4,9.3 +S4056,88.6,267.4 +S4057,74.0,194.3 +S4058,114.3,286.3 +S4059,31.4,155.7 +S4060,63.4,165.8 +S4061,77.9,199.1 +S4062,89.6,266.5 +S4063,29.1,79.2 +S4064,29.4,93.5 +S4065,41.4,81.2 +S4066,89.2,208.1 +S4067,36.7,44.0 +S4068,65.2,232.0 +S4069,22.0,148.7 +S4070,88.8,233.7 +S4071,31.2,29.7 +S4072,112.0,214.9 +S4073,65.5,94.6 +S4074,73.9,231.2 +S4075,97.7,154.0 +S4076,108.9,397.9 +S4077,59.7,167.2 +S4078,16.7,41.6 +S4079,116.6,384.6 +S4080,93.0,276.2 +S4081,89.4,167.1 +S4082,31.4,154.8 +S4083,52.8,90.1 +S4084,11.9,27.3 +S4085,61.8,85.3 +S4086,57.3,290.0 +S4087,103.6,215.1 +S4088,118.0,280.9 +S4089,61.3,248.2 +S4090,37.4,170.4 +S4091,67.6,155.4 +S4092,72.2,233.6 +S4093,98.9,328.2 +S4094,32.2,131.8 +S4095,30.7,47.6 +S4096,43.6,16.6 +S4097,92.7,176.5 +S4098,75.3,123.7 +S4099,30.4,78.9 +S4100,111.4,193.2 +S4101,13.1,5.0 +S4102,88.7,192.1 +S4103,76.1,96.8 +S4104,78.9,193.7 +S4105,90.0,260.3 +S4106,48.8,124.2 +S4107,88.8,243.5 +S4108,77.4,158.4 +S4109,118.4,396.4 +S4110,49.6,104.8 +S4111,94.0,127.3 +S4112,44.1,79.5 +S4113,66.7,185.3 +S4114,113.3,238.0 +S4115,110.4,253.0 +S4116,55.7,174.8 +S4117,38.2,85.7 +S4118,88.9,176.6 +S4119,110.5,359.6 +S4120,20.7,65.7 +S4121,13.9,132.6 +S4122,59.1,160.2 +S4123,66.5,211.8 +S4124,27.0,83.0 +S4125,112.4,212.2 +S4126,37.7,203.9 +S4127,100.0,322.1 +S4128,99.6,181.9 +S4129,116.2,261.0 +S4130,14.0,76.6 +S4131,54.2,139.8 +S4132,48.4,146.9 +S4133,61.2,77.7 +S4134,99.9,207.6 +S4135,91.3,200.2 +S4136,91.0,286.0 +S4137,35.3,56.9 +S4138,68.4,117.9 +S4139,46.4,287.4 +S4140,8.8,155.3 +S4141,47.2,169.9 +S4142,50.4,153.2 +S4143,12.8,51.3 +S4144,22.4,187.6 +S4145,38.3,55.8 +S4146,56.0,146.3 +S4147,103.5,267.0 +S4148,37.2,109.6 +S4149,95.1,186.8 +S4150,6.1,87.5 +S4151,88.2,306.5 +S4152,8.3,5.0 +S4153,17.2,47.7 +S4154,86.0,347.3 +S4155,82.1,275.5 +S4156,106.8,337.4 +S4157,11.4,84.2 +S4158,13.8,65.0 +S4159,51.8,125.0 +S4160,98.3,347.1 +S4161,46.6,140.3 +S4162,31.9,97.3 +S4163,64.0,197.5 +S4164,13.7,5.0 +S4165,111.7,233.5 +S4166,19.6,183.4 +S4167,77.5,146.2 +S4168,57.4,124.5 +S4169,76.4,251.8 +S4170,28.7,170.5 +S4171,102.7,359.3 +S4172,90.3,347.1 +S4173,87.5,219.3 +S4174,30.2,64.4 +S4175,45.5,139.3 +S4176,61.6,197.3 +S4177,14.0,78.7 +S4178,43.4,71.5 +S4179,14.6,32.3 +S4180,62.9,189.8 +S4181,55.5,266.3 +S4182,99.1,451.2 +S4183,33.5,5.0 +S4184,18.3,167.5 +S4185,99.1,343.5 +S4186,20.2,90.7 +S4187,46.2,96.2 +S4188,12.5,55.5 +S4189,78.6,212.9 +S4190,96.8,463.4 +S4191,102.0,258.0 +S4192,42.4,108.0 +S4193,100.1,294.1 +S4194,26.3,66.3 +S4195,70.4,123.2 +S4196,54.0,103.0 +S4197,54.9,74.3 +S4198,80.8,62.6 +S4199,105.1,355.4 +S4200,77.2,347.0 +S4201,69.9,227.4 +S4202,63.2,331.8 +S4203,8.3,23.1 +S4204,45.9,110.1 +S4205,71.5,268.0 +S4206,58.1,69.7 +S4207,19.4,108.8 +S4208,111.1,239.2 +S4209,87.3,196.6 +S4210,10.9,87.0 +S4211,40.6,277.5 +S4212,46.6,155.8 +S4213,76.4,193.8 +S4214,51.1,122.8 +S4215,100.1,276.5 +S4216,22.5,7.4 +S4217,23.8,143.9 +S4218,84.0,276.8 +S4219,76.2,328.4 +S4220,26.0,86.0 +S4221,39.4,146.0 +S4222,71.7,221.3 +S4223,110.9,194.3 +S4224,21.4,152.0 +S4225,5.5,147.8 +S4226,33.2,129.4 +S4227,111.8,296.0 +S4228,85.6,258.0 +S4229,38.1,5.0 +S4230,74.8,161.9 +S4231,79.1,306.4 +S4232,38.5,139.7 +S4233,68.9,5.0 +S4234,75.7,161.6 +S4235,41.8,235.5 +S4236,11.5,207.4 +S4237,56.6,243.1 +S4238,49.2,150.3 +S4239,38.1,197.2 +S4240,67.1,203.2 +S4241,52.1,165.7 +S4242,25.3,191.7 +S4243,50.9,175.1 +S4244,73.2,205.1 +S4245,94.7,172.9 +S4246,74.2,222.9 +S4247,83.2,150.2 +S4248,19.0,130.6 +S4249,34.8,45.7 +S4250,6.4,52.2 +S4251,86.8,252.1 +S4252,21.6,140.8 +S4253,20.2,82.2 +S4254,76.0,258.0 +S4255,55.8,85.9 +S4256,86.6,215.6 +S4257,54.3,320.1 +S4258,56.4,190.6 +S4259,18.0,8.6 +S4260,101.0,256.4 +S4261,62.7,281.3 +S4262,46.8,250.3 +S4263,84.7,102.4 +S4264,81.6,162.9 +S4265,10.2,88.7 +S4266,50.4,65.8 +S4267,54.7,234.5 +S4268,46.9,219.3 +S4269,61.0,82.2 +S4270,63.7,121.8 +S4271,25.2,31.1 +S4272,83.4,304.2 +S4273,73.5,272.6 +S4274,65.7,257.1 +S4275,47.6,175.2 +S4276,14.4,68.5 +S4277,17.6,5.0 +S4278,7.1,5.0 +S4279,80.5,174.3 +S4280,90.0,130.1 +S4281,55.3,201.1 +S4282,106.7,298.3 +S4283,39.5,136.1 +S4284,106.9,264.8 +S4285,79.2,201.3 +S4286,90.0,175.5 +S4287,85.2,176.7 +S4288,47.7,170.8 +S4289,105.0,354.9 +S4290,73.4,317.8 +S4291,82.8,191.0 +S4292,113.0,228.0 +S4293,39.8,137.6 +S4294,72.0,180.8 +S4295,82.6,200.8 +S4296,86.3,185.4 +S4297,114.2,320.1 +S4298,27.3,69.5 +S4299,81.8,95.5 +S4300,102.7,302.5 +S4301,93.0,236.3 +S4302,40.5,56.9 +S4303,102.3,159.6 +S4304,11.9,94.3 +S4305,65.1,343.1 +S4306,33.8,144.5 +S4307,93.1,249.8 +S4308,25.8,5.0 +S4309,17.3,42.1 +S4310,65.5,131.4 +S4311,17.5,5.0 +S4312,62.1,213.2 +S4313,104.7,237.8 +S4314,91.5,347.2 +S4315,26.6,153.6 +S4316,119.5,397.7 +S4317,49.6,136.8 +S4318,6.1,41.4 +S4319,8.3,27.3 +S4320,35.4,43.0 +S4321,10.5,116.1 +S4322,95.2,211.5 +S4323,112.2,267.7 +S4324,114.9,247.5 +S4325,83.1,274.0 +S4326,12.4,63.6 +S4327,36.2,108.5 +S4328,107.9,121.6 +S4329,19.2,80.0 +S4330,57.4,84.3 +S4331,109.4,232.2 +S4332,42.9,177.4 +S4333,49.1,171.3 +S4334,29.1,86.6 +S4335,115.0,175.2 +S4336,62.1,301.3 +S4337,107.8,242.8 +S4338,64.9,196.0 +S4339,76.4,163.1 +S4340,50.9,57.4 +S4341,33.0,204.8 +S4342,96.8,266.5 +S4343,92.0,261.3 +S4344,63.0,134.4 +S4345,15.7,128.7 +S4346,28.6,126.1 +S4347,55.8,116.8 +S4348,19.7,86.2 +S4349,14.4,99.7 +S4350,103.2,342.7 +S4351,51.9,170.1 +S4352,7.5,5.0 +S4353,68.2,266.7 +S4354,7.0,79.3 +S4355,73.0,298.6 +S4356,96.0,268.7 +S4357,115.5,240.0 +S4358,43.3,13.5 +S4359,67.4,65.5 +S4360,91.9,244.8 +S4361,8.5,49.8 +S4362,74.7,244.3 +S4363,24.2,70.0 +S4364,47.3,31.9 +S4365,70.2,167.5 +S4366,23.3,54.2 +S4367,13.7,82.1 +S4368,53.2,5.0 +S4369,98.4,112.3 +S4370,62.3,112.5 +S4371,13.3,5.0 +S4372,25.3,29.4 +S4373,117.8,222.1 +S4374,93.7,225.7 +S4375,82.0,300.3 +S4376,115.4,272.5 +S4377,37.8,119.6 +S4378,22.8,56.1 +S4379,36.3,78.3 +S4380,111.5,217.2 +S4381,74.2,223.4 +S4382,25.0,140.0 +S4383,103.0,310.4 +S4384,71.4,120.5 +S4385,11.4,23.4 +S4386,18.3,183.8 +S4387,50.6,77.0 +S4388,114.7,222.0 +S4389,92.1,272.8 +S4390,102.4,179.4 +S4391,19.1,60.7 +S4392,26.2,157.3 +S4393,69.3,239.8 +S4394,62.1,161.8 +S4395,64.4,216.7 +S4396,99.3,278.5 +S4397,16.7,55.1 +S4398,79.3,197.1 +S4399,5.7,94.6 +S4400,58.4,186.1 +S4401,48.0,143.0 +S4402,67.5,186.5 +S4403,102.4,266.3 +S4404,96.7,241.0 +S4405,8.2,88.1 +S4406,69.3,174.9 +S4407,77.8,190.5 +S4408,91.7,259.6 +S4409,14.8,5.0 +S4410,34.3,84.5 +S4411,58.5,130.9 +S4412,84.7,163.3 +S4413,27.2,84.8 +S4414,96.2,162.0 +S4415,106.8,354.9 +S4416,114.5,112.7 +S4417,42.6,63.6 +S4418,70.1,264.5 +S4419,49.9,85.1 +S4420,47.7,115.8 +S4421,65.3,178.8 +S4422,9.6,23.6 +S4423,97.5,238.0 +S4424,34.2,37.3 +S4425,12.6,21.1 +S4426,38.1,111.6 +S4427,111.9,222.6 +S4428,59.6,228.9 +S4429,42.6,37.9 +S4430,105.5,316.6 +S4431,107.2,179.3 +S4432,11.3,5.0 +S4433,8.8,95.4 +S4434,94.2,223.2 +S4435,97.5,281.5 +S4436,57.9,16.8 +S4437,108.2,318.6 +S4438,14.1,114.1 +S4439,55.3,206.9 +S4440,74.0,248.5 +S4441,100.2,266.9 +S4442,64.0,88.0 +S4443,56.2,209.3 +S4444,113.1,172.6 +S4445,110.1,201.9 +S4446,78.5,292.3 +S4447,12.0,78.7 +S4448,103.2,318.5 +S4449,99.6,144.3 +S4450,9.9,141.3 +S4451,13.1,5.0 +S4452,99.1,69.6 +S4453,56.6,20.6 +S4454,98.4,176.7 +S4455,63.4,192.3 +S4456,61.0,192.3 +S4457,81.8,247.2 +S4458,96.1,190.5 +S4459,104.6,316.7 +S4460,23.2,140.1 +S4461,33.4,52.3 +S4462,86.5,218.7 +S4463,83.0,183.7 +S4464,35.4,24.7 +S4465,57.1,262.9 +S4466,37.6,223.6 +S4467,31.8,54.8 +S4468,110.7,186.1 +S4469,105.3,334.8 +S4470,52.1,141.3 +S4471,23.0,136.9 +S4472,5.4,7.5 +S4473,45.0,160.6 +S4474,20.3,21.1 +S4475,71.0,289.1 +S4476,6.6,58.7 +S4477,94.8,309.1 +S4478,47.0,75.3 +S4479,107.3,190.5 +S4480,73.6,62.8 +S4481,19.5,123.4 +S4482,45.9,59.7 +S4483,78.7,157.2 +S4484,79.4,296.9 +S4485,43.6,102.3 +S4486,66.5,235.3 +S4487,117.8,289.3 +S4488,79.0,69.4 +S4489,30.9,161.5 +S4490,15.9,108.4 +S4491,95.2,456.6 +S4492,62.8,125.0 +S4493,42.1,278.3 +S4494,71.4,261.6 +S4495,49.8,162.2 +S4496,53.2,16.2 +S4497,80.1,60.0 +S4498,44.5,78.4 +S4499,81.4,281.8 +S4500,57.9,289.6 +S4501,102.5,285.1 +S4502,43.6,50.5 +S4503,38.5,128.9 +S4504,98.3,458.6 +S4505,81.5,254.4 +S4506,96.5,250.5 +S4507,42.4,204.6 +S4508,100.5,335.4 +S4509,27.5,33.2 +S4510,56.2,142.6 +S4511,101.1,365.9 +S4512,67.5,239.4 +S4513,110.7,252.8 +S4514,51.8,187.1 +S4515,114.1,400.6 +S4516,40.8,93.0 +S4517,12.8,5.0 +S4518,20.6,129.8 +S4519,86.9,160.2 +S4520,95.7,207.6 +S4521,91.3,335.7 +S4522,64.1,191.7 +S4523,87.6,206.0 +S4524,83.3,211.4 +S4525,81.6,276.5 +S4526,108.1,241.5 +S4527,57.9,141.3 +S4528,8.3,51.8 +S4529,29.4,213.1 +S4530,90.3,160.7 +S4531,90.1,113.3 +S4532,69.0,163.5 +S4533,70.1,165.2 +S4534,8.8,89.6 +S4535,29.6,76.3 +S4536,84.5,123.2 +S4537,53.0,61.0 +S4538,11.9,14.7 +S4539,60.8,208.0 +S4540,106.6,196.3 +S4541,88.1,151.9 +S4542,94.9,196.1 +S4543,25.1,136.7 +S4544,67.6,131.8 +S4545,58.9,181.2 +S4546,102.9,259.6 +S4547,84.0,227.4 +S4548,111.2,397.2 +S4549,98.3,271.5 +S4550,36.3,5.0 +S4551,54.1,109.6 +S4552,56.6,156.0 +S4553,50.3,85.1 +S4554,61.6,242.5 +S4555,11.0,232.3 +S4556,9.5,5.0 +S4557,26.1,182.1 +S4558,88.9,239.8 +S4559,54.0,165.4 +S4560,36.9,210.2 +S4561,98.6,175.5 +S4562,10.2,181.8 +S4563,43.3,78.3 +S4564,91.6,143.7 +S4565,6.0,23.3 +S4566,114.5,328.0 +S4567,23.8,69.7 +S4568,45.5,201.4 +S4569,79.8,272.2 +S4570,55.9,197.7 +S4571,8.4,14.9 +S4572,29.0,75.8 +S4573,109.5,365.1 +S4574,110.6,277.0 +S4575,58.0,198.4 +S4576,6.7,213.2 +S4577,45.6,177.6 +S4578,63.5,221.9 +S4579,101.9,281.3 +S4580,62.3,150.0 +S4581,21.6,182.8 +S4582,71.2,131.6 +S4583,38.7,166.5 +S4584,21.3,50.2 +S4585,39.9,160.2 +S4586,47.2,198.6 +S4587,61.5,230.7 +S4588,10.3,83.4 +S4589,104.4,308.3 +S4590,95.0,225.8 +S4591,51.7,76.6 +S4592,48.7,256.0 +S4593,62.5,136.6 +S4594,19.2,34.0 +S4595,77.7,129.8 +S4596,109.4,258.2 +S4597,83.5,212.5 +S4598,37.8,209.3 +S4599,17.2,83.4 +S4600,15.1,14.6 +S4601,91.7,150.5 +S4602,95.2,278.4 +S4603,24.3,117.4 +S4604,119.4,356.8 +S4605,13.6,5.0 +S4606,115.1,280.2 +S4607,16.9,36.4 +S4608,113.5,275.0 +S4609,97.2,305.4 +S4610,45.1,128.7 +S4611,103.0,224.7 +S4612,86.2,415.8 +S4613,40.0,182.8 +S4614,112.4,379.2 +S4615,9.7,67.5 +S4616,78.7,224.4 +S4617,106.8,301.5 +S4618,27.0,56.0 +S4619,99.0,224.7 +S4620,75.2,151.6 +S4621,70.7,210.7 +S4622,84.5,204.5 +S4623,55.5,95.3 +S4624,70.0,129.0 +S4625,47.1,151.0 +S4626,75.2,216.9 +S4627,31.2,210.9 +S4628,67.8,138.2 +S4629,10.5,5.0 +S4630,75.4,119.9 +S4631,52.3,166.3 +S4632,60.6,117.9 +S4633,39.6,78.2 +S4634,50.5,87.7 +S4635,28.4,103.2 +S4636,82.0,205.0 +S4637,67.5,200.4 +S4638,83.2,224.2 +S4639,77.5,127.3 +S4640,76.5,258.5 +S4641,61.5,51.7 +S4642,98.2,281.8 +S4643,42.9,5.0 +S4644,38.1,115.1 +S4645,113.1,232.5 +S4646,80.0,320.9 +S4647,85.9,244.4 +S4648,41.6,225.2 +S4649,38.7,103.9 +S4650,28.3,145.7 +S4651,44.1,72.9 +S4652,25.5,155.4 +S4653,76.2,98.7 +S4654,76.8,138.9 +S4655,42.8,180.9 +S4656,56.3,106.0 +S4657,20.3,5.0 +S4658,11.0,85.1 +S4659,95.7,276.7 +S4660,13.2,197.8 +S4661,30.4,160.6 +S4662,16.8,100.0 +S4663,104.9,328.6 +S4664,27.9,113.2 +S4665,91.7,301.7 +S4666,55.4,62.9 +S4667,35.5,69.4 +S4668,116.7,397.9 +S4669,19.6,102.0 +S4670,114.7,247.7 +S4671,52.8,123.7 +S4672,97.9,279.1 +S4673,54.6,298.8 +S4674,112.7,318.2 +S4675,99.7,121.3 +S4676,15.1,166.1 +S4677,61.9,270.9 +S4678,49.2,168.3 +S4679,89.3,231.6 +S4680,82.5,242.7 +S4681,109.3,312.6 +S4682,85.2,272.6 +S4683,102.3,415.6 +S4684,81.5,234.3 +S4685,33.2,83.6 +S4686,50.9,41.1 +S4687,68.7,88.0 +S4688,17.7,185.2 +S4689,51.4,164.9 +S4690,72.4,204.5 +S4691,111.5,327.6 +S4692,63.0,220.8 +S4693,42.7,180.5 +S4694,60.1,163.4 +S4695,5.6,95.7 +S4696,32.8,229.7 +S4697,22.8,72.0 +S4698,26.6,103.8 +S4699,57.8,66.6 +S4700,66.8,167.1 +S4701,71.2,224.2 +S4702,105.2,316.6 +S4703,75.6,276.1 +S4704,87.3,204.5 +S4705,44.4,51.7 +S4706,32.1,139.6 +S4707,94.2,201.9 +S4708,81.7,247.9 +S4709,82.5,114.1 +S4710,81.7,192.4 +S4711,49.4,147.2 +S4712,93.2,201.1 +S4713,21.7,169.2 +S4714,99.1,218.5 +S4715,10.4,13.7 +S4716,39.0,224.0 +S4717,105.9,216.0 +S4718,110.9,289.4 +S4719,65.8,62.8 +S4720,74.5,249.1 +S4721,34.8,176.4 +S4722,11.8,23.5 +S4723,90.7,216.2 +S4724,39.1,161.3 +S4725,80.6,139.0 +S4726,95.8,332.4 +S4727,55.1,183.7 +S4728,34.0,38.7 +S4729,83.5,206.4 +S4730,87.7,314.1 +S4731,43.2,91.6 +S4732,74.6,156.1 +S4733,7.5,5.0 +S4734,103.3,333.9 +S4735,28.0,134.0 +S4736,80.7,98.1 +S4737,76.2,212.9 +S4738,22.9,5.0 +S4739,79.6,166.0 +S4740,114.4,294.3 +S4741,46.5,54.3 +S4742,56.9,70.1 +S4743,55.7,261.7 +S4744,116.6,315.5 +S4745,43.9,85.2 +S4746,32.4,182.7 +S4747,14.9,21.2 +S4748,47.6,8.0 +S4749,39.7,111.1 +S4750,88.8,153.5 +S4751,110.5,196.7 +S4752,29.3,5.0 +S4753,13.1,31.1 +S4754,78.1,86.8 +S4755,52.5,224.0 +S4756,29.8,54.8 +S4757,110.4,164.1 +S4758,89.0,143.3 +S4759,33.9,125.2 +S4760,21.9,135.3 +S4761,32.5,163.0 +S4762,117.9,260.3 +S4763,44.4,66.0 +S4764,67.8,152.9 +S4765,33.8,158.9 +S4766,79.1,201.1 +S4767,116.6,281.7 +S4768,73.7,78.2 +S4769,92.1,286.6 +S4770,89.1,244.4 +S4771,67.7,168.5 +S4772,108.4,303.5 +S4773,59.1,185.2 +S4774,58.0,122.5 +S4775,34.2,59.3 +S4776,106.5,231.1 +S4777,53.2,234.0 +S4778,72.1,236.0 +S4779,117.8,230.2 +S4780,103.0,212.4 +S4781,66.5,80.7 +S4782,27.7,52.1 +S4783,62.3,248.1 +S4784,66.2,249.9 +S4785,62.5,348.1 +S4786,114.1,311.1 +S4787,79.9,276.3 +S4788,44.9,175.0 +S4789,45.5,116.7 +S4790,72.4,93.3 +S4791,90.0,124.2 +S4792,29.4,100.7 +S4793,52.7,196.3 +S4794,72.2,188.6 +S4795,53.3,158.7 +S4796,110.0,138.6 +S4797,97.7,273.0 +S4798,55.5,181.8 +S4799,96.5,239.4 +S4800,101.4,312.2 +S4801,85.6,163.5 +S4802,100.5,84.1 +S4803,46.3,109.8 +S4804,63.9,139.0 +S4805,11.8,5.0 +S4806,16.5,216.5 +S4807,47.4,159.0 +S4808,72.3,156.6 +S4809,117.2,426.5 +S4810,16.6,73.4 +S4811,69.3,212.6 +S4812,108.7,356.1 +S4813,95.8,12.6 +S4814,113.6,280.0 +S4815,13.8,7.7 +S4816,20.5,36.2 +S4817,34.3,5.0 +S4818,31.5,154.1 +S4819,26.9,5.0 +S4820,65.8,284.4 +S4821,74.6,226.6 +S4822,19.4,58.5 +S4823,29.6,137.9 +S4824,54.0,129.0 +S4825,36.8,134.6 +S4826,111.7,197.5 +S4827,7.3,5.0 +S4828,106.7,288.2 +S4829,13.2,133.0 +S4830,95.8,207.6 +S4831,10.7,14.6 +S4832,95.4,128.7 +S4833,119.2,276.4 +S4834,17.1,90.7 +S4835,94.4,189.7 +S4836,18.9,144.3 +S4837,6.2,39.2 +S4838,108.0,300.6 +S4839,46.1,212.7 +S4840,45.3,179.3 +S4841,45.9,38.8 +S4842,10.8,83.8 +S4843,118.3,317.9 +S4844,119.4,340.6 +S4845,52.3,147.8 +S4846,114.5,219.8 +S4847,42.2,117.4 +S4848,83.0,368.2 +S4849,42.6,300.0 +S4850,28.1,130.9 +S4851,55.0,199.9 +S4852,113.2,146.0 +S4853,94.1,219.6 +S4854,46.3,96.3 +S4855,14.8,13.0 +S4856,17.3,102.6 +S4857,57.7,86.1 +S4858,115.2,333.8 +S4859,44.5,95.6 +S4860,84.3,266.1 +S4861,117.0,240.9 +S4862,50.8,144.0 +S4863,73.1,223.6 +S4864,63.2,286.1 +S4865,48.4,179.9 +S4866,92.9,256.8 +S4867,98.4,328.2 +S4868,104.5,260.5 +S4869,106.8,238.6 +S4870,38.1,134.8 +S4871,15.8,43.1 +S4872,65.3,53.2 +S4873,12.9,41.1 +S4874,105.2,223.4 +S4875,88.6,323.1 +S4876,118.2,284.9 +S4877,70.6,215.5 +S4878,40.2,178.6 +S4879,5.2,85.3 +S4880,107.9,278.9 +S4881,82.5,237.0 +S4882,27.5,39.7 +S4883,85.6,228.9 +S4884,88.5,292.0 +S4885,94.5,163.7 +S4886,103.3,266.3 +S4887,49.7,261.7 +S4888,63.3,190.9 +S4889,104.1,197.7 +S4890,16.1,63.0 +S4891,76.6,165.8 +S4892,10.7,95.7 +S4893,73.8,381.3 +S4894,86.8,178.8 +S4895,109.3,272.5 +S4896,69.8,261.3 +S4897,46.1,19.5 +S4898,118.2,375.9 +S4899,10.4,5.0 +S4900,47.3,136.5 +S4901,36.5,184.8 +S4902,7.2,5.0 +S4903,34.7,194.0 +S4904,25.8,59.1 +S4905,66.5,220.6 +S4906,110.7,319.9 +S4907,15.6,104.4 +S4908,70.2,68.0 +S4909,101.2,134.1 +S4910,16.0,105.5 +S4911,69.5,269.4 +S4912,35.2,38.1 +S4913,13.3,5.0 +S4914,25.3,112.6 +S4915,105.6,345.1 +S4916,78.9,117.0 +S4917,83.7,162.8 +S4918,96.8,379.8 +S4919,58.0,77.6 +S4920,18.2,124.0 +S4921,110.1,240.5 +S4922,79.8,153.4 +S4923,60.6,126.8 +S4924,74.5,200.3 +S4925,107.8,251.7 +S4926,8.2,5.0 +S4927,92.2,310.9 +S4928,87.3,227.3 +S4929,26.4,16.3 +S4930,91.1,104.9 +S4931,69.1,220.6 +S4932,32.6,103.5 +S4933,28.5,103.0 +S4934,62.2,180.8 +S4935,76.0,128.2 +S4936,50.0,174.4 +S4937,54.6,224.1 +S4938,89.3,249.2 +S4939,116.3,351.5 +S4940,12.7,114.6 +S4941,79.1,137.3 +S4942,63.3,109.4 +S4943,90.5,248.8 +S4944,56.7,174.2 +S4945,54.4,95.0 +S4946,11.8,120.5 +S4947,21.4,115.9 +S4948,33.5,5.0 +S4949,53.8,160.4 +S4950,45.1,5.0 +S4951,21.9,5.0 +S4952,117.7,365.8 +S4953,50.1,251.8 +S4954,117.6,322.7 +S4955,25.2,125.8 +S4956,110.2,224.4 +S4957,37.9,66.2 +S4958,97.3,216.9 +S4959,68.4,95.8 +S4960,94.3,59.7 +S4961,109.0,347.7 +S4962,67.4,153.5 +S4963,95.8,147.8 +S4964,106.9,266.8 +S4965,65.9,212.8 +S4966,20.7,93.6 +S4967,97.5,279.6 +S4968,27.9,99.9 +S4969,61.2,175.0 +S4970,18.4,5.0 +S4971,74.8,157.3 +S4972,107.2,277.7 +S4973,111.1,292.1 +S4974,25.4,36.8 +S4975,56.8,142.5 +S4976,78.2,126.3 +S4977,85.0,147.4 +S4978,6.5,5.0 +S4979,94.2,315.6 +S4980,112.4,275.6 +S4981,61.4,188.6 +S4982,77.7,236.2 +S4983,58.0,211.9 +S4984,103.8,316.9 +S4985,94.3,167.6 +S4986,10.2,197.0 +S4987,16.2,195.7 +S4988,97.4,336.6 +S4989,116.0,324.7 +S4990,89.3,117.6 +S4991,109.0,239.9 +S4992,20.7,95.3 +S4993,102.1,313.9 +S4994,22.7,58.8 +S4995,69.0,175.5 +S4996,108.5,312.3 +S4997,89.4,180.0 +S4998,44.8,256.5 +S4999,53.9,153.7 +S5000,27.7,5.0 diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-renamed/case.json b/agents/evals/fixtures/cases/scatter-basic-pygal-renamed/case.json new file mode 100644 index 00000000000..4988341cf0d --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-renamed/case.json @@ -0,0 +1,25 @@ +{ + "spec_id": "scatter-basic", + "library": "pygal", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "x", + "column": "Werbebudget in Tsd. CHF" + }, + { + "role": "y", + "column": "Umsatz in Tsd. CHF" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "renamed", + "synthetic", + "renamed-headers", + "smoke" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, renamed)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-renamed/data.csv b/agents/evals/fixtures/cases/scatter-basic-pygal-renamed/data.csv new file mode 100644 index 00000000000..a0cf2f9f329 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-renamed/data.csv @@ -0,0 +1,151 @@ +Filiale,Werbebudget in Tsd. CHF,Umsatz in Tsd. CHF +S0001,113.5,277.1 +S0002,46.3,100.9 +S0003,95.3,228.4 +S0004,73.0,210.7 +S0005,38.8,9.2 +S0006,111.1,211.6 +S0007,105.0,169.0 +S0008,46.9,5.0 +S0009,116.9,354.9 +S0010,30.8,206.6 +S0011,97.6,329.5 +S0012,83.3,88.6 +S0013,59.2,192.4 +S0014,8.5,106.1 +S0015,107.9,225.7 +S0016,71.0,246.9 +S0017,49.9,65.0 +S0018,45.8,59.4 +S0019,80.0,148.3 +S0020,44.9,82.6 +S0021,63.4,101.0 +S0022,47.7,208.1 +S0023,11.3,5.0 +S0024,33.8,77.6 +S0025,101.7,207.9 +S0026,99.1,404.2 +S0027,81.7,147.5 +S0028,59.1,197.3 +S0029,116.5,413.5 +S0030,101.6,169.0 +S0031,33.2,50.3 +S0032,70.3,163.8 +S0033,114.9,187.1 +S0034,95.3,326.8 +S0035,47.5,105.7 +S0036,59.0,238.2 +S0037,64.6,213.0 +S0038,108.7,269.5 +S0039,87.1,290.5 +S0040,50.8,125.0 +S0041,58.1,236.4 +S0042,15.6,5.0 +S0043,61.6,116.5 +S0044,31.3,190.8 +S0045,15.7,5.0 +S0046,15.5,105.9 +S0047,29.8,73.5 +S0048,85.4,180.7 +S0049,25.6,44.4 +S0050,70.4,278.1 +S0051,74.3,88.4 +S0052,116.1,342.3 +S0053,57.7,194.6 +S0054,94.1,207.5 +S0055,9.0,52.7 +S0056,79.1,255.7 +S0057,117.7,245.4 +S0058,10.4,5.0 +S0059,109.4,289.4 +S0060,22.9,28.9 +S0061,82.7,184.7 +S0062,7.9,60.3 +S0063,12.1,117.0 +S0064,20.5,210.2 +S0065,108.7,292.1 +S0066,95.0,247.6 +S0067,81.1,267.7 +S0068,79.7,227.3 +S0069,38.8,5.0 +S0070,65.7,135.8 +S0071,60.4,80.1 +S0072,114.4,329.0 +S0073,57.2,249.3 +S0074,90.9,255.8 +S0075,46.2,64.9 +S0076,111.4,330.1 +S0077,103.0,188.9 +S0078,119.1,307.8 +S0079,31.1,21.3 +S0080,105.1,163.6 +S0081,59.9,67.4 +S0082,63.6,174.7 +S0083,67.3,135.0 +S0084,15.6,103.2 +S0085,106.3,172.3 +S0086,74.5,230.8 +S0087,17.1,32.6 +S0088,90.0,316.7 +S0089,18.0,149.3 +S0090,48.8,127.4 +S0091,82.0,219.8 +S0092,58.5,179.9 +S0093,12.5,98.7 +S0094,76.6,181.6 +S0095,47.2,215.8 +S0096,48.9,107.0 +S0097,23.7,5.0 +S0098,26.1,112.2 +S0099,119.2,282.7 +S0100,74.5,254.7 +S0101,72.6,234.1 +S0102,94.8,248.2 +S0103,49.1,150.6 +S0104,22.7,96.6 +S0105,74.8,151.0 +S0106,51.6,63.0 +S0107,51.4,90.5 +S0108,15.1,65.3 +S0109,53.4,5.0 +S0110,11.0,32.5 +S0111,108.7,199.6 +S0112,48.1,134.9 +S0113,87.3,166.3 +S0114,72.7,196.9 +S0115,55.6,140.8 +S0116,43.9,223.0 +S0117,8.7,34.2 +S0118,80.3,191.5 +S0119,16.4,76.3 +S0120,32.0,5.0 +S0121,115.3,207.0 +S0122,48.2,241.8 +S0123,46.7,174.2 +S0124,84.3,223.0 +S0125,36.0,191.4 +S0126,47.3,126.8 +S0127,40.4,107.3 +S0128,85.0,197.2 +S0129,13.9,5.0 +S0130,48.8,208.2 +S0131,119.7,278.1 +S0132,78.7,198.7 +S0133,59.6,141.9 +S0134,38.3,75.9 +S0135,7.6,5.0 +S0136,109.6,280.7 +S0137,110.9,425.5 +S0138,117.5,356.0 +S0139,60.1,146.1 +S0140,73.2,129.1 +S0141,38.2,122.1 +S0142,100.3,276.5 +S0143,72.0,182.8 +S0144,39.1,180.5 +S0145,38.9,55.0 +S0146,46.0,211.3 +S0147,82.1,223.3 +S0148,93.5,197.9 +S0149,16.9,55.7 +S0150,111.8,299.1 diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-x10/case.json b/agents/evals/fixtures/cases/scatter-basic-pygal-x10/case.json new file mode 100644 index 00000000000..76e3091c35e --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "scatter-basic", + "library": "pygal", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "x", + "column": "Ad Spend (kCHF)" + }, + { + "role": "y", + "column": "Revenue (kCHF)" + } + ], + "expected": "accepted", + "tags": [ + "scatter", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 101, x10)" +} diff --git a/agents/evals/fixtures/cases/scatter-basic-pygal-x10/data.csv b/agents/evals/fixtures/cases/scatter-basic-pygal-x10/data.csv new file mode 100644 index 00000000000..069cc23cad1 --- /dev/null +++ b/agents/evals/fixtures/cases/scatter-basic-pygal-x10/data.csv @@ -0,0 +1,151 @@ +Store,Ad Spend (kCHF),Revenue (kCHF) +S0001,1135.1,2770.7 +S0002,463.3,1009.4 +S0003,952.5,2284.1 +S0004,730.0,2107.0 +S0005,388.5,91.6 +S0006,1111.1,2115.7 +S0007,1049.7,1689.9 +S0008,468.8,50.0 +S0009,1169.2,3548.7 +S0010,308.2,2066.1 +S0011,976.3,3294.7 +S0012,833.0,885.5 +S0013,591.7,1924.0 +S0014,85.4,1060.6 +S0015,1079.0,2257.1 +S0016,709.7,2469.3 +S0017,498.9,649.9 +S0018,457.9,593.6 +S0019,799.8,1483.2 +S0020,449.1,826.5 +S0021,633.7,1010.0 +S0022,476.6,2081.4 +S0023,113.5,50.0 +S0024,338.0,775.7 +S0025,1017.1,2079.3 +S0026,990.9,4041.5 +S0027,817.4,1474.7 +S0028,591.2,1973.3 +S0029,1165.3,4135.3 +S0030,1016.3,1690.1 +S0031,331.8,503.1 +S0032,702.7,1637.9 +S0033,1149.3,1870.6 +S0034,953.5,3267.8 +S0035,474.8,1057.1 +S0036,590.4,2382.1 +S0037,645.5,2129.6 +S0038,1087.2,2695.4 +S0039,871.4,2905.2 +S0040,507.9,1249.6 +S0041,581.3,2363.6 +S0042,156.2,50.0 +S0043,615.8,1165.1 +S0044,313.4,1907.8 +S0045,157.1,50.0 +S0046,155.0,1058.9 +S0047,298.2,734.5 +S0048,854.0,1806.7 +S0049,256.1,444.2 +S0050,703.6,2781.2 +S0051,743.0,883.8 +S0052,1161.2,3423.2 +S0053,576.9,1945.6 +S0054,940.7,2074.7 +S0055,90.1,527.2 +S0056,791.3,2556.6 +S0057,1177.3,2453.9 +S0058,104.5,50.0 +S0059,1093.8,2894.4 +S0060,229.1,288.5 +S0061,826.5,1846.6 +S0062,79.1,602.8 +S0063,120.7,1169.5 +S0064,204.9,2102.0 +S0065,1086.5,2921.5 +S0066,950.3,2476.3 +S0067,811.1,2676.9 +S0068,796.9,2273.5 +S0069,387.8,50.0 +S0070,657.3,1358.4 +S0071,604.1,800.9 +S0072,1143.8,3289.6 +S0073,572.3,2493.3 +S0074,909.0,2558.2 +S0075,462.5,649.1 +S0076,1114.2,3300.7 +S0077,1030.2,1889.0 +S0078,1190.7,3077.7 +S0079,311.1,213.4 +S0080,1050.9,1636.0 +S0081,598.5,673.8 +S0082,635.8,1747.3 +S0083,673.1,1350.1 +S0084,155.6,1032.3 +S0085,1063.2,1723.3 +S0086,745.1,2307.8 +S0087,171.1,325.9 +S0088,899.9,3166.6 +S0089,180.5,1492.8 +S0090,488.4,1274.3 +S0091,820.0,2197.7 +S0092,585.1,1799.1 +S0093,124.7,986.5 +S0094,765.6,1815.8 +S0095,471.7,2157.6 +S0096,488.5,1070.0 +S0097,237.4,50.0 +S0098,261.5,1121.6 +S0099,1192.1,2827.4 +S0100,745.1,2547.4 +S0101,725.5,2340.8 +S0102,948.1,2481.7 +S0103,491.1,1506.3 +S0104,227.3,966.0 +S0105,748.2,1509.8 +S0106,515.6,630.5 +S0107,514.0,904.7 +S0108,151.0,653.2 +S0109,534.0,50.0 +S0110,109.7,325.4 +S0111,1087.3,1995.9 +S0112,481.1,1348.5 +S0113,872.6,1663.1 +S0114,726.6,1969.4 +S0115,556.2,1408.2 +S0116,439.2,2229.6 +S0117,86.7,341.9 +S0118,802.8,1915.4 +S0119,164.4,763.2 +S0120,320.0,50.0 +S0121,1152.7,2070.2 +S0122,482.2,2418.0 +S0123,466.9,1742.0 +S0124,843.4,2230.1 +S0125,360.2,1913.5 +S0126,473.4,1268.0 +S0127,403.6,1073.2 +S0128,849.6,1972.3 +S0129,138.9,50.0 +S0130,488.0,2082.3 +S0131,1196.9,2781.0 +S0132,787.1,1987.0 +S0133,596.4,1418.5 +S0134,382.6,758.9 +S0135,76.1,50.0 +S0136,1095.9,2807.2 +S0137,1108.9,4255.5 +S0138,1175.3,3559.8 +S0139,601.4,1461.2 +S0140,732.3,1290.5 +S0141,382.3,1220.9 +S0142,1002.7,2765.2 +S0143,720.1,1827.9 +S0144,391.2,1805.3 +S0145,389.3,550.4 +S0146,459.7,2112.7 +S0147,821.3,2233.3 +S0148,935.0,1979.1 +S0149,169.3,556.9 +S0150,1118.2,2991.4 diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-date/case.json b/agents/evals/fixtures/cases/violin-basic-letsplot-date/case.json new file mode 100644 index 00000000000..a0c6b9c4900 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "violin-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "category", + "column": "Customer Segment" + }, + { + "role": "value", + "column": "Basket Value (EUR)" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, date)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-date/data.csv b/agents/evals/fixtures/cases/violin-basic-letsplot-date/data.csv new file mode 100644 index 00000000000..0f22af43f20 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-date/data.csv @@ -0,0 +1,401 @@ +Customer Segment,Basket Value (EUR),Purchase Date,Synced On +Students,14.07,26.06.2026,2026-06-26 +Families,98.65,05.04.2026,2026-04-06 +Retirees,63.77,08.03.2026,2026-03-08 +Professionals,54.23,02.05.2026,2026-05-02 +Students,7.03,08.01.2026,2026-01-09 +Families,89.88,25.02.2026,2026-03-01 +Retirees,34.77,30.05.2026,2026-06-01 +Professionals,50.78,17.04.2026,2026-04-18 +Students,17.69,09.04.2026,2026-04-12 +Families,134.75,31.05.2026,2026-06-03 +Retirees,30.60,27.02.2026,2026-03-03 +Professionals,62.20,05.04.2026,2026-04-06 +Students,14.92,19.05.2026,2026-05-21 +Families,115.29,03.05.2026,2026-05-05 +Retirees,21.91,13.04.2026,2026-04-13 +Professionals,67.09,08.06.2026,2026-06-09 +Students,19.17,12.06.2026,2026-06-14 +Families,110.73,11.04.2026,2026-04-11 +Retirees,28.02,14.06.2026,2026-06-15 +Professionals,54.26,27.01.2026,2026-01-31 +Students,21.51,11.01.2026,2026-01-15 +Families,79.17,26.01.2026,2026-01-30 +Retirees,39.53,05.05.2026,2026-05-06 +Professionals,43.37,04.05.2026,2026-05-07 +Students,10.80,05.03.2026,2026-03-09 +Families,49.56,01.07.2026,2026-07-02 +Retirees,76.84,11.05.2026,2026-05-11 +Professionals,74.95,19.04.2026,2026-04-19 +Students,14.05,15.01.2026,2026-01-17 +Families,46.72,07.06.2026,2026-06-08 +Retirees,49.78,02.05.2026,2026-05-03 +Professionals,41.90,12.06.2026,2026-06-13 +Students,27.46,26.06.2026,2026-06-27 +Families,76.29,22.02.2026,2026-02-24 +Retirees,80.98,13.01.2026,2026-01-16 +Professionals,68.49,20.01.2026,2026-01-22 +Students,23.83,20.03.2026,2026-03-20 +Families,56.71,13.03.2026,2026-03-17 +Retirees,64.30,22.03.2026,2026-03-22 +Professionals,97.86,12.01.2026,2026-01-14 +Students,32.82,20.03.2026,2026-03-24 +Families,70.32,09.05.2026,2026-05-09 +Retirees,80.67,17.06.2026,2026-06-20 +Professionals,35.59,16.06.2026,2026-06-19 +Students,19.89,24.04.2026,2026-04-26 +Families,76.06,21.05.2026,2026-05-24 +Retirees,72.90,13.01.2026,2026-01-13 +Professionals,70.40,20.01.2026,2026-01-23 +Students,14.21,07.01.2026,2026-01-07 +Families,81.29,06.05.2026,2026-05-07 +Retirees,25.11,27.05.2026,2026-05-27 +Professionals,51.93,07.01.2026,2026-01-07 +Students,18.37,17.06.2026,2026-06-21 +Families,85.01,02.05.2026,2026-05-05 +Retirees,40.22,06.04.2026,2026-04-10 +Professionals,44.24,23.01.2026,2026-01-23 +Students,17.86,30.01.2026,2026-02-03 +Families,93.67,27.03.2026,2026-03-27 +Retirees,43.56,31.05.2026,2026-06-01 +Professionals,91.76,17.01.2026,2026-01-18 +Students,33.28,12.04.2026,2026-04-12 +Families,102.97,13.02.2026,2026-02-13 +Retirees,41.06,20.01.2026,2026-01-23 +Professionals,100.33,09.03.2026,2026-03-10 +Students,33.28,19.06.2026,2026-06-19 +Families,79.74,02.02.2026,2026-02-05 +Retirees,62.88,14.04.2026,2026-04-14 +Professionals,27.55,20.04.2026,2026-04-20 +Students,41.19,28.03.2026,2026-03-29 +Families,107.49,12.01.2026,2026-01-14 +Retirees,31.48,27.02.2026,2026-02-27 +Professionals,121.52,02.06.2026,2026-06-06 +Students,14.52,20.06.2026,2026-06-24 +Families,73.63,23.06.2026,2026-06-25 +Retirees,71.69,03.05.2026,2026-05-03 +Professionals,46.11,03.02.2026,2026-02-06 +Students,28.97,23.03.2026,2026-03-27 +Families,105.38,01.05.2026,2026-05-04 +Retirees,66.12,16.04.2026,2026-04-18 +Professionals,41.76,06.03.2026,2026-03-09 +Students,24.41,09.06.2026,2026-06-11 +Families,106.45,10.06.2026,2026-06-12 +Retirees,32.50,05.06.2026,2026-06-07 +Professionals,22.59,18.04.2026,2026-04-19 +Students,22.51,28.06.2026,2026-06-30 +Families,89.34,14.06.2026,2026-06-15 +Retirees,84.89,24.01.2026,2026-01-24 +Professionals,39.16,21.06.2026,2026-06-22 +Students,34.24,19.04.2026,2026-04-20 +Families,100.71,20.03.2026,2026-03-24 +Retirees,37.17,19.03.2026,2026-03-19 +Professionals,24.74,11.02.2026,2026-02-12 +Students,16.87,09.02.2026,2026-02-10 +Families,82.53,18.04.2026,2026-04-19 +Retirees,23.43,29.03.2026,2026-03-29 +Professionals,31.85,07.03.2026,2026-03-09 +Students,24.66,21.02.2026,2026-02-23 +Families,94.35,13.04.2026,2026-04-15 +Retirees,78.00,18.05.2026,2026-05-20 +Professionals,152.39,09.03.2026,2026-03-10 +Students,21.58,04.02.2026,2026-02-04 +Families,109.73,22.05.2026,2026-05-24 +Retirees,77.38,22.01.2026,2026-01-23 +Professionals,68.12,12.04.2026,2026-04-12 +Students,23.87,27.01.2026,2026-01-27 +Families,99.19,28.01.2026,2026-01-31 +Retirees,32.37,23.04.2026,2026-04-23 +Professionals,40.72,19.03.2026,2026-03-22 +Students,16.47,30.04.2026,2026-05-04 +Families,88.25,26.03.2026,2026-03-26 +Retirees,15.73,16.03.2026,2026-03-16 +Professionals,58.83,12.02.2026,2026-02-15 +Students,52.98,17.05.2026,2026-05-20 +Families,89.35,28.06.2026,2026-06-29 +Retirees,28.87,06.05.2026,2026-05-09 +Professionals,61.93,03.02.2026,2026-02-07 +Students,19.83,17.06.2026,2026-06-18 +Families,93.21,19.04.2026,2026-04-20 +Retirees,30.55,07.02.2026,2026-02-11 +Professionals,37.59,23.04.2026,2026-04-24 +Students,36.60,07.06.2026,2026-06-10 +Families,67.98,23.05.2026,2026-05-23 +Retirees,35.47,18.02.2026,2026-02-18 +Professionals,42.28,29.03.2026,2026-03-30 +Students,36.05,09.02.2026,2026-02-13 +Families,78.23,29.01.2026,2026-01-30 +Retirees,58.26,16.04.2026,2026-04-17 +Professionals,45.58,19.05.2026,2026-05-21 +Students,35.68,11.01.2026,2026-01-15 +Families,113.11,08.05.2026,2026-05-12 +Retirees,35.93,12.06.2026,2026-06-14 +Professionals,44.83,22.06.2026,2026-06-26 +Students,14.89,27.03.2026,2026-03-31 +Families,92.40,03.05.2026,2026-05-05 +Retirees,81.76,20.02.2026,2026-02-21 +Professionals,37.09,07.04.2026,2026-04-08 +Students,33.40,28.03.2026,2026-03-28 +Families,61.53,11.02.2026,2026-02-13 +Retirees,35.59,13.06.2026,2026-06-13 +Professionals,60.61,24.06.2026,2026-06-25 +Students,16.87,19.06.2026,2026-06-21 +Families,102.93,13.05.2026,2026-05-14 +Retirees,87.60,14.06.2026,2026-06-15 +Professionals,92.86,24.06.2026,2026-06-28 +Students,21.85,28.04.2026,2026-04-29 +Families,77.35,08.05.2026,2026-05-10 +Retirees,33.76,10.04.2026,2026-04-11 +Professionals,92.10,16.01.2026,2026-01-18 +Students,22.59,05.01.2026,2026-01-06 +Families,73.61,17.04.2026,2026-04-20 +Retirees,32.53,01.03.2026,2026-03-01 +Professionals,35.00,21.06.2026,2026-06-23 +Students,29.83,02.03.2026,2026-03-06 +Families,83.79,20.04.2026,2026-04-20 +Retirees,79.26,12.04.2026,2026-04-16 +Professionals,21.34,11.02.2026,2026-02-12 +Students,23.59,17.06.2026,2026-06-17 +Families,112.80,28.02.2026,2026-03-04 +Retirees,75.69,25.02.2026,2026-02-28 +Professionals,34.25,05.01.2026,2026-01-09 +Students,43.61,31.03.2026,2026-03-31 +Families,96.90,29.03.2026,2026-03-29 +Retirees,36.36,04.06.2026,2026-06-05 +Professionals,33.52,22.05.2026,2026-05-24 +Students,20.37,08.05.2026,2026-05-12 +Families,83.75,05.04.2026,2026-04-09 +Retirees,66.22,25.03.2026,2026-03-27 +Professionals,35.49,18.02.2026,2026-02-19 +Students,20.87,14.05.2026,2026-05-18 +Families,99.93,12.06.2026,2026-06-15 +Retirees,43.49,10.05.2026,2026-05-12 +Professionals,40.22,12.04.2026,2026-04-13 +Students,14.19,28.03.2026,2026-03-30 +Families,86.40,23.03.2026,2026-03-27 +Retirees,87.92,04.06.2026,2026-06-05 +Professionals,104.52,09.04.2026,2026-04-12 +Students,33.49,17.04.2026,2026-04-20 +Families,91.78,10.02.2026,2026-02-10 +Retirees,33.64,17.01.2026,2026-01-21 +Professionals,68.52,30.01.2026,2026-02-02 +Students,22.35,29.05.2026,2026-05-30 +Families,64.32,08.05.2026,2026-05-08 +Retirees,34.77,26.03.2026,2026-03-29 +Professionals,59.34,28.03.2026,2026-03-29 +Students,24.31,22.04.2026,2026-04-24 +Families,85.21,10.04.2026,2026-04-12 +Retirees,71.52,11.01.2026,2026-01-11 +Professionals,50.91,19.03.2026,2026-03-21 +Students,17.60,11.06.2026,2026-06-14 +Families,82.48,08.03.2026,2026-03-10 +Retirees,64.85,13.02.2026,2026-02-17 +Professionals,58.28,08.03.2026,2026-03-08 +Students,22.13,17.04.2026,2026-04-18 +Families,96.84,28.05.2026,2026-05-31 +Retirees,72.02,22.02.2026,2026-02-22 +Professionals,57.37,04.06.2026,2026-06-08 +Students,32.78,21.03.2026,2026-03-23 +Families,91.75,16.06.2026,2026-06-16 +Retirees,34.03,28.03.2026,2026-04-01 +Professionals,42.43,06.06.2026,2026-06-09 +Students,31.11,04.06.2026,2026-06-08 +Families,119.85,07.02.2026,2026-02-07 +Retirees,22.88,16.05.2026,2026-05-17 +Professionals,59.60,30.03.2026,2026-03-31 +Students,12.00,05.01.2026,2026-01-05 +Families,70.55,19.06.2026,2026-06-23 +Retirees,60.50,27.01.2026,2026-01-31 +Professionals,31.89,19.02.2026,2026-02-20 +Students,41.34,24.06.2026,2026-06-27 +Families,78.24,26.02.2026,2026-03-01 +Retirees,41.48,26.06.2026,2026-06-27 +Professionals,30.75,30.04.2026,2026-04-30 +Students,12.81,16.05.2026,2026-05-19 +Families,77.10,14.03.2026,2026-03-14 +Retirees,32.53,17.01.2026,2026-01-17 +Professionals,134.60,31.03.2026,2026-04-03 +Students,14.69,13.01.2026,2026-01-17 +Families,88.97,24.06.2026,2026-06-27 +Retirees,61.03,18.02.2026,2026-02-22 +Professionals,30.28,01.02.2026,2026-02-05 +Students,23.28,29.01.2026,2026-01-30 +Families,75.89,29.05.2026,2026-05-30 +Retirees,31.14,15.01.2026,2026-01-16 +Professionals,42.42,20.06.2026,2026-06-20 +Students,26.10,18.01.2026,2026-01-18 +Families,82.91,22.02.2026,2026-02-24 +Retirees,41.48,17.01.2026,2026-01-19 +Professionals,33.35,23.04.2026,2026-04-25 +Students,9.96,11.01.2026,2026-01-13 +Families,103.82,03.03.2026,2026-03-07 +Retirees,71.73,24.03.2026,2026-03-26 +Professionals,85.63,02.03.2026,2026-03-06 +Students,35.51,17.02.2026,2026-02-21 +Families,78.14,18.01.2026,2026-01-21 +Retirees,62.85,24.06.2026,2026-06-24 +Professionals,52.55,16.04.2026,2026-04-16 +Students,53.34,20.05.2026,2026-05-20 +Families,75.90,17.06.2026,2026-06-18 +Retirees,38.24,24.06.2026,2026-06-24 +Professionals,75.53,19.02.2026,2026-02-23 +Students,23.10,08.05.2026,2026-05-09 +Families,81.99,31.01.2026,2026-01-31 +Retirees,69.59,30.04.2026,2026-05-01 +Professionals,73.99,04.04.2026,2026-04-05 +Students,34.39,27.01.2026,2026-01-31 +Families,77.69,23.06.2026,2026-06-27 +Retirees,69.91,16.01.2026,2026-01-19 +Professionals,71.06,01.04.2026,2026-04-04 +Students,32.25,18.04.2026,2026-04-18 +Families,65.71,17.04.2026,2026-04-19 +Retirees,57.54,15.06.2026,2026-06-18 +Professionals,37.26,22.06.2026,2026-06-24 +Students,20.66,14.05.2026,2026-05-17 +Families,70.86,11.06.2026,2026-06-15 +Retirees,64.51,06.06.2026,2026-06-08 +Professionals,159.68,20.02.2026,2026-02-23 +Students,34.78,21.03.2026,2026-03-25 +Families,100.48,18.01.2026,2026-01-21 +Retirees,75.07,26.04.2026,2026-04-26 +Professionals,31.08,28.06.2026,2026-07-01 +Students,14.78,19.01.2026,2026-01-20 +Families,95.59,13.06.2026,2026-06-14 +Retirees,71.47,14.03.2026,2026-03-15 +Professionals,54.85,29.06.2026,2026-07-02 +Students,4.32,27.03.2026,2026-03-31 +Families,70.61,13.05.2026,2026-05-17 +Retirees,74.01,23.02.2026,2026-02-27 +Professionals,20.50,20.02.2026,2026-02-23 +Students,42.51,04.06.2026,2026-06-04 +Families,75.42,03.03.2026,2026-03-07 +Retirees,32.80,24.05.2026,2026-05-28 +Professionals,81.24,16.03.2026,2026-03-19 +Students,23.32,28.02.2026,2026-03-01 +Families,61.32,18.02.2026,2026-02-18 +Retirees,19.58,18.04.2026,2026-04-19 +Professionals,33.11,10.02.2026,2026-02-14 +Students,57.91,28.01.2026,2026-02-01 +Families,93.61,30.05.2026,2026-06-03 +Retirees,94.53,25.01.2026,2026-01-27 +Professionals,43.36,31.01.2026,2026-02-03 +Students,14.60,09.04.2026,2026-04-13 +Families,71.45,26.04.2026,2026-04-29 +Retirees,41.11,13.02.2026,2026-02-15 +Professionals,60.85,10.05.2026,2026-05-14 +Students,14.60,01.06.2026,2026-06-04 +Families,84.60,11.06.2026,2026-06-12 +Retirees,85.70,11.01.2026,2026-01-11 +Professionals,77.59,25.05.2026,2026-05-27 +Students,13.23,21.01.2026,2026-01-22 +Families,89.29,12.06.2026,2026-06-14 +Retirees,77.35,20.01.2026,2026-01-24 +Professionals,53.24,26.04.2026,2026-04-29 +Students,16.74,30.06.2026,2026-06-30 +Families,59.05,19.02.2026,2026-02-19 +Retirees,27.50,24.02.2026,2026-02-25 +Professionals,70.45,26.05.2026,2026-05-27 +Students,21.61,23.05.2026,2026-05-24 +Families,100.58,27.01.2026,2026-01-29 +Retirees,71.62,09.01.2026,2026-01-12 +Professionals,79.96,04.04.2026,2026-04-08 +Students,29.96,07.03.2026,2026-03-11 +Families,106.74,08.01.2026,2026-01-12 +Retirees,39.18,24.04.2026,2026-04-24 +Professionals,90.13,14.05.2026,2026-05-16 +Students,37.92,19.01.2026,2026-01-21 +Families,95.36,25.02.2026,2026-02-25 +Retirees,62.76,18.01.2026,2026-01-20 +Professionals,75.71,10.03.2026,2026-03-10 +Students,16.92,10.02.2026,2026-02-12 +Families,83.62,11.03.2026,2026-03-13 +Retirees,83.22,28.04.2026,2026-04-28 +Professionals,65.27,19.04.2026,2026-04-22 +Students,31.29,27.03.2026,2026-03-28 +Families,106.47,02.03.2026,2026-03-04 +Retirees,29.12,01.02.2026,2026-02-01 +Professionals,31.34,05.05.2026,2026-05-08 +Students,19.09,19.05.2026,2026-05-23 +Families,106.04,08.04.2026,2026-04-09 +Retirees,38.32,02.03.2026,2026-03-04 +Professionals,60.85,01.06.2026,2026-06-04 +Students,35.39,28.03.2026,2026-03-30 +Families,105.89,11.02.2026,2026-02-15 +Retirees,37.83,08.03.2026,2026-03-08 +Professionals,22.69,01.07.2026,2026-07-03 +Students,35.81,26.03.2026,2026-03-26 +Families,88.24,06.05.2026,2026-05-09 +Retirees,38.00,15.03.2026,2026-03-17 +Professionals,35.94,12.06.2026,2026-06-16 +Students,15.70,15.02.2026,2026-02-18 +Families,73.16,02.02.2026,2026-02-02 +Retirees,69.72,12.02.2026,2026-02-15 +Professionals,38.93,31.01.2026,2026-02-03 +Students,14.32,07.04.2026,2026-04-09 +Families,83.62,11.02.2026,2026-02-15 +Retirees,42.96,30.04.2026,2026-05-04 +Professionals,76.75,24.04.2026,2026-04-25 +Students,9.38,10.04.2026,2026-04-14 +Families,61.61,05.05.2026,2026-05-06 +Retirees,80.80,13.02.2026,2026-02-17 +Professionals,52.17,01.06.2026,2026-06-03 +Students,27.20,27.02.2026,2026-03-02 +Families,108.44,09.05.2026,2026-05-10 +Retirees,40.82,07.02.2026,2026-02-11 +Professionals,140.54,20.02.2026,2026-02-22 +Students,17.99,15.05.2026,2026-05-19 +Families,86.15,31.05.2026,2026-06-01 +Retirees,32.49,06.01.2026,2026-01-08 +Professionals,41.02,02.07.2026,2026-07-03 +Students,42.45,29.01.2026,2026-01-29 +Families,73.40,23.06.2026,2026-06-23 +Retirees,26.13,06.02.2026,2026-02-09 +Professionals,75.92,29.06.2026,2026-07-02 +Students,15.44,13.02.2026,2026-02-16 +Families,93.99,08.05.2026,2026-05-11 +Retirees,29.36,27.04.2026,2026-04-30 +Professionals,107.85,09.01.2026,2026-01-12 +Students,23.13,04.02.2026,2026-02-08 +Families,101.09,27.03.2026,2026-03-27 +Retirees,47.31,03.06.2026,2026-06-05 +Professionals,47.67,19.04.2026,2026-04-22 +Students,10.26,01.04.2026,2026-04-05 +Families,130.57,25.01.2026,2026-01-26 +Retirees,54.57,12.05.2026,2026-05-13 +Professionals,28.86,20.04.2026,2026-04-20 +Students,13.84,26.06.2026,2026-06-27 +Families,76.21,09.03.2026,2026-03-11 +Retirees,69.06,02.07.2026,2026-07-06 +Professionals,36.92,18.01.2026,2026-01-20 +Students,23.10,07.06.2026,2026-06-10 +Families,98.27,18.01.2026,2026-01-21 +Retirees,35.71,19.01.2026,2026-01-21 +Professionals,29.50,25.03.2026,2026-03-29 +Students,31.28,14.03.2026,2026-03-18 +Families,100.72,14.03.2026,2026-03-16 +Retirees,65.58,25.06.2026,2026-06-25 +Professionals,39.39,12.06.2026,2026-06-12 +Students,11.18,27.03.2026,2026-03-28 +Families,126.08,01.03.2026,2026-03-05 +Retirees,71.56,20.04.2026,2026-04-20 +Professionals,31.64,09.03.2026,2026-03-12 +Students,31.11,09.01.2026,2026-01-13 +Families,96.31,28.05.2026,2026-05-28 +Retirees,74.67,04.03.2026,2026-03-05 +Professionals,29.91,01.04.2026,2026-04-03 +Students,28.16,05.01.2026,2026-01-06 +Families,104.00,14.03.2026,2026-03-18 +Retirees,24.53,28.05.2026,2026-05-31 +Professionals,53.33,06.05.2026,2026-05-07 +Students,35.20,21.05.2026,2026-05-21 +Families,65.06,24.03.2026,2026-03-26 +Retirees,13.32,01.05.2026,2026-05-04 +Professionals,59.25,21.06.2026,2026-06-23 +Students,43.60,08.03.2026,2026-03-09 +Families,71.94,07.02.2026,2026-02-11 +Retirees,25.58,15.05.2026,2026-05-15 +Professionals,72.96,09.03.2026,2026-03-09 +Students,13.80,28.05.2026,2026-05-31 +Families,119.24,14.04.2026,2026-04-14 +Retirees,72.04,10.06.2026,2026-06-14 +Professionals,36.08,17.04.2026,2026-04-21 diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-decimal-comma/case.json b/agents/evals/fixtures/cases/violin-basic-letsplot-decimal-comma/case.json new file mode 100644 index 00000000000..2d02ed248b7 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "violin-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "category", + "column": "Customer Segment" + }, + { + "role": "value", + "column": "Basket Value (EUR)" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-decimal-comma/data.csv b/agents/evals/fixtures/cases/violin-basic-letsplot-decimal-comma/data.csv new file mode 100644 index 00000000000..356b2725bac --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-decimal-comma/data.csv @@ -0,0 +1,401 @@ +Customer Segment;Basket Value (EUR) +Students;14,07 +Families;98,65 +Retirees;63,77 +Professionals;54,23 +Students;7,03 +Families;89,88 +Retirees;34,77 +Professionals;50,78 +Students;17,69 +Families;134,75 +Retirees;30,60 +Professionals;62,20 +Students;14,92 +Families;115,29 +Retirees;21,91 +Professionals;67,09 +Students;19,17 +Families;110,73 +Retirees;28,02 +Professionals;54,26 +Students;21,51 +Families;79,17 +Retirees;39,53 +Professionals;43,37 +Students;10,80 +Families;49,56 +Retirees;76,84 +Professionals;74,95 +Students;14,05 +Families;46,72 +Retirees;49,78 +Professionals;41,90 +Students;27,46 +Families;76,29 +Retirees;80,98 +Professionals;68,49 +Students;23,83 +Families;56,71 +Retirees;64,30 +Professionals;97,86 +Students;32,82 +Families;70,32 +Retirees;80,67 +Professionals;35,59 +Students;19,89 +Families;76,06 +Retirees;72,90 +Professionals;70,40 +Students;14,21 +Families;81,29 +Retirees;25,11 +Professionals;51,93 +Students;18,37 +Families;85,01 +Retirees;40,22 +Professionals;44,24 +Students;17,86 +Families;93,67 +Retirees;43,56 +Professionals;91,76 +Students;33,28 +Families;102,97 +Retirees;41,06 +Professionals;100,33 +Students;33,28 +Families;79,74 +Retirees;62,88 +Professionals;27,55 +Students;41,19 +Families;107,49 +Retirees;31,48 +Professionals;121,52 +Students;14,52 +Families;73,63 +Retirees;71,69 +Professionals;46,11 +Students;28,97 +Families;105,38 +Retirees;66,12 +Professionals;41,76 +Students;24,41 +Families;106,45 +Retirees;32,50 +Professionals;22,59 +Students;22,51 +Families;89,34 +Retirees;84,89 +Professionals;39,16 +Students;34,24 +Families;100,71 +Retirees;37,17 +Professionals;24,74 +Students;16,87 +Families;82,53 +Retirees;23,43 +Professionals;31,85 +Students;24,66 +Families;94,35 +Retirees;78,00 +Professionals;152,39 +Students;21,58 +Families;109,73 +Retirees;77,38 +Professionals;68,12 +Students;23,87 +Families;99,19 +Retirees;32,37 +Professionals;40,72 +Students;16,47 +Families;88,25 +Retirees;15,73 +Professionals;58,83 +Students;52,98 +Families;89,35 +Retirees;28,87 +Professionals;61,93 +Students;19,83 +Families;93,21 +Retirees;30,55 +Professionals;37,59 +Students;36,60 +Families;67,98 +Retirees;35,47 +Professionals;42,28 +Students;36,05 +Families;78,23 +Retirees;58,26 +Professionals;45,58 +Students;35,68 +Families;113,11 +Retirees;35,93 +Professionals;44,83 +Students;14,89 +Families;92,40 +Retirees;81,76 +Professionals;37,09 +Students;33,40 +Families;61,53 +Retirees;35,59 +Professionals;60,61 +Students;16,87 +Families;102,93 +Retirees;87,60 +Professionals;92,86 +Students;21,85 +Families;77,35 +Retirees;33,76 +Professionals;92,10 +Students;22,59 +Families;73,61 +Retirees;32,53 +Professionals;35,00 +Students;29,83 +Families;83,79 +Retirees;79,26 +Professionals;21,34 +Students;23,59 +Families;112,80 +Retirees;75,69 +Professionals;34,25 +Students;43,61 +Families;96,90 +Retirees;36,36 +Professionals;33,52 +Students;20,37 +Families;83,75 +Retirees;66,22 +Professionals;35,49 +Students;20,87 +Families;99,93 +Retirees;43,49 +Professionals;40,22 +Students;14,19 +Families;86,40 +Retirees;87,92 +Professionals;104,52 +Students;33,49 +Families;91,78 +Retirees;33,64 +Professionals;68,52 +Students;22,35 +Families;64,32 +Retirees;34,77 +Professionals;59,34 +Students;24,31 +Families;85,21 +Retirees;71,52 +Professionals;50,91 +Students;17,60 +Families;82,48 +Retirees;64,85 +Professionals;58,28 +Students;22,13 +Families;96,84 +Retirees;72,02 +Professionals;57,37 +Students;32,78 +Families;91,75 +Retirees;34,03 +Professionals;42,43 +Students;31,11 +Families;119,85 +Retirees;22,88 +Professionals;59,60 +Students;12,00 +Families;70,55 +Retirees;60,50 +Professionals;31,89 +Students;41,34 +Families;78,24 +Retirees;41,48 +Professionals;30,75 +Students;12,81 +Families;77,10 +Retirees;32,53 +Professionals;134,60 +Students;14,69 +Families;88,97 +Retirees;61,03 +Professionals;30,28 +Students;23,28 +Families;75,89 +Retirees;31,14 +Professionals;42,42 +Students;26,10 +Families;82,91 +Retirees;41,48 +Professionals;33,35 +Students;9,96 +Families;103,82 +Retirees;71,73 +Professionals;85,63 +Students;35,51 +Families;78,14 +Retirees;62,85 +Professionals;52,55 +Students;53,34 +Families;75,90 +Retirees;38,24 +Professionals;75,53 +Students;23,10 +Families;81,99 +Retirees;69,59 +Professionals;73,99 +Students;34,39 +Families;77,69 +Retirees;69,91 +Professionals;71,06 +Students;32,25 +Families;65,71 +Retirees;57,54 +Professionals;37,26 +Students;20,66 +Families;70,86 +Retirees;64,51 +Professionals;159,68 +Students;34,78 +Families;100,48 +Retirees;75,07 +Professionals;31,08 +Students;14,78 +Families;95,59 +Retirees;71,47 +Professionals;54,85 +Students;4,32 +Families;70,61 +Retirees;74,01 +Professionals;20,50 +Students;42,51 +Families;75,42 +Retirees;32,80 +Professionals;81,24 +Students;23,32 +Families;61,32 +Retirees;19,58 +Professionals;33,11 +Students;57,91 +Families;93,61 +Retirees;94,53 +Professionals;43,36 +Students;14,60 +Families;71,45 +Retirees;41,11 +Professionals;60,85 +Students;14,60 +Families;84,60 +Retirees;85,70 +Professionals;77,59 +Students;13,23 +Families;89,29 +Retirees;77,35 +Professionals;53,24 +Students;16,74 +Families;59,05 +Retirees;27,50 +Professionals;70,45 +Students;21,61 +Families;100,58 +Retirees;71,62 +Professionals;79,96 +Students;29,96 +Families;106,74 +Retirees;39,18 +Professionals;90,13 +Students;37,92 +Families;95,36 +Retirees;62,76 +Professionals;75,71 +Students;16,92 +Families;83,62 +Retirees;83,22 +Professionals;65,27 +Students;31,29 +Families;106,47 +Retirees;29,12 +Professionals;31,34 +Students;19,09 +Families;106,04 +Retirees;38,32 +Professionals;60,85 +Students;35,39 +Families;105,89 +Retirees;37,83 +Professionals;22,69 +Students;35,81 +Families;88,24 +Retirees;38,00 +Professionals;35,94 +Students;15,70 +Families;73,16 +Retirees;69,72 +Professionals;38,93 +Students;14,32 +Families;83,62 +Retirees;42,96 +Professionals;76,75 +Students;9,38 +Families;61,61 +Retirees;80,80 +Professionals;52,17 +Students;27,20 +Families;108,44 +Retirees;40,82 +Professionals;140,54 +Students;17,99 +Families;86,15 +Retirees;32,49 +Professionals;41,02 +Students;42,45 +Families;73,40 +Retirees;26,13 +Professionals;75,92 +Students;15,44 +Families;93,99 +Retirees;29,36 +Professionals;107,85 +Students;23,13 +Families;101,09 +Retirees;47,31 +Professionals;47,67 +Students;10,26 +Families;130,57 +Retirees;54,57 +Professionals;28,86 +Students;13,84 +Families;76,21 +Retirees;69,06 +Professionals;36,92 +Students;23,10 +Families;98,27 +Retirees;35,71 +Professionals;29,50 +Students;31,28 +Families;100,72 +Retirees;65,58 +Professionals;39,39 +Students;11,18 +Families;126,08 +Retirees;71,56 +Professionals;31,64 +Students;31,11 +Families;96,31 +Retirees;74,67 +Professionals;29,91 +Students;28,16 +Families;104,00 +Retirees;24,53 +Professionals;53,33 +Students;35,20 +Families;65,06 +Retirees;13,32 +Professionals;59,25 +Students;43,60 +Families;71,94 +Retirees;25,58 +Professionals;72,96 +Students;13,80 +Families;119,24 +Retirees;72,04 +Professionals;36,08 diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-n12/case.json b/agents/evals/fixtures/cases/violin-basic-letsplot-n12/case.json new file mode 100644 index 00000000000..495a383e87c --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "violin-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "category", + "column": "Customer Segment" + }, + { + "role": "value", + "column": "Basket Value (EUR)" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, n12)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-n12/data.csv b/agents/evals/fixtures/cases/violin-basic-letsplot-n12/data.csv new file mode 100644 index 00000000000..5996aed8438 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-n12/data.csv @@ -0,0 +1,13 @@ +Customer Segment,Basket Value (EUR) +Students,16.29 +Families,97.22 +Retirees,60.68 +Professionals,109.72 +Students,40.49 +Families,69.68 +Retirees,35.05 +Professionals,66.85 +Students,29.06 +Families,98.27 +Retirees,77.34 +Professionals,42.64 diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-n5000/case.json b/agents/evals/fixtures/cases/violin-basic-letsplot-n5000/case.json new file mode 100644 index 00000000000..4d7ec10baf4 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "violin-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "category", + "column": "Customer Segment" + }, + { + "role": "value", + "column": "Basket Value (EUR)" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, n5000)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-n5000/data.csv b/agents/evals/fixtures/cases/violin-basic-letsplot-n5000/data.csv new file mode 100644 index 00000000000..80d091d1fb1 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-n5000/data.csv @@ -0,0 +1,5001 @@ +Customer Segment,Basket Value (EUR) +Students,29.08 +Families,86.84 +Retirees,32.48 +Professionals,35.15 +Students,22.09 +Families,81.24 +Retirees,34.80 +Professionals,80.35 +Students,22.64 +Families,101.66 +Retirees,79.17 +Professionals,38.22 +Students,27.42 +Families,72.21 +Retirees,40.61 +Professionals,69.36 +Students,31.85 +Families,112.31 +Retirees,33.94 +Professionals,59.29 +Students,13.16 +Families,82.82 +Retirees,30.40 +Professionals,25.08 +Students,15.15 +Families,99.80 +Retirees,72.41 +Professionals,39.46 +Students,30.78 +Families,95.29 +Retirees,32.23 +Professionals,60.47 +Students,30.31 +Families,98.38 +Retirees,37.68 +Professionals,22.07 +Students,14.70 +Families,76.93 +Retirees,33.62 +Professionals,59.68 +Students,24.05 +Families,91.13 +Retirees,67.04 +Professionals,35.21 +Students,42.12 +Families,98.25 +Retirees,35.79 +Professionals,108.69 +Students,35.12 +Families,93.67 +Retirees,38.85 +Professionals,58.85 +Students,25.30 +Families,82.07 +Retirees,89.35 +Professionals,45.72 +Students,18.71 +Families,102.02 +Retirees,75.24 +Professionals,49.87 +Students,18.17 +Families,80.86 +Retirees,68.79 +Professionals,34.74 +Students,20.39 +Families,58.12 +Retirees,19.99 +Professionals,100.83 +Students,25.84 +Families,80.01 +Retirees,34.29 +Professionals,102.74 +Students,17.00 +Families,82.37 +Retirees,71.60 +Professionals,79.69 +Students,19.79 +Families,87.48 +Retirees,33.42 +Professionals,54.15 +Students,26.95 +Families,73.00 +Retirees,43.41 +Professionals,37.44 +Students,34.92 +Families,77.34 +Retirees,67.81 +Professionals,53.65 +Students,28.61 +Families,64.18 +Retirees,54.75 +Professionals,50.26 +Students,16.66 +Families,78.63 +Retirees,43.42 +Professionals,35.23 +Students,9.31 +Families,121.95 +Retirees,38.93 +Professionals,59.66 +Students,18.20 +Families,70.25 +Retirees,49.70 +Professionals,75.94 +Students,32.38 +Families,80.01 +Retirees,39.27 +Professionals,45.46 +Students,7.17 +Families,91.20 +Retirees,46.86 +Professionals,54.86 +Students,23.35 +Families,93.20 +Retirees,64.64 +Professionals,51.11 +Students,33.12 +Families,88.66 +Retirees,61.06 +Professionals,83.31 +Students,15.43 +Families,79.71 +Retirees,33.40 +Professionals,51.49 +Students,19.40 +Families,105.25 +Retirees,81.01 +Professionals,30.06 +Students,23.36 +Families,111.88 +Retirees,26.24 +Professionals,48.29 +Students,39.33 +Families,77.46 +Retirees,76.27 +Professionals,65.05 +Students,32.13 +Families,49.39 +Retirees,84.27 +Professionals,65.04 +Students,17.33 +Families,65.96 +Retirees,31.47 +Professionals,41.52 +Students,25.10 +Families,62.35 +Retirees,31.97 +Professionals,32.72 +Students,56.15 +Families,82.39 +Retirees,71.79 +Professionals,37.83 +Students,16.23 +Families,65.08 +Retirees,41.98 +Professionals,154.68 +Students,42.04 +Families,91.85 +Retirees,69.12 +Professionals,68.10 +Students,26.72 +Families,79.76 +Retirees,77.85 +Professionals,25.81 +Students,21.26 +Families,105.79 +Retirees,27.93 +Professionals,44.14 +Students,26.17 +Families,59.05 +Retirees,29.59 +Professionals,30.89 +Students,17.71 +Families,73.98 +Retirees,38.89 +Professionals,54.43 +Students,10.22 +Families,78.62 +Retirees,37.59 +Professionals,47.55 +Students,9.76 +Families,82.63 +Retirees,63.78 +Professionals,35.17 +Students,36.23 +Families,59.30 +Retirees,27.15 +Professionals,31.05 +Students,37.97 +Families,76.23 +Retirees,34.37 +Professionals,47.28 +Students,36.39 +Families,85.71 +Retirees,35.45 +Professionals,88.59 +Students,40.39 +Families,83.95 +Retirees,37.87 +Professionals,23.24 +Students,50.46 +Families,75.78 +Retirees,17.74 +Professionals,73.64 +Students,34.21 +Families,68.03 +Retirees,36.02 +Professionals,44.71 +Students,27.37 +Families,127.40 +Retirees,60.04 +Professionals,65.16 +Students,20.30 +Families,41.05 +Retirees,73.55 +Professionals,49.07 +Students,20.01 +Families,39.53 +Retirees,25.60 +Professionals,50.75 +Students,24.07 +Families,74.06 +Retirees,38.29 +Professionals,87.15 +Students,11.70 +Families,89.98 +Retirees,19.88 +Professionals,40.13 +Students,13.31 +Families,67.11 +Retirees,30.15 +Professionals,24.61 +Students,25.94 +Families,65.33 +Retirees,42.43 +Professionals,56.94 +Students,28.46 +Families,95.22 +Retirees,31.13 +Professionals,29.84 +Students,30.44 +Families,86.27 +Retirees,39.95 +Professionals,48.03 +Students,20.34 +Families,102.48 +Retirees,35.58 +Professionals,38.36 +Students,23.59 +Families,123.82 +Retirees,40.94 +Professionals,28.31 +Students,32.47 +Families,117.75 +Retirees,62.41 +Professionals,83.27 +Students,21.37 +Families,99.05 +Retirees,39.18 +Professionals,53.36 +Students,14.81 +Families,73.33 +Retirees,83.64 +Professionals,136.38 +Students,17.93 +Families,73.89 +Retirees,58.18 +Professionals,82.99 +Students,20.74 +Families,94.89 +Retirees,41.43 +Professionals,34.88 +Students,22.47 +Families,83.14 +Retirees,29.34 +Professionals,45.81 +Students,16.71 +Families,106.85 +Retirees,76.11 +Professionals,73.18 +Students,13.77 +Families,56.31 +Retirees,71.36 +Professionals,52.51 +Students,27.32 +Families,90.20 +Retirees,41.20 +Professionals,99.65 +Students,13.15 +Families,74.03 +Retirees,27.65 +Professionals,85.94 +Students,15.94 +Families,74.84 +Retirees,73.02 +Professionals,102.06 +Students,21.19 +Families,103.88 +Retirees,25.21 +Professionals,89.50 +Students,36.04 +Families,76.40 +Retirees,78.73 +Professionals,84.35 +Students,39.73 +Families,68.32 +Retirees,42.28 +Professionals,42.64 +Students,15.15 +Families,59.51 +Retirees,72.24 +Professionals,62.12 +Students,21.25 +Families,70.87 +Retirees,18.66 +Professionals,69.88 +Students,41.65 +Families,58.98 +Retirees,74.95 +Professionals,78.18 +Students,15.86 +Families,96.21 +Retirees,24.89 +Professionals,72.14 +Students,12.47 +Families,116.47 +Retirees,39.50 +Professionals,26.22 +Students,10.92 +Families,72.31 +Retirees,24.79 +Professionals,45.69 +Students,11.89 +Families,66.43 +Retirees,26.56 +Professionals,55.52 +Students,24.40 +Families,71.93 +Retirees,32.31 +Professionals,47.88 +Students,17.93 +Families,49.59 +Retirees,37.12 +Professionals,53.72 +Students,25.47 +Families,123.85 +Retirees,74.04 +Professionals,52.85 +Students,16.32 +Families,74.68 +Retirees,30.71 +Professionals,53.60 +Students,19.31 +Families,85.41 +Retirees,40.90 +Professionals,63.20 +Students,20.48 +Families,92.21 +Retirees,65.46 +Professionals,71.92 +Students,13.79 +Families,80.20 +Retirees,30.22 +Professionals,46.43 +Students,21.58 +Families,84.13 +Retirees,75.48 +Professionals,38.26 +Students,13.54 +Families,100.16 +Retirees,37.26 +Professionals,67.56 +Students,21.46 +Families,31.87 +Retirees,35.10 +Professionals,45.99 +Students,13.58 +Families,139.49 +Retirees,31.84 +Professionals,55.02 +Students,9.31 +Families,89.09 +Retirees,66.83 +Professionals,66.40 +Students,41.66 +Families,100.79 +Retirees,35.31 +Professionals,52.31 +Students,19.29 +Families,85.52 +Retirees,70.70 +Professionals,69.73 +Students,14.02 +Families,85.43 +Retirees,18.17 +Professionals,26.14 +Students,24.57 +Families,96.63 +Retirees,38.42 +Professionals,45.13 +Students,50.13 +Families,105.63 +Retirees,41.28 +Professionals,57.76 +Students,13.90 +Families,88.96 +Retirees,59.70 +Professionals,51.44 +Students,6.18 +Families,73.49 +Retirees,83.04 +Professionals,43.50 +Students,43.67 +Families,120.23 +Retirees,70.37 +Professionals,27.57 +Students,14.98 +Families,87.98 +Retirees,43.01 +Professionals,46.62 +Students,10.95 +Families,61.78 +Retirees,25.53 +Professionals,64.54 +Students,27.05 +Families,93.22 +Retirees,42.58 +Professionals,37.05 +Students,41.86 +Families,78.68 +Retirees,81.28 +Professionals,35.79 +Students,15.39 +Families,96.51 +Retirees,80.86 +Professionals,87.10 +Students,29.66 +Families,67.50 +Retirees,77.92 +Professionals,30.93 +Students,27.92 +Families,84.13 +Retirees,30.05 +Professionals,73.20 +Students,11.40 +Families,100.10 +Retirees,82.29 +Professionals,55.75 +Students,28.07 +Families,92.05 +Retirees,35.52 +Professionals,20.79 +Students,8.75 +Families,88.81 +Retirees,31.53 +Professionals,34.54 +Students,25.58 +Families,90.66 +Retirees,38.34 +Professionals,51.33 +Students,19.94 +Families,93.57 +Retirees,70.06 +Professionals,39.74 +Students,25.39 +Families,88.65 +Retirees,79.94 +Professionals,24.29 +Students,34.83 +Families,112.18 +Retirees,40.60 +Professionals,35.95 +Students,27.09 +Families,81.95 +Retirees,35.62 +Professionals,99.39 +Students,11.73 +Families,98.24 +Retirees,54.06 +Professionals,58.07 +Students,13.45 +Families,105.42 +Retirees,75.27 +Professionals,31.29 +Students,31.63 +Families,109.66 +Retirees,75.12 +Professionals,76.82 +Students,16.89 +Families,98.58 +Retirees,56.70 +Professionals,54.89 +Students,26.01 +Families,75.98 +Retirees,44.22 +Professionals,40.29 +Students,26.66 +Families,86.60 +Retirees,31.28 +Professionals,24.54 +Students,21.04 +Families,99.27 +Retirees,41.55 +Professionals,90.72 +Students,26.38 +Families,51.33 +Retirees,72.67 +Professionals,35.25 +Students,21.70 +Families,98.36 +Retirees,74.30 +Professionals,46.18 +Students,14.24 +Families,68.12 +Retirees,74.71 +Professionals,37.73 +Students,36.27 +Families,56.98 +Retirees,81.98 +Professionals,61.02 +Students,35.61 +Families,75.08 +Retirees,40.08 +Professionals,54.44 +Students,16.49 +Families,89.65 +Retirees,82.69 +Professionals,47.49 +Students,36.46 +Families,120.96 +Retirees,26.67 +Professionals,35.03 +Students,14.05 +Families,102.97 +Retirees,73.46 +Professionals,81.47 +Students,19.39 +Families,65.59 +Retirees,37.69 +Professionals,42.08 +Students,20.52 +Families,86.53 +Retirees,75.80 +Professionals,48.19 +Students,18.36 +Families,69.17 +Retirees,34.62 +Professionals,53.81 +Students,43.64 +Families,76.78 +Retirees,30.46 +Professionals,76.45 +Students,27.05 +Families,93.11 +Retirees,69.30 +Professionals,39.56 +Students,19.88 +Families,87.42 +Retirees,31.87 +Professionals,39.33 +Students,21.08 +Families,104.67 +Retirees,48.28 +Professionals,42.48 +Students,23.26 +Families,70.93 +Retirees,75.08 +Professionals,41.74 +Students,10.10 +Families,114.79 +Retirees,28.58 +Professionals,79.92 +Students,12.63 +Families,81.40 +Retirees,39.97 +Professionals,62.97 +Students,22.59 +Families,91.71 +Retirees,73.57 +Professionals,43.15 +Students,14.04 +Families,68.84 +Retirees,46.99 +Professionals,49.18 +Students,32.15 +Families,68.00 +Retirees,30.81 +Professionals,68.54 +Students,19.40 +Families,95.05 +Retirees,32.48 +Professionals,33.31 +Students,9.80 +Families,87.49 +Retirees,26.16 +Professionals,54.36 +Students,30.46 +Families,81.91 +Retirees,87.05 +Professionals,30.10 +Students,18.68 +Families,60.76 +Retirees,91.45 +Professionals,31.91 +Students,13.64 +Families,92.40 +Retirees,36.55 +Professionals,24.57 +Students,10.19 +Families,80.36 +Retirees,32.75 +Professionals,40.14 +Students,24.72 +Families,76.54 +Retirees,51.01 +Professionals,28.35 +Students,33.94 +Families,81.42 +Retirees,19.78 +Professionals,42.96 +Students,33.68 +Families,72.84 +Retirees,83.82 +Professionals,45.95 +Students,11.05 +Families,79.58 +Retirees,39.07 +Professionals,49.49 +Students,21.98 +Families,71.02 +Retirees,79.80 +Professionals,52.71 +Students,25.35 +Families,127.48 +Retirees,76.84 +Professionals,57.44 +Students,18.16 +Families,61.45 +Retirees,39.81 +Professionals,60.51 +Students,20.60 +Families,79.72 +Retirees,69.97 +Professionals,56.40 +Students,25.95 +Families,92.80 +Retirees,45.25 +Professionals,163.27 +Students,23.18 +Families,88.39 +Retirees,86.19 +Professionals,39.49 +Students,25.42 +Families,114.46 +Retirees,38.72 +Professionals,28.34 +Students,51.03 +Families,86.34 +Retirees,22.66 +Professionals,29.43 +Students,8.84 +Families,72.86 +Retirees,53.35 +Professionals,49.57 +Students,11.86 +Families,89.06 +Retirees,43.33 +Professionals,40.48 +Students,12.60 +Families,71.92 +Retirees,31.97 +Professionals,26.04 +Students,34.85 +Families,108.15 +Retirees,71.33 +Professionals,43.96 +Students,38.77 +Families,81.88 +Retirees,87.32 +Professionals,106.38 +Students,24.24 +Families,85.64 +Retirees,34.46 +Professionals,24.48 +Students,29.35 +Families,71.85 +Retirees,61.69 +Professionals,46.75 +Students,17.17 +Families,64.14 +Retirees,60.83 +Professionals,37.82 +Students,11.42 +Families,106.48 +Retirees,52.52 +Professionals,81.66 +Students,16.78 +Families,102.62 +Retirees,27.36 +Professionals,75.76 +Students,24.59 +Families,81.23 +Retirees,34.23 +Professionals,97.49 +Students,39.87 +Families,121.50 +Retirees,85.37 +Professionals,41.60 +Students,25.87 +Families,100.00 +Retirees,37.58 +Professionals,33.91 +Students,14.57 +Families,81.37 +Retirees,41.19 +Professionals,41.94 +Students,18.49 +Families,94.46 +Retirees,93.19 +Professionals,47.54 +Students,15.11 +Families,112.15 +Retirees,54.65 +Professionals,61.90 +Students,12.51 +Families,42.60 +Retirees,83.15 +Professionals,42.85 +Students,13.42 +Families,63.66 +Retirees,45.86 +Professionals,52.79 +Students,21.68 +Families,91.08 +Retirees,30.10 +Professionals,60.56 +Students,18.35 +Families,111.90 +Retirees,31.71 +Professionals,34.15 +Students,29.77 +Families,88.27 +Retirees,39.58 +Professionals,27.26 +Students,37.93 +Families,37.47 +Retirees,25.48 +Professionals,56.07 +Students,24.73 +Families,65.94 +Retirees,41.34 +Professionals,33.84 +Students,33.92 +Families,78.91 +Retirees,72.61 +Professionals,91.55 +Students,21.56 +Families,123.68 +Retirees,32.25 +Professionals,41.82 +Students,20.38 +Families,97.05 +Retirees,32.58 +Professionals,95.39 +Students,12.25 +Families,99.63 +Retirees,74.27 +Professionals,72.23 +Students,57.51 +Families,89.08 +Retirees,58.79 +Professionals,24.92 +Students,35.92 +Families,90.10 +Retirees,34.06 +Professionals,78.43 +Students,24.41 +Families,80.94 +Retirees,38.42 +Professionals,38.85 +Students,29.88 +Families,101.60 +Retirees,72.49 +Professionals,45.95 +Students,24.11 +Families,92.52 +Retirees,76.80 +Professionals,46.73 +Students,16.06 +Families,71.97 +Retirees,51.59 +Professionals,64.99 +Students,20.51 +Families,105.36 +Retirees,35.84 +Professionals,78.11 +Students,28.90 +Families,60.57 +Retirees,65.82 +Professionals,38.22 +Students,10.02 +Families,97.99 +Retirees,71.87 +Professionals,91.77 +Students,15.33 +Families,99.35 +Retirees,80.20 +Professionals,36.45 +Students,10.36 +Families,82.51 +Retirees,62.25 +Professionals,28.91 +Students,11.03 +Families,80.36 +Retirees,26.12 +Professionals,38.20 +Students,12.16 +Families,88.00 +Retirees,70.86 +Professionals,50.31 +Students,18.07 +Families,115.38 +Retirees,38.84 +Professionals,45.68 +Students,27.36 +Families,84.50 +Retirees,61.16 +Professionals,86.58 +Students,19.38 +Families,84.79 +Retirees,50.02 +Professionals,33.94 +Students,34.17 +Families,123.75 +Retirees,71.34 +Professionals,26.48 +Students,37.43 +Families,79.86 +Retirees,41.20 +Professionals,59.42 +Students,16.74 +Families,107.31 +Retirees,67.35 +Professionals,53.07 +Students,15.61 +Families,67.74 +Retirees,68.57 +Professionals,25.63 +Students,19.39 +Families,80.40 +Retirees,29.98 +Professionals,35.68 +Students,21.21 +Families,108.55 +Retirees,26.62 +Professionals,25.83 +Students,19.88 +Families,107.59 +Retirees,73.90 +Professionals,61.57 +Students,20.10 +Families,86.22 +Retirees,33.99 +Professionals,49.32 +Students,15.13 +Families,74.80 +Retirees,57.66 +Professionals,45.97 +Students,50.25 +Families,80.06 +Retirees,59.52 +Professionals,51.10 +Students,8.11 +Families,59.65 +Retirees,35.43 +Professionals,33.37 +Students,15.26 +Families,82.31 +Retirees,42.45 +Professionals,28.58 +Students,25.31 +Families,57.13 +Retirees,54.14 +Professionals,61.58 +Students,31.07 +Families,62.43 +Retirees,25.28 +Professionals,96.01 +Students,30.03 +Families,98.36 +Retirees,40.28 +Professionals,48.60 +Students,22.70 +Families,123.55 +Retirees,15.90 +Professionals,47.95 +Students,11.86 +Families,114.32 +Retirees,56.55 +Professionals,48.03 +Students,14.32 +Families,95.76 +Retirees,20.81 +Professionals,50.11 +Students,26.54 +Families,126.55 +Retirees,37.88 +Professionals,50.46 +Students,23.36 +Families,73.12 +Retirees,83.63 +Professionals,29.70 +Students,11.91 +Families,118.04 +Retirees,64.13 +Professionals,77.09 +Students,18.83 +Families,89.79 +Retirees,68.89 +Professionals,130.14 +Students,13.70 +Families,77.19 +Retirees,41.73 +Professionals,77.37 +Students,17.62 +Families,112.17 +Retirees,71.50 +Professionals,25.13 +Students,71.75 +Families,86.99 +Retirees,80.78 +Professionals,51.19 +Students,26.66 +Families,94.82 +Retirees,28.97 +Professionals,40.60 +Students,26.62 +Families,98.25 +Retirees,86.85 +Professionals,79.22 +Students,34.34 +Families,85.29 +Retirees,29.27 +Professionals,27.05 +Students,24.89 +Families,96.55 +Retirees,37.85 +Professionals,97.15 +Students,9.42 +Families,85.13 +Retirees,32.40 +Professionals,93.72 +Students,27.57 +Families,74.95 +Retirees,31.38 +Professionals,57.82 +Students,34.87 +Families,99.74 +Retirees,34.44 +Professionals,60.13 +Students,22.92 +Families,77.99 +Retirees,64.71 +Professionals,87.38 +Students,24.41 +Families,117.19 +Retirees,24.91 +Professionals,96.08 +Students,46.13 +Families,94.09 +Retirees,69.98 +Professionals,40.25 +Students,12.92 +Families,64.91 +Retirees,28.30 +Professionals,71.50 +Students,19.60 +Families,91.16 +Retirees,37.45 +Professionals,86.80 +Students,21.93 +Families,95.05 +Retirees,26.74 +Professionals,79.25 +Students,23.91 +Families,102.37 +Retirees,86.80 +Professionals,22.45 +Students,14.05 +Families,82.78 +Retirees,33.93 +Professionals,70.84 +Students,28.93 +Families,51.07 +Retirees,42.71 +Professionals,55.90 +Students,16.06 +Families,108.86 +Retirees,39.17 +Professionals,48.84 +Students,18.70 +Families,77.14 +Retirees,23.77 +Professionals,25.11 +Students,24.46 +Families,72.39 +Retirees,70.35 +Professionals,33.94 +Students,23.87 +Families,115.27 +Retirees,36.16 +Professionals,38.46 +Students,16.01 +Families,95.48 +Retirees,41.73 +Professionals,34.19 +Students,33.94 +Families,72.43 +Retirees,72.38 +Professionals,107.91 +Students,25.30 +Families,106.68 +Retirees,62.94 +Professionals,79.46 +Students,36.41 +Families,100.27 +Retirees,77.91 +Professionals,54.65 +Students,32.48 +Families,110.43 +Retirees,40.07 +Professionals,85.38 +Students,25.74 +Families,61.19 +Retirees,87.24 +Professionals,97.01 +Students,20.38 +Families,108.02 +Retirees,70.89 +Professionals,58.84 +Students,21.50 +Families,76.25 +Retirees,88.30 +Professionals,76.12 +Students,23.02 +Families,80.67 +Retirees,69.73 +Professionals,31.56 +Students,37.07 +Families,54.36 +Retirees,81.77 +Professionals,49.63 +Students,31.20 +Families,88.99 +Retirees,71.47 +Professionals,36.91 +Students,12.11 +Families,82.96 +Retirees,35.46 +Professionals,109.60 +Students,19.74 +Families,108.08 +Retirees,78.60 +Professionals,96.02 +Students,7.70 +Families,100.11 +Retirees,37.25 +Professionals,26.89 +Students,14.13 +Families,58.28 +Retirees,73.76 +Professionals,52.63 +Students,16.42 +Families,97.75 +Retirees,34.60 +Professionals,31.37 +Students,15.64 +Families,72.41 +Retirees,72.93 +Professionals,54.76 +Students,39.04 +Families,73.60 +Retirees,92.26 +Professionals,91.13 +Students,26.55 +Families,78.75 +Retirees,40.71 +Professionals,68.09 +Students,26.51 +Families,67.71 +Retirees,27.48 +Professionals,51.54 +Students,21.74 +Families,93.10 +Retirees,67.10 +Professionals,89.74 +Students,19.22 +Families,109.81 +Retirees,64.46 +Professionals,47.19 +Students,32.24 +Families,78.59 +Retirees,70.59 +Professionals,24.79 +Students,22.54 +Families,65.85 +Retirees,36.32 +Professionals,56.34 +Students,32.85 +Families,102.61 +Retirees,45.60 +Professionals,34.86 +Students,15.91 +Families,113.77 +Retirees,19.00 +Professionals,31.36 +Students,12.36 +Families,91.73 +Retirees,64.08 +Professionals,116.46 +Students,13.34 +Families,85.36 +Retirees,43.86 +Professionals,70.64 +Students,18.87 +Families,99.18 +Retirees,34.70 +Professionals,112.70 +Students,72.66 +Families,55.63 +Retirees,55.65 +Professionals,65.65 +Students,15.77 +Families,68.46 +Retirees,50.16 +Professionals,59.78 +Students,10.50 +Families,81.53 +Retirees,36.00 +Professionals,33.41 +Students,36.47 +Families,83.80 +Retirees,29.01 +Professionals,77.62 +Students,21.21 +Families,75.98 +Retirees,79.30 +Professionals,43.26 +Students,27.22 +Families,81.23 +Retirees,31.86 +Professionals,154.29 +Students,42.16 +Families,113.38 +Retirees,70.74 +Professionals,83.31 +Students,13.75 +Families,85.03 +Retirees,34.01 +Professionals,159.36 +Students,37.08 +Families,88.90 +Retirees,26.19 +Professionals,58.53 +Students,30.11 +Families,125.99 +Retirees,79.31 +Professionals,33.75 +Students,15.32 +Families,81.39 +Retirees,36.37 +Professionals,28.91 +Students,22.36 +Families,78.77 +Retirees,33.75 +Professionals,69.73 +Students,17.04 +Families,89.48 +Retirees,34.26 +Professionals,29.19 +Students,27.45 +Families,123.06 +Retirees,29.72 +Professionals,34.27 +Students,25.18 +Families,92.00 +Retirees,40.76 +Professionals,99.01 +Students,15.81 +Families,73.96 +Retirees,72.69 +Professionals,37.50 +Students,25.13 +Families,59.79 +Retirees,30.35 +Professionals,26.31 +Students,29.63 +Families,82.96 +Retirees,70.95 +Professionals,73.84 +Students,20.77 +Families,64.39 +Retirees,76.68 +Professionals,46.67 +Students,12.80 +Families,90.55 +Retirees,24.10 +Professionals,128.30 +Students,18.69 +Families,71.33 +Retirees,33.51 +Professionals,61.67 +Students,41.07 +Families,96.54 +Retirees,70.96 +Professionals,23.72 +Students,23.20 +Families,84.18 +Retirees,43.15 +Professionals,48.17 +Students,11.80 +Families,68.64 +Retirees,71.10 +Professionals,106.30 +Students,22.23 +Families,70.74 +Retirees,27.39 +Professionals,51.47 +Students,62.27 +Families,75.67 +Retirees,41.70 +Professionals,74.35 +Students,8.67 +Families,112.96 +Retirees,30.95 +Professionals,103.18 +Students,18.75 +Families,77.35 +Retirees,80.07 +Professionals,104.89 +Students,17.47 +Families,84.72 +Retirees,35.52 +Professionals,35.15 +Students,29.31 +Families,105.31 +Retirees,82.80 +Professionals,46.05 +Students,22.77 +Families,67.70 +Retirees,23.48 +Professionals,24.89 +Students,16.46 +Families,90.11 +Retirees,25.62 +Professionals,45.01 +Students,17.47 +Families,55.50 +Retirees,33.14 +Professionals,44.53 +Students,17.75 +Families,55.38 +Retirees,32.62 +Professionals,43.57 +Students,33.63 +Families,50.06 +Retirees,42.34 +Professionals,129.18 +Students,9.11 +Families,77.19 +Retirees,77.86 +Professionals,54.34 +Students,23.02 +Families,73.00 +Retirees,76.67 +Professionals,37.40 +Students,21.53 +Families,90.69 +Retirees,67.09 +Professionals,68.11 +Students,24.27 +Families,84.42 +Retirees,22.93 +Professionals,51.16 +Students,59.82 +Families,51.01 +Retirees,31.46 +Professionals,26.12 +Students,36.52 +Families,103.85 +Retirees,27.51 +Professionals,77.67 +Students,10.59 +Families,83.37 +Retirees,39.84 +Professionals,49.61 +Students,34.60 +Families,97.32 +Retirees,73.96 +Professionals,74.30 +Students,16.05 +Families,95.86 +Retirees,36.47 +Professionals,32.50 +Students,20.09 +Families,52.23 +Retirees,35.12 +Professionals,53.01 +Students,45.27 +Families,100.77 +Retirees,14.96 +Professionals,82.16 +Students,14.93 +Families,118.75 +Retirees,75.13 +Professionals,34.83 +Students,18.83 +Families,78.97 +Retirees,44.72 +Professionals,68.65 +Students,19.30 +Families,77.65 +Retirees,39.58 +Professionals,67.81 +Students,21.87 +Families,98.19 +Retirees,70.38 +Professionals,41.20 +Students,19.91 +Families,85.31 +Retirees,18.52 +Professionals,32.59 +Students,10.97 +Families,73.66 +Retirees,26.57 +Professionals,30.87 +Students,18.35 +Families,72.47 +Retirees,78.00 +Professionals,68.52 +Students,20.89 +Families,104.48 +Retirees,29.95 +Professionals,95.46 +Students,43.89 +Families,107.77 +Retirees,75.94 +Professionals,71.08 +Students,24.83 +Families,108.01 +Retirees,42.90 +Professionals,64.67 +Students,21.09 +Families,83.40 +Retirees,59.05 +Professionals,63.11 +Students,24.34 +Families,87.17 +Retirees,71.11 +Professionals,101.79 +Students,19.61 +Families,99.51 +Retirees,36.87 +Professionals,175.08 +Students,13.43 +Families,93.00 +Retirees,72.28 +Professionals,83.81 +Students,26.56 +Families,97.48 +Retirees,35.96 +Professionals,38.90 +Students,55.13 +Families,87.61 +Retirees,78.85 +Professionals,107.07 +Students,26.95 +Families,97.20 +Retirees,52.17 +Professionals,75.07 +Students,56.42 +Families,78.94 +Retirees,68.94 +Professionals,58.28 +Students,42.73 +Families,73.60 +Retirees,82.53 +Professionals,56.72 +Students,17.90 +Families,87.78 +Retirees,38.68 +Professionals,59.41 +Students,14.73 +Families,99.79 +Retirees,62.33 +Professionals,41.39 +Students,24.88 +Families,90.26 +Retirees,56.27 +Professionals,69.61 +Students,38.68 +Families,80.33 +Retirees,30.77 +Professionals,51.89 +Students,50.83 +Families,97.37 +Retirees,37.33 +Professionals,71.71 +Students,27.58 +Families,72.44 +Retirees,37.71 +Professionals,24.57 +Students,17.90 +Families,63.02 +Retirees,59.01 +Professionals,126.38 +Students,16.32 +Families,98.74 +Retirees,43.86 +Professionals,94.67 +Students,16.46 +Families,103.66 +Retirees,86.32 +Professionals,54.95 +Students,27.59 +Families,80.34 +Retirees,26.81 +Professionals,22.56 +Students,13.27 +Families,85.96 +Retirees,20.42 +Professionals,80.51 +Students,18.74 +Families,92.44 +Retirees,29.11 +Professionals,29.04 +Students,18.06 +Families,54.22 +Retirees,75.20 +Professionals,117.87 +Students,31.91 +Families,80.16 +Retirees,66.43 +Professionals,24.57 +Students,19.50 +Families,118.93 +Retirees,38.52 +Professionals,66.45 +Students,39.40 +Families,46.11 +Retirees,76.32 +Professionals,41.05 +Students,17.65 +Families,110.88 +Retirees,38.42 +Professionals,44.65 +Students,19.16 +Families,78.85 +Retirees,26.69 +Professionals,33.19 +Students,20.53 +Families,66.15 +Retirees,73.15 +Professionals,135.48 +Students,20.66 +Families,97.56 +Retirees,65.51 +Professionals,51.68 +Students,35.95 +Families,113.97 +Retirees,62.37 +Professionals,36.49 +Students,13.83 +Families,34.11 +Retirees,27.77 +Professionals,47.44 +Students,12.54 +Families,68.51 +Retirees,81.64 +Professionals,35.49 +Students,40.56 +Families,89.33 +Retirees,66.79 +Professionals,32.55 +Students,27.47 +Families,95.53 +Retirees,70.93 +Professionals,77.30 +Students,22.86 +Families,83.53 +Retirees,62.85 +Professionals,50.29 +Students,17.09 +Families,90.76 +Retirees,60.51 +Professionals,100.66 +Students,17.33 +Families,58.77 +Retirees,74.21 +Professionals,34.43 +Students,21.50 +Families,100.09 +Retirees,27.06 +Professionals,56.12 +Students,26.16 +Families,75.31 +Retirees,89.10 +Professionals,78.01 +Students,13.73 +Families,79.12 +Retirees,73.85 +Professionals,39.61 +Students,18.02 +Families,87.32 +Retirees,84.88 +Professionals,99.05 +Students,31.90 +Families,104.84 +Retirees,37.68 +Professionals,60.32 +Students,38.12 +Families,104.88 +Retirees,31.61 +Professionals,64.34 +Students,27.20 +Families,94.49 +Retirees,24.23 +Professionals,51.34 +Students,40.43 +Families,81.08 +Retirees,39.67 +Professionals,22.92 +Students,11.10 +Families,88.29 +Retirees,30.74 +Professionals,56.33 +Students,23.84 +Families,104.03 +Retirees,40.77 +Professionals,50.36 +Students,25.05 +Families,74.91 +Retirees,37.93 +Professionals,37.23 +Students,17.06 +Families,70.68 +Retirees,73.46 +Professionals,105.02 +Students,18.28 +Families,105.93 +Retirees,35.79 +Professionals,82.42 +Students,21.34 +Families,73.41 +Retirees,36.65 +Professionals,76.58 +Students,19.46 +Families,118.89 +Retirees,61.74 +Professionals,75.08 +Students,15.98 +Families,72.11 +Retirees,73.85 +Professionals,53.58 +Students,25.20 +Families,70.34 +Retirees,28.46 +Professionals,79.26 +Students,19.88 +Families,52.16 +Retirees,66.33 +Professionals,145.03 +Students,11.33 +Families,112.02 +Retirees,75.27 +Professionals,29.07 +Students,17.67 +Families,109.29 +Retirees,77.50 +Professionals,60.53 +Students,16.16 +Families,77.64 +Retirees,36.36 +Professionals,54.27 +Students,23.62 +Families,62.12 +Retirees,46.29 +Professionals,88.62 +Students,23.22 +Families,68.78 +Retirees,75.27 +Professionals,46.27 +Students,18.58 +Families,95.88 +Retirees,47.59 +Professionals,61.96 +Students,14.26 +Families,67.40 +Retirees,30.14 +Professionals,44.47 +Students,40.32 +Families,88.68 +Retirees,55.48 +Professionals,46.28 +Students,17.70 +Families,98.43 +Retirees,76.61 +Professionals,75.21 +Students,31.61 +Families,77.47 +Retirees,33.50 +Professionals,36.06 +Students,28.67 +Families,96.93 +Retirees,67.31 +Professionals,54.47 +Students,14.30 +Families,74.08 +Retirees,32.31 +Professionals,38.88 +Students,18.84 +Families,59.03 +Retirees,35.45 +Professionals,49.59 +Students,9.48 +Families,91.96 +Retirees,18.29 +Professionals,91.58 +Students,29.61 +Families,122.23 +Retirees,75.84 +Professionals,72.54 +Students,23.07 +Families,103.47 +Retirees,41.10 +Professionals,57.79 +Students,42.53 +Families,110.83 +Retirees,26.67 +Professionals,45.35 +Students,14.73 +Families,69.78 +Retirees,28.55 +Professionals,51.49 +Students,13.83 +Families,73.32 +Retirees,26.22 +Professionals,51.11 +Students,6.07 +Families,71.59 +Retirees,30.50 +Professionals,59.18 +Students,43.10 +Families,90.94 +Retirees,57.42 +Professionals,125.47 +Students,28.30 +Families,76.26 +Retirees,83.23 +Professionals,27.14 +Students,26.29 +Families,85.02 +Retirees,69.20 +Professionals,33.82 +Students,13.42 +Families,80.18 +Retirees,85.30 +Professionals,52.73 +Students,15.15 +Families,72.20 +Retirees,42.19 +Professionals,42.16 +Students,13.94 +Families,109.62 +Retirees,70.66 +Professionals,48.46 +Students,48.29 +Families,74.59 +Retirees,34.98 +Professionals,48.24 +Students,45.50 +Families,70.17 +Retirees,62.66 +Professionals,86.12 +Students,18.20 +Families,98.68 +Retirees,67.98 +Professionals,32.60 +Students,21.40 +Families,65.73 +Retirees,59.80 +Professionals,35.73 +Students,27.66 +Families,83.62 +Retirees,31.08 +Professionals,54.57 +Students,28.46 +Families,91.45 +Retirees,39.65 +Professionals,58.43 +Students,20.83 +Families,67.92 +Retirees,78.88 +Professionals,51.60 +Students,19.29 +Families,73.73 +Retirees,62.32 +Professionals,68.45 +Students,53.51 +Families,85.94 +Retirees,31.51 +Professionals,31.30 +Students,21.09 +Families,94.10 +Retirees,27.93 +Professionals,103.78 +Students,17.57 +Families,88.38 +Retirees,58.26 +Professionals,37.63 +Students,24.75 +Families,106.02 +Retirees,28.02 +Professionals,26.64 +Students,22.85 +Families,81.24 +Retirees,76.64 +Professionals,53.46 +Students,24.62 +Families,102.89 +Retirees,29.30 +Professionals,54.86 +Students,14.93 +Families,57.85 +Retirees,48.12 +Professionals,93.81 +Students,20.90 +Families,115.97 +Retirees,38.87 +Professionals,37.46 +Students,16.99 +Families,74.01 +Retirees,33.90 +Professionals,26.17 +Students,10.72 +Families,48.61 +Retirees,40.86 +Professionals,47.11 +Students,27.53 +Families,94.86 +Retirees,60.18 +Professionals,32.68 +Students,18.31 +Families,95.93 +Retirees,38.03 +Professionals,38.17 +Students,21.82 +Families,79.01 +Retirees,34.74 +Professionals,65.86 +Students,38.65 +Families,95.91 +Retirees,67.11 +Professionals,102.21 +Students,24.38 +Families,91.83 +Retirees,65.10 +Professionals,26.02 +Students,34.85 +Families,78.81 +Retirees,69.93 +Professionals,59.47 +Students,8.30 +Families,67.54 +Retirees,33.02 +Professionals,59.62 +Students,33.95 +Families,94.52 +Retirees,74.41 +Professionals,56.25 +Students,43.28 +Families,47.52 +Retirees,34.90 +Professionals,69.15 +Students,26.79 +Families,82.60 +Retirees,35.52 +Professionals,36.44 +Students,36.39 +Families,86.28 +Retirees,66.24 +Professionals,67.83 +Students,21.21 +Families,96.18 +Retirees,71.41 +Professionals,59.21 +Students,23.59 +Families,85.90 +Retirees,24.36 +Professionals,70.98 +Students,9.78 +Families,106.48 +Retirees,82.21 +Professionals,33.11 +Students,43.55 +Families,103.15 +Retirees,73.11 +Professionals,100.66 +Students,32.92 +Families,79.52 +Retirees,46.59 +Professionals,40.20 +Students,17.59 +Families,74.99 +Retirees,40.07 +Professionals,28.54 +Students,19.95 +Families,78.45 +Retirees,98.30 +Professionals,62.91 +Students,21.21 +Families,69.73 +Retirees,42.60 +Professionals,48.61 +Students,17.57 +Families,73.93 +Retirees,88.87 +Professionals,31.98 +Students,15.40 +Families,75.75 +Retirees,38.77 +Professionals,43.79 +Students,8.90 +Families,96.99 +Retirees,27.96 +Professionals,32.40 +Students,60.49 +Families,82.18 +Retirees,28.43 +Professionals,53.50 +Students,21.52 +Families,60.83 +Retirees,69.18 +Professionals,50.40 +Students,35.58 +Families,108.19 +Retirees,79.26 +Professionals,75.77 +Students,14.27 +Families,52.95 +Retirees,67.28 +Professionals,35.63 +Students,20.40 +Families,77.92 +Retirees,26.85 +Professionals,49.15 +Students,11.63 +Families,95.48 +Retirees,30.86 +Professionals,84.82 +Students,27.67 +Families,95.93 +Retirees,37.32 +Professionals,58.44 +Students,11.47 +Families,85.23 +Retirees,75.10 +Professionals,53.55 +Students,6.20 +Families,122.04 +Retirees,68.04 +Professionals,41.45 +Students,27.19 +Families,91.42 +Retirees,70.76 +Professionals,51.60 +Students,34.93 +Families,71.64 +Retirees,73.67 +Professionals,51.89 +Students,11.61 +Families,105.88 +Retirees,68.47 +Professionals,95.43 +Students,46.12 +Families,75.80 +Retirees,64.08 +Professionals,30.50 +Students,19.45 +Families,86.42 +Retirees,29.42 +Professionals,99.88 +Students,20.20 +Families,93.88 +Retirees,36.98 +Professionals,27.29 +Students,12.30 +Families,94.36 +Retirees,29.20 +Professionals,47.36 +Students,15.84 +Families,48.22 +Retirees,62.96 +Professionals,56.23 +Students,17.22 +Families,66.36 +Retirees,41.44 +Professionals,43.75 +Students,16.73 +Families,72.45 +Retirees,68.39 +Professionals,100.32 +Students,19.97 +Families,102.51 +Retirees,33.36 +Professionals,38.84 +Students,15.07 +Families,85.05 +Retirees,61.10 +Professionals,29.70 +Students,19.19 +Families,89.59 +Retirees,83.86 +Professionals,110.65 +Students,28.98 +Families,52.97 +Retirees,53.71 +Professionals,30.17 +Students,16.76 +Families,90.84 +Retirees,43.05 +Professionals,54.83 +Students,21.17 +Families,67.38 +Retirees,37.61 +Professionals,52.49 +Students,10.91 +Families,71.13 +Retirees,70.84 +Professionals,48.81 +Students,40.45 +Families,63.21 +Retirees,25.04 +Professionals,130.90 +Students,31.50 +Families,73.60 +Retirees,41.21 +Professionals,66.86 +Students,9.58 +Families,55.00 +Retirees,24.07 +Professionals,46.65 +Students,65.96 +Families,121.17 +Retirees,31.08 +Professionals,39.55 +Students,22.30 +Families,58.98 +Retirees,36.88 +Professionals,52.85 +Students,15.43 +Families,92.02 +Retirees,87.87 +Professionals,51.03 +Students,30.09 +Families,118.71 +Retirees,33.89 +Professionals,54.73 +Students,27.80 +Families,93.69 +Retirees,35.19 +Professionals,49.25 +Students,18.81 +Families,83.22 +Retirees,89.98 +Professionals,62.11 +Students,22.77 +Families,91.56 +Retirees,60.41 +Professionals,58.04 +Students,27.94 +Families,102.00 +Retirees,62.23 +Professionals,77.08 +Students,14.21 +Families,92.57 +Retirees,66.87 +Professionals,52.85 +Students,15.97 +Families,67.97 +Retirees,38.61 +Professionals,29.77 +Students,8.20 +Families,85.63 +Retirees,38.37 +Professionals,68.55 +Students,20.74 +Families,71.66 +Retirees,57.55 +Professionals,60.39 +Students,30.47 +Families,114.46 +Retirees,59.51 +Professionals,52.68 +Students,19.93 +Families,64.04 +Retirees,20.41 +Professionals,69.53 +Students,22.89 +Families,105.62 +Retirees,30.38 +Professionals,27.19 +Students,55.01 +Families,78.74 +Retirees,71.41 +Professionals,81.66 +Students,14.80 +Families,85.12 +Retirees,39.56 +Professionals,48.34 +Students,11.32 +Families,68.23 +Retirees,82.54 +Professionals,40.32 +Students,10.36 +Families,112.02 +Retirees,57.51 +Professionals,82.60 +Students,16.12 +Families,96.48 +Retirees,65.37 +Professionals,86.21 +Students,34.45 +Families,88.03 +Retirees,81.70 +Professionals,34.39 +Students,28.00 +Families,108.72 +Retirees,94.11 +Professionals,79.70 +Students,27.91 +Families,84.79 +Retirees,83.90 +Professionals,41.61 +Students,36.37 +Families,76.10 +Retirees,70.31 +Professionals,45.14 +Students,14.92 +Families,90.86 +Retirees,31.49 +Professionals,72.61 +Students,13.50 +Families,66.18 +Retirees,25.31 +Professionals,65.21 +Students,21.09 +Families,87.79 +Retirees,42.96 +Professionals,62.86 +Students,42.51 +Families,69.99 +Retirees,66.65 +Professionals,136.01 +Students,10.05 +Families,92.15 +Retirees,79.54 +Professionals,73.29 +Students,10.60 +Families,109.24 +Retirees,38.61 +Professionals,56.72 +Students,10.88 +Families,105.18 +Retirees,51.41 +Professionals,36.65 +Students,11.72 +Families,93.21 +Retirees,25.88 +Professionals,35.80 +Students,22.99 +Families,62.51 +Retirees,72.76 +Professionals,24.95 +Students,23.42 +Families,101.48 +Retirees,38.59 +Professionals,37.62 +Students,13.16 +Families,78.27 +Retirees,80.09 +Professionals,45.75 +Students,14.66 +Families,115.55 +Retirees,31.84 +Professionals,42.30 +Students,11.07 +Families,82.56 +Retirees,28.47 +Professionals,73.12 +Students,15.08 +Families,78.95 +Retirees,31.85 +Professionals,103.06 +Students,19.70 +Families,81.31 +Retirees,77.29 +Professionals,58.09 +Students,22.49 +Families,95.54 +Retirees,37.44 +Professionals,72.73 +Students,15.28 +Families,107.01 +Retirees,28.39 +Professionals,64.40 +Students,36.36 +Families,96.50 +Retirees,55.27 +Professionals,30.75 +Students,29.30 +Families,134.42 +Retirees,64.07 +Professionals,40.65 +Students,16.69 +Families,68.34 +Retirees,50.81 +Professionals,42.03 +Students,38.08 +Families,92.58 +Retirees,55.05 +Professionals,44.96 +Students,25.72 +Families,62.68 +Retirees,77.11 +Professionals,32.21 +Students,21.70 +Families,97.85 +Retirees,45.14 +Professionals,39.85 +Students,16.69 +Families,108.91 +Retirees,25.19 +Professionals,62.29 +Students,45.47 +Families,110.01 +Retirees,24.92 +Professionals,31.42 +Students,33.44 +Families,87.30 +Retirees,25.90 +Professionals,108.55 +Students,39.00 +Families,69.07 +Retirees,17.12 +Professionals,44.67 +Students,12.71 +Families,98.77 +Retirees,54.41 +Professionals,27.00 +Students,11.69 +Families,99.28 +Retirees,68.41 +Professionals,60.09 +Students,20.25 +Families,75.05 +Retirees,76.01 +Professionals,143.85 +Students,19.04 +Families,105.84 +Retirees,38.47 +Professionals,31.49 +Students,19.62 +Families,128.76 +Retirees,39.26 +Professionals,84.34 +Students,16.28 +Families,78.62 +Retirees,43.93 +Professionals,68.25 +Students,15.18 +Families,77.48 +Retirees,35.09 +Professionals,32.64 +Students,18.31 +Families,111.08 +Retirees,26.79 +Professionals,38.03 +Students,26.91 +Families,94.45 +Retirees,75.54 +Professionals,36.22 +Students,13.57 +Families,58.16 +Retirees,69.47 +Professionals,73.27 +Students,42.20 +Families,83.04 +Retirees,35.51 +Professionals,90.18 +Students,20.08 +Families,90.73 +Retirees,51.31 +Professionals,29.79 +Students,29.09 +Families,77.31 +Retirees,37.01 +Professionals,45.04 +Students,32.09 +Families,89.58 +Retirees,74.10 +Professionals,37.01 +Students,30.50 +Families,82.41 +Retirees,32.01 +Professionals,66.71 +Students,28.73 +Families,78.73 +Retirees,94.39 +Professionals,104.79 +Students,23.39 +Families,83.74 +Retirees,30.53 +Professionals,69.54 +Students,56.30 +Families,121.55 +Retirees,41.85 +Professionals,70.70 +Students,20.60 +Families,102.72 +Retirees,61.59 +Professionals,53.18 +Students,15.35 +Families,95.85 +Retirees,30.59 +Professionals,76.85 +Students,26.54 +Families,46.22 +Retirees,40.68 +Professionals,55.90 +Students,43.60 +Families,97.58 +Retirees,30.34 +Professionals,82.51 +Students,29.41 +Families,116.04 +Retirees,33.36 +Professionals,152.91 +Students,16.46 +Families,92.87 +Retirees,74.23 +Professionals,54.50 +Students,13.10 +Families,76.42 +Retirees,27.59 +Professionals,37.40 +Students,23.01 +Families,63.47 +Retirees,42.49 +Professionals,52.06 +Students,20.13 +Families,87.36 +Retirees,73.77 +Professionals,55.89 +Students,21.45 +Families,95.01 +Retirees,31.24 +Professionals,58.09 +Students,16.28 +Families,114.65 +Retirees,78.17 +Professionals,37.29 +Students,34.74 +Families,74.09 +Retirees,60.52 +Professionals,128.29 +Students,16.19 +Families,74.74 +Retirees,36.70 +Professionals,49.81 +Students,10.53 +Families,92.99 +Retirees,57.76 +Professionals,87.62 +Students,15.41 +Families,77.15 +Retirees,37.50 +Professionals,45.48 +Students,27.60 +Families,75.61 +Retirees,32.81 +Professionals,60.05 +Students,17.20 +Families,95.35 +Retirees,34.01 +Professionals,79.09 +Students,17.30 +Families,72.48 +Retirees,79.54 +Professionals,27.55 +Students,19.20 +Families,88.59 +Retirees,35.47 +Professionals,37.59 +Students,39.85 +Families,73.56 +Retirees,30.47 +Professionals,47.33 +Students,45.03 +Families,71.20 +Retirees,34.59 +Professionals,24.14 +Students,14.49 +Families,64.33 +Retirees,76.15 +Professionals,108.26 +Students,27.31 +Families,66.90 +Retirees,21.28 +Professionals,62.78 +Students,11.37 +Families,83.81 +Retirees,40.58 +Professionals,41.98 +Students,29.03 +Families,97.77 +Retirees,41.24 +Professionals,34.56 +Students,22.76 +Families,101.59 +Retirees,72.67 +Professionals,40.89 +Students,14.85 +Families,72.93 +Retirees,64.82 +Professionals,57.96 +Students,39.45 +Families,86.84 +Retirees,32.67 +Professionals,55.73 +Students,38.95 +Families,93.11 +Retirees,63.78 +Professionals,89.40 +Students,15.51 +Families,84.02 +Retirees,63.34 +Professionals,90.96 +Students,15.62 +Families,92.06 +Retirees,63.61 +Professionals,37.19 +Students,30.32 +Families,73.67 +Retirees,31.76 +Professionals,72.58 +Students,30.05 +Families,77.33 +Retirees,62.70 +Professionals,81.10 +Students,14.93 +Families,106.15 +Retirees,36.71 +Professionals,65.37 +Students,17.20 +Families,73.23 +Retirees,59.63 +Professionals,27.01 +Students,11.24 +Families,88.71 +Retirees,92.39 +Professionals,26.28 +Students,17.27 +Families,51.53 +Retirees,61.94 +Professionals,31.08 +Students,22.68 +Families,72.79 +Retirees,74.13 +Professionals,94.78 +Students,19.85 +Families,101.72 +Retirees,65.28 +Professionals,36.51 +Students,29.62 +Families,100.03 +Retirees,98.86 +Professionals,41.97 +Students,31.19 +Families,65.42 +Retirees,80.72 +Professionals,81.46 +Students,14.49 +Families,82.78 +Retirees,29.80 +Professionals,56.52 +Students,44.55 +Families,70.79 +Retirees,61.40 +Professionals,47.04 +Students,37.20 +Families,103.96 +Retirees,35.99 +Professionals,56.80 +Students,58.76 +Families,84.76 +Retirees,71.83 +Professionals,51.10 +Students,31.91 +Families,105.98 +Retirees,66.65 +Professionals,55.11 +Students,22.70 +Families,108.41 +Retirees,88.18 +Professionals,101.28 +Students,20.88 +Families,72.82 +Retirees,76.82 +Professionals,84.77 +Students,17.32 +Families,77.40 +Retirees,21.28 +Professionals,61.06 +Students,37.29 +Families,89.88 +Retirees,35.10 +Professionals,30.35 +Students,23.88 +Families,91.18 +Retirees,81.07 +Professionals,37.77 +Students,17.06 +Families,87.78 +Retirees,41.87 +Professionals,47.16 +Students,31.63 +Families,86.66 +Retirees,27.75 +Professionals,54.20 +Students,19.02 +Families,36.37 +Retirees,31.35 +Professionals,75.60 +Students,13.44 +Families,98.64 +Retirees,66.90 +Professionals,83.22 +Students,13.28 +Families,92.06 +Retirees,74.30 +Professionals,109.86 +Students,26.73 +Families,100.33 +Retirees,33.22 +Professionals,54.75 +Students,12.50 +Families,62.56 +Retirees,29.76 +Professionals,28.79 +Students,12.79 +Families,87.42 +Retirees,32.45 +Professionals,48.28 +Students,15.02 +Families,75.67 +Retirees,67.25 +Professionals,52.28 +Students,25.55 +Families,93.41 +Retirees,80.74 +Professionals,46.00 +Students,23.58 +Families,35.76 +Retirees,23.94 +Professionals,46.63 +Students,17.04 +Families,114.85 +Retirees,73.38 +Professionals,32.07 +Students,15.37 +Families,67.14 +Retirees,34.22 +Professionals,33.41 +Students,11.37 +Families,107.72 +Retirees,26.45 +Professionals,30.80 +Students,19.99 +Families,78.04 +Retirees,38.67 +Professionals,79.03 +Students,14.17 +Families,95.01 +Retirees,35.31 +Professionals,21.82 +Students,13.26 +Families,106.64 +Retirees,83.93 +Professionals,139.63 +Students,21.46 +Families,113.24 +Retirees,82.31 +Professionals,43.36 +Students,29.82 +Families,73.94 +Retirees,37.43 +Professionals,32.21 +Students,11.49 +Families,54.01 +Retirees,68.20 +Professionals,68.44 +Students,24.49 +Families,112.00 +Retirees,22.17 +Professionals,46.66 +Students,9.01 +Families,103.98 +Retirees,40.87 +Professionals,122.17 +Students,21.66 +Families,87.72 +Retirees,41.02 +Professionals,45.32 +Students,17.45 +Families,81.90 +Retirees,79.07 +Professionals,31.84 +Students,16.64 +Families,60.67 +Retirees,68.98 +Professionals,48.51 +Students,15.65 +Families,103.80 +Retirees,60.02 +Professionals,33.23 +Students,25.78 +Families,93.73 +Retirees,76.88 +Professionals,61.38 +Students,18.40 +Families,114.96 +Retirees,22.05 +Professionals,65.88 +Students,23.34 +Families,99.84 +Retirees,29.17 +Professionals,28.87 +Students,22.47 +Families,114.45 +Retirees,37.72 +Professionals,39.48 +Students,17.74 +Families,104.61 +Retirees,43.26 +Professionals,87.82 +Students,12.69 +Families,88.37 +Retirees,40.08 +Professionals,74.46 +Students,8.65 +Families,80.26 +Retirees,39.79 +Professionals,31.54 +Students,22.46 +Families,90.06 +Retirees,67.19 +Professionals,51.48 +Students,10.95 +Families,105.25 +Retirees,76.88 +Professionals,71.50 +Students,10.70 +Families,76.70 +Retirees,63.64 +Professionals,59.87 +Students,30.29 +Families,98.70 +Retirees,71.15 +Professionals,72.85 +Students,19.15 +Families,89.67 +Retirees,31.03 +Professionals,31.28 +Students,42.69 +Families,85.92 +Retirees,78.76 +Professionals,39.14 +Students,30.96 +Families,59.30 +Retirees,61.60 +Professionals,56.16 +Students,14.57 +Families,50.08 +Retirees,31.93 +Professionals,22.53 +Students,28.59 +Families,95.25 +Retirees,46.97 +Professionals,46.49 +Students,25.44 +Families,69.86 +Retirees,32.86 +Professionals,81.68 +Students,18.55 +Families,96.08 +Retirees,75.70 +Professionals,48.79 +Students,19.80 +Families,57.58 +Retirees,30.51 +Professionals,85.48 +Students,16.33 +Families,90.55 +Retirees,34.56 +Professionals,104.30 +Students,36.03 +Families,90.82 +Retirees,45.03 +Professionals,90.59 +Students,25.13 +Families,48.78 +Retirees,35.46 +Professionals,99.30 +Students,15.34 +Families,93.14 +Retirees,35.66 +Professionals,54.49 +Students,31.30 +Families,85.69 +Retirees,85.17 +Professionals,50.68 +Students,14.92 +Families,90.14 +Retirees,33.70 +Professionals,94.40 +Students,38.07 +Families,59.03 +Retirees,33.16 +Professionals,60.49 +Students,16.46 +Families,119.99 +Retirees,61.97 +Professionals,67.45 +Students,17.74 +Families,124.63 +Retirees,71.95 +Professionals,45.90 +Students,26.60 +Families,69.29 +Retirees,81.31 +Professionals,44.13 +Students,31.76 +Families,79.02 +Retirees,34.37 +Professionals,109.87 +Students,10.11 +Families,59.27 +Retirees,23.17 +Professionals,56.72 +Students,41.55 +Families,73.53 +Retirees,23.55 +Professionals,99.66 +Students,20.96 +Families,91.67 +Retirees,47.43 +Professionals,40.21 +Students,22.86 +Families,80.03 +Retirees,61.20 +Professionals,52.24 +Students,29.84 +Families,55.20 +Retirees,30.86 +Professionals,33.43 +Students,25.26 +Families,87.71 +Retirees,72.34 +Professionals,50.35 +Students,19.59 +Families,58.84 +Retirees,47.63 +Professionals,36.33 +Students,23.80 +Families,88.41 +Retirees,37.22 +Professionals,49.71 +Students,8.80 +Families,65.29 +Retirees,69.80 +Professionals,58.84 +Students,17.40 +Families,105.67 +Retirees,37.08 +Professionals,65.99 +Students,11.68 +Families,101.75 +Retirees,39.57 +Professionals,61.54 +Students,37.29 +Families,79.97 +Retirees,69.25 +Professionals,61.34 +Students,46.20 +Families,88.04 +Retirees,35.99 +Professionals,65.82 +Students,21.45 +Families,80.35 +Retirees,36.62 +Professionals,140.12 +Students,21.27 +Families,43.17 +Retirees,28.55 +Professionals,54.80 +Students,21.65 +Families,92.21 +Retirees,61.74 +Professionals,77.43 +Students,13.87 +Families,73.79 +Retirees,44.57 +Professionals,29.74 +Students,24.58 +Families,100.35 +Retirees,15.47 +Professionals,33.32 +Students,14.57 +Families,112.54 +Retirees,46.23 +Professionals,46.01 +Students,26.96 +Families,80.42 +Retirees,30.23 +Professionals,43.91 +Students,38.42 +Families,121.80 +Retirees,70.36 +Professionals,36.99 +Students,16.53 +Families,61.46 +Retirees,37.07 +Professionals,50.37 +Students,26.56 +Families,94.86 +Retirees,34.35 +Professionals,79.72 +Students,42.79 +Families,111.88 +Retirees,44.73 +Professionals,86.28 +Students,19.96 +Families,107.14 +Retirees,60.60 +Professionals,28.07 +Students,32.23 +Families,106.32 +Retirees,87.90 +Professionals,48.02 +Students,29.21 +Families,85.65 +Retirees,44.22 +Professionals,47.10 +Students,14.25 +Families,61.16 +Retirees,42.78 +Professionals,98.77 +Students,26.33 +Families,73.55 +Retirees,28.39 +Professionals,42.31 +Students,21.04 +Families,89.16 +Retirees,73.90 +Professionals,59.37 +Students,28.32 +Families,81.20 +Retirees,37.87 +Professionals,97.97 +Students,20.01 +Families,100.57 +Retirees,69.57 +Professionals,53.43 +Students,31.27 +Families,99.15 +Retirees,70.25 +Professionals,57.11 +Students,35.81 +Families,74.88 +Retirees,69.35 +Professionals,50.85 +Students,20.96 +Families,107.56 +Retirees,30.98 +Professionals,30.93 +Students,65.31 +Families,49.74 +Retirees,26.35 +Professionals,93.20 +Students,21.19 +Families,73.42 +Retirees,28.14 +Professionals,57.15 +Students,19.41 +Families,64.48 +Retirees,68.06 +Professionals,30.69 +Students,23.09 +Families,91.11 +Retirees,85.93 +Professionals,56.55 +Students,20.76 +Families,95.41 +Retirees,48.25 +Professionals,45.02 +Students,33.81 +Families,91.41 +Retirees,75.87 +Professionals,101.01 +Students,29.32 +Families,54.43 +Retirees,31.42 +Professionals,54.88 +Students,20.51 +Families,72.45 +Retirees,23.73 +Professionals,170.41 +Students,8.10 +Families,66.17 +Retirees,30.90 +Professionals,125.93 +Students,44.90 +Families,97.19 +Retirees,34.51 +Professionals,133.14 +Students,25.19 +Families,86.93 +Retirees,71.56 +Professionals,84.59 +Students,9.66 +Families,113.83 +Retirees,80.35 +Professionals,33.68 +Students,18.07 +Families,116.27 +Retirees,70.85 +Professionals,58.69 +Students,32.10 +Families,53.61 +Retirees,73.15 +Professionals,57.11 +Students,13.05 +Families,87.25 +Retirees,31.78 +Professionals,61.49 +Students,19.44 +Families,87.73 +Retirees,30.22 +Professionals,48.20 +Students,47.12 +Families,86.94 +Retirees,35.23 +Professionals,50.52 +Students,21.14 +Families,130.73 +Retirees,45.00 +Professionals,63.73 +Students,19.08 +Families,72.23 +Retirees,20.61 +Professionals,102.63 +Students,27.74 +Families,60.53 +Retirees,31.84 +Professionals,34.91 +Students,23.47 +Families,125.20 +Retirees,82.69 +Professionals,22.33 +Students,33.71 +Families,98.06 +Retirees,78.86 +Professionals,36.86 +Students,7.99 +Families,72.78 +Retirees,20.25 +Professionals,117.51 +Students,13.11 +Families,63.14 +Retirees,51.69 +Professionals,85.01 +Students,28.51 +Families,88.18 +Retirees,82.31 +Professionals,38.26 +Students,21.25 +Families,93.71 +Retirees,29.86 +Professionals,25.44 +Students,33.85 +Families,85.99 +Retirees,76.86 +Professionals,108.09 +Students,7.61 +Families,77.56 +Retirees,28.96 +Professionals,62.46 +Students,30.62 +Families,90.85 +Retirees,37.14 +Professionals,98.26 +Students,31.14 +Families,60.62 +Retirees,25.02 +Professionals,37.63 +Students,9.39 +Families,108.10 +Retirees,86.08 +Professionals,97.98 +Students,9.74 +Families,98.15 +Retirees,79.92 +Professionals,57.51 +Students,12.92 +Families,97.50 +Retirees,27.90 +Professionals,54.30 +Students,56.24 +Families,113.33 +Retirees,38.03 +Professionals,31.75 +Students,16.90 +Families,72.44 +Retirees,68.32 +Professionals,88.41 +Students,26.23 +Families,123.69 +Retirees,72.21 +Professionals,81.01 +Students,20.86 +Families,97.82 +Retirees,16.14 +Professionals,56.99 +Students,52.85 +Families,93.50 +Retirees,74.24 +Professionals,61.17 +Students,39.07 +Families,73.93 +Retirees,32.49 +Professionals,39.80 +Students,22.11 +Families,61.16 +Retirees,88.12 +Professionals,29.04 +Students,57.34 +Families,89.17 +Retirees,74.40 +Professionals,26.84 +Students,14.53 +Families,93.59 +Retirees,49.50 +Professionals,30.19 +Students,26.66 +Families,60.41 +Retirees,70.80 +Professionals,133.89 +Students,48.86 +Families,86.43 +Retirees,72.00 +Professionals,65.62 +Students,18.15 +Families,95.94 +Retirees,80.88 +Professionals,78.42 +Students,14.32 +Families,85.11 +Retirees,75.42 +Professionals,77.32 +Students,21.18 +Families,43.71 +Retirees,54.13 +Professionals,78.98 +Students,67.98 +Families,90.50 +Retirees,76.50 +Professionals,56.56 +Students,30.92 +Families,57.72 +Retirees,32.25 +Professionals,60.50 +Students,30.78 +Families,99.44 +Retirees,26.71 +Professionals,38.99 +Students,23.84 +Families,86.86 +Retirees,82.38 +Professionals,98.35 +Students,12.58 +Families,105.90 +Retirees,37.87 +Professionals,64.57 +Students,30.91 +Families,94.45 +Retirees,75.83 +Professionals,43.95 +Students,14.54 +Families,69.90 +Retirees,42.57 +Professionals,46.59 +Students,41.38 +Families,81.85 +Retirees,34.65 +Professionals,57.90 +Students,24.37 +Families,90.24 +Retirees,27.11 +Professionals,57.77 +Students,21.97 +Families,49.70 +Retirees,29.13 +Professionals,44.49 +Students,34.65 +Families,80.01 +Retirees,18.82 +Professionals,45.33 +Students,29.37 +Families,80.79 +Retirees,37.39 +Professionals,53.39 +Students,32.16 +Families,55.83 +Retirees,33.82 +Professionals,38.54 +Students,10.78 +Families,72.65 +Retirees,50.82 +Professionals,56.83 +Students,28.71 +Families,98.40 +Retirees,73.04 +Professionals,46.87 +Students,80.34 +Families,87.97 +Retirees,20.11 +Professionals,81.25 +Students,22.79 +Families,86.59 +Retirees,32.89 +Professionals,82.75 +Students,45.61 +Families,87.39 +Retirees,40.48 +Professionals,79.16 +Students,10.07 +Families,102.20 +Retirees,32.61 +Professionals,97.79 +Students,42.90 +Families,101.60 +Retirees,32.63 +Professionals,67.20 +Students,22.99 +Families,65.12 +Retirees,34.23 +Professionals,54.02 +Students,34.11 +Families,89.42 +Retirees,32.05 +Professionals,94.67 +Students,18.68 +Families,58.60 +Retirees,31.89 +Professionals,61.91 +Students,16.77 +Families,98.36 +Retirees,70.86 +Professionals,46.00 +Students,49.02 +Families,89.09 +Retirees,28.41 +Professionals,35.83 +Students,13.47 +Families,114.09 +Retirees,48.31 +Professionals,36.24 +Students,43.07 +Families,56.54 +Retirees,54.55 +Professionals,41.13 +Students,14.04 +Families,74.47 +Retirees,63.37 +Professionals,79.48 +Students,28.27 +Families,109.70 +Retirees,51.81 +Professionals,32.96 +Students,14.48 +Families,101.50 +Retirees,72.47 +Professionals,55.97 +Students,13.92 +Families,95.25 +Retirees,71.12 +Professionals,34.96 +Students,31.44 +Families,83.62 +Retirees,71.17 +Professionals,37.53 +Students,25.59 +Families,108.81 +Retirees,73.89 +Professionals,25.64 +Students,23.21 +Families,95.23 +Retirees,82.17 +Professionals,103.65 +Students,44.78 +Families,114.78 +Retirees,27.05 +Professionals,35.79 +Students,15.11 +Families,40.66 +Retirees,33.70 +Professionals,71.17 +Students,21.72 +Families,106.67 +Retirees,24.35 +Professionals,57.04 +Students,21.35 +Families,96.34 +Retirees,29.02 +Professionals,158.25 +Students,24.32 +Families,66.59 +Retirees,86.64 +Professionals,73.51 +Students,44.79 +Families,81.50 +Retirees,88.32 +Professionals,44.59 +Students,12.65 +Families,101.58 +Retirees,48.59 +Professionals,99.17 +Students,21.42 +Families,88.47 +Retirees,70.02 +Professionals,62.10 +Students,10.25 +Families,126.52 +Retirees,38.01 +Professionals,51.59 +Students,20.75 +Families,86.25 +Retirees,31.22 +Professionals,32.84 +Students,35.17 +Families,84.81 +Retirees,67.28 +Professionals,40.47 +Students,11.71 +Families,80.14 +Retirees,41.43 +Professionals,61.85 +Students,30.23 +Families,85.39 +Retirees,76.59 +Professionals,51.71 +Students,26.82 +Families,87.60 +Retirees,41.82 +Professionals,55.14 +Students,13.05 +Families,114.30 +Retirees,31.12 +Professionals,59.08 +Students,23.46 +Families,96.03 +Retirees,55.37 +Professionals,25.11 +Students,34.88 +Families,93.22 +Retirees,36.36 +Professionals,42.94 +Students,17.47 +Families,101.09 +Retirees,21.44 +Professionals,51.61 +Students,31.10 +Families,75.38 +Retirees,73.63 +Professionals,22.54 +Students,24.82 +Families,86.52 +Retirees,74.91 +Professionals,42.70 +Students,20.24 +Families,69.29 +Retirees,79.96 +Professionals,54.60 +Students,40.49 +Families,114.84 +Retirees,44.17 +Professionals,37.56 +Students,26.27 +Families,77.08 +Retirees,66.30 +Professionals,72.26 +Students,42.30 +Families,87.61 +Retirees,31.14 +Professionals,35.29 +Students,20.99 +Families,75.66 +Retirees,25.27 +Professionals,46.17 +Students,23.73 +Families,117.15 +Retirees,26.07 +Professionals,37.39 +Students,19.44 +Families,58.04 +Retirees,27.57 +Professionals,63.00 +Students,23.44 +Families,73.56 +Retirees,80.10 +Professionals,96.47 +Students,14.04 +Families,87.15 +Retirees,28.73 +Professionals,63.04 +Students,14.95 +Families,85.82 +Retirees,30.95 +Professionals,72.07 +Students,32.54 +Families,97.66 +Retirees,40.15 +Professionals,67.87 +Students,14.17 +Families,94.56 +Retirees,77.94 +Professionals,51.98 +Students,8.55 +Families,61.35 +Retirees,43.21 +Professionals,57.04 +Students,22.81 +Families,96.00 +Retirees,41.03 +Professionals,54.20 +Students,17.85 +Families,90.52 +Retirees,29.38 +Professionals,51.44 +Students,25.41 +Families,139.71 +Retirees,29.53 +Professionals,53.84 +Students,17.58 +Families,86.93 +Retirees,59.52 +Professionals,56.89 +Students,11.53 +Families,120.65 +Retirees,34.07 +Professionals,50.34 +Students,14.59 +Families,54.24 +Retirees,40.49 +Professionals,98.12 +Students,13.95 +Families,76.24 +Retirees,82.81 +Professionals,102.48 +Students,12.46 +Families,57.66 +Retirees,78.94 +Professionals,60.71 +Students,28.94 +Families,73.71 +Retirees,27.19 +Professionals,58.43 +Students,14.32 +Families,88.56 +Retirees,41.88 +Professionals,52.76 +Students,17.14 +Families,113.65 +Retirees,31.73 +Professionals,71.33 +Students,92.91 +Families,86.00 +Retirees,40.44 +Professionals,42.22 +Students,18.18 +Families,88.70 +Retirees,35.60 +Professionals,36.23 +Students,25.50 +Families,78.34 +Retirees,75.23 +Professionals,29.71 +Students,6.98 +Families,96.46 +Retirees,26.78 +Professionals,74.72 +Students,22.27 +Families,111.31 +Retirees,65.09 +Professionals,42.99 +Students,17.05 +Families,69.49 +Retirees,34.11 +Professionals,50.94 +Students,25.51 +Families,82.39 +Retirees,73.48 +Professionals,41.86 +Students,24.16 +Families,60.11 +Retirees,71.55 +Professionals,49.24 +Students,25.21 +Families,112.05 +Retirees,35.99 +Professionals,84.22 +Students,20.15 +Families,105.75 +Retirees,69.54 +Professionals,86.67 +Students,27.84 +Families,57.64 +Retirees,24.28 +Professionals,20.22 +Students,25.18 +Families,82.92 +Retirees,40.53 +Professionals,59.85 +Students,15.87 +Families,118.04 +Retirees,66.06 +Professionals,58.81 +Students,8.93 +Families,96.55 +Retirees,32.53 +Professionals,92.15 +Students,29.48 +Families,93.15 +Retirees,31.69 +Professionals,46.90 +Students,44.11 +Families,67.33 +Retirees,31.88 +Professionals,67.86 +Students,26.80 +Families,82.53 +Retirees,39.67 +Professionals,55.95 +Students,15.53 +Families,83.03 +Retirees,28.52 +Professionals,39.22 +Students,39.04 +Families,106.66 +Retirees,33.60 +Professionals,66.83 +Students,12.94 +Families,40.89 +Retirees,76.77 +Professionals,57.02 +Students,10.61 +Families,82.80 +Retirees,68.37 +Professionals,77.35 +Students,13.59 +Families,69.81 +Retirees,59.49 +Professionals,50.69 +Students,13.29 +Families,92.30 +Retirees,54.95 +Professionals,39.65 +Students,13.82 +Families,83.47 +Retirees,60.26 +Professionals,44.69 +Students,29.06 +Families,80.37 +Retirees,77.83 +Professionals,68.42 +Students,34.12 +Families,78.28 +Retirees,81.92 +Professionals,67.69 +Students,13.33 +Families,99.21 +Retirees,29.25 +Professionals,68.25 +Students,30.14 +Families,90.46 +Retirees,65.71 +Professionals,102.65 +Students,20.18 +Families,82.61 +Retirees,69.55 +Professionals,68.22 +Students,15.06 +Families,79.81 +Retirees,75.16 +Professionals,36.46 +Students,29.62 +Families,70.42 +Retirees,42.63 +Professionals,50.26 +Students,27.74 +Families,85.90 +Retirees,65.44 +Professionals,54.02 +Students,66.60 +Families,109.38 +Retirees,43.58 +Professionals,37.96 +Students,13.54 +Families,46.18 +Retirees,60.35 +Professionals,107.29 +Students,28.94 +Families,75.54 +Retirees,26.25 +Professionals,47.75 +Students,38.87 +Families,86.11 +Retirees,78.42 +Professionals,77.16 +Students,9.22 +Families,94.31 +Retirees,35.87 +Professionals,81.54 +Students,32.21 +Families,81.12 +Retirees,44.02 +Professionals,33.20 +Students,35.29 +Families,82.82 +Retirees,69.72 +Professionals,23.43 +Students,19.94 +Families,75.41 +Retirees,92.48 +Professionals,76.96 +Students,17.07 +Families,55.91 +Retirees,32.94 +Professionals,44.96 +Students,42.91 +Families,81.29 +Retirees,30.48 +Professionals,23.02 +Students,35.79 +Families,90.19 +Retirees,68.03 +Professionals,102.19 +Students,12.21 +Families,99.53 +Retirees,70.48 +Professionals,50.21 +Students,15.08 +Families,56.45 +Retirees,74.55 +Professionals,28.12 +Students,11.38 +Families,112.19 +Retirees,43.01 +Professionals,34.80 +Students,44.98 +Families,90.66 +Retirees,66.57 +Professionals,161.54 +Students,20.94 +Families,93.19 +Retirees,67.88 +Professionals,28.61 +Students,29.55 +Families,71.60 +Retirees,36.10 +Professionals,42.52 +Students,42.49 +Families,78.19 +Retirees,76.00 +Professionals,35.66 +Students,7.59 +Families,121.08 +Retirees,60.88 +Professionals,89.34 +Students,48.63 +Families,97.95 +Retirees,45.76 +Professionals,54.99 +Students,20.18 +Families,82.56 +Retirees,90.34 +Professionals,67.80 +Students,14.98 +Families,74.50 +Retirees,69.33 +Professionals,66.01 +Students,34.26 +Families,85.98 +Retirees,81.42 +Professionals,79.80 +Students,58.99 +Families,64.16 +Retirees,37.50 +Professionals,63.11 +Students,22.67 +Families,80.90 +Retirees,76.67 +Professionals,50.49 +Students,15.88 +Families,103.07 +Retirees,37.78 +Professionals,42.85 +Students,20.20 +Families,62.64 +Retirees,69.37 +Professionals,52.11 +Students,34.19 +Families,100.53 +Retirees,36.70 +Professionals,67.44 +Students,14.75 +Families,71.17 +Retirees,72.75 +Professionals,25.02 +Students,10.02 +Families,74.38 +Retirees,27.82 +Professionals,60.68 +Students,37.02 +Families,83.46 +Retirees,70.72 +Professionals,29.22 +Students,19.48 +Families,58.22 +Retirees,71.09 +Professionals,91.12 +Students,46.76 +Families,81.50 +Retirees,30.60 +Professionals,74.30 +Students,27.18 +Families,81.22 +Retirees,75.31 +Professionals,71.70 +Students,29.90 +Families,76.03 +Retirees,28.27 +Professionals,52.10 +Students,29.49 +Families,67.46 +Retirees,71.27 +Professionals,52.00 +Students,24.20 +Families,71.52 +Retirees,58.33 +Professionals,58.13 +Students,24.34 +Families,72.03 +Retirees,74.86 +Professionals,31.79 +Students,10.14 +Families,100.47 +Retirees,67.28 +Professionals,28.46 +Students,29.92 +Families,91.08 +Retirees,69.53 +Professionals,36.93 +Students,13.14 +Families,126.16 +Retirees,44.83 +Professionals,65.85 +Students,18.02 +Families,59.54 +Retirees,67.71 +Professionals,83.18 +Students,37.91 +Families,75.78 +Retirees,43.24 +Professionals,34.49 +Students,22.67 +Families,63.15 +Retirees,69.26 +Professionals,63.94 +Students,29.96 +Families,73.16 +Retirees,60.71 +Professionals,33.59 +Students,27.42 +Families,86.15 +Retirees,56.77 +Professionals,49.01 +Students,26.38 +Families,82.81 +Retirees,68.88 +Professionals,36.00 +Students,20.06 +Families,86.59 +Retirees,31.65 +Professionals,71.42 +Students,20.84 +Families,69.82 +Retirees,28.94 +Professionals,40.76 +Students,13.25 +Families,72.69 +Retirees,87.76 +Professionals,64.65 +Students,23.54 +Families,132.31 +Retirees,38.43 +Professionals,34.27 +Students,10.47 +Families,89.86 +Retirees,84.74 +Professionals,82.51 +Students,13.07 +Families,61.01 +Retirees,62.45 +Professionals,57.86 +Students,14.04 +Families,84.83 +Retirees,89.63 +Professionals,27.36 +Students,24.08 +Families,59.74 +Retirees,25.00 +Professionals,104.12 +Students,11.38 +Families,88.76 +Retirees,42.06 +Professionals,32.03 +Students,63.12 +Families,65.59 +Retirees,81.14 +Professionals,44.24 +Students,13.07 +Families,75.99 +Retirees,32.71 +Professionals,55.76 +Students,29.76 +Families,126.24 +Retirees,25.87 +Professionals,90.92 +Students,20.42 +Families,96.80 +Retirees,60.00 +Professionals,38.07 +Students,20.28 +Families,122.61 +Retirees,37.74 +Professionals,96.00 +Students,15.73 +Families,67.70 +Retirees,28.41 +Professionals,49.47 +Students,9.79 +Families,77.49 +Retirees,38.82 +Professionals,48.49 +Students,20.77 +Families,99.84 +Retirees,77.99 +Professionals,118.37 +Students,23.61 +Families,85.54 +Retirees,59.88 +Professionals,27.18 +Students,34.26 +Families,67.30 +Retirees,78.03 +Professionals,55.11 +Students,13.37 +Families,78.43 +Retirees,37.97 +Professionals,122.96 +Students,61.06 +Families,109.24 +Retirees,35.22 +Professionals,71.92 +Students,42.73 +Families,106.71 +Retirees,41.14 +Professionals,40.71 +Students,17.82 +Families,89.02 +Retirees,71.45 +Professionals,50.05 +Students,16.88 +Families,121.81 +Retirees,48.00 +Professionals,38.53 +Students,25.04 +Families,122.18 +Retirees,73.93 +Professionals,63.47 +Students,24.21 +Families,101.15 +Retirees,65.55 +Professionals,66.23 +Students,36.40 +Families,67.91 +Retirees,88.11 +Professionals,40.07 +Students,33.29 +Families,87.94 +Retirees,34.25 +Professionals,33.28 +Students,32.46 +Families,102.26 +Retirees,41.90 +Professionals,60.53 +Students,24.54 +Families,97.06 +Retirees,70.41 +Professionals,29.08 +Students,23.19 +Families,120.24 +Retirees,39.04 +Professionals,31.16 +Students,17.11 +Families,47.70 +Retirees,91.53 +Professionals,59.01 +Students,27.53 +Families,70.66 +Retirees,19.58 +Professionals,59.39 +Students,26.71 +Families,83.53 +Retirees,37.94 +Professionals,30.93 +Students,40.29 +Families,110.62 +Retirees,32.50 +Professionals,59.43 +Students,19.87 +Families,99.43 +Retirees,33.59 +Professionals,36.45 +Students,18.05 +Families,69.06 +Retirees,45.04 +Professionals,47.14 +Students,33.52 +Families,77.01 +Retirees,72.29 +Professionals,56.18 +Students,29.26 +Families,108.55 +Retirees,75.17 +Professionals,30.57 +Students,40.51 +Families,118.52 +Retirees,44.25 +Professionals,43.47 +Students,12.21 +Families,57.71 +Retirees,20.00 +Professionals,64.59 +Students,20.88 +Families,96.08 +Retirees,41.24 +Professionals,47.12 +Students,58.38 +Families,78.83 +Retirees,72.83 +Professionals,40.17 +Students,15.29 +Families,93.87 +Retirees,76.15 +Professionals,70.55 +Students,17.31 +Families,102.17 +Retirees,84.54 +Professionals,52.78 +Students,17.22 +Families,67.51 +Retirees,82.41 +Professionals,39.64 +Students,17.72 +Families,76.96 +Retirees,35.85 +Professionals,61.60 +Students,21.94 +Families,71.76 +Retirees,63.85 +Professionals,81.56 +Students,34.35 +Families,57.55 +Retirees,39.82 +Professionals,89.22 +Students,17.24 +Families,68.54 +Retirees,69.57 +Professionals,49.97 +Students,18.35 +Families,64.09 +Retirees,80.12 +Professionals,25.72 +Students,18.19 +Families,81.64 +Retirees,57.32 +Professionals,124.35 +Students,8.22 +Families,68.07 +Retirees,67.41 +Professionals,62.45 +Students,14.58 +Families,93.10 +Retirees,41.76 +Professionals,142.49 +Students,18.20 +Families,89.39 +Retirees,31.95 +Professionals,51.11 +Students,17.97 +Families,67.10 +Retirees,77.76 +Professionals,48.68 +Students,7.43 +Families,70.27 +Retirees,26.99 +Professionals,25.96 +Students,32.97 +Families,70.70 +Retirees,64.23 +Professionals,42.96 +Students,21.18 +Families,92.62 +Retirees,67.19 +Professionals,125.84 +Students,32.61 +Families,71.14 +Retirees,67.83 +Professionals,41.62 +Students,15.40 +Families,93.32 +Retirees,30.50 +Professionals,52.33 +Students,11.79 +Families,102.14 +Retirees,69.96 +Professionals,38.81 +Students,17.67 +Families,85.65 +Retirees,79.24 +Professionals,42.23 +Students,31.04 +Families,69.34 +Retirees,24.75 +Professionals,30.20 +Students,62.07 +Families,86.59 +Retirees,23.00 +Professionals,40.47 +Students,23.73 +Families,95.73 +Retirees,65.40 +Professionals,71.67 +Students,18.29 +Families,72.46 +Retirees,50.41 +Professionals,52.30 +Students,22.23 +Families,49.58 +Retirees,38.16 +Professionals,87.89 +Students,26.74 +Families,92.54 +Retirees,45.48 +Professionals,29.40 +Students,31.33 +Families,85.45 +Retirees,23.02 +Professionals,102.86 +Students,12.71 +Families,84.49 +Retirees,72.87 +Professionals,42.71 +Students,39.69 +Families,101.33 +Retirees,76.12 +Professionals,22.12 +Students,33.64 +Families,72.89 +Retirees,70.33 +Professionals,79.36 +Students,16.66 +Families,82.73 +Retirees,90.00 +Professionals,32.24 +Students,16.58 +Families,102.77 +Retirees,73.11 +Professionals,46.13 +Students,20.11 +Families,87.33 +Retirees,69.52 +Professionals,57.86 +Students,34.35 +Families,82.98 +Retirees,39.89 +Professionals,49.56 +Students,16.14 +Families,113.06 +Retirees,20.93 +Professionals,84.41 +Students,20.91 +Families,90.89 +Retirees,29.02 +Professionals,70.29 +Students,21.54 +Families,93.67 +Retirees,35.31 +Professionals,47.75 +Students,29.93 +Families,109.44 +Retirees,34.19 +Professionals,42.09 +Students,16.47 +Families,75.92 +Retirees,44.11 +Professionals,86.15 +Students,19.18 +Families,106.12 +Retirees,36.36 +Professionals,27.38 +Students,19.09 +Families,69.30 +Retirees,27.23 +Professionals,79.14 +Students,15.60 +Families,108.70 +Retirees,55.83 +Professionals,22.93 +Students,33.09 +Families,65.72 +Retirees,74.78 +Professionals,67.19 +Students,16.06 +Families,110.43 +Retirees,74.50 +Professionals,38.62 +Students,26.97 +Families,80.03 +Retirees,31.99 +Professionals,26.04 +Students,18.58 +Families,67.22 +Retirees,23.31 +Professionals,49.58 +Students,27.19 +Families,69.54 +Retirees,82.26 +Professionals,52.83 +Students,19.22 +Families,79.25 +Retirees,73.54 +Professionals,31.68 +Students,20.72 +Families,64.57 +Retirees,22.83 +Professionals,37.93 +Students,19.64 +Families,93.23 +Retirees,74.86 +Professionals,61.90 +Students,19.38 +Families,104.75 +Retirees,36.77 +Professionals,34.16 +Students,9.63 +Families,68.51 +Retirees,26.98 +Professionals,103.67 +Students,13.66 +Families,66.07 +Retirees,59.81 +Professionals,46.78 +Students,23.07 +Families,115.17 +Retirees,20.04 +Professionals,47.79 +Students,17.75 +Families,92.10 +Retirees,73.18 +Professionals,45.93 +Students,26.74 +Families,79.02 +Retirees,37.46 +Professionals,92.23 +Students,14.86 +Families,90.66 +Retirees,37.54 +Professionals,59.18 +Students,27.52 +Families,98.92 +Retirees,34.29 +Professionals,41.60 +Students,17.51 +Families,72.76 +Retirees,44.97 +Professionals,65.76 +Students,23.10 +Families,83.71 +Retirees,34.23 +Professionals,52.10 +Students,43.08 +Families,78.52 +Retirees,31.95 +Professionals,38.13 +Students,46.36 +Families,73.39 +Retirees,24.14 +Professionals,33.82 +Students,22.13 +Families,116.55 +Retirees,26.88 +Professionals,45.06 +Students,15.85 +Families,95.09 +Retirees,25.05 +Professionals,28.47 +Students,42.59 +Families,88.29 +Retirees,92.29 +Professionals,40.92 +Students,32.12 +Families,107.41 +Retirees,89.12 +Professionals,45.22 +Students,24.95 +Families,91.45 +Retirees,59.42 +Professionals,40.89 +Students,15.02 +Families,93.25 +Retirees,71.28 +Professionals,52.88 +Students,11.57 +Families,49.73 +Retirees,84.31 +Professionals,56.84 +Students,9.33 +Families,89.68 +Retirees,59.95 +Professionals,64.13 +Students,13.54 +Families,69.31 +Retirees,19.97 +Professionals,95.65 +Students,14.20 +Families,109.91 +Retirees,31.19 +Professionals,27.78 +Students,20.86 +Families,118.53 +Retirees,59.15 +Professionals,119.92 +Students,23.43 +Families,64.61 +Retirees,28.15 +Professionals,59.56 +Students,27.31 +Families,78.33 +Retirees,67.46 +Professionals,40.28 +Students,20.41 +Families,65.47 +Retirees,69.99 +Professionals,33.86 +Students,38.53 +Families,93.02 +Retirees,62.84 +Professionals,52.87 +Students,17.74 +Families,75.83 +Retirees,80.23 +Professionals,47.67 +Students,38.29 +Families,83.77 +Retirees,36.15 +Professionals,53.13 +Students,48.07 +Families,61.63 +Retirees,46.59 +Professionals,26.37 +Students,34.73 +Families,80.13 +Retirees,72.82 +Professionals,45.20 +Students,18.78 +Families,96.23 +Retirees,43.28 +Professionals,63.59 +Students,41.59 +Families,86.97 +Retirees,69.93 +Professionals,57.67 +Students,10.07 +Families,91.80 +Retirees,24.17 +Professionals,56.65 +Students,20.73 +Families,93.51 +Retirees,68.97 +Professionals,78.06 +Students,24.71 +Families,66.60 +Retirees,63.04 +Professionals,127.24 +Students,14.83 +Families,68.44 +Retirees,63.66 +Professionals,40.44 +Students,55.60 +Families,96.26 +Retirees,80.24 +Professionals,67.81 +Students,42.44 +Families,81.67 +Retirees,54.00 +Professionals,66.93 +Students,19.48 +Families,107.11 +Retirees,30.07 +Professionals,30.47 +Students,13.48 +Families,104.96 +Retirees,33.99 +Professionals,26.78 +Students,12.56 +Families,94.11 +Retirees,31.56 +Professionals,57.14 +Students,34.32 +Families,87.11 +Retirees,65.55 +Professionals,38.66 +Students,26.65 +Families,80.57 +Retirees,37.54 +Professionals,83.43 +Students,16.67 +Families,98.72 +Retirees,75.11 +Professionals,66.20 +Students,12.77 +Families,102.25 +Retirees,35.07 +Professionals,55.64 +Students,10.59 +Families,81.36 +Retirees,74.81 +Professionals,99.09 +Students,14.24 +Families,76.90 +Retirees,35.19 +Professionals,33.75 +Students,25.75 +Families,78.60 +Retirees,75.82 +Professionals,55.08 +Students,62.76 +Families,49.66 +Retirees,32.81 +Professionals,92.75 +Students,46.69 +Families,100.17 +Retirees,79.16 +Professionals,59.67 +Students,43.18 +Families,74.86 +Retirees,71.59 +Professionals,84.04 +Students,19.67 +Families,109.29 +Retirees,71.76 +Professionals,49.00 +Students,13.99 +Families,74.46 +Retirees,88.54 +Professionals,51.91 +Students,30.47 +Families,93.63 +Retirees,31.33 +Professionals,70.71 +Students,28.66 +Families,90.63 +Retirees,26.08 +Professionals,124.04 +Students,14.08 +Families,76.64 +Retirees,56.09 +Professionals,70.61 +Students,18.13 +Families,101.30 +Retirees,49.16 +Professionals,34.39 +Students,27.94 +Families,91.61 +Retirees,58.19 +Professionals,92.08 +Students,30.82 +Families,127.10 +Retirees,59.72 +Professionals,42.82 +Students,25.61 +Families,72.88 +Retirees,45.58 +Professionals,55.43 +Students,20.83 +Families,47.25 +Retirees,86.01 +Professionals,37.88 +Students,24.49 +Families,95.31 +Retirees,49.19 +Professionals,56.75 +Students,41.19 +Families,105.79 +Retirees,39.49 +Professionals,23.15 +Students,16.95 +Families,79.04 +Retirees,47.37 +Professionals,43.73 +Students,45.09 +Families,94.21 +Retirees,71.43 +Professionals,92.06 +Students,19.94 +Families,78.22 +Retirees,64.90 +Professionals,36.16 +Students,20.26 +Families,68.44 +Retirees,63.82 +Professionals,127.95 +Students,44.54 +Families,97.03 +Retirees,73.63 +Professionals,48.33 +Students,27.39 +Families,77.14 +Retirees,42.25 +Professionals,75.16 +Students,61.41 +Families,97.27 +Retirees,62.02 +Professionals,40.67 +Students,33.31 +Families,81.63 +Retirees,34.99 +Professionals,70.73 +Students,27.64 +Families,100.34 +Retirees,37.90 +Professionals,74.40 +Students,18.62 +Families,67.82 +Retirees,23.13 +Professionals,28.17 +Students,18.13 +Families,102.41 +Retirees,82.75 +Professionals,45.65 +Students,18.63 +Families,69.31 +Retirees,66.75 +Professionals,97.03 +Students,26.98 +Families,99.96 +Retirees,47.26 +Professionals,40.29 +Students,18.55 +Families,50.10 +Retirees,30.47 +Professionals,40.71 +Students,13.87 +Families,86.48 +Retirees,35.63 +Professionals,66.88 +Students,19.89 +Families,73.98 +Retirees,74.53 +Professionals,77.34 +Students,25.96 +Families,91.33 +Retirees,32.61 +Professionals,86.43 +Students,23.55 +Families,86.02 +Retirees,37.97 +Professionals,32.83 +Students,14.56 +Families,75.28 +Retirees,14.97 +Professionals,59.54 +Students,23.67 +Families,83.85 +Retirees,31.93 +Professionals,40.28 +Students,19.76 +Families,78.86 +Retirees,25.46 +Professionals,37.91 +Students,14.82 +Families,85.40 +Retirees,32.84 +Professionals,36.03 +Students,20.22 +Families,85.52 +Retirees,78.44 +Professionals,25.23 +Students,16.99 +Families,94.45 +Retirees,52.50 +Professionals,43.06 +Students,29.39 +Families,109.14 +Retirees,71.36 +Professionals,42.31 +Students,23.71 +Families,66.66 +Retirees,74.48 +Professionals,34.52 +Students,20.79 +Families,105.11 +Retirees,77.51 +Professionals,93.47 +Students,29.14 +Families,60.39 +Retirees,40.55 +Professionals,57.07 +Students,22.72 +Families,100.79 +Retirees,29.81 +Professionals,81.71 +Students,18.35 +Families,96.05 +Retirees,73.36 +Professionals,151.55 +Students,22.14 +Families,116.88 +Retirees,37.95 +Professionals,60.14 +Students,25.67 +Families,78.32 +Retirees,73.00 +Professionals,37.62 +Students,26.40 +Families,103.86 +Retirees,77.00 +Professionals,27.37 +Students,19.08 +Families,79.46 +Retirees,85.02 +Professionals,46.48 +Students,23.64 +Families,111.24 +Retirees,89.65 +Professionals,39.79 +Students,20.39 +Families,105.40 +Retirees,82.91 +Professionals,95.08 +Students,15.27 +Families,113.55 +Retirees,43.30 +Professionals,68.63 +Students,51.75 +Families,125.23 +Retirees,88.42 +Professionals,51.60 +Students,17.31 +Families,75.10 +Retirees,81.24 +Professionals,74.25 +Students,62.72 +Families,77.78 +Retirees,35.51 +Professionals,76.63 +Students,12.58 +Families,93.04 +Retirees,37.96 +Professionals,39.30 +Students,29.11 +Families,80.79 +Retirees,78.30 +Professionals,64.79 +Students,23.04 +Families,67.61 +Retirees,19.51 +Professionals,42.50 +Students,27.64 +Families,86.86 +Retirees,33.32 +Professionals,68.98 +Students,12.35 +Families,60.63 +Retirees,36.87 +Professionals,144.60 +Students,12.23 +Families,77.64 +Retirees,27.85 +Professionals,57.59 +Students,13.80 +Families,120.51 +Retirees,80.02 +Professionals,66.29 +Students,46.38 +Families,60.35 +Retirees,35.50 +Professionals,129.81 +Students,29.50 +Families,83.88 +Retirees,62.89 +Professionals,61.65 +Students,46.24 +Families,103.04 +Retirees,30.89 +Professionals,119.57 +Students,13.56 +Families,82.87 +Retirees,20.60 +Professionals,46.18 +Students,14.25 +Families,92.02 +Retirees,36.71 +Professionals,50.94 +Students,28.81 +Families,75.20 +Retirees,42.02 +Professionals,59.14 +Students,12.20 +Families,105.75 +Retirees,71.04 +Professionals,41.44 +Students,18.26 +Families,95.35 +Retirees,80.83 +Professionals,64.57 +Students,19.47 +Families,87.89 +Retirees,84.56 +Professionals,45.30 +Students,9.40 +Families,67.98 +Retirees,74.58 +Professionals,56.41 +Students,23.44 +Families,83.94 +Retirees,77.08 +Professionals,40.84 +Students,32.27 +Families,100.02 +Retirees,69.45 +Professionals,45.14 +Students,13.90 +Families,96.70 +Retirees,27.18 +Professionals,56.97 +Students,17.21 +Families,93.19 +Retirees,44.68 +Professionals,69.76 +Students,40.42 +Families,69.99 +Retirees,52.60 +Professionals,53.34 +Students,31.90 +Families,91.15 +Retirees,29.43 +Professionals,28.91 +Students,11.15 +Families,90.34 +Retirees,36.99 +Professionals,33.63 +Students,9.25 +Families,92.92 +Retirees,38.69 +Professionals,99.75 +Students,18.30 +Families,58.85 +Retirees,77.33 +Professionals,74.26 +Students,8.37 +Families,85.05 +Retirees,74.67 +Professionals,58.89 +Students,18.10 +Families,95.56 +Retirees,32.25 +Professionals,105.26 +Students,13.13 +Families,93.95 +Retirees,67.15 +Professionals,66.09 +Students,11.95 +Families,66.13 +Retirees,38.27 +Professionals,76.23 +Students,39.57 +Families,71.55 +Retirees,37.52 +Professionals,43.51 +Students,36.89 +Families,94.19 +Retirees,76.23 +Professionals,27.90 +Students,32.88 +Families,92.95 +Retirees,39.50 +Professionals,35.89 +Students,17.11 +Families,76.61 +Retirees,66.60 +Professionals,42.24 +Students,28.46 +Families,80.44 +Retirees,58.78 +Professionals,39.91 +Students,16.83 +Families,79.03 +Retirees,25.18 +Professionals,54.92 +Students,35.59 +Families,110.12 +Retirees,25.08 +Professionals,110.40 +Students,16.92 +Families,116.13 +Retirees,35.66 +Professionals,118.37 +Students,25.98 +Families,77.09 +Retirees,55.59 +Professionals,54.27 +Students,20.23 +Families,60.29 +Retirees,71.52 +Professionals,111.82 +Students,12.64 +Families,83.00 +Retirees,31.12 +Professionals,39.66 +Students,33.27 +Families,87.89 +Retirees,41.88 +Professionals,44.34 +Students,23.65 +Families,92.43 +Retirees,79.36 +Professionals,47.64 +Students,28.54 +Families,99.42 +Retirees,68.81 +Professionals,47.71 +Students,7.51 +Families,99.50 +Retirees,43.19 +Professionals,41.18 +Students,31.81 +Families,66.27 +Retirees,85.46 +Professionals,106.76 +Students,46.05 +Families,92.13 +Retirees,31.30 +Professionals,63.73 +Students,44.03 +Families,99.04 +Retirees,16.75 +Professionals,64.83 +Students,10.18 +Families,65.32 +Retirees,34.29 +Professionals,29.01 +Students,28.06 +Families,119.95 +Retirees,36.50 +Professionals,33.61 +Students,24.79 +Families,87.51 +Retirees,26.41 +Professionals,37.25 +Students,32.56 +Families,74.29 +Retirees,83.78 +Professionals,25.97 +Students,25.03 +Families,68.13 +Retirees,29.14 +Professionals,127.28 +Students,40.55 +Families,85.53 +Retirees,62.93 +Professionals,114.39 +Students,11.55 +Families,74.18 +Retirees,67.02 +Professionals,54.68 +Students,30.21 +Families,84.21 +Retirees,34.02 +Professionals,69.45 +Students,15.09 +Families,79.32 +Retirees,73.89 +Professionals,89.53 +Students,32.11 +Families,90.65 +Retirees,27.71 +Professionals,50.93 +Students,36.52 +Families,75.58 +Retirees,40.29 +Professionals,40.63 +Students,26.13 +Families,82.93 +Retirees,61.58 +Professionals,47.58 +Students,36.30 +Families,105.93 +Retirees,50.91 +Professionals,71.24 +Students,31.42 +Families,92.96 +Retirees,55.15 +Professionals,79.37 +Students,41.32 +Families,29.25 +Retirees,69.19 +Professionals,53.20 +Students,27.90 +Families,57.58 +Retirees,33.05 +Professionals,24.12 +Students,32.08 +Families,107.58 +Retirees,40.47 +Professionals,108.77 +Students,25.78 +Families,82.95 +Retirees,34.13 +Professionals,33.32 +Students,11.71 +Families,68.06 +Retirees,64.66 +Professionals,52.76 +Students,8.63 +Families,131.75 +Retirees,27.51 +Professionals,49.30 +Students,19.69 +Families,122.29 +Retirees,83.01 +Professionals,28.47 +Students,74.84 +Families,70.47 +Retirees,67.93 +Professionals,49.57 +Students,22.17 +Families,88.77 +Retirees,42.04 +Professionals,83.17 +Students,19.01 +Families,92.64 +Retirees,67.23 +Professionals,94.31 +Students,30.30 +Families,107.03 +Retirees,38.99 +Professionals,79.65 +Students,11.69 +Families,58.21 +Retirees,77.41 +Professionals,36.39 +Students,23.66 +Families,88.23 +Retirees,63.42 +Professionals,28.73 +Students,12.77 +Families,65.77 +Retirees,53.89 +Professionals,47.29 +Students,32.57 +Families,62.67 +Retirees,77.20 +Professionals,82.46 +Students,19.02 +Families,78.16 +Retirees,32.47 +Professionals,67.57 +Students,26.54 +Families,86.89 +Retirees,63.76 +Professionals,42.04 +Students,30.24 +Families,106.41 +Retirees,61.04 +Professionals,77.01 +Students,30.62 +Families,99.96 +Retirees,78.07 +Professionals,42.89 +Students,13.28 +Families,78.25 +Retirees,73.12 +Professionals,73.89 +Students,16.62 +Families,90.40 +Retirees,59.17 +Professionals,45.92 +Students,10.71 +Families,128.27 +Retirees,32.31 +Professionals,46.86 +Students,26.83 +Families,87.26 +Retirees,35.13 +Professionals,47.60 +Students,10.80 +Families,107.84 +Retirees,29.43 +Professionals,92.14 +Students,12.01 +Families,116.70 +Retirees,71.94 +Professionals,31.51 +Students,11.62 +Families,83.60 +Retirees,86.03 +Professionals,64.99 +Students,23.69 +Families,76.75 +Retirees,27.09 +Professionals,54.22 +Students,12.08 +Families,77.48 +Retirees,72.76 +Professionals,77.56 +Students,38.42 +Families,87.86 +Retirees,71.49 +Professionals,51.68 +Students,22.89 +Families,77.92 +Retirees,56.04 +Professionals,33.12 +Students,12.68 +Families,81.72 +Retirees,80.94 +Professionals,41.46 +Students,19.78 +Families,76.62 +Retirees,82.60 +Professionals,56.36 +Students,19.52 +Families,61.25 +Retirees,44.39 +Professionals,67.68 +Students,16.19 +Families,78.96 +Retirees,32.36 +Professionals,61.81 +Students,22.74 +Families,73.14 +Retirees,26.22 +Professionals,131.59 +Students,17.93 +Families,111.31 +Retirees,27.90 +Professionals,47.77 +Students,11.85 +Families,83.47 +Retirees,35.49 +Professionals,104.97 +Students,17.29 +Families,34.94 +Retirees,30.59 +Professionals,32.44 +Students,21.41 +Families,100.47 +Retirees,40.92 +Professionals,42.00 +Students,22.49 +Families,53.26 +Retirees,49.81 +Professionals,33.24 +Students,23.21 +Families,76.44 +Retirees,43.24 +Professionals,89.71 +Students,13.09 +Families,57.97 +Retirees,83.90 +Professionals,70.87 +Students,23.48 +Families,74.88 +Retirees,34.16 +Professionals,66.52 +Students,26.30 +Families,59.29 +Retirees,29.50 +Professionals,114.81 +Students,46.14 +Families,81.99 +Retirees,76.99 +Professionals,36.59 +Students,29.03 +Families,89.62 +Retirees,72.63 +Professionals,64.46 +Students,30.48 +Families,85.68 +Retirees,77.84 +Professionals,69.04 +Students,10.32 +Families,104.92 +Retirees,34.47 +Professionals,42.50 +Students,16.74 +Families,19.81 +Retirees,31.51 +Professionals,78.40 +Students,12.00 +Families,97.02 +Retirees,72.76 +Professionals,55.79 +Students,59.65 +Families,93.33 +Retirees,40.58 +Professionals,40.36 +Students,13.57 +Families,63.48 +Retirees,27.85 +Professionals,55.90 +Students,14.24 +Families,93.57 +Retirees,26.16 +Professionals,76.47 +Students,15.87 +Families,116.40 +Retirees,29.74 +Professionals,23.16 +Students,16.44 +Families,61.65 +Retirees,34.01 +Professionals,83.52 +Students,8.78 +Families,110.22 +Retirees,67.71 +Professionals,99.38 +Students,15.49 +Families,90.03 +Retirees,67.06 +Professionals,54.17 +Students,17.86 +Families,96.83 +Retirees,58.86 +Professionals,34.45 +Students,26.70 +Families,124.13 +Retirees,50.75 +Professionals,31.43 +Students,22.20 +Families,91.17 +Retirees,31.06 +Professionals,40.44 +Students,30.91 +Families,115.20 +Retirees,86.17 +Professionals,89.57 +Students,21.38 +Families,86.21 +Retirees,56.91 +Professionals,76.33 +Students,14.50 +Families,71.77 +Retirees,27.04 +Professionals,46.48 +Students,22.01 +Families,110.17 +Retirees,94.17 +Professionals,64.28 +Students,53.51 +Families,102.68 +Retirees,31.78 +Professionals,44.19 +Students,21.16 +Families,91.50 +Retirees,36.09 +Professionals,64.95 +Students,51.95 +Families,69.50 +Retirees,42.32 +Professionals,39.93 +Students,24.27 +Families,96.80 +Retirees,28.31 +Professionals,92.35 +Students,9.85 +Families,71.31 +Retirees,65.72 +Professionals,64.36 +Students,28.77 +Families,47.46 +Retirees,27.97 +Professionals,41.95 +Students,33.05 +Families,53.74 +Retirees,78.07 +Professionals,51.79 +Students,20.23 +Families,97.86 +Retirees,24.92 +Professionals,54.77 +Students,17.10 +Families,91.45 +Retirees,64.00 +Professionals,75.75 +Students,41.91 +Families,49.63 +Retirees,64.68 +Professionals,37.48 +Students,22.22 +Families,62.43 +Retirees,65.32 +Professionals,112.75 +Students,26.71 +Families,65.83 +Retirees,66.30 +Professionals,52.39 +Students,17.96 +Families,82.11 +Retirees,79.22 +Professionals,47.43 +Students,14.02 +Families,97.98 +Retirees,73.20 +Professionals,173.06 +Students,18.41 +Families,86.44 +Retirees,43.61 +Professionals,113.15 +Students,6.77 +Families,86.80 +Retirees,27.95 +Professionals,56.72 +Students,44.58 +Families,62.78 +Retirees,73.02 +Professionals,42.28 +Students,24.80 +Families,105.11 +Retirees,35.14 +Professionals,94.24 +Students,32.34 +Families,89.36 +Retirees,78.54 +Professionals,40.18 +Students,20.14 +Families,84.46 +Retirees,76.15 +Professionals,61.36 +Students,31.88 +Families,68.35 +Retirees,69.22 +Professionals,47.20 +Students,15.58 +Families,108.67 +Retirees,34.79 +Professionals,47.03 +Students,16.72 +Families,89.77 +Retirees,66.94 +Professionals,88.97 +Students,47.72 +Families,69.54 +Retirees,24.67 +Professionals,83.66 diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-renamed/case.json b/agents/evals/fixtures/cases/violin-basic-letsplot-renamed/case.json new file mode 100644 index 00000000000..17be262e45f --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-renamed/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "violin-basic", + "library": "letsplot", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "category", + "column": "segment" + }, + { + "role": "value", + "column": "basket_eur" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "renamed", + "synthetic", + "renamed-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, renamed)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-renamed/data.csv b/agents/evals/fixtures/cases/violin-basic-letsplot-renamed/data.csv new file mode 100644 index 00000000000..f88e643436c --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-renamed/data.csv @@ -0,0 +1,401 @@ +segment,basket_eur +Students,14.07 +Families,98.65 +Retirees,63.77 +Professionals,54.23 +Students,7.03 +Families,89.88 +Retirees,34.77 +Professionals,50.78 +Students,17.69 +Families,134.75 +Retirees,30.60 +Professionals,62.20 +Students,14.92 +Families,115.29 +Retirees,21.91 +Professionals,67.09 +Students,19.17 +Families,110.73 +Retirees,28.02 +Professionals,54.26 +Students,21.51 +Families,79.17 +Retirees,39.53 +Professionals,43.37 +Students,10.80 +Families,49.56 +Retirees,76.84 +Professionals,74.95 +Students,14.05 +Families,46.72 +Retirees,49.78 +Professionals,41.90 +Students,27.46 +Families,76.29 +Retirees,80.98 +Professionals,68.49 +Students,23.83 +Families,56.71 +Retirees,64.30 +Professionals,97.86 +Students,32.82 +Families,70.32 +Retirees,80.67 +Professionals,35.59 +Students,19.89 +Families,76.06 +Retirees,72.90 +Professionals,70.40 +Students,14.21 +Families,81.29 +Retirees,25.11 +Professionals,51.93 +Students,18.37 +Families,85.01 +Retirees,40.22 +Professionals,44.24 +Students,17.86 +Families,93.67 +Retirees,43.56 +Professionals,91.76 +Students,33.28 +Families,102.97 +Retirees,41.06 +Professionals,100.33 +Students,33.28 +Families,79.74 +Retirees,62.88 +Professionals,27.55 +Students,41.19 +Families,107.49 +Retirees,31.48 +Professionals,121.52 +Students,14.52 +Families,73.63 +Retirees,71.69 +Professionals,46.11 +Students,28.97 +Families,105.38 +Retirees,66.12 +Professionals,41.76 +Students,24.41 +Families,106.45 +Retirees,32.50 +Professionals,22.59 +Students,22.51 +Families,89.34 +Retirees,84.89 +Professionals,39.16 +Students,34.24 +Families,100.71 +Retirees,37.17 +Professionals,24.74 +Students,16.87 +Families,82.53 +Retirees,23.43 +Professionals,31.85 +Students,24.66 +Families,94.35 +Retirees,78.00 +Professionals,152.39 +Students,21.58 +Families,109.73 +Retirees,77.38 +Professionals,68.12 +Students,23.87 +Families,99.19 +Retirees,32.37 +Professionals,40.72 +Students,16.47 +Families,88.25 +Retirees,15.73 +Professionals,58.83 +Students,52.98 +Families,89.35 +Retirees,28.87 +Professionals,61.93 +Students,19.83 +Families,93.21 +Retirees,30.55 +Professionals,37.59 +Students,36.60 +Families,67.98 +Retirees,35.47 +Professionals,42.28 +Students,36.05 +Families,78.23 +Retirees,58.26 +Professionals,45.58 +Students,35.68 +Families,113.11 +Retirees,35.93 +Professionals,44.83 +Students,14.89 +Families,92.40 +Retirees,81.76 +Professionals,37.09 +Students,33.40 +Families,61.53 +Retirees,35.59 +Professionals,60.61 +Students,16.87 +Families,102.93 +Retirees,87.60 +Professionals,92.86 +Students,21.85 +Families,77.35 +Retirees,33.76 +Professionals,92.10 +Students,22.59 +Families,73.61 +Retirees,32.53 +Professionals,35.00 +Students,29.83 +Families,83.79 +Retirees,79.26 +Professionals,21.34 +Students,23.59 +Families,112.80 +Retirees,75.69 +Professionals,34.25 +Students,43.61 +Families,96.90 +Retirees,36.36 +Professionals,33.52 +Students,20.37 +Families,83.75 +Retirees,66.22 +Professionals,35.49 +Students,20.87 +Families,99.93 +Retirees,43.49 +Professionals,40.22 +Students,14.19 +Families,86.40 +Retirees,87.92 +Professionals,104.52 +Students,33.49 +Families,91.78 +Retirees,33.64 +Professionals,68.52 +Students,22.35 +Families,64.32 +Retirees,34.77 +Professionals,59.34 +Students,24.31 +Families,85.21 +Retirees,71.52 +Professionals,50.91 +Students,17.60 +Families,82.48 +Retirees,64.85 +Professionals,58.28 +Students,22.13 +Families,96.84 +Retirees,72.02 +Professionals,57.37 +Students,32.78 +Families,91.75 +Retirees,34.03 +Professionals,42.43 +Students,31.11 +Families,119.85 +Retirees,22.88 +Professionals,59.60 +Students,12.00 +Families,70.55 +Retirees,60.50 +Professionals,31.89 +Students,41.34 +Families,78.24 +Retirees,41.48 +Professionals,30.75 +Students,12.81 +Families,77.10 +Retirees,32.53 +Professionals,134.60 +Students,14.69 +Families,88.97 +Retirees,61.03 +Professionals,30.28 +Students,23.28 +Families,75.89 +Retirees,31.14 +Professionals,42.42 +Students,26.10 +Families,82.91 +Retirees,41.48 +Professionals,33.35 +Students,9.96 +Families,103.82 +Retirees,71.73 +Professionals,85.63 +Students,35.51 +Families,78.14 +Retirees,62.85 +Professionals,52.55 +Students,53.34 +Families,75.90 +Retirees,38.24 +Professionals,75.53 +Students,23.10 +Families,81.99 +Retirees,69.59 +Professionals,73.99 +Students,34.39 +Families,77.69 +Retirees,69.91 +Professionals,71.06 +Students,32.25 +Families,65.71 +Retirees,57.54 +Professionals,37.26 +Students,20.66 +Families,70.86 +Retirees,64.51 +Professionals,159.68 +Students,34.78 +Families,100.48 +Retirees,75.07 +Professionals,31.08 +Students,14.78 +Families,95.59 +Retirees,71.47 +Professionals,54.85 +Students,4.32 +Families,70.61 +Retirees,74.01 +Professionals,20.50 +Students,42.51 +Families,75.42 +Retirees,32.80 +Professionals,81.24 +Students,23.32 +Families,61.32 +Retirees,19.58 +Professionals,33.11 +Students,57.91 +Families,93.61 +Retirees,94.53 +Professionals,43.36 +Students,14.60 +Families,71.45 +Retirees,41.11 +Professionals,60.85 +Students,14.60 +Families,84.60 +Retirees,85.70 +Professionals,77.59 +Students,13.23 +Families,89.29 +Retirees,77.35 +Professionals,53.24 +Students,16.74 +Families,59.05 +Retirees,27.50 +Professionals,70.45 +Students,21.61 +Families,100.58 +Retirees,71.62 +Professionals,79.96 +Students,29.96 +Families,106.74 +Retirees,39.18 +Professionals,90.13 +Students,37.92 +Families,95.36 +Retirees,62.76 +Professionals,75.71 +Students,16.92 +Families,83.62 +Retirees,83.22 +Professionals,65.27 +Students,31.29 +Families,106.47 +Retirees,29.12 +Professionals,31.34 +Students,19.09 +Families,106.04 +Retirees,38.32 +Professionals,60.85 +Students,35.39 +Families,105.89 +Retirees,37.83 +Professionals,22.69 +Students,35.81 +Families,88.24 +Retirees,38.00 +Professionals,35.94 +Students,15.70 +Families,73.16 +Retirees,69.72 +Professionals,38.93 +Students,14.32 +Families,83.62 +Retirees,42.96 +Professionals,76.75 +Students,9.38 +Families,61.61 +Retirees,80.80 +Professionals,52.17 +Students,27.20 +Families,108.44 +Retirees,40.82 +Professionals,140.54 +Students,17.99 +Families,86.15 +Retirees,32.49 +Professionals,41.02 +Students,42.45 +Families,73.40 +Retirees,26.13 +Professionals,75.92 +Students,15.44 +Families,93.99 +Retirees,29.36 +Professionals,107.85 +Students,23.13 +Families,101.09 +Retirees,47.31 +Professionals,47.67 +Students,10.26 +Families,130.57 +Retirees,54.57 +Professionals,28.86 +Students,13.84 +Families,76.21 +Retirees,69.06 +Professionals,36.92 +Students,23.10 +Families,98.27 +Retirees,35.71 +Professionals,29.50 +Students,31.28 +Families,100.72 +Retirees,65.58 +Professionals,39.39 +Students,11.18 +Families,126.08 +Retirees,71.56 +Professionals,31.64 +Students,31.11 +Families,96.31 +Retirees,74.67 +Professionals,29.91 +Students,28.16 +Families,104.00 +Retirees,24.53 +Professionals,53.33 +Students,35.20 +Families,65.06 +Retirees,13.32 +Professionals,59.25 +Students,43.60 +Families,71.94 +Retirees,25.58 +Professionals,72.96 +Students,13.80 +Families,119.24 +Retirees,72.04 +Professionals,36.08 diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-x10/case.json b/agents/evals/fixtures/cases/violin-basic-letsplot-x10/case.json new file mode 100644 index 00000000000..db32c0f4807 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "violin-basic", + "library": "letsplot", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "category", + "column": "Customer Segment" + }, + { + "role": "value", + "column": "Basket Value (EUR)" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, x10)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-letsplot-x10/data.csv b/agents/evals/fixtures/cases/violin-basic-letsplot-x10/data.csv new file mode 100644 index 00000000000..abbd5353be7 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-letsplot-x10/data.csv @@ -0,0 +1,401 @@ +Customer Segment,Basket Value (EUR) +Students,140.71 +Families,986.53 +Retirees,637.72 +Professionals,542.28 +Students,70.26 +Families,898.84 +Retirees,347.68 +Professionals,507.84 +Students,176.87 +Families,1347.47 +Retirees,305.97 +Professionals,621.98 +Students,149.17 +Families,1152.86 +Retirees,219.08 +Professionals,670.90 +Students,191.66 +Families,1107.32 +Retirees,280.16 +Professionals,542.65 +Students,215.11 +Families,791.70 +Retirees,395.27 +Professionals,433.72 +Students,107.97 +Families,495.61 +Retirees,768.35 +Professionals,749.53 +Students,140.49 +Families,467.17 +Retirees,497.76 +Professionals,419.03 +Students,274.56 +Families,762.89 +Retirees,809.81 +Professionals,684.87 +Students,238.26 +Families,567.08 +Retirees,642.99 +Professionals,978.59 +Students,328.25 +Families,703.24 +Retirees,806.71 +Professionals,355.95 +Students,198.95 +Families,760.62 +Retirees,729.01 +Professionals,704.04 +Students,142.09 +Families,812.89 +Retirees,251.09 +Professionals,519.29 +Students,183.72 +Families,850.15 +Retirees,402.25 +Professionals,442.42 +Students,178.57 +Families,936.74 +Retirees,435.65 +Professionals,917.62 +Students,332.76 +Families,1029.66 +Retirees,410.57 +Professionals,1003.26 +Students,332.82 +Families,797.39 +Retirees,628.77 +Professionals,275.52 +Students,411.87 +Families,1074.88 +Retirees,314.83 +Professionals,1215.17 +Students,145.18 +Families,736.26 +Retirees,716.93 +Professionals,461.07 +Students,289.74 +Families,1053.81 +Retirees,661.15 +Professionals,417.59 +Students,244.11 +Families,1064.46 +Retirees,324.99 +Professionals,225.87 +Students,225.10 +Families,893.45 +Retirees,848.91 +Professionals,391.62 +Students,342.36 +Families,1007.05 +Retirees,371.74 +Professionals,247.40 +Students,168.71 +Families,825.31 +Retirees,234.31 +Professionals,318.54 +Students,246.59 +Families,943.48 +Retirees,779.96 +Professionals,1523.89 +Students,215.76 +Families,1097.25 +Retirees,773.82 +Professionals,681.16 +Students,238.67 +Families,991.91 +Retirees,323.74 +Professionals,407.21 +Students,164.74 +Families,882.47 +Retirees,157.30 +Professionals,588.27 +Students,529.82 +Families,893.51 +Retirees,288.67 +Professionals,619.32 +Students,198.29 +Families,932.10 +Retirees,305.53 +Professionals,375.88 +Students,365.97 +Families,679.81 +Retirees,354.71 +Professionals,422.84 +Students,360.49 +Families,782.27 +Retirees,582.59 +Professionals,455.79 +Students,356.81 +Families,1131.06 +Retirees,359.31 +Professionals,448.26 +Students,148.93 +Families,923.99 +Retirees,817.62 +Professionals,370.86 +Students,334.02 +Families,615.33 +Retirees,355.89 +Professionals,606.06 +Students,168.67 +Families,1029.31 +Retirees,876.03 +Professionals,928.56 +Students,218.52 +Families,773.49 +Retirees,337.57 +Professionals,921.04 +Students,225.93 +Families,736.15 +Retirees,325.28 +Professionals,350.01 +Students,298.32 +Families,837.86 +Retirees,792.59 +Professionals,213.40 +Students,235.92 +Families,1128.00 +Retirees,756.87 +Professionals,342.49 +Students,436.10 +Families,969.04 +Retirees,363.61 +Professionals,335.23 +Students,203.66 +Families,837.48 +Retirees,662.20 +Professionals,354.93 +Students,208.75 +Families,999.32 +Retirees,434.87 +Professionals,402.16 +Students,141.93 +Families,864.00 +Retirees,879.21 +Professionals,1045.16 +Students,334.87 +Families,917.85 +Retirees,336.39 +Professionals,685.20 +Students,223.52 +Families,643.16 +Retirees,347.66 +Professionals,593.41 +Students,243.10 +Families,852.06 +Retirees,715.20 +Professionals,509.06 +Students,176.00 +Families,824.77 +Retirees,648.48 +Professionals,582.82 +Students,221.32 +Families,968.37 +Retirees,720.18 +Professionals,573.74 +Students,327.77 +Families,917.53 +Retirees,340.32 +Professionals,424.34 +Students,311.11 +Families,1198.52 +Retirees,228.81 +Professionals,595.97 +Students,119.97 +Families,705.53 +Retirees,604.97 +Professionals,318.89 +Students,413.40 +Families,782.39 +Retirees,414.82 +Professionals,307.52 +Students,128.13 +Families,770.97 +Retirees,325.29 +Professionals,1345.98 +Students,146.90 +Families,889.71 +Retirees,610.32 +Professionals,302.84 +Students,232.77 +Families,758.94 +Retirees,311.45 +Professionals,424.25 +Students,261.04 +Families,829.08 +Retirees,414.77 +Professionals,333.49 +Students,99.57 +Families,1038.18 +Retirees,717.35 +Professionals,856.30 +Students,355.13 +Families,781.36 +Retirees,628.47 +Professionals,525.46 +Students,533.38 +Families,758.96 +Retirees,382.37 +Professionals,755.27 +Students,231.03 +Families,819.90 +Retirees,695.94 +Professionals,739.94 +Students,343.92 +Families,776.86 +Retirees,699.05 +Professionals,710.57 +Students,322.53 +Families,657.07 +Retirees,575.38 +Professionals,372.56 +Students,206.61 +Families,708.64 +Retirees,645.12 +Professionals,1596.83 +Students,347.82 +Families,1004.79 +Retirees,750.69 +Professionals,310.82 +Students,147.83 +Families,955.90 +Retirees,714.71 +Professionals,548.52 +Students,43.21 +Families,706.06 +Retirees,740.05 +Professionals,205.02 +Students,425.10 +Families,754.18 +Retirees,327.99 +Professionals,812.42 +Students,233.18 +Families,613.24 +Retirees,195.79 +Professionals,331.07 +Students,579.06 +Families,936.10 +Retirees,945.29 +Professionals,433.58 +Students,146.04 +Families,714.48 +Retirees,411.10 +Professionals,608.48 +Students,145.97 +Families,846.03 +Retirees,857.05 +Professionals,775.91 +Students,132.25 +Families,892.91 +Retirees,773.48 +Professionals,532.39 +Students,167.43 +Families,590.46 +Retirees,275.05 +Professionals,704.46 +Students,216.06 +Families,1005.83 +Retirees,716.16 +Professionals,799.60 +Students,299.63 +Families,1067.41 +Retirees,391.82 +Professionals,901.35 +Students,379.18 +Families,953.61 +Retirees,627.57 +Professionals,757.11 +Students,169.17 +Families,836.16 +Retirees,832.18 +Professionals,652.74 +Students,312.94 +Families,1064.68 +Retirees,291.18 +Professionals,313.43 +Students,190.94 +Families,1060.42 +Retirees,383.16 +Professionals,608.46 +Students,353.88 +Families,1058.88 +Retirees,378.34 +Professionals,226.94 +Students,358.14 +Families,882.36 +Retirees,380.05 +Professionals,359.41 +Students,156.99 +Families,731.62 +Retirees,697.22 +Professionals,389.33 +Students,143.22 +Families,836.22 +Retirees,429.65 +Professionals,767.50 +Students,93.80 +Families,616.14 +Retirees,807.99 +Professionals,521.67 +Students,272.03 +Families,1084.45 +Retirees,408.15 +Professionals,1405.39 +Students,179.92 +Families,861.50 +Retirees,324.93 +Professionals,410.24 +Students,424.48 +Families,734.04 +Retirees,261.30 +Professionals,759.23 +Students,154.41 +Families,939.92 +Retirees,293.63 +Professionals,1078.47 +Students,231.28 +Families,1010.88 +Retirees,473.10 +Professionals,476.68 +Students,102.57 +Families,1305.73 +Retirees,545.69 +Professionals,288.55 +Students,138.36 +Families,762.11 +Retirees,690.56 +Professionals,369.20 +Students,230.97 +Families,982.70 +Retirees,357.05 +Professionals,294.96 +Students,312.80 +Families,1007.21 +Retirees,655.76 +Professionals,393.87 +Students,111.85 +Families,1260.84 +Retirees,715.56 +Professionals,316.42 +Students,311.08 +Families,963.14 +Retirees,746.66 +Professionals,299.06 +Students,281.64 +Families,1040.00 +Retirees,245.28 +Professionals,533.34 +Students,352.01 +Families,650.60 +Retirees,133.19 +Professionals,592.52 +Students,435.99 +Families,719.42 +Retirees,255.80 +Professionals,729.56 +Students,137.97 +Families,1192.38 +Retirees,720.36 +Professionals,360.81 diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-date/case.json b/agents/evals/fixtures/cases/violin-basic-pygal-date/case.json new file mode 100644 index 00000000000..78b7390f49e --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-date/case.json @@ -0,0 +1,26 @@ +{ + "spec_id": "violin-basic", + "library": "pygal", + "locale": "en", + "perturbation": "date", + "bindings": [ + { + "role": "category", + "column": "Customer Segment" + }, + { + "role": "value", + "column": "Basket Value (EUR)" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "date", + "synthetic", + "dd.mm.yyyy", + "iso-date", + "unbound-dates" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, date)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-date/data.csv b/agents/evals/fixtures/cases/violin-basic-pygal-date/data.csv new file mode 100644 index 00000000000..0f22af43f20 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-date/data.csv @@ -0,0 +1,401 @@ +Customer Segment,Basket Value (EUR),Purchase Date,Synced On +Students,14.07,26.06.2026,2026-06-26 +Families,98.65,05.04.2026,2026-04-06 +Retirees,63.77,08.03.2026,2026-03-08 +Professionals,54.23,02.05.2026,2026-05-02 +Students,7.03,08.01.2026,2026-01-09 +Families,89.88,25.02.2026,2026-03-01 +Retirees,34.77,30.05.2026,2026-06-01 +Professionals,50.78,17.04.2026,2026-04-18 +Students,17.69,09.04.2026,2026-04-12 +Families,134.75,31.05.2026,2026-06-03 +Retirees,30.60,27.02.2026,2026-03-03 +Professionals,62.20,05.04.2026,2026-04-06 +Students,14.92,19.05.2026,2026-05-21 +Families,115.29,03.05.2026,2026-05-05 +Retirees,21.91,13.04.2026,2026-04-13 +Professionals,67.09,08.06.2026,2026-06-09 +Students,19.17,12.06.2026,2026-06-14 +Families,110.73,11.04.2026,2026-04-11 +Retirees,28.02,14.06.2026,2026-06-15 +Professionals,54.26,27.01.2026,2026-01-31 +Students,21.51,11.01.2026,2026-01-15 +Families,79.17,26.01.2026,2026-01-30 +Retirees,39.53,05.05.2026,2026-05-06 +Professionals,43.37,04.05.2026,2026-05-07 +Students,10.80,05.03.2026,2026-03-09 +Families,49.56,01.07.2026,2026-07-02 +Retirees,76.84,11.05.2026,2026-05-11 +Professionals,74.95,19.04.2026,2026-04-19 +Students,14.05,15.01.2026,2026-01-17 +Families,46.72,07.06.2026,2026-06-08 +Retirees,49.78,02.05.2026,2026-05-03 +Professionals,41.90,12.06.2026,2026-06-13 +Students,27.46,26.06.2026,2026-06-27 +Families,76.29,22.02.2026,2026-02-24 +Retirees,80.98,13.01.2026,2026-01-16 +Professionals,68.49,20.01.2026,2026-01-22 +Students,23.83,20.03.2026,2026-03-20 +Families,56.71,13.03.2026,2026-03-17 +Retirees,64.30,22.03.2026,2026-03-22 +Professionals,97.86,12.01.2026,2026-01-14 +Students,32.82,20.03.2026,2026-03-24 +Families,70.32,09.05.2026,2026-05-09 +Retirees,80.67,17.06.2026,2026-06-20 +Professionals,35.59,16.06.2026,2026-06-19 +Students,19.89,24.04.2026,2026-04-26 +Families,76.06,21.05.2026,2026-05-24 +Retirees,72.90,13.01.2026,2026-01-13 +Professionals,70.40,20.01.2026,2026-01-23 +Students,14.21,07.01.2026,2026-01-07 +Families,81.29,06.05.2026,2026-05-07 +Retirees,25.11,27.05.2026,2026-05-27 +Professionals,51.93,07.01.2026,2026-01-07 +Students,18.37,17.06.2026,2026-06-21 +Families,85.01,02.05.2026,2026-05-05 +Retirees,40.22,06.04.2026,2026-04-10 +Professionals,44.24,23.01.2026,2026-01-23 +Students,17.86,30.01.2026,2026-02-03 +Families,93.67,27.03.2026,2026-03-27 +Retirees,43.56,31.05.2026,2026-06-01 +Professionals,91.76,17.01.2026,2026-01-18 +Students,33.28,12.04.2026,2026-04-12 +Families,102.97,13.02.2026,2026-02-13 +Retirees,41.06,20.01.2026,2026-01-23 +Professionals,100.33,09.03.2026,2026-03-10 +Students,33.28,19.06.2026,2026-06-19 +Families,79.74,02.02.2026,2026-02-05 +Retirees,62.88,14.04.2026,2026-04-14 +Professionals,27.55,20.04.2026,2026-04-20 +Students,41.19,28.03.2026,2026-03-29 +Families,107.49,12.01.2026,2026-01-14 +Retirees,31.48,27.02.2026,2026-02-27 +Professionals,121.52,02.06.2026,2026-06-06 +Students,14.52,20.06.2026,2026-06-24 +Families,73.63,23.06.2026,2026-06-25 +Retirees,71.69,03.05.2026,2026-05-03 +Professionals,46.11,03.02.2026,2026-02-06 +Students,28.97,23.03.2026,2026-03-27 +Families,105.38,01.05.2026,2026-05-04 +Retirees,66.12,16.04.2026,2026-04-18 +Professionals,41.76,06.03.2026,2026-03-09 +Students,24.41,09.06.2026,2026-06-11 +Families,106.45,10.06.2026,2026-06-12 +Retirees,32.50,05.06.2026,2026-06-07 +Professionals,22.59,18.04.2026,2026-04-19 +Students,22.51,28.06.2026,2026-06-30 +Families,89.34,14.06.2026,2026-06-15 +Retirees,84.89,24.01.2026,2026-01-24 +Professionals,39.16,21.06.2026,2026-06-22 +Students,34.24,19.04.2026,2026-04-20 +Families,100.71,20.03.2026,2026-03-24 +Retirees,37.17,19.03.2026,2026-03-19 +Professionals,24.74,11.02.2026,2026-02-12 +Students,16.87,09.02.2026,2026-02-10 +Families,82.53,18.04.2026,2026-04-19 +Retirees,23.43,29.03.2026,2026-03-29 +Professionals,31.85,07.03.2026,2026-03-09 +Students,24.66,21.02.2026,2026-02-23 +Families,94.35,13.04.2026,2026-04-15 +Retirees,78.00,18.05.2026,2026-05-20 +Professionals,152.39,09.03.2026,2026-03-10 +Students,21.58,04.02.2026,2026-02-04 +Families,109.73,22.05.2026,2026-05-24 +Retirees,77.38,22.01.2026,2026-01-23 +Professionals,68.12,12.04.2026,2026-04-12 +Students,23.87,27.01.2026,2026-01-27 +Families,99.19,28.01.2026,2026-01-31 +Retirees,32.37,23.04.2026,2026-04-23 +Professionals,40.72,19.03.2026,2026-03-22 +Students,16.47,30.04.2026,2026-05-04 +Families,88.25,26.03.2026,2026-03-26 +Retirees,15.73,16.03.2026,2026-03-16 +Professionals,58.83,12.02.2026,2026-02-15 +Students,52.98,17.05.2026,2026-05-20 +Families,89.35,28.06.2026,2026-06-29 +Retirees,28.87,06.05.2026,2026-05-09 +Professionals,61.93,03.02.2026,2026-02-07 +Students,19.83,17.06.2026,2026-06-18 +Families,93.21,19.04.2026,2026-04-20 +Retirees,30.55,07.02.2026,2026-02-11 +Professionals,37.59,23.04.2026,2026-04-24 +Students,36.60,07.06.2026,2026-06-10 +Families,67.98,23.05.2026,2026-05-23 +Retirees,35.47,18.02.2026,2026-02-18 +Professionals,42.28,29.03.2026,2026-03-30 +Students,36.05,09.02.2026,2026-02-13 +Families,78.23,29.01.2026,2026-01-30 +Retirees,58.26,16.04.2026,2026-04-17 +Professionals,45.58,19.05.2026,2026-05-21 +Students,35.68,11.01.2026,2026-01-15 +Families,113.11,08.05.2026,2026-05-12 +Retirees,35.93,12.06.2026,2026-06-14 +Professionals,44.83,22.06.2026,2026-06-26 +Students,14.89,27.03.2026,2026-03-31 +Families,92.40,03.05.2026,2026-05-05 +Retirees,81.76,20.02.2026,2026-02-21 +Professionals,37.09,07.04.2026,2026-04-08 +Students,33.40,28.03.2026,2026-03-28 +Families,61.53,11.02.2026,2026-02-13 +Retirees,35.59,13.06.2026,2026-06-13 +Professionals,60.61,24.06.2026,2026-06-25 +Students,16.87,19.06.2026,2026-06-21 +Families,102.93,13.05.2026,2026-05-14 +Retirees,87.60,14.06.2026,2026-06-15 +Professionals,92.86,24.06.2026,2026-06-28 +Students,21.85,28.04.2026,2026-04-29 +Families,77.35,08.05.2026,2026-05-10 +Retirees,33.76,10.04.2026,2026-04-11 +Professionals,92.10,16.01.2026,2026-01-18 +Students,22.59,05.01.2026,2026-01-06 +Families,73.61,17.04.2026,2026-04-20 +Retirees,32.53,01.03.2026,2026-03-01 +Professionals,35.00,21.06.2026,2026-06-23 +Students,29.83,02.03.2026,2026-03-06 +Families,83.79,20.04.2026,2026-04-20 +Retirees,79.26,12.04.2026,2026-04-16 +Professionals,21.34,11.02.2026,2026-02-12 +Students,23.59,17.06.2026,2026-06-17 +Families,112.80,28.02.2026,2026-03-04 +Retirees,75.69,25.02.2026,2026-02-28 +Professionals,34.25,05.01.2026,2026-01-09 +Students,43.61,31.03.2026,2026-03-31 +Families,96.90,29.03.2026,2026-03-29 +Retirees,36.36,04.06.2026,2026-06-05 +Professionals,33.52,22.05.2026,2026-05-24 +Students,20.37,08.05.2026,2026-05-12 +Families,83.75,05.04.2026,2026-04-09 +Retirees,66.22,25.03.2026,2026-03-27 +Professionals,35.49,18.02.2026,2026-02-19 +Students,20.87,14.05.2026,2026-05-18 +Families,99.93,12.06.2026,2026-06-15 +Retirees,43.49,10.05.2026,2026-05-12 +Professionals,40.22,12.04.2026,2026-04-13 +Students,14.19,28.03.2026,2026-03-30 +Families,86.40,23.03.2026,2026-03-27 +Retirees,87.92,04.06.2026,2026-06-05 +Professionals,104.52,09.04.2026,2026-04-12 +Students,33.49,17.04.2026,2026-04-20 +Families,91.78,10.02.2026,2026-02-10 +Retirees,33.64,17.01.2026,2026-01-21 +Professionals,68.52,30.01.2026,2026-02-02 +Students,22.35,29.05.2026,2026-05-30 +Families,64.32,08.05.2026,2026-05-08 +Retirees,34.77,26.03.2026,2026-03-29 +Professionals,59.34,28.03.2026,2026-03-29 +Students,24.31,22.04.2026,2026-04-24 +Families,85.21,10.04.2026,2026-04-12 +Retirees,71.52,11.01.2026,2026-01-11 +Professionals,50.91,19.03.2026,2026-03-21 +Students,17.60,11.06.2026,2026-06-14 +Families,82.48,08.03.2026,2026-03-10 +Retirees,64.85,13.02.2026,2026-02-17 +Professionals,58.28,08.03.2026,2026-03-08 +Students,22.13,17.04.2026,2026-04-18 +Families,96.84,28.05.2026,2026-05-31 +Retirees,72.02,22.02.2026,2026-02-22 +Professionals,57.37,04.06.2026,2026-06-08 +Students,32.78,21.03.2026,2026-03-23 +Families,91.75,16.06.2026,2026-06-16 +Retirees,34.03,28.03.2026,2026-04-01 +Professionals,42.43,06.06.2026,2026-06-09 +Students,31.11,04.06.2026,2026-06-08 +Families,119.85,07.02.2026,2026-02-07 +Retirees,22.88,16.05.2026,2026-05-17 +Professionals,59.60,30.03.2026,2026-03-31 +Students,12.00,05.01.2026,2026-01-05 +Families,70.55,19.06.2026,2026-06-23 +Retirees,60.50,27.01.2026,2026-01-31 +Professionals,31.89,19.02.2026,2026-02-20 +Students,41.34,24.06.2026,2026-06-27 +Families,78.24,26.02.2026,2026-03-01 +Retirees,41.48,26.06.2026,2026-06-27 +Professionals,30.75,30.04.2026,2026-04-30 +Students,12.81,16.05.2026,2026-05-19 +Families,77.10,14.03.2026,2026-03-14 +Retirees,32.53,17.01.2026,2026-01-17 +Professionals,134.60,31.03.2026,2026-04-03 +Students,14.69,13.01.2026,2026-01-17 +Families,88.97,24.06.2026,2026-06-27 +Retirees,61.03,18.02.2026,2026-02-22 +Professionals,30.28,01.02.2026,2026-02-05 +Students,23.28,29.01.2026,2026-01-30 +Families,75.89,29.05.2026,2026-05-30 +Retirees,31.14,15.01.2026,2026-01-16 +Professionals,42.42,20.06.2026,2026-06-20 +Students,26.10,18.01.2026,2026-01-18 +Families,82.91,22.02.2026,2026-02-24 +Retirees,41.48,17.01.2026,2026-01-19 +Professionals,33.35,23.04.2026,2026-04-25 +Students,9.96,11.01.2026,2026-01-13 +Families,103.82,03.03.2026,2026-03-07 +Retirees,71.73,24.03.2026,2026-03-26 +Professionals,85.63,02.03.2026,2026-03-06 +Students,35.51,17.02.2026,2026-02-21 +Families,78.14,18.01.2026,2026-01-21 +Retirees,62.85,24.06.2026,2026-06-24 +Professionals,52.55,16.04.2026,2026-04-16 +Students,53.34,20.05.2026,2026-05-20 +Families,75.90,17.06.2026,2026-06-18 +Retirees,38.24,24.06.2026,2026-06-24 +Professionals,75.53,19.02.2026,2026-02-23 +Students,23.10,08.05.2026,2026-05-09 +Families,81.99,31.01.2026,2026-01-31 +Retirees,69.59,30.04.2026,2026-05-01 +Professionals,73.99,04.04.2026,2026-04-05 +Students,34.39,27.01.2026,2026-01-31 +Families,77.69,23.06.2026,2026-06-27 +Retirees,69.91,16.01.2026,2026-01-19 +Professionals,71.06,01.04.2026,2026-04-04 +Students,32.25,18.04.2026,2026-04-18 +Families,65.71,17.04.2026,2026-04-19 +Retirees,57.54,15.06.2026,2026-06-18 +Professionals,37.26,22.06.2026,2026-06-24 +Students,20.66,14.05.2026,2026-05-17 +Families,70.86,11.06.2026,2026-06-15 +Retirees,64.51,06.06.2026,2026-06-08 +Professionals,159.68,20.02.2026,2026-02-23 +Students,34.78,21.03.2026,2026-03-25 +Families,100.48,18.01.2026,2026-01-21 +Retirees,75.07,26.04.2026,2026-04-26 +Professionals,31.08,28.06.2026,2026-07-01 +Students,14.78,19.01.2026,2026-01-20 +Families,95.59,13.06.2026,2026-06-14 +Retirees,71.47,14.03.2026,2026-03-15 +Professionals,54.85,29.06.2026,2026-07-02 +Students,4.32,27.03.2026,2026-03-31 +Families,70.61,13.05.2026,2026-05-17 +Retirees,74.01,23.02.2026,2026-02-27 +Professionals,20.50,20.02.2026,2026-02-23 +Students,42.51,04.06.2026,2026-06-04 +Families,75.42,03.03.2026,2026-03-07 +Retirees,32.80,24.05.2026,2026-05-28 +Professionals,81.24,16.03.2026,2026-03-19 +Students,23.32,28.02.2026,2026-03-01 +Families,61.32,18.02.2026,2026-02-18 +Retirees,19.58,18.04.2026,2026-04-19 +Professionals,33.11,10.02.2026,2026-02-14 +Students,57.91,28.01.2026,2026-02-01 +Families,93.61,30.05.2026,2026-06-03 +Retirees,94.53,25.01.2026,2026-01-27 +Professionals,43.36,31.01.2026,2026-02-03 +Students,14.60,09.04.2026,2026-04-13 +Families,71.45,26.04.2026,2026-04-29 +Retirees,41.11,13.02.2026,2026-02-15 +Professionals,60.85,10.05.2026,2026-05-14 +Students,14.60,01.06.2026,2026-06-04 +Families,84.60,11.06.2026,2026-06-12 +Retirees,85.70,11.01.2026,2026-01-11 +Professionals,77.59,25.05.2026,2026-05-27 +Students,13.23,21.01.2026,2026-01-22 +Families,89.29,12.06.2026,2026-06-14 +Retirees,77.35,20.01.2026,2026-01-24 +Professionals,53.24,26.04.2026,2026-04-29 +Students,16.74,30.06.2026,2026-06-30 +Families,59.05,19.02.2026,2026-02-19 +Retirees,27.50,24.02.2026,2026-02-25 +Professionals,70.45,26.05.2026,2026-05-27 +Students,21.61,23.05.2026,2026-05-24 +Families,100.58,27.01.2026,2026-01-29 +Retirees,71.62,09.01.2026,2026-01-12 +Professionals,79.96,04.04.2026,2026-04-08 +Students,29.96,07.03.2026,2026-03-11 +Families,106.74,08.01.2026,2026-01-12 +Retirees,39.18,24.04.2026,2026-04-24 +Professionals,90.13,14.05.2026,2026-05-16 +Students,37.92,19.01.2026,2026-01-21 +Families,95.36,25.02.2026,2026-02-25 +Retirees,62.76,18.01.2026,2026-01-20 +Professionals,75.71,10.03.2026,2026-03-10 +Students,16.92,10.02.2026,2026-02-12 +Families,83.62,11.03.2026,2026-03-13 +Retirees,83.22,28.04.2026,2026-04-28 +Professionals,65.27,19.04.2026,2026-04-22 +Students,31.29,27.03.2026,2026-03-28 +Families,106.47,02.03.2026,2026-03-04 +Retirees,29.12,01.02.2026,2026-02-01 +Professionals,31.34,05.05.2026,2026-05-08 +Students,19.09,19.05.2026,2026-05-23 +Families,106.04,08.04.2026,2026-04-09 +Retirees,38.32,02.03.2026,2026-03-04 +Professionals,60.85,01.06.2026,2026-06-04 +Students,35.39,28.03.2026,2026-03-30 +Families,105.89,11.02.2026,2026-02-15 +Retirees,37.83,08.03.2026,2026-03-08 +Professionals,22.69,01.07.2026,2026-07-03 +Students,35.81,26.03.2026,2026-03-26 +Families,88.24,06.05.2026,2026-05-09 +Retirees,38.00,15.03.2026,2026-03-17 +Professionals,35.94,12.06.2026,2026-06-16 +Students,15.70,15.02.2026,2026-02-18 +Families,73.16,02.02.2026,2026-02-02 +Retirees,69.72,12.02.2026,2026-02-15 +Professionals,38.93,31.01.2026,2026-02-03 +Students,14.32,07.04.2026,2026-04-09 +Families,83.62,11.02.2026,2026-02-15 +Retirees,42.96,30.04.2026,2026-05-04 +Professionals,76.75,24.04.2026,2026-04-25 +Students,9.38,10.04.2026,2026-04-14 +Families,61.61,05.05.2026,2026-05-06 +Retirees,80.80,13.02.2026,2026-02-17 +Professionals,52.17,01.06.2026,2026-06-03 +Students,27.20,27.02.2026,2026-03-02 +Families,108.44,09.05.2026,2026-05-10 +Retirees,40.82,07.02.2026,2026-02-11 +Professionals,140.54,20.02.2026,2026-02-22 +Students,17.99,15.05.2026,2026-05-19 +Families,86.15,31.05.2026,2026-06-01 +Retirees,32.49,06.01.2026,2026-01-08 +Professionals,41.02,02.07.2026,2026-07-03 +Students,42.45,29.01.2026,2026-01-29 +Families,73.40,23.06.2026,2026-06-23 +Retirees,26.13,06.02.2026,2026-02-09 +Professionals,75.92,29.06.2026,2026-07-02 +Students,15.44,13.02.2026,2026-02-16 +Families,93.99,08.05.2026,2026-05-11 +Retirees,29.36,27.04.2026,2026-04-30 +Professionals,107.85,09.01.2026,2026-01-12 +Students,23.13,04.02.2026,2026-02-08 +Families,101.09,27.03.2026,2026-03-27 +Retirees,47.31,03.06.2026,2026-06-05 +Professionals,47.67,19.04.2026,2026-04-22 +Students,10.26,01.04.2026,2026-04-05 +Families,130.57,25.01.2026,2026-01-26 +Retirees,54.57,12.05.2026,2026-05-13 +Professionals,28.86,20.04.2026,2026-04-20 +Students,13.84,26.06.2026,2026-06-27 +Families,76.21,09.03.2026,2026-03-11 +Retirees,69.06,02.07.2026,2026-07-06 +Professionals,36.92,18.01.2026,2026-01-20 +Students,23.10,07.06.2026,2026-06-10 +Families,98.27,18.01.2026,2026-01-21 +Retirees,35.71,19.01.2026,2026-01-21 +Professionals,29.50,25.03.2026,2026-03-29 +Students,31.28,14.03.2026,2026-03-18 +Families,100.72,14.03.2026,2026-03-16 +Retirees,65.58,25.06.2026,2026-06-25 +Professionals,39.39,12.06.2026,2026-06-12 +Students,11.18,27.03.2026,2026-03-28 +Families,126.08,01.03.2026,2026-03-05 +Retirees,71.56,20.04.2026,2026-04-20 +Professionals,31.64,09.03.2026,2026-03-12 +Students,31.11,09.01.2026,2026-01-13 +Families,96.31,28.05.2026,2026-05-28 +Retirees,74.67,04.03.2026,2026-03-05 +Professionals,29.91,01.04.2026,2026-04-03 +Students,28.16,05.01.2026,2026-01-06 +Families,104.00,14.03.2026,2026-03-18 +Retirees,24.53,28.05.2026,2026-05-31 +Professionals,53.33,06.05.2026,2026-05-07 +Students,35.20,21.05.2026,2026-05-21 +Families,65.06,24.03.2026,2026-03-26 +Retirees,13.32,01.05.2026,2026-05-04 +Professionals,59.25,21.06.2026,2026-06-23 +Students,43.60,08.03.2026,2026-03-09 +Families,71.94,07.02.2026,2026-02-11 +Retirees,25.58,15.05.2026,2026-05-15 +Professionals,72.96,09.03.2026,2026-03-09 +Students,13.80,28.05.2026,2026-05-31 +Families,119.24,14.04.2026,2026-04-14 +Retirees,72.04,10.06.2026,2026-06-14 +Professionals,36.08,17.04.2026,2026-04-21 diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-decimal-comma/case.json b/agents/evals/fixtures/cases/violin-basic-pygal-decimal-comma/case.json new file mode 100644 index 00000000000..49abbf88ec9 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-decimal-comma/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "violin-basic", + "library": "pygal", + "locale": "de", + "perturbation": "decimal-comma", + "bindings": [ + { + "role": "category", + "column": "Customer Segment" + }, + { + "role": "value", + "column": "Basket Value (EUR)" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "decimal-comma", + "synthetic", + "semicolon" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, decimal-comma)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-decimal-comma/data.csv b/agents/evals/fixtures/cases/violin-basic-pygal-decimal-comma/data.csv new file mode 100644 index 00000000000..356b2725bac --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-decimal-comma/data.csv @@ -0,0 +1,401 @@ +Customer Segment;Basket Value (EUR) +Students;14,07 +Families;98,65 +Retirees;63,77 +Professionals;54,23 +Students;7,03 +Families;89,88 +Retirees;34,77 +Professionals;50,78 +Students;17,69 +Families;134,75 +Retirees;30,60 +Professionals;62,20 +Students;14,92 +Families;115,29 +Retirees;21,91 +Professionals;67,09 +Students;19,17 +Families;110,73 +Retirees;28,02 +Professionals;54,26 +Students;21,51 +Families;79,17 +Retirees;39,53 +Professionals;43,37 +Students;10,80 +Families;49,56 +Retirees;76,84 +Professionals;74,95 +Students;14,05 +Families;46,72 +Retirees;49,78 +Professionals;41,90 +Students;27,46 +Families;76,29 +Retirees;80,98 +Professionals;68,49 +Students;23,83 +Families;56,71 +Retirees;64,30 +Professionals;97,86 +Students;32,82 +Families;70,32 +Retirees;80,67 +Professionals;35,59 +Students;19,89 +Families;76,06 +Retirees;72,90 +Professionals;70,40 +Students;14,21 +Families;81,29 +Retirees;25,11 +Professionals;51,93 +Students;18,37 +Families;85,01 +Retirees;40,22 +Professionals;44,24 +Students;17,86 +Families;93,67 +Retirees;43,56 +Professionals;91,76 +Students;33,28 +Families;102,97 +Retirees;41,06 +Professionals;100,33 +Students;33,28 +Families;79,74 +Retirees;62,88 +Professionals;27,55 +Students;41,19 +Families;107,49 +Retirees;31,48 +Professionals;121,52 +Students;14,52 +Families;73,63 +Retirees;71,69 +Professionals;46,11 +Students;28,97 +Families;105,38 +Retirees;66,12 +Professionals;41,76 +Students;24,41 +Families;106,45 +Retirees;32,50 +Professionals;22,59 +Students;22,51 +Families;89,34 +Retirees;84,89 +Professionals;39,16 +Students;34,24 +Families;100,71 +Retirees;37,17 +Professionals;24,74 +Students;16,87 +Families;82,53 +Retirees;23,43 +Professionals;31,85 +Students;24,66 +Families;94,35 +Retirees;78,00 +Professionals;152,39 +Students;21,58 +Families;109,73 +Retirees;77,38 +Professionals;68,12 +Students;23,87 +Families;99,19 +Retirees;32,37 +Professionals;40,72 +Students;16,47 +Families;88,25 +Retirees;15,73 +Professionals;58,83 +Students;52,98 +Families;89,35 +Retirees;28,87 +Professionals;61,93 +Students;19,83 +Families;93,21 +Retirees;30,55 +Professionals;37,59 +Students;36,60 +Families;67,98 +Retirees;35,47 +Professionals;42,28 +Students;36,05 +Families;78,23 +Retirees;58,26 +Professionals;45,58 +Students;35,68 +Families;113,11 +Retirees;35,93 +Professionals;44,83 +Students;14,89 +Families;92,40 +Retirees;81,76 +Professionals;37,09 +Students;33,40 +Families;61,53 +Retirees;35,59 +Professionals;60,61 +Students;16,87 +Families;102,93 +Retirees;87,60 +Professionals;92,86 +Students;21,85 +Families;77,35 +Retirees;33,76 +Professionals;92,10 +Students;22,59 +Families;73,61 +Retirees;32,53 +Professionals;35,00 +Students;29,83 +Families;83,79 +Retirees;79,26 +Professionals;21,34 +Students;23,59 +Families;112,80 +Retirees;75,69 +Professionals;34,25 +Students;43,61 +Families;96,90 +Retirees;36,36 +Professionals;33,52 +Students;20,37 +Families;83,75 +Retirees;66,22 +Professionals;35,49 +Students;20,87 +Families;99,93 +Retirees;43,49 +Professionals;40,22 +Students;14,19 +Families;86,40 +Retirees;87,92 +Professionals;104,52 +Students;33,49 +Families;91,78 +Retirees;33,64 +Professionals;68,52 +Students;22,35 +Families;64,32 +Retirees;34,77 +Professionals;59,34 +Students;24,31 +Families;85,21 +Retirees;71,52 +Professionals;50,91 +Students;17,60 +Families;82,48 +Retirees;64,85 +Professionals;58,28 +Students;22,13 +Families;96,84 +Retirees;72,02 +Professionals;57,37 +Students;32,78 +Families;91,75 +Retirees;34,03 +Professionals;42,43 +Students;31,11 +Families;119,85 +Retirees;22,88 +Professionals;59,60 +Students;12,00 +Families;70,55 +Retirees;60,50 +Professionals;31,89 +Students;41,34 +Families;78,24 +Retirees;41,48 +Professionals;30,75 +Students;12,81 +Families;77,10 +Retirees;32,53 +Professionals;134,60 +Students;14,69 +Families;88,97 +Retirees;61,03 +Professionals;30,28 +Students;23,28 +Families;75,89 +Retirees;31,14 +Professionals;42,42 +Students;26,10 +Families;82,91 +Retirees;41,48 +Professionals;33,35 +Students;9,96 +Families;103,82 +Retirees;71,73 +Professionals;85,63 +Students;35,51 +Families;78,14 +Retirees;62,85 +Professionals;52,55 +Students;53,34 +Families;75,90 +Retirees;38,24 +Professionals;75,53 +Students;23,10 +Families;81,99 +Retirees;69,59 +Professionals;73,99 +Students;34,39 +Families;77,69 +Retirees;69,91 +Professionals;71,06 +Students;32,25 +Families;65,71 +Retirees;57,54 +Professionals;37,26 +Students;20,66 +Families;70,86 +Retirees;64,51 +Professionals;159,68 +Students;34,78 +Families;100,48 +Retirees;75,07 +Professionals;31,08 +Students;14,78 +Families;95,59 +Retirees;71,47 +Professionals;54,85 +Students;4,32 +Families;70,61 +Retirees;74,01 +Professionals;20,50 +Students;42,51 +Families;75,42 +Retirees;32,80 +Professionals;81,24 +Students;23,32 +Families;61,32 +Retirees;19,58 +Professionals;33,11 +Students;57,91 +Families;93,61 +Retirees;94,53 +Professionals;43,36 +Students;14,60 +Families;71,45 +Retirees;41,11 +Professionals;60,85 +Students;14,60 +Families;84,60 +Retirees;85,70 +Professionals;77,59 +Students;13,23 +Families;89,29 +Retirees;77,35 +Professionals;53,24 +Students;16,74 +Families;59,05 +Retirees;27,50 +Professionals;70,45 +Students;21,61 +Families;100,58 +Retirees;71,62 +Professionals;79,96 +Students;29,96 +Families;106,74 +Retirees;39,18 +Professionals;90,13 +Students;37,92 +Families;95,36 +Retirees;62,76 +Professionals;75,71 +Students;16,92 +Families;83,62 +Retirees;83,22 +Professionals;65,27 +Students;31,29 +Families;106,47 +Retirees;29,12 +Professionals;31,34 +Students;19,09 +Families;106,04 +Retirees;38,32 +Professionals;60,85 +Students;35,39 +Families;105,89 +Retirees;37,83 +Professionals;22,69 +Students;35,81 +Families;88,24 +Retirees;38,00 +Professionals;35,94 +Students;15,70 +Families;73,16 +Retirees;69,72 +Professionals;38,93 +Students;14,32 +Families;83,62 +Retirees;42,96 +Professionals;76,75 +Students;9,38 +Families;61,61 +Retirees;80,80 +Professionals;52,17 +Students;27,20 +Families;108,44 +Retirees;40,82 +Professionals;140,54 +Students;17,99 +Families;86,15 +Retirees;32,49 +Professionals;41,02 +Students;42,45 +Families;73,40 +Retirees;26,13 +Professionals;75,92 +Students;15,44 +Families;93,99 +Retirees;29,36 +Professionals;107,85 +Students;23,13 +Families;101,09 +Retirees;47,31 +Professionals;47,67 +Students;10,26 +Families;130,57 +Retirees;54,57 +Professionals;28,86 +Students;13,84 +Families;76,21 +Retirees;69,06 +Professionals;36,92 +Students;23,10 +Families;98,27 +Retirees;35,71 +Professionals;29,50 +Students;31,28 +Families;100,72 +Retirees;65,58 +Professionals;39,39 +Students;11,18 +Families;126,08 +Retirees;71,56 +Professionals;31,64 +Students;31,11 +Families;96,31 +Retirees;74,67 +Professionals;29,91 +Students;28,16 +Families;104,00 +Retirees;24,53 +Professionals;53,33 +Students;35,20 +Families;65,06 +Retirees;13,32 +Professionals;59,25 +Students;43,60 +Families;71,94 +Retirees;25,58 +Professionals;72,96 +Students;13,80 +Families;119,24 +Retirees;72,04 +Professionals;36,08 diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-n12/case.json b/agents/evals/fixtures/cases/violin-basic-pygal-n12/case.json new file mode 100644 index 00000000000..05b12e4fa51 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-n12/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "violin-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n12", + "bindings": [ + { + "role": "category", + "column": "Customer Segment" + }, + { + "role": "value", + "column": "Basket Value (EUR)" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "n12", + "synthetic", + "small" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, n12)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-n12/data.csv b/agents/evals/fixtures/cases/violin-basic-pygal-n12/data.csv new file mode 100644 index 00000000000..5996aed8438 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-n12/data.csv @@ -0,0 +1,13 @@ +Customer Segment,Basket Value (EUR) +Students,16.29 +Families,97.22 +Retirees,60.68 +Professionals,109.72 +Students,40.49 +Families,69.68 +Retirees,35.05 +Professionals,66.85 +Students,29.06 +Families,98.27 +Retirees,77.34 +Professionals,42.64 diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-n5000/case.json b/agents/evals/fixtures/cases/violin-basic-pygal-n5000/case.json new file mode 100644 index 00000000000..155ec1a5e18 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-n5000/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "violin-basic", + "library": "pygal", + "locale": "en", + "perturbation": "n5000", + "bindings": [ + { + "role": "category", + "column": "Customer Segment" + }, + { + "role": "value", + "column": "Basket Value (EUR)" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "n5000", + "synthetic", + "large" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, n5000)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-n5000/data.csv b/agents/evals/fixtures/cases/violin-basic-pygal-n5000/data.csv new file mode 100644 index 00000000000..80d091d1fb1 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-n5000/data.csv @@ -0,0 +1,5001 @@ +Customer Segment,Basket Value (EUR) +Students,29.08 +Families,86.84 +Retirees,32.48 +Professionals,35.15 +Students,22.09 +Families,81.24 +Retirees,34.80 +Professionals,80.35 +Students,22.64 +Families,101.66 +Retirees,79.17 +Professionals,38.22 +Students,27.42 +Families,72.21 +Retirees,40.61 +Professionals,69.36 +Students,31.85 +Families,112.31 +Retirees,33.94 +Professionals,59.29 +Students,13.16 +Families,82.82 +Retirees,30.40 +Professionals,25.08 +Students,15.15 +Families,99.80 +Retirees,72.41 +Professionals,39.46 +Students,30.78 +Families,95.29 +Retirees,32.23 +Professionals,60.47 +Students,30.31 +Families,98.38 +Retirees,37.68 +Professionals,22.07 +Students,14.70 +Families,76.93 +Retirees,33.62 +Professionals,59.68 +Students,24.05 +Families,91.13 +Retirees,67.04 +Professionals,35.21 +Students,42.12 +Families,98.25 +Retirees,35.79 +Professionals,108.69 +Students,35.12 +Families,93.67 +Retirees,38.85 +Professionals,58.85 +Students,25.30 +Families,82.07 +Retirees,89.35 +Professionals,45.72 +Students,18.71 +Families,102.02 +Retirees,75.24 +Professionals,49.87 +Students,18.17 +Families,80.86 +Retirees,68.79 +Professionals,34.74 +Students,20.39 +Families,58.12 +Retirees,19.99 +Professionals,100.83 +Students,25.84 +Families,80.01 +Retirees,34.29 +Professionals,102.74 +Students,17.00 +Families,82.37 +Retirees,71.60 +Professionals,79.69 +Students,19.79 +Families,87.48 +Retirees,33.42 +Professionals,54.15 +Students,26.95 +Families,73.00 +Retirees,43.41 +Professionals,37.44 +Students,34.92 +Families,77.34 +Retirees,67.81 +Professionals,53.65 +Students,28.61 +Families,64.18 +Retirees,54.75 +Professionals,50.26 +Students,16.66 +Families,78.63 +Retirees,43.42 +Professionals,35.23 +Students,9.31 +Families,121.95 +Retirees,38.93 +Professionals,59.66 +Students,18.20 +Families,70.25 +Retirees,49.70 +Professionals,75.94 +Students,32.38 +Families,80.01 +Retirees,39.27 +Professionals,45.46 +Students,7.17 +Families,91.20 +Retirees,46.86 +Professionals,54.86 +Students,23.35 +Families,93.20 +Retirees,64.64 +Professionals,51.11 +Students,33.12 +Families,88.66 +Retirees,61.06 +Professionals,83.31 +Students,15.43 +Families,79.71 +Retirees,33.40 +Professionals,51.49 +Students,19.40 +Families,105.25 +Retirees,81.01 +Professionals,30.06 +Students,23.36 +Families,111.88 +Retirees,26.24 +Professionals,48.29 +Students,39.33 +Families,77.46 +Retirees,76.27 +Professionals,65.05 +Students,32.13 +Families,49.39 +Retirees,84.27 +Professionals,65.04 +Students,17.33 +Families,65.96 +Retirees,31.47 +Professionals,41.52 +Students,25.10 +Families,62.35 +Retirees,31.97 +Professionals,32.72 +Students,56.15 +Families,82.39 +Retirees,71.79 +Professionals,37.83 +Students,16.23 +Families,65.08 +Retirees,41.98 +Professionals,154.68 +Students,42.04 +Families,91.85 +Retirees,69.12 +Professionals,68.10 +Students,26.72 +Families,79.76 +Retirees,77.85 +Professionals,25.81 +Students,21.26 +Families,105.79 +Retirees,27.93 +Professionals,44.14 +Students,26.17 +Families,59.05 +Retirees,29.59 +Professionals,30.89 +Students,17.71 +Families,73.98 +Retirees,38.89 +Professionals,54.43 +Students,10.22 +Families,78.62 +Retirees,37.59 +Professionals,47.55 +Students,9.76 +Families,82.63 +Retirees,63.78 +Professionals,35.17 +Students,36.23 +Families,59.30 +Retirees,27.15 +Professionals,31.05 +Students,37.97 +Families,76.23 +Retirees,34.37 +Professionals,47.28 +Students,36.39 +Families,85.71 +Retirees,35.45 +Professionals,88.59 +Students,40.39 +Families,83.95 +Retirees,37.87 +Professionals,23.24 +Students,50.46 +Families,75.78 +Retirees,17.74 +Professionals,73.64 +Students,34.21 +Families,68.03 +Retirees,36.02 +Professionals,44.71 +Students,27.37 +Families,127.40 +Retirees,60.04 +Professionals,65.16 +Students,20.30 +Families,41.05 +Retirees,73.55 +Professionals,49.07 +Students,20.01 +Families,39.53 +Retirees,25.60 +Professionals,50.75 +Students,24.07 +Families,74.06 +Retirees,38.29 +Professionals,87.15 +Students,11.70 +Families,89.98 +Retirees,19.88 +Professionals,40.13 +Students,13.31 +Families,67.11 +Retirees,30.15 +Professionals,24.61 +Students,25.94 +Families,65.33 +Retirees,42.43 +Professionals,56.94 +Students,28.46 +Families,95.22 +Retirees,31.13 +Professionals,29.84 +Students,30.44 +Families,86.27 +Retirees,39.95 +Professionals,48.03 +Students,20.34 +Families,102.48 +Retirees,35.58 +Professionals,38.36 +Students,23.59 +Families,123.82 +Retirees,40.94 +Professionals,28.31 +Students,32.47 +Families,117.75 +Retirees,62.41 +Professionals,83.27 +Students,21.37 +Families,99.05 +Retirees,39.18 +Professionals,53.36 +Students,14.81 +Families,73.33 +Retirees,83.64 +Professionals,136.38 +Students,17.93 +Families,73.89 +Retirees,58.18 +Professionals,82.99 +Students,20.74 +Families,94.89 +Retirees,41.43 +Professionals,34.88 +Students,22.47 +Families,83.14 +Retirees,29.34 +Professionals,45.81 +Students,16.71 +Families,106.85 +Retirees,76.11 +Professionals,73.18 +Students,13.77 +Families,56.31 +Retirees,71.36 +Professionals,52.51 +Students,27.32 +Families,90.20 +Retirees,41.20 +Professionals,99.65 +Students,13.15 +Families,74.03 +Retirees,27.65 +Professionals,85.94 +Students,15.94 +Families,74.84 +Retirees,73.02 +Professionals,102.06 +Students,21.19 +Families,103.88 +Retirees,25.21 +Professionals,89.50 +Students,36.04 +Families,76.40 +Retirees,78.73 +Professionals,84.35 +Students,39.73 +Families,68.32 +Retirees,42.28 +Professionals,42.64 +Students,15.15 +Families,59.51 +Retirees,72.24 +Professionals,62.12 +Students,21.25 +Families,70.87 +Retirees,18.66 +Professionals,69.88 +Students,41.65 +Families,58.98 +Retirees,74.95 +Professionals,78.18 +Students,15.86 +Families,96.21 +Retirees,24.89 +Professionals,72.14 +Students,12.47 +Families,116.47 +Retirees,39.50 +Professionals,26.22 +Students,10.92 +Families,72.31 +Retirees,24.79 +Professionals,45.69 +Students,11.89 +Families,66.43 +Retirees,26.56 +Professionals,55.52 +Students,24.40 +Families,71.93 +Retirees,32.31 +Professionals,47.88 +Students,17.93 +Families,49.59 +Retirees,37.12 +Professionals,53.72 +Students,25.47 +Families,123.85 +Retirees,74.04 +Professionals,52.85 +Students,16.32 +Families,74.68 +Retirees,30.71 +Professionals,53.60 +Students,19.31 +Families,85.41 +Retirees,40.90 +Professionals,63.20 +Students,20.48 +Families,92.21 +Retirees,65.46 +Professionals,71.92 +Students,13.79 +Families,80.20 +Retirees,30.22 +Professionals,46.43 +Students,21.58 +Families,84.13 +Retirees,75.48 +Professionals,38.26 +Students,13.54 +Families,100.16 +Retirees,37.26 +Professionals,67.56 +Students,21.46 +Families,31.87 +Retirees,35.10 +Professionals,45.99 +Students,13.58 +Families,139.49 +Retirees,31.84 +Professionals,55.02 +Students,9.31 +Families,89.09 +Retirees,66.83 +Professionals,66.40 +Students,41.66 +Families,100.79 +Retirees,35.31 +Professionals,52.31 +Students,19.29 +Families,85.52 +Retirees,70.70 +Professionals,69.73 +Students,14.02 +Families,85.43 +Retirees,18.17 +Professionals,26.14 +Students,24.57 +Families,96.63 +Retirees,38.42 +Professionals,45.13 +Students,50.13 +Families,105.63 +Retirees,41.28 +Professionals,57.76 +Students,13.90 +Families,88.96 +Retirees,59.70 +Professionals,51.44 +Students,6.18 +Families,73.49 +Retirees,83.04 +Professionals,43.50 +Students,43.67 +Families,120.23 +Retirees,70.37 +Professionals,27.57 +Students,14.98 +Families,87.98 +Retirees,43.01 +Professionals,46.62 +Students,10.95 +Families,61.78 +Retirees,25.53 +Professionals,64.54 +Students,27.05 +Families,93.22 +Retirees,42.58 +Professionals,37.05 +Students,41.86 +Families,78.68 +Retirees,81.28 +Professionals,35.79 +Students,15.39 +Families,96.51 +Retirees,80.86 +Professionals,87.10 +Students,29.66 +Families,67.50 +Retirees,77.92 +Professionals,30.93 +Students,27.92 +Families,84.13 +Retirees,30.05 +Professionals,73.20 +Students,11.40 +Families,100.10 +Retirees,82.29 +Professionals,55.75 +Students,28.07 +Families,92.05 +Retirees,35.52 +Professionals,20.79 +Students,8.75 +Families,88.81 +Retirees,31.53 +Professionals,34.54 +Students,25.58 +Families,90.66 +Retirees,38.34 +Professionals,51.33 +Students,19.94 +Families,93.57 +Retirees,70.06 +Professionals,39.74 +Students,25.39 +Families,88.65 +Retirees,79.94 +Professionals,24.29 +Students,34.83 +Families,112.18 +Retirees,40.60 +Professionals,35.95 +Students,27.09 +Families,81.95 +Retirees,35.62 +Professionals,99.39 +Students,11.73 +Families,98.24 +Retirees,54.06 +Professionals,58.07 +Students,13.45 +Families,105.42 +Retirees,75.27 +Professionals,31.29 +Students,31.63 +Families,109.66 +Retirees,75.12 +Professionals,76.82 +Students,16.89 +Families,98.58 +Retirees,56.70 +Professionals,54.89 +Students,26.01 +Families,75.98 +Retirees,44.22 +Professionals,40.29 +Students,26.66 +Families,86.60 +Retirees,31.28 +Professionals,24.54 +Students,21.04 +Families,99.27 +Retirees,41.55 +Professionals,90.72 +Students,26.38 +Families,51.33 +Retirees,72.67 +Professionals,35.25 +Students,21.70 +Families,98.36 +Retirees,74.30 +Professionals,46.18 +Students,14.24 +Families,68.12 +Retirees,74.71 +Professionals,37.73 +Students,36.27 +Families,56.98 +Retirees,81.98 +Professionals,61.02 +Students,35.61 +Families,75.08 +Retirees,40.08 +Professionals,54.44 +Students,16.49 +Families,89.65 +Retirees,82.69 +Professionals,47.49 +Students,36.46 +Families,120.96 +Retirees,26.67 +Professionals,35.03 +Students,14.05 +Families,102.97 +Retirees,73.46 +Professionals,81.47 +Students,19.39 +Families,65.59 +Retirees,37.69 +Professionals,42.08 +Students,20.52 +Families,86.53 +Retirees,75.80 +Professionals,48.19 +Students,18.36 +Families,69.17 +Retirees,34.62 +Professionals,53.81 +Students,43.64 +Families,76.78 +Retirees,30.46 +Professionals,76.45 +Students,27.05 +Families,93.11 +Retirees,69.30 +Professionals,39.56 +Students,19.88 +Families,87.42 +Retirees,31.87 +Professionals,39.33 +Students,21.08 +Families,104.67 +Retirees,48.28 +Professionals,42.48 +Students,23.26 +Families,70.93 +Retirees,75.08 +Professionals,41.74 +Students,10.10 +Families,114.79 +Retirees,28.58 +Professionals,79.92 +Students,12.63 +Families,81.40 +Retirees,39.97 +Professionals,62.97 +Students,22.59 +Families,91.71 +Retirees,73.57 +Professionals,43.15 +Students,14.04 +Families,68.84 +Retirees,46.99 +Professionals,49.18 +Students,32.15 +Families,68.00 +Retirees,30.81 +Professionals,68.54 +Students,19.40 +Families,95.05 +Retirees,32.48 +Professionals,33.31 +Students,9.80 +Families,87.49 +Retirees,26.16 +Professionals,54.36 +Students,30.46 +Families,81.91 +Retirees,87.05 +Professionals,30.10 +Students,18.68 +Families,60.76 +Retirees,91.45 +Professionals,31.91 +Students,13.64 +Families,92.40 +Retirees,36.55 +Professionals,24.57 +Students,10.19 +Families,80.36 +Retirees,32.75 +Professionals,40.14 +Students,24.72 +Families,76.54 +Retirees,51.01 +Professionals,28.35 +Students,33.94 +Families,81.42 +Retirees,19.78 +Professionals,42.96 +Students,33.68 +Families,72.84 +Retirees,83.82 +Professionals,45.95 +Students,11.05 +Families,79.58 +Retirees,39.07 +Professionals,49.49 +Students,21.98 +Families,71.02 +Retirees,79.80 +Professionals,52.71 +Students,25.35 +Families,127.48 +Retirees,76.84 +Professionals,57.44 +Students,18.16 +Families,61.45 +Retirees,39.81 +Professionals,60.51 +Students,20.60 +Families,79.72 +Retirees,69.97 +Professionals,56.40 +Students,25.95 +Families,92.80 +Retirees,45.25 +Professionals,163.27 +Students,23.18 +Families,88.39 +Retirees,86.19 +Professionals,39.49 +Students,25.42 +Families,114.46 +Retirees,38.72 +Professionals,28.34 +Students,51.03 +Families,86.34 +Retirees,22.66 +Professionals,29.43 +Students,8.84 +Families,72.86 +Retirees,53.35 +Professionals,49.57 +Students,11.86 +Families,89.06 +Retirees,43.33 +Professionals,40.48 +Students,12.60 +Families,71.92 +Retirees,31.97 +Professionals,26.04 +Students,34.85 +Families,108.15 +Retirees,71.33 +Professionals,43.96 +Students,38.77 +Families,81.88 +Retirees,87.32 +Professionals,106.38 +Students,24.24 +Families,85.64 +Retirees,34.46 +Professionals,24.48 +Students,29.35 +Families,71.85 +Retirees,61.69 +Professionals,46.75 +Students,17.17 +Families,64.14 +Retirees,60.83 +Professionals,37.82 +Students,11.42 +Families,106.48 +Retirees,52.52 +Professionals,81.66 +Students,16.78 +Families,102.62 +Retirees,27.36 +Professionals,75.76 +Students,24.59 +Families,81.23 +Retirees,34.23 +Professionals,97.49 +Students,39.87 +Families,121.50 +Retirees,85.37 +Professionals,41.60 +Students,25.87 +Families,100.00 +Retirees,37.58 +Professionals,33.91 +Students,14.57 +Families,81.37 +Retirees,41.19 +Professionals,41.94 +Students,18.49 +Families,94.46 +Retirees,93.19 +Professionals,47.54 +Students,15.11 +Families,112.15 +Retirees,54.65 +Professionals,61.90 +Students,12.51 +Families,42.60 +Retirees,83.15 +Professionals,42.85 +Students,13.42 +Families,63.66 +Retirees,45.86 +Professionals,52.79 +Students,21.68 +Families,91.08 +Retirees,30.10 +Professionals,60.56 +Students,18.35 +Families,111.90 +Retirees,31.71 +Professionals,34.15 +Students,29.77 +Families,88.27 +Retirees,39.58 +Professionals,27.26 +Students,37.93 +Families,37.47 +Retirees,25.48 +Professionals,56.07 +Students,24.73 +Families,65.94 +Retirees,41.34 +Professionals,33.84 +Students,33.92 +Families,78.91 +Retirees,72.61 +Professionals,91.55 +Students,21.56 +Families,123.68 +Retirees,32.25 +Professionals,41.82 +Students,20.38 +Families,97.05 +Retirees,32.58 +Professionals,95.39 +Students,12.25 +Families,99.63 +Retirees,74.27 +Professionals,72.23 +Students,57.51 +Families,89.08 +Retirees,58.79 +Professionals,24.92 +Students,35.92 +Families,90.10 +Retirees,34.06 +Professionals,78.43 +Students,24.41 +Families,80.94 +Retirees,38.42 +Professionals,38.85 +Students,29.88 +Families,101.60 +Retirees,72.49 +Professionals,45.95 +Students,24.11 +Families,92.52 +Retirees,76.80 +Professionals,46.73 +Students,16.06 +Families,71.97 +Retirees,51.59 +Professionals,64.99 +Students,20.51 +Families,105.36 +Retirees,35.84 +Professionals,78.11 +Students,28.90 +Families,60.57 +Retirees,65.82 +Professionals,38.22 +Students,10.02 +Families,97.99 +Retirees,71.87 +Professionals,91.77 +Students,15.33 +Families,99.35 +Retirees,80.20 +Professionals,36.45 +Students,10.36 +Families,82.51 +Retirees,62.25 +Professionals,28.91 +Students,11.03 +Families,80.36 +Retirees,26.12 +Professionals,38.20 +Students,12.16 +Families,88.00 +Retirees,70.86 +Professionals,50.31 +Students,18.07 +Families,115.38 +Retirees,38.84 +Professionals,45.68 +Students,27.36 +Families,84.50 +Retirees,61.16 +Professionals,86.58 +Students,19.38 +Families,84.79 +Retirees,50.02 +Professionals,33.94 +Students,34.17 +Families,123.75 +Retirees,71.34 +Professionals,26.48 +Students,37.43 +Families,79.86 +Retirees,41.20 +Professionals,59.42 +Students,16.74 +Families,107.31 +Retirees,67.35 +Professionals,53.07 +Students,15.61 +Families,67.74 +Retirees,68.57 +Professionals,25.63 +Students,19.39 +Families,80.40 +Retirees,29.98 +Professionals,35.68 +Students,21.21 +Families,108.55 +Retirees,26.62 +Professionals,25.83 +Students,19.88 +Families,107.59 +Retirees,73.90 +Professionals,61.57 +Students,20.10 +Families,86.22 +Retirees,33.99 +Professionals,49.32 +Students,15.13 +Families,74.80 +Retirees,57.66 +Professionals,45.97 +Students,50.25 +Families,80.06 +Retirees,59.52 +Professionals,51.10 +Students,8.11 +Families,59.65 +Retirees,35.43 +Professionals,33.37 +Students,15.26 +Families,82.31 +Retirees,42.45 +Professionals,28.58 +Students,25.31 +Families,57.13 +Retirees,54.14 +Professionals,61.58 +Students,31.07 +Families,62.43 +Retirees,25.28 +Professionals,96.01 +Students,30.03 +Families,98.36 +Retirees,40.28 +Professionals,48.60 +Students,22.70 +Families,123.55 +Retirees,15.90 +Professionals,47.95 +Students,11.86 +Families,114.32 +Retirees,56.55 +Professionals,48.03 +Students,14.32 +Families,95.76 +Retirees,20.81 +Professionals,50.11 +Students,26.54 +Families,126.55 +Retirees,37.88 +Professionals,50.46 +Students,23.36 +Families,73.12 +Retirees,83.63 +Professionals,29.70 +Students,11.91 +Families,118.04 +Retirees,64.13 +Professionals,77.09 +Students,18.83 +Families,89.79 +Retirees,68.89 +Professionals,130.14 +Students,13.70 +Families,77.19 +Retirees,41.73 +Professionals,77.37 +Students,17.62 +Families,112.17 +Retirees,71.50 +Professionals,25.13 +Students,71.75 +Families,86.99 +Retirees,80.78 +Professionals,51.19 +Students,26.66 +Families,94.82 +Retirees,28.97 +Professionals,40.60 +Students,26.62 +Families,98.25 +Retirees,86.85 +Professionals,79.22 +Students,34.34 +Families,85.29 +Retirees,29.27 +Professionals,27.05 +Students,24.89 +Families,96.55 +Retirees,37.85 +Professionals,97.15 +Students,9.42 +Families,85.13 +Retirees,32.40 +Professionals,93.72 +Students,27.57 +Families,74.95 +Retirees,31.38 +Professionals,57.82 +Students,34.87 +Families,99.74 +Retirees,34.44 +Professionals,60.13 +Students,22.92 +Families,77.99 +Retirees,64.71 +Professionals,87.38 +Students,24.41 +Families,117.19 +Retirees,24.91 +Professionals,96.08 +Students,46.13 +Families,94.09 +Retirees,69.98 +Professionals,40.25 +Students,12.92 +Families,64.91 +Retirees,28.30 +Professionals,71.50 +Students,19.60 +Families,91.16 +Retirees,37.45 +Professionals,86.80 +Students,21.93 +Families,95.05 +Retirees,26.74 +Professionals,79.25 +Students,23.91 +Families,102.37 +Retirees,86.80 +Professionals,22.45 +Students,14.05 +Families,82.78 +Retirees,33.93 +Professionals,70.84 +Students,28.93 +Families,51.07 +Retirees,42.71 +Professionals,55.90 +Students,16.06 +Families,108.86 +Retirees,39.17 +Professionals,48.84 +Students,18.70 +Families,77.14 +Retirees,23.77 +Professionals,25.11 +Students,24.46 +Families,72.39 +Retirees,70.35 +Professionals,33.94 +Students,23.87 +Families,115.27 +Retirees,36.16 +Professionals,38.46 +Students,16.01 +Families,95.48 +Retirees,41.73 +Professionals,34.19 +Students,33.94 +Families,72.43 +Retirees,72.38 +Professionals,107.91 +Students,25.30 +Families,106.68 +Retirees,62.94 +Professionals,79.46 +Students,36.41 +Families,100.27 +Retirees,77.91 +Professionals,54.65 +Students,32.48 +Families,110.43 +Retirees,40.07 +Professionals,85.38 +Students,25.74 +Families,61.19 +Retirees,87.24 +Professionals,97.01 +Students,20.38 +Families,108.02 +Retirees,70.89 +Professionals,58.84 +Students,21.50 +Families,76.25 +Retirees,88.30 +Professionals,76.12 +Students,23.02 +Families,80.67 +Retirees,69.73 +Professionals,31.56 +Students,37.07 +Families,54.36 +Retirees,81.77 +Professionals,49.63 +Students,31.20 +Families,88.99 +Retirees,71.47 +Professionals,36.91 +Students,12.11 +Families,82.96 +Retirees,35.46 +Professionals,109.60 +Students,19.74 +Families,108.08 +Retirees,78.60 +Professionals,96.02 +Students,7.70 +Families,100.11 +Retirees,37.25 +Professionals,26.89 +Students,14.13 +Families,58.28 +Retirees,73.76 +Professionals,52.63 +Students,16.42 +Families,97.75 +Retirees,34.60 +Professionals,31.37 +Students,15.64 +Families,72.41 +Retirees,72.93 +Professionals,54.76 +Students,39.04 +Families,73.60 +Retirees,92.26 +Professionals,91.13 +Students,26.55 +Families,78.75 +Retirees,40.71 +Professionals,68.09 +Students,26.51 +Families,67.71 +Retirees,27.48 +Professionals,51.54 +Students,21.74 +Families,93.10 +Retirees,67.10 +Professionals,89.74 +Students,19.22 +Families,109.81 +Retirees,64.46 +Professionals,47.19 +Students,32.24 +Families,78.59 +Retirees,70.59 +Professionals,24.79 +Students,22.54 +Families,65.85 +Retirees,36.32 +Professionals,56.34 +Students,32.85 +Families,102.61 +Retirees,45.60 +Professionals,34.86 +Students,15.91 +Families,113.77 +Retirees,19.00 +Professionals,31.36 +Students,12.36 +Families,91.73 +Retirees,64.08 +Professionals,116.46 +Students,13.34 +Families,85.36 +Retirees,43.86 +Professionals,70.64 +Students,18.87 +Families,99.18 +Retirees,34.70 +Professionals,112.70 +Students,72.66 +Families,55.63 +Retirees,55.65 +Professionals,65.65 +Students,15.77 +Families,68.46 +Retirees,50.16 +Professionals,59.78 +Students,10.50 +Families,81.53 +Retirees,36.00 +Professionals,33.41 +Students,36.47 +Families,83.80 +Retirees,29.01 +Professionals,77.62 +Students,21.21 +Families,75.98 +Retirees,79.30 +Professionals,43.26 +Students,27.22 +Families,81.23 +Retirees,31.86 +Professionals,154.29 +Students,42.16 +Families,113.38 +Retirees,70.74 +Professionals,83.31 +Students,13.75 +Families,85.03 +Retirees,34.01 +Professionals,159.36 +Students,37.08 +Families,88.90 +Retirees,26.19 +Professionals,58.53 +Students,30.11 +Families,125.99 +Retirees,79.31 +Professionals,33.75 +Students,15.32 +Families,81.39 +Retirees,36.37 +Professionals,28.91 +Students,22.36 +Families,78.77 +Retirees,33.75 +Professionals,69.73 +Students,17.04 +Families,89.48 +Retirees,34.26 +Professionals,29.19 +Students,27.45 +Families,123.06 +Retirees,29.72 +Professionals,34.27 +Students,25.18 +Families,92.00 +Retirees,40.76 +Professionals,99.01 +Students,15.81 +Families,73.96 +Retirees,72.69 +Professionals,37.50 +Students,25.13 +Families,59.79 +Retirees,30.35 +Professionals,26.31 +Students,29.63 +Families,82.96 +Retirees,70.95 +Professionals,73.84 +Students,20.77 +Families,64.39 +Retirees,76.68 +Professionals,46.67 +Students,12.80 +Families,90.55 +Retirees,24.10 +Professionals,128.30 +Students,18.69 +Families,71.33 +Retirees,33.51 +Professionals,61.67 +Students,41.07 +Families,96.54 +Retirees,70.96 +Professionals,23.72 +Students,23.20 +Families,84.18 +Retirees,43.15 +Professionals,48.17 +Students,11.80 +Families,68.64 +Retirees,71.10 +Professionals,106.30 +Students,22.23 +Families,70.74 +Retirees,27.39 +Professionals,51.47 +Students,62.27 +Families,75.67 +Retirees,41.70 +Professionals,74.35 +Students,8.67 +Families,112.96 +Retirees,30.95 +Professionals,103.18 +Students,18.75 +Families,77.35 +Retirees,80.07 +Professionals,104.89 +Students,17.47 +Families,84.72 +Retirees,35.52 +Professionals,35.15 +Students,29.31 +Families,105.31 +Retirees,82.80 +Professionals,46.05 +Students,22.77 +Families,67.70 +Retirees,23.48 +Professionals,24.89 +Students,16.46 +Families,90.11 +Retirees,25.62 +Professionals,45.01 +Students,17.47 +Families,55.50 +Retirees,33.14 +Professionals,44.53 +Students,17.75 +Families,55.38 +Retirees,32.62 +Professionals,43.57 +Students,33.63 +Families,50.06 +Retirees,42.34 +Professionals,129.18 +Students,9.11 +Families,77.19 +Retirees,77.86 +Professionals,54.34 +Students,23.02 +Families,73.00 +Retirees,76.67 +Professionals,37.40 +Students,21.53 +Families,90.69 +Retirees,67.09 +Professionals,68.11 +Students,24.27 +Families,84.42 +Retirees,22.93 +Professionals,51.16 +Students,59.82 +Families,51.01 +Retirees,31.46 +Professionals,26.12 +Students,36.52 +Families,103.85 +Retirees,27.51 +Professionals,77.67 +Students,10.59 +Families,83.37 +Retirees,39.84 +Professionals,49.61 +Students,34.60 +Families,97.32 +Retirees,73.96 +Professionals,74.30 +Students,16.05 +Families,95.86 +Retirees,36.47 +Professionals,32.50 +Students,20.09 +Families,52.23 +Retirees,35.12 +Professionals,53.01 +Students,45.27 +Families,100.77 +Retirees,14.96 +Professionals,82.16 +Students,14.93 +Families,118.75 +Retirees,75.13 +Professionals,34.83 +Students,18.83 +Families,78.97 +Retirees,44.72 +Professionals,68.65 +Students,19.30 +Families,77.65 +Retirees,39.58 +Professionals,67.81 +Students,21.87 +Families,98.19 +Retirees,70.38 +Professionals,41.20 +Students,19.91 +Families,85.31 +Retirees,18.52 +Professionals,32.59 +Students,10.97 +Families,73.66 +Retirees,26.57 +Professionals,30.87 +Students,18.35 +Families,72.47 +Retirees,78.00 +Professionals,68.52 +Students,20.89 +Families,104.48 +Retirees,29.95 +Professionals,95.46 +Students,43.89 +Families,107.77 +Retirees,75.94 +Professionals,71.08 +Students,24.83 +Families,108.01 +Retirees,42.90 +Professionals,64.67 +Students,21.09 +Families,83.40 +Retirees,59.05 +Professionals,63.11 +Students,24.34 +Families,87.17 +Retirees,71.11 +Professionals,101.79 +Students,19.61 +Families,99.51 +Retirees,36.87 +Professionals,175.08 +Students,13.43 +Families,93.00 +Retirees,72.28 +Professionals,83.81 +Students,26.56 +Families,97.48 +Retirees,35.96 +Professionals,38.90 +Students,55.13 +Families,87.61 +Retirees,78.85 +Professionals,107.07 +Students,26.95 +Families,97.20 +Retirees,52.17 +Professionals,75.07 +Students,56.42 +Families,78.94 +Retirees,68.94 +Professionals,58.28 +Students,42.73 +Families,73.60 +Retirees,82.53 +Professionals,56.72 +Students,17.90 +Families,87.78 +Retirees,38.68 +Professionals,59.41 +Students,14.73 +Families,99.79 +Retirees,62.33 +Professionals,41.39 +Students,24.88 +Families,90.26 +Retirees,56.27 +Professionals,69.61 +Students,38.68 +Families,80.33 +Retirees,30.77 +Professionals,51.89 +Students,50.83 +Families,97.37 +Retirees,37.33 +Professionals,71.71 +Students,27.58 +Families,72.44 +Retirees,37.71 +Professionals,24.57 +Students,17.90 +Families,63.02 +Retirees,59.01 +Professionals,126.38 +Students,16.32 +Families,98.74 +Retirees,43.86 +Professionals,94.67 +Students,16.46 +Families,103.66 +Retirees,86.32 +Professionals,54.95 +Students,27.59 +Families,80.34 +Retirees,26.81 +Professionals,22.56 +Students,13.27 +Families,85.96 +Retirees,20.42 +Professionals,80.51 +Students,18.74 +Families,92.44 +Retirees,29.11 +Professionals,29.04 +Students,18.06 +Families,54.22 +Retirees,75.20 +Professionals,117.87 +Students,31.91 +Families,80.16 +Retirees,66.43 +Professionals,24.57 +Students,19.50 +Families,118.93 +Retirees,38.52 +Professionals,66.45 +Students,39.40 +Families,46.11 +Retirees,76.32 +Professionals,41.05 +Students,17.65 +Families,110.88 +Retirees,38.42 +Professionals,44.65 +Students,19.16 +Families,78.85 +Retirees,26.69 +Professionals,33.19 +Students,20.53 +Families,66.15 +Retirees,73.15 +Professionals,135.48 +Students,20.66 +Families,97.56 +Retirees,65.51 +Professionals,51.68 +Students,35.95 +Families,113.97 +Retirees,62.37 +Professionals,36.49 +Students,13.83 +Families,34.11 +Retirees,27.77 +Professionals,47.44 +Students,12.54 +Families,68.51 +Retirees,81.64 +Professionals,35.49 +Students,40.56 +Families,89.33 +Retirees,66.79 +Professionals,32.55 +Students,27.47 +Families,95.53 +Retirees,70.93 +Professionals,77.30 +Students,22.86 +Families,83.53 +Retirees,62.85 +Professionals,50.29 +Students,17.09 +Families,90.76 +Retirees,60.51 +Professionals,100.66 +Students,17.33 +Families,58.77 +Retirees,74.21 +Professionals,34.43 +Students,21.50 +Families,100.09 +Retirees,27.06 +Professionals,56.12 +Students,26.16 +Families,75.31 +Retirees,89.10 +Professionals,78.01 +Students,13.73 +Families,79.12 +Retirees,73.85 +Professionals,39.61 +Students,18.02 +Families,87.32 +Retirees,84.88 +Professionals,99.05 +Students,31.90 +Families,104.84 +Retirees,37.68 +Professionals,60.32 +Students,38.12 +Families,104.88 +Retirees,31.61 +Professionals,64.34 +Students,27.20 +Families,94.49 +Retirees,24.23 +Professionals,51.34 +Students,40.43 +Families,81.08 +Retirees,39.67 +Professionals,22.92 +Students,11.10 +Families,88.29 +Retirees,30.74 +Professionals,56.33 +Students,23.84 +Families,104.03 +Retirees,40.77 +Professionals,50.36 +Students,25.05 +Families,74.91 +Retirees,37.93 +Professionals,37.23 +Students,17.06 +Families,70.68 +Retirees,73.46 +Professionals,105.02 +Students,18.28 +Families,105.93 +Retirees,35.79 +Professionals,82.42 +Students,21.34 +Families,73.41 +Retirees,36.65 +Professionals,76.58 +Students,19.46 +Families,118.89 +Retirees,61.74 +Professionals,75.08 +Students,15.98 +Families,72.11 +Retirees,73.85 +Professionals,53.58 +Students,25.20 +Families,70.34 +Retirees,28.46 +Professionals,79.26 +Students,19.88 +Families,52.16 +Retirees,66.33 +Professionals,145.03 +Students,11.33 +Families,112.02 +Retirees,75.27 +Professionals,29.07 +Students,17.67 +Families,109.29 +Retirees,77.50 +Professionals,60.53 +Students,16.16 +Families,77.64 +Retirees,36.36 +Professionals,54.27 +Students,23.62 +Families,62.12 +Retirees,46.29 +Professionals,88.62 +Students,23.22 +Families,68.78 +Retirees,75.27 +Professionals,46.27 +Students,18.58 +Families,95.88 +Retirees,47.59 +Professionals,61.96 +Students,14.26 +Families,67.40 +Retirees,30.14 +Professionals,44.47 +Students,40.32 +Families,88.68 +Retirees,55.48 +Professionals,46.28 +Students,17.70 +Families,98.43 +Retirees,76.61 +Professionals,75.21 +Students,31.61 +Families,77.47 +Retirees,33.50 +Professionals,36.06 +Students,28.67 +Families,96.93 +Retirees,67.31 +Professionals,54.47 +Students,14.30 +Families,74.08 +Retirees,32.31 +Professionals,38.88 +Students,18.84 +Families,59.03 +Retirees,35.45 +Professionals,49.59 +Students,9.48 +Families,91.96 +Retirees,18.29 +Professionals,91.58 +Students,29.61 +Families,122.23 +Retirees,75.84 +Professionals,72.54 +Students,23.07 +Families,103.47 +Retirees,41.10 +Professionals,57.79 +Students,42.53 +Families,110.83 +Retirees,26.67 +Professionals,45.35 +Students,14.73 +Families,69.78 +Retirees,28.55 +Professionals,51.49 +Students,13.83 +Families,73.32 +Retirees,26.22 +Professionals,51.11 +Students,6.07 +Families,71.59 +Retirees,30.50 +Professionals,59.18 +Students,43.10 +Families,90.94 +Retirees,57.42 +Professionals,125.47 +Students,28.30 +Families,76.26 +Retirees,83.23 +Professionals,27.14 +Students,26.29 +Families,85.02 +Retirees,69.20 +Professionals,33.82 +Students,13.42 +Families,80.18 +Retirees,85.30 +Professionals,52.73 +Students,15.15 +Families,72.20 +Retirees,42.19 +Professionals,42.16 +Students,13.94 +Families,109.62 +Retirees,70.66 +Professionals,48.46 +Students,48.29 +Families,74.59 +Retirees,34.98 +Professionals,48.24 +Students,45.50 +Families,70.17 +Retirees,62.66 +Professionals,86.12 +Students,18.20 +Families,98.68 +Retirees,67.98 +Professionals,32.60 +Students,21.40 +Families,65.73 +Retirees,59.80 +Professionals,35.73 +Students,27.66 +Families,83.62 +Retirees,31.08 +Professionals,54.57 +Students,28.46 +Families,91.45 +Retirees,39.65 +Professionals,58.43 +Students,20.83 +Families,67.92 +Retirees,78.88 +Professionals,51.60 +Students,19.29 +Families,73.73 +Retirees,62.32 +Professionals,68.45 +Students,53.51 +Families,85.94 +Retirees,31.51 +Professionals,31.30 +Students,21.09 +Families,94.10 +Retirees,27.93 +Professionals,103.78 +Students,17.57 +Families,88.38 +Retirees,58.26 +Professionals,37.63 +Students,24.75 +Families,106.02 +Retirees,28.02 +Professionals,26.64 +Students,22.85 +Families,81.24 +Retirees,76.64 +Professionals,53.46 +Students,24.62 +Families,102.89 +Retirees,29.30 +Professionals,54.86 +Students,14.93 +Families,57.85 +Retirees,48.12 +Professionals,93.81 +Students,20.90 +Families,115.97 +Retirees,38.87 +Professionals,37.46 +Students,16.99 +Families,74.01 +Retirees,33.90 +Professionals,26.17 +Students,10.72 +Families,48.61 +Retirees,40.86 +Professionals,47.11 +Students,27.53 +Families,94.86 +Retirees,60.18 +Professionals,32.68 +Students,18.31 +Families,95.93 +Retirees,38.03 +Professionals,38.17 +Students,21.82 +Families,79.01 +Retirees,34.74 +Professionals,65.86 +Students,38.65 +Families,95.91 +Retirees,67.11 +Professionals,102.21 +Students,24.38 +Families,91.83 +Retirees,65.10 +Professionals,26.02 +Students,34.85 +Families,78.81 +Retirees,69.93 +Professionals,59.47 +Students,8.30 +Families,67.54 +Retirees,33.02 +Professionals,59.62 +Students,33.95 +Families,94.52 +Retirees,74.41 +Professionals,56.25 +Students,43.28 +Families,47.52 +Retirees,34.90 +Professionals,69.15 +Students,26.79 +Families,82.60 +Retirees,35.52 +Professionals,36.44 +Students,36.39 +Families,86.28 +Retirees,66.24 +Professionals,67.83 +Students,21.21 +Families,96.18 +Retirees,71.41 +Professionals,59.21 +Students,23.59 +Families,85.90 +Retirees,24.36 +Professionals,70.98 +Students,9.78 +Families,106.48 +Retirees,82.21 +Professionals,33.11 +Students,43.55 +Families,103.15 +Retirees,73.11 +Professionals,100.66 +Students,32.92 +Families,79.52 +Retirees,46.59 +Professionals,40.20 +Students,17.59 +Families,74.99 +Retirees,40.07 +Professionals,28.54 +Students,19.95 +Families,78.45 +Retirees,98.30 +Professionals,62.91 +Students,21.21 +Families,69.73 +Retirees,42.60 +Professionals,48.61 +Students,17.57 +Families,73.93 +Retirees,88.87 +Professionals,31.98 +Students,15.40 +Families,75.75 +Retirees,38.77 +Professionals,43.79 +Students,8.90 +Families,96.99 +Retirees,27.96 +Professionals,32.40 +Students,60.49 +Families,82.18 +Retirees,28.43 +Professionals,53.50 +Students,21.52 +Families,60.83 +Retirees,69.18 +Professionals,50.40 +Students,35.58 +Families,108.19 +Retirees,79.26 +Professionals,75.77 +Students,14.27 +Families,52.95 +Retirees,67.28 +Professionals,35.63 +Students,20.40 +Families,77.92 +Retirees,26.85 +Professionals,49.15 +Students,11.63 +Families,95.48 +Retirees,30.86 +Professionals,84.82 +Students,27.67 +Families,95.93 +Retirees,37.32 +Professionals,58.44 +Students,11.47 +Families,85.23 +Retirees,75.10 +Professionals,53.55 +Students,6.20 +Families,122.04 +Retirees,68.04 +Professionals,41.45 +Students,27.19 +Families,91.42 +Retirees,70.76 +Professionals,51.60 +Students,34.93 +Families,71.64 +Retirees,73.67 +Professionals,51.89 +Students,11.61 +Families,105.88 +Retirees,68.47 +Professionals,95.43 +Students,46.12 +Families,75.80 +Retirees,64.08 +Professionals,30.50 +Students,19.45 +Families,86.42 +Retirees,29.42 +Professionals,99.88 +Students,20.20 +Families,93.88 +Retirees,36.98 +Professionals,27.29 +Students,12.30 +Families,94.36 +Retirees,29.20 +Professionals,47.36 +Students,15.84 +Families,48.22 +Retirees,62.96 +Professionals,56.23 +Students,17.22 +Families,66.36 +Retirees,41.44 +Professionals,43.75 +Students,16.73 +Families,72.45 +Retirees,68.39 +Professionals,100.32 +Students,19.97 +Families,102.51 +Retirees,33.36 +Professionals,38.84 +Students,15.07 +Families,85.05 +Retirees,61.10 +Professionals,29.70 +Students,19.19 +Families,89.59 +Retirees,83.86 +Professionals,110.65 +Students,28.98 +Families,52.97 +Retirees,53.71 +Professionals,30.17 +Students,16.76 +Families,90.84 +Retirees,43.05 +Professionals,54.83 +Students,21.17 +Families,67.38 +Retirees,37.61 +Professionals,52.49 +Students,10.91 +Families,71.13 +Retirees,70.84 +Professionals,48.81 +Students,40.45 +Families,63.21 +Retirees,25.04 +Professionals,130.90 +Students,31.50 +Families,73.60 +Retirees,41.21 +Professionals,66.86 +Students,9.58 +Families,55.00 +Retirees,24.07 +Professionals,46.65 +Students,65.96 +Families,121.17 +Retirees,31.08 +Professionals,39.55 +Students,22.30 +Families,58.98 +Retirees,36.88 +Professionals,52.85 +Students,15.43 +Families,92.02 +Retirees,87.87 +Professionals,51.03 +Students,30.09 +Families,118.71 +Retirees,33.89 +Professionals,54.73 +Students,27.80 +Families,93.69 +Retirees,35.19 +Professionals,49.25 +Students,18.81 +Families,83.22 +Retirees,89.98 +Professionals,62.11 +Students,22.77 +Families,91.56 +Retirees,60.41 +Professionals,58.04 +Students,27.94 +Families,102.00 +Retirees,62.23 +Professionals,77.08 +Students,14.21 +Families,92.57 +Retirees,66.87 +Professionals,52.85 +Students,15.97 +Families,67.97 +Retirees,38.61 +Professionals,29.77 +Students,8.20 +Families,85.63 +Retirees,38.37 +Professionals,68.55 +Students,20.74 +Families,71.66 +Retirees,57.55 +Professionals,60.39 +Students,30.47 +Families,114.46 +Retirees,59.51 +Professionals,52.68 +Students,19.93 +Families,64.04 +Retirees,20.41 +Professionals,69.53 +Students,22.89 +Families,105.62 +Retirees,30.38 +Professionals,27.19 +Students,55.01 +Families,78.74 +Retirees,71.41 +Professionals,81.66 +Students,14.80 +Families,85.12 +Retirees,39.56 +Professionals,48.34 +Students,11.32 +Families,68.23 +Retirees,82.54 +Professionals,40.32 +Students,10.36 +Families,112.02 +Retirees,57.51 +Professionals,82.60 +Students,16.12 +Families,96.48 +Retirees,65.37 +Professionals,86.21 +Students,34.45 +Families,88.03 +Retirees,81.70 +Professionals,34.39 +Students,28.00 +Families,108.72 +Retirees,94.11 +Professionals,79.70 +Students,27.91 +Families,84.79 +Retirees,83.90 +Professionals,41.61 +Students,36.37 +Families,76.10 +Retirees,70.31 +Professionals,45.14 +Students,14.92 +Families,90.86 +Retirees,31.49 +Professionals,72.61 +Students,13.50 +Families,66.18 +Retirees,25.31 +Professionals,65.21 +Students,21.09 +Families,87.79 +Retirees,42.96 +Professionals,62.86 +Students,42.51 +Families,69.99 +Retirees,66.65 +Professionals,136.01 +Students,10.05 +Families,92.15 +Retirees,79.54 +Professionals,73.29 +Students,10.60 +Families,109.24 +Retirees,38.61 +Professionals,56.72 +Students,10.88 +Families,105.18 +Retirees,51.41 +Professionals,36.65 +Students,11.72 +Families,93.21 +Retirees,25.88 +Professionals,35.80 +Students,22.99 +Families,62.51 +Retirees,72.76 +Professionals,24.95 +Students,23.42 +Families,101.48 +Retirees,38.59 +Professionals,37.62 +Students,13.16 +Families,78.27 +Retirees,80.09 +Professionals,45.75 +Students,14.66 +Families,115.55 +Retirees,31.84 +Professionals,42.30 +Students,11.07 +Families,82.56 +Retirees,28.47 +Professionals,73.12 +Students,15.08 +Families,78.95 +Retirees,31.85 +Professionals,103.06 +Students,19.70 +Families,81.31 +Retirees,77.29 +Professionals,58.09 +Students,22.49 +Families,95.54 +Retirees,37.44 +Professionals,72.73 +Students,15.28 +Families,107.01 +Retirees,28.39 +Professionals,64.40 +Students,36.36 +Families,96.50 +Retirees,55.27 +Professionals,30.75 +Students,29.30 +Families,134.42 +Retirees,64.07 +Professionals,40.65 +Students,16.69 +Families,68.34 +Retirees,50.81 +Professionals,42.03 +Students,38.08 +Families,92.58 +Retirees,55.05 +Professionals,44.96 +Students,25.72 +Families,62.68 +Retirees,77.11 +Professionals,32.21 +Students,21.70 +Families,97.85 +Retirees,45.14 +Professionals,39.85 +Students,16.69 +Families,108.91 +Retirees,25.19 +Professionals,62.29 +Students,45.47 +Families,110.01 +Retirees,24.92 +Professionals,31.42 +Students,33.44 +Families,87.30 +Retirees,25.90 +Professionals,108.55 +Students,39.00 +Families,69.07 +Retirees,17.12 +Professionals,44.67 +Students,12.71 +Families,98.77 +Retirees,54.41 +Professionals,27.00 +Students,11.69 +Families,99.28 +Retirees,68.41 +Professionals,60.09 +Students,20.25 +Families,75.05 +Retirees,76.01 +Professionals,143.85 +Students,19.04 +Families,105.84 +Retirees,38.47 +Professionals,31.49 +Students,19.62 +Families,128.76 +Retirees,39.26 +Professionals,84.34 +Students,16.28 +Families,78.62 +Retirees,43.93 +Professionals,68.25 +Students,15.18 +Families,77.48 +Retirees,35.09 +Professionals,32.64 +Students,18.31 +Families,111.08 +Retirees,26.79 +Professionals,38.03 +Students,26.91 +Families,94.45 +Retirees,75.54 +Professionals,36.22 +Students,13.57 +Families,58.16 +Retirees,69.47 +Professionals,73.27 +Students,42.20 +Families,83.04 +Retirees,35.51 +Professionals,90.18 +Students,20.08 +Families,90.73 +Retirees,51.31 +Professionals,29.79 +Students,29.09 +Families,77.31 +Retirees,37.01 +Professionals,45.04 +Students,32.09 +Families,89.58 +Retirees,74.10 +Professionals,37.01 +Students,30.50 +Families,82.41 +Retirees,32.01 +Professionals,66.71 +Students,28.73 +Families,78.73 +Retirees,94.39 +Professionals,104.79 +Students,23.39 +Families,83.74 +Retirees,30.53 +Professionals,69.54 +Students,56.30 +Families,121.55 +Retirees,41.85 +Professionals,70.70 +Students,20.60 +Families,102.72 +Retirees,61.59 +Professionals,53.18 +Students,15.35 +Families,95.85 +Retirees,30.59 +Professionals,76.85 +Students,26.54 +Families,46.22 +Retirees,40.68 +Professionals,55.90 +Students,43.60 +Families,97.58 +Retirees,30.34 +Professionals,82.51 +Students,29.41 +Families,116.04 +Retirees,33.36 +Professionals,152.91 +Students,16.46 +Families,92.87 +Retirees,74.23 +Professionals,54.50 +Students,13.10 +Families,76.42 +Retirees,27.59 +Professionals,37.40 +Students,23.01 +Families,63.47 +Retirees,42.49 +Professionals,52.06 +Students,20.13 +Families,87.36 +Retirees,73.77 +Professionals,55.89 +Students,21.45 +Families,95.01 +Retirees,31.24 +Professionals,58.09 +Students,16.28 +Families,114.65 +Retirees,78.17 +Professionals,37.29 +Students,34.74 +Families,74.09 +Retirees,60.52 +Professionals,128.29 +Students,16.19 +Families,74.74 +Retirees,36.70 +Professionals,49.81 +Students,10.53 +Families,92.99 +Retirees,57.76 +Professionals,87.62 +Students,15.41 +Families,77.15 +Retirees,37.50 +Professionals,45.48 +Students,27.60 +Families,75.61 +Retirees,32.81 +Professionals,60.05 +Students,17.20 +Families,95.35 +Retirees,34.01 +Professionals,79.09 +Students,17.30 +Families,72.48 +Retirees,79.54 +Professionals,27.55 +Students,19.20 +Families,88.59 +Retirees,35.47 +Professionals,37.59 +Students,39.85 +Families,73.56 +Retirees,30.47 +Professionals,47.33 +Students,45.03 +Families,71.20 +Retirees,34.59 +Professionals,24.14 +Students,14.49 +Families,64.33 +Retirees,76.15 +Professionals,108.26 +Students,27.31 +Families,66.90 +Retirees,21.28 +Professionals,62.78 +Students,11.37 +Families,83.81 +Retirees,40.58 +Professionals,41.98 +Students,29.03 +Families,97.77 +Retirees,41.24 +Professionals,34.56 +Students,22.76 +Families,101.59 +Retirees,72.67 +Professionals,40.89 +Students,14.85 +Families,72.93 +Retirees,64.82 +Professionals,57.96 +Students,39.45 +Families,86.84 +Retirees,32.67 +Professionals,55.73 +Students,38.95 +Families,93.11 +Retirees,63.78 +Professionals,89.40 +Students,15.51 +Families,84.02 +Retirees,63.34 +Professionals,90.96 +Students,15.62 +Families,92.06 +Retirees,63.61 +Professionals,37.19 +Students,30.32 +Families,73.67 +Retirees,31.76 +Professionals,72.58 +Students,30.05 +Families,77.33 +Retirees,62.70 +Professionals,81.10 +Students,14.93 +Families,106.15 +Retirees,36.71 +Professionals,65.37 +Students,17.20 +Families,73.23 +Retirees,59.63 +Professionals,27.01 +Students,11.24 +Families,88.71 +Retirees,92.39 +Professionals,26.28 +Students,17.27 +Families,51.53 +Retirees,61.94 +Professionals,31.08 +Students,22.68 +Families,72.79 +Retirees,74.13 +Professionals,94.78 +Students,19.85 +Families,101.72 +Retirees,65.28 +Professionals,36.51 +Students,29.62 +Families,100.03 +Retirees,98.86 +Professionals,41.97 +Students,31.19 +Families,65.42 +Retirees,80.72 +Professionals,81.46 +Students,14.49 +Families,82.78 +Retirees,29.80 +Professionals,56.52 +Students,44.55 +Families,70.79 +Retirees,61.40 +Professionals,47.04 +Students,37.20 +Families,103.96 +Retirees,35.99 +Professionals,56.80 +Students,58.76 +Families,84.76 +Retirees,71.83 +Professionals,51.10 +Students,31.91 +Families,105.98 +Retirees,66.65 +Professionals,55.11 +Students,22.70 +Families,108.41 +Retirees,88.18 +Professionals,101.28 +Students,20.88 +Families,72.82 +Retirees,76.82 +Professionals,84.77 +Students,17.32 +Families,77.40 +Retirees,21.28 +Professionals,61.06 +Students,37.29 +Families,89.88 +Retirees,35.10 +Professionals,30.35 +Students,23.88 +Families,91.18 +Retirees,81.07 +Professionals,37.77 +Students,17.06 +Families,87.78 +Retirees,41.87 +Professionals,47.16 +Students,31.63 +Families,86.66 +Retirees,27.75 +Professionals,54.20 +Students,19.02 +Families,36.37 +Retirees,31.35 +Professionals,75.60 +Students,13.44 +Families,98.64 +Retirees,66.90 +Professionals,83.22 +Students,13.28 +Families,92.06 +Retirees,74.30 +Professionals,109.86 +Students,26.73 +Families,100.33 +Retirees,33.22 +Professionals,54.75 +Students,12.50 +Families,62.56 +Retirees,29.76 +Professionals,28.79 +Students,12.79 +Families,87.42 +Retirees,32.45 +Professionals,48.28 +Students,15.02 +Families,75.67 +Retirees,67.25 +Professionals,52.28 +Students,25.55 +Families,93.41 +Retirees,80.74 +Professionals,46.00 +Students,23.58 +Families,35.76 +Retirees,23.94 +Professionals,46.63 +Students,17.04 +Families,114.85 +Retirees,73.38 +Professionals,32.07 +Students,15.37 +Families,67.14 +Retirees,34.22 +Professionals,33.41 +Students,11.37 +Families,107.72 +Retirees,26.45 +Professionals,30.80 +Students,19.99 +Families,78.04 +Retirees,38.67 +Professionals,79.03 +Students,14.17 +Families,95.01 +Retirees,35.31 +Professionals,21.82 +Students,13.26 +Families,106.64 +Retirees,83.93 +Professionals,139.63 +Students,21.46 +Families,113.24 +Retirees,82.31 +Professionals,43.36 +Students,29.82 +Families,73.94 +Retirees,37.43 +Professionals,32.21 +Students,11.49 +Families,54.01 +Retirees,68.20 +Professionals,68.44 +Students,24.49 +Families,112.00 +Retirees,22.17 +Professionals,46.66 +Students,9.01 +Families,103.98 +Retirees,40.87 +Professionals,122.17 +Students,21.66 +Families,87.72 +Retirees,41.02 +Professionals,45.32 +Students,17.45 +Families,81.90 +Retirees,79.07 +Professionals,31.84 +Students,16.64 +Families,60.67 +Retirees,68.98 +Professionals,48.51 +Students,15.65 +Families,103.80 +Retirees,60.02 +Professionals,33.23 +Students,25.78 +Families,93.73 +Retirees,76.88 +Professionals,61.38 +Students,18.40 +Families,114.96 +Retirees,22.05 +Professionals,65.88 +Students,23.34 +Families,99.84 +Retirees,29.17 +Professionals,28.87 +Students,22.47 +Families,114.45 +Retirees,37.72 +Professionals,39.48 +Students,17.74 +Families,104.61 +Retirees,43.26 +Professionals,87.82 +Students,12.69 +Families,88.37 +Retirees,40.08 +Professionals,74.46 +Students,8.65 +Families,80.26 +Retirees,39.79 +Professionals,31.54 +Students,22.46 +Families,90.06 +Retirees,67.19 +Professionals,51.48 +Students,10.95 +Families,105.25 +Retirees,76.88 +Professionals,71.50 +Students,10.70 +Families,76.70 +Retirees,63.64 +Professionals,59.87 +Students,30.29 +Families,98.70 +Retirees,71.15 +Professionals,72.85 +Students,19.15 +Families,89.67 +Retirees,31.03 +Professionals,31.28 +Students,42.69 +Families,85.92 +Retirees,78.76 +Professionals,39.14 +Students,30.96 +Families,59.30 +Retirees,61.60 +Professionals,56.16 +Students,14.57 +Families,50.08 +Retirees,31.93 +Professionals,22.53 +Students,28.59 +Families,95.25 +Retirees,46.97 +Professionals,46.49 +Students,25.44 +Families,69.86 +Retirees,32.86 +Professionals,81.68 +Students,18.55 +Families,96.08 +Retirees,75.70 +Professionals,48.79 +Students,19.80 +Families,57.58 +Retirees,30.51 +Professionals,85.48 +Students,16.33 +Families,90.55 +Retirees,34.56 +Professionals,104.30 +Students,36.03 +Families,90.82 +Retirees,45.03 +Professionals,90.59 +Students,25.13 +Families,48.78 +Retirees,35.46 +Professionals,99.30 +Students,15.34 +Families,93.14 +Retirees,35.66 +Professionals,54.49 +Students,31.30 +Families,85.69 +Retirees,85.17 +Professionals,50.68 +Students,14.92 +Families,90.14 +Retirees,33.70 +Professionals,94.40 +Students,38.07 +Families,59.03 +Retirees,33.16 +Professionals,60.49 +Students,16.46 +Families,119.99 +Retirees,61.97 +Professionals,67.45 +Students,17.74 +Families,124.63 +Retirees,71.95 +Professionals,45.90 +Students,26.60 +Families,69.29 +Retirees,81.31 +Professionals,44.13 +Students,31.76 +Families,79.02 +Retirees,34.37 +Professionals,109.87 +Students,10.11 +Families,59.27 +Retirees,23.17 +Professionals,56.72 +Students,41.55 +Families,73.53 +Retirees,23.55 +Professionals,99.66 +Students,20.96 +Families,91.67 +Retirees,47.43 +Professionals,40.21 +Students,22.86 +Families,80.03 +Retirees,61.20 +Professionals,52.24 +Students,29.84 +Families,55.20 +Retirees,30.86 +Professionals,33.43 +Students,25.26 +Families,87.71 +Retirees,72.34 +Professionals,50.35 +Students,19.59 +Families,58.84 +Retirees,47.63 +Professionals,36.33 +Students,23.80 +Families,88.41 +Retirees,37.22 +Professionals,49.71 +Students,8.80 +Families,65.29 +Retirees,69.80 +Professionals,58.84 +Students,17.40 +Families,105.67 +Retirees,37.08 +Professionals,65.99 +Students,11.68 +Families,101.75 +Retirees,39.57 +Professionals,61.54 +Students,37.29 +Families,79.97 +Retirees,69.25 +Professionals,61.34 +Students,46.20 +Families,88.04 +Retirees,35.99 +Professionals,65.82 +Students,21.45 +Families,80.35 +Retirees,36.62 +Professionals,140.12 +Students,21.27 +Families,43.17 +Retirees,28.55 +Professionals,54.80 +Students,21.65 +Families,92.21 +Retirees,61.74 +Professionals,77.43 +Students,13.87 +Families,73.79 +Retirees,44.57 +Professionals,29.74 +Students,24.58 +Families,100.35 +Retirees,15.47 +Professionals,33.32 +Students,14.57 +Families,112.54 +Retirees,46.23 +Professionals,46.01 +Students,26.96 +Families,80.42 +Retirees,30.23 +Professionals,43.91 +Students,38.42 +Families,121.80 +Retirees,70.36 +Professionals,36.99 +Students,16.53 +Families,61.46 +Retirees,37.07 +Professionals,50.37 +Students,26.56 +Families,94.86 +Retirees,34.35 +Professionals,79.72 +Students,42.79 +Families,111.88 +Retirees,44.73 +Professionals,86.28 +Students,19.96 +Families,107.14 +Retirees,60.60 +Professionals,28.07 +Students,32.23 +Families,106.32 +Retirees,87.90 +Professionals,48.02 +Students,29.21 +Families,85.65 +Retirees,44.22 +Professionals,47.10 +Students,14.25 +Families,61.16 +Retirees,42.78 +Professionals,98.77 +Students,26.33 +Families,73.55 +Retirees,28.39 +Professionals,42.31 +Students,21.04 +Families,89.16 +Retirees,73.90 +Professionals,59.37 +Students,28.32 +Families,81.20 +Retirees,37.87 +Professionals,97.97 +Students,20.01 +Families,100.57 +Retirees,69.57 +Professionals,53.43 +Students,31.27 +Families,99.15 +Retirees,70.25 +Professionals,57.11 +Students,35.81 +Families,74.88 +Retirees,69.35 +Professionals,50.85 +Students,20.96 +Families,107.56 +Retirees,30.98 +Professionals,30.93 +Students,65.31 +Families,49.74 +Retirees,26.35 +Professionals,93.20 +Students,21.19 +Families,73.42 +Retirees,28.14 +Professionals,57.15 +Students,19.41 +Families,64.48 +Retirees,68.06 +Professionals,30.69 +Students,23.09 +Families,91.11 +Retirees,85.93 +Professionals,56.55 +Students,20.76 +Families,95.41 +Retirees,48.25 +Professionals,45.02 +Students,33.81 +Families,91.41 +Retirees,75.87 +Professionals,101.01 +Students,29.32 +Families,54.43 +Retirees,31.42 +Professionals,54.88 +Students,20.51 +Families,72.45 +Retirees,23.73 +Professionals,170.41 +Students,8.10 +Families,66.17 +Retirees,30.90 +Professionals,125.93 +Students,44.90 +Families,97.19 +Retirees,34.51 +Professionals,133.14 +Students,25.19 +Families,86.93 +Retirees,71.56 +Professionals,84.59 +Students,9.66 +Families,113.83 +Retirees,80.35 +Professionals,33.68 +Students,18.07 +Families,116.27 +Retirees,70.85 +Professionals,58.69 +Students,32.10 +Families,53.61 +Retirees,73.15 +Professionals,57.11 +Students,13.05 +Families,87.25 +Retirees,31.78 +Professionals,61.49 +Students,19.44 +Families,87.73 +Retirees,30.22 +Professionals,48.20 +Students,47.12 +Families,86.94 +Retirees,35.23 +Professionals,50.52 +Students,21.14 +Families,130.73 +Retirees,45.00 +Professionals,63.73 +Students,19.08 +Families,72.23 +Retirees,20.61 +Professionals,102.63 +Students,27.74 +Families,60.53 +Retirees,31.84 +Professionals,34.91 +Students,23.47 +Families,125.20 +Retirees,82.69 +Professionals,22.33 +Students,33.71 +Families,98.06 +Retirees,78.86 +Professionals,36.86 +Students,7.99 +Families,72.78 +Retirees,20.25 +Professionals,117.51 +Students,13.11 +Families,63.14 +Retirees,51.69 +Professionals,85.01 +Students,28.51 +Families,88.18 +Retirees,82.31 +Professionals,38.26 +Students,21.25 +Families,93.71 +Retirees,29.86 +Professionals,25.44 +Students,33.85 +Families,85.99 +Retirees,76.86 +Professionals,108.09 +Students,7.61 +Families,77.56 +Retirees,28.96 +Professionals,62.46 +Students,30.62 +Families,90.85 +Retirees,37.14 +Professionals,98.26 +Students,31.14 +Families,60.62 +Retirees,25.02 +Professionals,37.63 +Students,9.39 +Families,108.10 +Retirees,86.08 +Professionals,97.98 +Students,9.74 +Families,98.15 +Retirees,79.92 +Professionals,57.51 +Students,12.92 +Families,97.50 +Retirees,27.90 +Professionals,54.30 +Students,56.24 +Families,113.33 +Retirees,38.03 +Professionals,31.75 +Students,16.90 +Families,72.44 +Retirees,68.32 +Professionals,88.41 +Students,26.23 +Families,123.69 +Retirees,72.21 +Professionals,81.01 +Students,20.86 +Families,97.82 +Retirees,16.14 +Professionals,56.99 +Students,52.85 +Families,93.50 +Retirees,74.24 +Professionals,61.17 +Students,39.07 +Families,73.93 +Retirees,32.49 +Professionals,39.80 +Students,22.11 +Families,61.16 +Retirees,88.12 +Professionals,29.04 +Students,57.34 +Families,89.17 +Retirees,74.40 +Professionals,26.84 +Students,14.53 +Families,93.59 +Retirees,49.50 +Professionals,30.19 +Students,26.66 +Families,60.41 +Retirees,70.80 +Professionals,133.89 +Students,48.86 +Families,86.43 +Retirees,72.00 +Professionals,65.62 +Students,18.15 +Families,95.94 +Retirees,80.88 +Professionals,78.42 +Students,14.32 +Families,85.11 +Retirees,75.42 +Professionals,77.32 +Students,21.18 +Families,43.71 +Retirees,54.13 +Professionals,78.98 +Students,67.98 +Families,90.50 +Retirees,76.50 +Professionals,56.56 +Students,30.92 +Families,57.72 +Retirees,32.25 +Professionals,60.50 +Students,30.78 +Families,99.44 +Retirees,26.71 +Professionals,38.99 +Students,23.84 +Families,86.86 +Retirees,82.38 +Professionals,98.35 +Students,12.58 +Families,105.90 +Retirees,37.87 +Professionals,64.57 +Students,30.91 +Families,94.45 +Retirees,75.83 +Professionals,43.95 +Students,14.54 +Families,69.90 +Retirees,42.57 +Professionals,46.59 +Students,41.38 +Families,81.85 +Retirees,34.65 +Professionals,57.90 +Students,24.37 +Families,90.24 +Retirees,27.11 +Professionals,57.77 +Students,21.97 +Families,49.70 +Retirees,29.13 +Professionals,44.49 +Students,34.65 +Families,80.01 +Retirees,18.82 +Professionals,45.33 +Students,29.37 +Families,80.79 +Retirees,37.39 +Professionals,53.39 +Students,32.16 +Families,55.83 +Retirees,33.82 +Professionals,38.54 +Students,10.78 +Families,72.65 +Retirees,50.82 +Professionals,56.83 +Students,28.71 +Families,98.40 +Retirees,73.04 +Professionals,46.87 +Students,80.34 +Families,87.97 +Retirees,20.11 +Professionals,81.25 +Students,22.79 +Families,86.59 +Retirees,32.89 +Professionals,82.75 +Students,45.61 +Families,87.39 +Retirees,40.48 +Professionals,79.16 +Students,10.07 +Families,102.20 +Retirees,32.61 +Professionals,97.79 +Students,42.90 +Families,101.60 +Retirees,32.63 +Professionals,67.20 +Students,22.99 +Families,65.12 +Retirees,34.23 +Professionals,54.02 +Students,34.11 +Families,89.42 +Retirees,32.05 +Professionals,94.67 +Students,18.68 +Families,58.60 +Retirees,31.89 +Professionals,61.91 +Students,16.77 +Families,98.36 +Retirees,70.86 +Professionals,46.00 +Students,49.02 +Families,89.09 +Retirees,28.41 +Professionals,35.83 +Students,13.47 +Families,114.09 +Retirees,48.31 +Professionals,36.24 +Students,43.07 +Families,56.54 +Retirees,54.55 +Professionals,41.13 +Students,14.04 +Families,74.47 +Retirees,63.37 +Professionals,79.48 +Students,28.27 +Families,109.70 +Retirees,51.81 +Professionals,32.96 +Students,14.48 +Families,101.50 +Retirees,72.47 +Professionals,55.97 +Students,13.92 +Families,95.25 +Retirees,71.12 +Professionals,34.96 +Students,31.44 +Families,83.62 +Retirees,71.17 +Professionals,37.53 +Students,25.59 +Families,108.81 +Retirees,73.89 +Professionals,25.64 +Students,23.21 +Families,95.23 +Retirees,82.17 +Professionals,103.65 +Students,44.78 +Families,114.78 +Retirees,27.05 +Professionals,35.79 +Students,15.11 +Families,40.66 +Retirees,33.70 +Professionals,71.17 +Students,21.72 +Families,106.67 +Retirees,24.35 +Professionals,57.04 +Students,21.35 +Families,96.34 +Retirees,29.02 +Professionals,158.25 +Students,24.32 +Families,66.59 +Retirees,86.64 +Professionals,73.51 +Students,44.79 +Families,81.50 +Retirees,88.32 +Professionals,44.59 +Students,12.65 +Families,101.58 +Retirees,48.59 +Professionals,99.17 +Students,21.42 +Families,88.47 +Retirees,70.02 +Professionals,62.10 +Students,10.25 +Families,126.52 +Retirees,38.01 +Professionals,51.59 +Students,20.75 +Families,86.25 +Retirees,31.22 +Professionals,32.84 +Students,35.17 +Families,84.81 +Retirees,67.28 +Professionals,40.47 +Students,11.71 +Families,80.14 +Retirees,41.43 +Professionals,61.85 +Students,30.23 +Families,85.39 +Retirees,76.59 +Professionals,51.71 +Students,26.82 +Families,87.60 +Retirees,41.82 +Professionals,55.14 +Students,13.05 +Families,114.30 +Retirees,31.12 +Professionals,59.08 +Students,23.46 +Families,96.03 +Retirees,55.37 +Professionals,25.11 +Students,34.88 +Families,93.22 +Retirees,36.36 +Professionals,42.94 +Students,17.47 +Families,101.09 +Retirees,21.44 +Professionals,51.61 +Students,31.10 +Families,75.38 +Retirees,73.63 +Professionals,22.54 +Students,24.82 +Families,86.52 +Retirees,74.91 +Professionals,42.70 +Students,20.24 +Families,69.29 +Retirees,79.96 +Professionals,54.60 +Students,40.49 +Families,114.84 +Retirees,44.17 +Professionals,37.56 +Students,26.27 +Families,77.08 +Retirees,66.30 +Professionals,72.26 +Students,42.30 +Families,87.61 +Retirees,31.14 +Professionals,35.29 +Students,20.99 +Families,75.66 +Retirees,25.27 +Professionals,46.17 +Students,23.73 +Families,117.15 +Retirees,26.07 +Professionals,37.39 +Students,19.44 +Families,58.04 +Retirees,27.57 +Professionals,63.00 +Students,23.44 +Families,73.56 +Retirees,80.10 +Professionals,96.47 +Students,14.04 +Families,87.15 +Retirees,28.73 +Professionals,63.04 +Students,14.95 +Families,85.82 +Retirees,30.95 +Professionals,72.07 +Students,32.54 +Families,97.66 +Retirees,40.15 +Professionals,67.87 +Students,14.17 +Families,94.56 +Retirees,77.94 +Professionals,51.98 +Students,8.55 +Families,61.35 +Retirees,43.21 +Professionals,57.04 +Students,22.81 +Families,96.00 +Retirees,41.03 +Professionals,54.20 +Students,17.85 +Families,90.52 +Retirees,29.38 +Professionals,51.44 +Students,25.41 +Families,139.71 +Retirees,29.53 +Professionals,53.84 +Students,17.58 +Families,86.93 +Retirees,59.52 +Professionals,56.89 +Students,11.53 +Families,120.65 +Retirees,34.07 +Professionals,50.34 +Students,14.59 +Families,54.24 +Retirees,40.49 +Professionals,98.12 +Students,13.95 +Families,76.24 +Retirees,82.81 +Professionals,102.48 +Students,12.46 +Families,57.66 +Retirees,78.94 +Professionals,60.71 +Students,28.94 +Families,73.71 +Retirees,27.19 +Professionals,58.43 +Students,14.32 +Families,88.56 +Retirees,41.88 +Professionals,52.76 +Students,17.14 +Families,113.65 +Retirees,31.73 +Professionals,71.33 +Students,92.91 +Families,86.00 +Retirees,40.44 +Professionals,42.22 +Students,18.18 +Families,88.70 +Retirees,35.60 +Professionals,36.23 +Students,25.50 +Families,78.34 +Retirees,75.23 +Professionals,29.71 +Students,6.98 +Families,96.46 +Retirees,26.78 +Professionals,74.72 +Students,22.27 +Families,111.31 +Retirees,65.09 +Professionals,42.99 +Students,17.05 +Families,69.49 +Retirees,34.11 +Professionals,50.94 +Students,25.51 +Families,82.39 +Retirees,73.48 +Professionals,41.86 +Students,24.16 +Families,60.11 +Retirees,71.55 +Professionals,49.24 +Students,25.21 +Families,112.05 +Retirees,35.99 +Professionals,84.22 +Students,20.15 +Families,105.75 +Retirees,69.54 +Professionals,86.67 +Students,27.84 +Families,57.64 +Retirees,24.28 +Professionals,20.22 +Students,25.18 +Families,82.92 +Retirees,40.53 +Professionals,59.85 +Students,15.87 +Families,118.04 +Retirees,66.06 +Professionals,58.81 +Students,8.93 +Families,96.55 +Retirees,32.53 +Professionals,92.15 +Students,29.48 +Families,93.15 +Retirees,31.69 +Professionals,46.90 +Students,44.11 +Families,67.33 +Retirees,31.88 +Professionals,67.86 +Students,26.80 +Families,82.53 +Retirees,39.67 +Professionals,55.95 +Students,15.53 +Families,83.03 +Retirees,28.52 +Professionals,39.22 +Students,39.04 +Families,106.66 +Retirees,33.60 +Professionals,66.83 +Students,12.94 +Families,40.89 +Retirees,76.77 +Professionals,57.02 +Students,10.61 +Families,82.80 +Retirees,68.37 +Professionals,77.35 +Students,13.59 +Families,69.81 +Retirees,59.49 +Professionals,50.69 +Students,13.29 +Families,92.30 +Retirees,54.95 +Professionals,39.65 +Students,13.82 +Families,83.47 +Retirees,60.26 +Professionals,44.69 +Students,29.06 +Families,80.37 +Retirees,77.83 +Professionals,68.42 +Students,34.12 +Families,78.28 +Retirees,81.92 +Professionals,67.69 +Students,13.33 +Families,99.21 +Retirees,29.25 +Professionals,68.25 +Students,30.14 +Families,90.46 +Retirees,65.71 +Professionals,102.65 +Students,20.18 +Families,82.61 +Retirees,69.55 +Professionals,68.22 +Students,15.06 +Families,79.81 +Retirees,75.16 +Professionals,36.46 +Students,29.62 +Families,70.42 +Retirees,42.63 +Professionals,50.26 +Students,27.74 +Families,85.90 +Retirees,65.44 +Professionals,54.02 +Students,66.60 +Families,109.38 +Retirees,43.58 +Professionals,37.96 +Students,13.54 +Families,46.18 +Retirees,60.35 +Professionals,107.29 +Students,28.94 +Families,75.54 +Retirees,26.25 +Professionals,47.75 +Students,38.87 +Families,86.11 +Retirees,78.42 +Professionals,77.16 +Students,9.22 +Families,94.31 +Retirees,35.87 +Professionals,81.54 +Students,32.21 +Families,81.12 +Retirees,44.02 +Professionals,33.20 +Students,35.29 +Families,82.82 +Retirees,69.72 +Professionals,23.43 +Students,19.94 +Families,75.41 +Retirees,92.48 +Professionals,76.96 +Students,17.07 +Families,55.91 +Retirees,32.94 +Professionals,44.96 +Students,42.91 +Families,81.29 +Retirees,30.48 +Professionals,23.02 +Students,35.79 +Families,90.19 +Retirees,68.03 +Professionals,102.19 +Students,12.21 +Families,99.53 +Retirees,70.48 +Professionals,50.21 +Students,15.08 +Families,56.45 +Retirees,74.55 +Professionals,28.12 +Students,11.38 +Families,112.19 +Retirees,43.01 +Professionals,34.80 +Students,44.98 +Families,90.66 +Retirees,66.57 +Professionals,161.54 +Students,20.94 +Families,93.19 +Retirees,67.88 +Professionals,28.61 +Students,29.55 +Families,71.60 +Retirees,36.10 +Professionals,42.52 +Students,42.49 +Families,78.19 +Retirees,76.00 +Professionals,35.66 +Students,7.59 +Families,121.08 +Retirees,60.88 +Professionals,89.34 +Students,48.63 +Families,97.95 +Retirees,45.76 +Professionals,54.99 +Students,20.18 +Families,82.56 +Retirees,90.34 +Professionals,67.80 +Students,14.98 +Families,74.50 +Retirees,69.33 +Professionals,66.01 +Students,34.26 +Families,85.98 +Retirees,81.42 +Professionals,79.80 +Students,58.99 +Families,64.16 +Retirees,37.50 +Professionals,63.11 +Students,22.67 +Families,80.90 +Retirees,76.67 +Professionals,50.49 +Students,15.88 +Families,103.07 +Retirees,37.78 +Professionals,42.85 +Students,20.20 +Families,62.64 +Retirees,69.37 +Professionals,52.11 +Students,34.19 +Families,100.53 +Retirees,36.70 +Professionals,67.44 +Students,14.75 +Families,71.17 +Retirees,72.75 +Professionals,25.02 +Students,10.02 +Families,74.38 +Retirees,27.82 +Professionals,60.68 +Students,37.02 +Families,83.46 +Retirees,70.72 +Professionals,29.22 +Students,19.48 +Families,58.22 +Retirees,71.09 +Professionals,91.12 +Students,46.76 +Families,81.50 +Retirees,30.60 +Professionals,74.30 +Students,27.18 +Families,81.22 +Retirees,75.31 +Professionals,71.70 +Students,29.90 +Families,76.03 +Retirees,28.27 +Professionals,52.10 +Students,29.49 +Families,67.46 +Retirees,71.27 +Professionals,52.00 +Students,24.20 +Families,71.52 +Retirees,58.33 +Professionals,58.13 +Students,24.34 +Families,72.03 +Retirees,74.86 +Professionals,31.79 +Students,10.14 +Families,100.47 +Retirees,67.28 +Professionals,28.46 +Students,29.92 +Families,91.08 +Retirees,69.53 +Professionals,36.93 +Students,13.14 +Families,126.16 +Retirees,44.83 +Professionals,65.85 +Students,18.02 +Families,59.54 +Retirees,67.71 +Professionals,83.18 +Students,37.91 +Families,75.78 +Retirees,43.24 +Professionals,34.49 +Students,22.67 +Families,63.15 +Retirees,69.26 +Professionals,63.94 +Students,29.96 +Families,73.16 +Retirees,60.71 +Professionals,33.59 +Students,27.42 +Families,86.15 +Retirees,56.77 +Professionals,49.01 +Students,26.38 +Families,82.81 +Retirees,68.88 +Professionals,36.00 +Students,20.06 +Families,86.59 +Retirees,31.65 +Professionals,71.42 +Students,20.84 +Families,69.82 +Retirees,28.94 +Professionals,40.76 +Students,13.25 +Families,72.69 +Retirees,87.76 +Professionals,64.65 +Students,23.54 +Families,132.31 +Retirees,38.43 +Professionals,34.27 +Students,10.47 +Families,89.86 +Retirees,84.74 +Professionals,82.51 +Students,13.07 +Families,61.01 +Retirees,62.45 +Professionals,57.86 +Students,14.04 +Families,84.83 +Retirees,89.63 +Professionals,27.36 +Students,24.08 +Families,59.74 +Retirees,25.00 +Professionals,104.12 +Students,11.38 +Families,88.76 +Retirees,42.06 +Professionals,32.03 +Students,63.12 +Families,65.59 +Retirees,81.14 +Professionals,44.24 +Students,13.07 +Families,75.99 +Retirees,32.71 +Professionals,55.76 +Students,29.76 +Families,126.24 +Retirees,25.87 +Professionals,90.92 +Students,20.42 +Families,96.80 +Retirees,60.00 +Professionals,38.07 +Students,20.28 +Families,122.61 +Retirees,37.74 +Professionals,96.00 +Students,15.73 +Families,67.70 +Retirees,28.41 +Professionals,49.47 +Students,9.79 +Families,77.49 +Retirees,38.82 +Professionals,48.49 +Students,20.77 +Families,99.84 +Retirees,77.99 +Professionals,118.37 +Students,23.61 +Families,85.54 +Retirees,59.88 +Professionals,27.18 +Students,34.26 +Families,67.30 +Retirees,78.03 +Professionals,55.11 +Students,13.37 +Families,78.43 +Retirees,37.97 +Professionals,122.96 +Students,61.06 +Families,109.24 +Retirees,35.22 +Professionals,71.92 +Students,42.73 +Families,106.71 +Retirees,41.14 +Professionals,40.71 +Students,17.82 +Families,89.02 +Retirees,71.45 +Professionals,50.05 +Students,16.88 +Families,121.81 +Retirees,48.00 +Professionals,38.53 +Students,25.04 +Families,122.18 +Retirees,73.93 +Professionals,63.47 +Students,24.21 +Families,101.15 +Retirees,65.55 +Professionals,66.23 +Students,36.40 +Families,67.91 +Retirees,88.11 +Professionals,40.07 +Students,33.29 +Families,87.94 +Retirees,34.25 +Professionals,33.28 +Students,32.46 +Families,102.26 +Retirees,41.90 +Professionals,60.53 +Students,24.54 +Families,97.06 +Retirees,70.41 +Professionals,29.08 +Students,23.19 +Families,120.24 +Retirees,39.04 +Professionals,31.16 +Students,17.11 +Families,47.70 +Retirees,91.53 +Professionals,59.01 +Students,27.53 +Families,70.66 +Retirees,19.58 +Professionals,59.39 +Students,26.71 +Families,83.53 +Retirees,37.94 +Professionals,30.93 +Students,40.29 +Families,110.62 +Retirees,32.50 +Professionals,59.43 +Students,19.87 +Families,99.43 +Retirees,33.59 +Professionals,36.45 +Students,18.05 +Families,69.06 +Retirees,45.04 +Professionals,47.14 +Students,33.52 +Families,77.01 +Retirees,72.29 +Professionals,56.18 +Students,29.26 +Families,108.55 +Retirees,75.17 +Professionals,30.57 +Students,40.51 +Families,118.52 +Retirees,44.25 +Professionals,43.47 +Students,12.21 +Families,57.71 +Retirees,20.00 +Professionals,64.59 +Students,20.88 +Families,96.08 +Retirees,41.24 +Professionals,47.12 +Students,58.38 +Families,78.83 +Retirees,72.83 +Professionals,40.17 +Students,15.29 +Families,93.87 +Retirees,76.15 +Professionals,70.55 +Students,17.31 +Families,102.17 +Retirees,84.54 +Professionals,52.78 +Students,17.22 +Families,67.51 +Retirees,82.41 +Professionals,39.64 +Students,17.72 +Families,76.96 +Retirees,35.85 +Professionals,61.60 +Students,21.94 +Families,71.76 +Retirees,63.85 +Professionals,81.56 +Students,34.35 +Families,57.55 +Retirees,39.82 +Professionals,89.22 +Students,17.24 +Families,68.54 +Retirees,69.57 +Professionals,49.97 +Students,18.35 +Families,64.09 +Retirees,80.12 +Professionals,25.72 +Students,18.19 +Families,81.64 +Retirees,57.32 +Professionals,124.35 +Students,8.22 +Families,68.07 +Retirees,67.41 +Professionals,62.45 +Students,14.58 +Families,93.10 +Retirees,41.76 +Professionals,142.49 +Students,18.20 +Families,89.39 +Retirees,31.95 +Professionals,51.11 +Students,17.97 +Families,67.10 +Retirees,77.76 +Professionals,48.68 +Students,7.43 +Families,70.27 +Retirees,26.99 +Professionals,25.96 +Students,32.97 +Families,70.70 +Retirees,64.23 +Professionals,42.96 +Students,21.18 +Families,92.62 +Retirees,67.19 +Professionals,125.84 +Students,32.61 +Families,71.14 +Retirees,67.83 +Professionals,41.62 +Students,15.40 +Families,93.32 +Retirees,30.50 +Professionals,52.33 +Students,11.79 +Families,102.14 +Retirees,69.96 +Professionals,38.81 +Students,17.67 +Families,85.65 +Retirees,79.24 +Professionals,42.23 +Students,31.04 +Families,69.34 +Retirees,24.75 +Professionals,30.20 +Students,62.07 +Families,86.59 +Retirees,23.00 +Professionals,40.47 +Students,23.73 +Families,95.73 +Retirees,65.40 +Professionals,71.67 +Students,18.29 +Families,72.46 +Retirees,50.41 +Professionals,52.30 +Students,22.23 +Families,49.58 +Retirees,38.16 +Professionals,87.89 +Students,26.74 +Families,92.54 +Retirees,45.48 +Professionals,29.40 +Students,31.33 +Families,85.45 +Retirees,23.02 +Professionals,102.86 +Students,12.71 +Families,84.49 +Retirees,72.87 +Professionals,42.71 +Students,39.69 +Families,101.33 +Retirees,76.12 +Professionals,22.12 +Students,33.64 +Families,72.89 +Retirees,70.33 +Professionals,79.36 +Students,16.66 +Families,82.73 +Retirees,90.00 +Professionals,32.24 +Students,16.58 +Families,102.77 +Retirees,73.11 +Professionals,46.13 +Students,20.11 +Families,87.33 +Retirees,69.52 +Professionals,57.86 +Students,34.35 +Families,82.98 +Retirees,39.89 +Professionals,49.56 +Students,16.14 +Families,113.06 +Retirees,20.93 +Professionals,84.41 +Students,20.91 +Families,90.89 +Retirees,29.02 +Professionals,70.29 +Students,21.54 +Families,93.67 +Retirees,35.31 +Professionals,47.75 +Students,29.93 +Families,109.44 +Retirees,34.19 +Professionals,42.09 +Students,16.47 +Families,75.92 +Retirees,44.11 +Professionals,86.15 +Students,19.18 +Families,106.12 +Retirees,36.36 +Professionals,27.38 +Students,19.09 +Families,69.30 +Retirees,27.23 +Professionals,79.14 +Students,15.60 +Families,108.70 +Retirees,55.83 +Professionals,22.93 +Students,33.09 +Families,65.72 +Retirees,74.78 +Professionals,67.19 +Students,16.06 +Families,110.43 +Retirees,74.50 +Professionals,38.62 +Students,26.97 +Families,80.03 +Retirees,31.99 +Professionals,26.04 +Students,18.58 +Families,67.22 +Retirees,23.31 +Professionals,49.58 +Students,27.19 +Families,69.54 +Retirees,82.26 +Professionals,52.83 +Students,19.22 +Families,79.25 +Retirees,73.54 +Professionals,31.68 +Students,20.72 +Families,64.57 +Retirees,22.83 +Professionals,37.93 +Students,19.64 +Families,93.23 +Retirees,74.86 +Professionals,61.90 +Students,19.38 +Families,104.75 +Retirees,36.77 +Professionals,34.16 +Students,9.63 +Families,68.51 +Retirees,26.98 +Professionals,103.67 +Students,13.66 +Families,66.07 +Retirees,59.81 +Professionals,46.78 +Students,23.07 +Families,115.17 +Retirees,20.04 +Professionals,47.79 +Students,17.75 +Families,92.10 +Retirees,73.18 +Professionals,45.93 +Students,26.74 +Families,79.02 +Retirees,37.46 +Professionals,92.23 +Students,14.86 +Families,90.66 +Retirees,37.54 +Professionals,59.18 +Students,27.52 +Families,98.92 +Retirees,34.29 +Professionals,41.60 +Students,17.51 +Families,72.76 +Retirees,44.97 +Professionals,65.76 +Students,23.10 +Families,83.71 +Retirees,34.23 +Professionals,52.10 +Students,43.08 +Families,78.52 +Retirees,31.95 +Professionals,38.13 +Students,46.36 +Families,73.39 +Retirees,24.14 +Professionals,33.82 +Students,22.13 +Families,116.55 +Retirees,26.88 +Professionals,45.06 +Students,15.85 +Families,95.09 +Retirees,25.05 +Professionals,28.47 +Students,42.59 +Families,88.29 +Retirees,92.29 +Professionals,40.92 +Students,32.12 +Families,107.41 +Retirees,89.12 +Professionals,45.22 +Students,24.95 +Families,91.45 +Retirees,59.42 +Professionals,40.89 +Students,15.02 +Families,93.25 +Retirees,71.28 +Professionals,52.88 +Students,11.57 +Families,49.73 +Retirees,84.31 +Professionals,56.84 +Students,9.33 +Families,89.68 +Retirees,59.95 +Professionals,64.13 +Students,13.54 +Families,69.31 +Retirees,19.97 +Professionals,95.65 +Students,14.20 +Families,109.91 +Retirees,31.19 +Professionals,27.78 +Students,20.86 +Families,118.53 +Retirees,59.15 +Professionals,119.92 +Students,23.43 +Families,64.61 +Retirees,28.15 +Professionals,59.56 +Students,27.31 +Families,78.33 +Retirees,67.46 +Professionals,40.28 +Students,20.41 +Families,65.47 +Retirees,69.99 +Professionals,33.86 +Students,38.53 +Families,93.02 +Retirees,62.84 +Professionals,52.87 +Students,17.74 +Families,75.83 +Retirees,80.23 +Professionals,47.67 +Students,38.29 +Families,83.77 +Retirees,36.15 +Professionals,53.13 +Students,48.07 +Families,61.63 +Retirees,46.59 +Professionals,26.37 +Students,34.73 +Families,80.13 +Retirees,72.82 +Professionals,45.20 +Students,18.78 +Families,96.23 +Retirees,43.28 +Professionals,63.59 +Students,41.59 +Families,86.97 +Retirees,69.93 +Professionals,57.67 +Students,10.07 +Families,91.80 +Retirees,24.17 +Professionals,56.65 +Students,20.73 +Families,93.51 +Retirees,68.97 +Professionals,78.06 +Students,24.71 +Families,66.60 +Retirees,63.04 +Professionals,127.24 +Students,14.83 +Families,68.44 +Retirees,63.66 +Professionals,40.44 +Students,55.60 +Families,96.26 +Retirees,80.24 +Professionals,67.81 +Students,42.44 +Families,81.67 +Retirees,54.00 +Professionals,66.93 +Students,19.48 +Families,107.11 +Retirees,30.07 +Professionals,30.47 +Students,13.48 +Families,104.96 +Retirees,33.99 +Professionals,26.78 +Students,12.56 +Families,94.11 +Retirees,31.56 +Professionals,57.14 +Students,34.32 +Families,87.11 +Retirees,65.55 +Professionals,38.66 +Students,26.65 +Families,80.57 +Retirees,37.54 +Professionals,83.43 +Students,16.67 +Families,98.72 +Retirees,75.11 +Professionals,66.20 +Students,12.77 +Families,102.25 +Retirees,35.07 +Professionals,55.64 +Students,10.59 +Families,81.36 +Retirees,74.81 +Professionals,99.09 +Students,14.24 +Families,76.90 +Retirees,35.19 +Professionals,33.75 +Students,25.75 +Families,78.60 +Retirees,75.82 +Professionals,55.08 +Students,62.76 +Families,49.66 +Retirees,32.81 +Professionals,92.75 +Students,46.69 +Families,100.17 +Retirees,79.16 +Professionals,59.67 +Students,43.18 +Families,74.86 +Retirees,71.59 +Professionals,84.04 +Students,19.67 +Families,109.29 +Retirees,71.76 +Professionals,49.00 +Students,13.99 +Families,74.46 +Retirees,88.54 +Professionals,51.91 +Students,30.47 +Families,93.63 +Retirees,31.33 +Professionals,70.71 +Students,28.66 +Families,90.63 +Retirees,26.08 +Professionals,124.04 +Students,14.08 +Families,76.64 +Retirees,56.09 +Professionals,70.61 +Students,18.13 +Families,101.30 +Retirees,49.16 +Professionals,34.39 +Students,27.94 +Families,91.61 +Retirees,58.19 +Professionals,92.08 +Students,30.82 +Families,127.10 +Retirees,59.72 +Professionals,42.82 +Students,25.61 +Families,72.88 +Retirees,45.58 +Professionals,55.43 +Students,20.83 +Families,47.25 +Retirees,86.01 +Professionals,37.88 +Students,24.49 +Families,95.31 +Retirees,49.19 +Professionals,56.75 +Students,41.19 +Families,105.79 +Retirees,39.49 +Professionals,23.15 +Students,16.95 +Families,79.04 +Retirees,47.37 +Professionals,43.73 +Students,45.09 +Families,94.21 +Retirees,71.43 +Professionals,92.06 +Students,19.94 +Families,78.22 +Retirees,64.90 +Professionals,36.16 +Students,20.26 +Families,68.44 +Retirees,63.82 +Professionals,127.95 +Students,44.54 +Families,97.03 +Retirees,73.63 +Professionals,48.33 +Students,27.39 +Families,77.14 +Retirees,42.25 +Professionals,75.16 +Students,61.41 +Families,97.27 +Retirees,62.02 +Professionals,40.67 +Students,33.31 +Families,81.63 +Retirees,34.99 +Professionals,70.73 +Students,27.64 +Families,100.34 +Retirees,37.90 +Professionals,74.40 +Students,18.62 +Families,67.82 +Retirees,23.13 +Professionals,28.17 +Students,18.13 +Families,102.41 +Retirees,82.75 +Professionals,45.65 +Students,18.63 +Families,69.31 +Retirees,66.75 +Professionals,97.03 +Students,26.98 +Families,99.96 +Retirees,47.26 +Professionals,40.29 +Students,18.55 +Families,50.10 +Retirees,30.47 +Professionals,40.71 +Students,13.87 +Families,86.48 +Retirees,35.63 +Professionals,66.88 +Students,19.89 +Families,73.98 +Retirees,74.53 +Professionals,77.34 +Students,25.96 +Families,91.33 +Retirees,32.61 +Professionals,86.43 +Students,23.55 +Families,86.02 +Retirees,37.97 +Professionals,32.83 +Students,14.56 +Families,75.28 +Retirees,14.97 +Professionals,59.54 +Students,23.67 +Families,83.85 +Retirees,31.93 +Professionals,40.28 +Students,19.76 +Families,78.86 +Retirees,25.46 +Professionals,37.91 +Students,14.82 +Families,85.40 +Retirees,32.84 +Professionals,36.03 +Students,20.22 +Families,85.52 +Retirees,78.44 +Professionals,25.23 +Students,16.99 +Families,94.45 +Retirees,52.50 +Professionals,43.06 +Students,29.39 +Families,109.14 +Retirees,71.36 +Professionals,42.31 +Students,23.71 +Families,66.66 +Retirees,74.48 +Professionals,34.52 +Students,20.79 +Families,105.11 +Retirees,77.51 +Professionals,93.47 +Students,29.14 +Families,60.39 +Retirees,40.55 +Professionals,57.07 +Students,22.72 +Families,100.79 +Retirees,29.81 +Professionals,81.71 +Students,18.35 +Families,96.05 +Retirees,73.36 +Professionals,151.55 +Students,22.14 +Families,116.88 +Retirees,37.95 +Professionals,60.14 +Students,25.67 +Families,78.32 +Retirees,73.00 +Professionals,37.62 +Students,26.40 +Families,103.86 +Retirees,77.00 +Professionals,27.37 +Students,19.08 +Families,79.46 +Retirees,85.02 +Professionals,46.48 +Students,23.64 +Families,111.24 +Retirees,89.65 +Professionals,39.79 +Students,20.39 +Families,105.40 +Retirees,82.91 +Professionals,95.08 +Students,15.27 +Families,113.55 +Retirees,43.30 +Professionals,68.63 +Students,51.75 +Families,125.23 +Retirees,88.42 +Professionals,51.60 +Students,17.31 +Families,75.10 +Retirees,81.24 +Professionals,74.25 +Students,62.72 +Families,77.78 +Retirees,35.51 +Professionals,76.63 +Students,12.58 +Families,93.04 +Retirees,37.96 +Professionals,39.30 +Students,29.11 +Families,80.79 +Retirees,78.30 +Professionals,64.79 +Students,23.04 +Families,67.61 +Retirees,19.51 +Professionals,42.50 +Students,27.64 +Families,86.86 +Retirees,33.32 +Professionals,68.98 +Students,12.35 +Families,60.63 +Retirees,36.87 +Professionals,144.60 +Students,12.23 +Families,77.64 +Retirees,27.85 +Professionals,57.59 +Students,13.80 +Families,120.51 +Retirees,80.02 +Professionals,66.29 +Students,46.38 +Families,60.35 +Retirees,35.50 +Professionals,129.81 +Students,29.50 +Families,83.88 +Retirees,62.89 +Professionals,61.65 +Students,46.24 +Families,103.04 +Retirees,30.89 +Professionals,119.57 +Students,13.56 +Families,82.87 +Retirees,20.60 +Professionals,46.18 +Students,14.25 +Families,92.02 +Retirees,36.71 +Professionals,50.94 +Students,28.81 +Families,75.20 +Retirees,42.02 +Professionals,59.14 +Students,12.20 +Families,105.75 +Retirees,71.04 +Professionals,41.44 +Students,18.26 +Families,95.35 +Retirees,80.83 +Professionals,64.57 +Students,19.47 +Families,87.89 +Retirees,84.56 +Professionals,45.30 +Students,9.40 +Families,67.98 +Retirees,74.58 +Professionals,56.41 +Students,23.44 +Families,83.94 +Retirees,77.08 +Professionals,40.84 +Students,32.27 +Families,100.02 +Retirees,69.45 +Professionals,45.14 +Students,13.90 +Families,96.70 +Retirees,27.18 +Professionals,56.97 +Students,17.21 +Families,93.19 +Retirees,44.68 +Professionals,69.76 +Students,40.42 +Families,69.99 +Retirees,52.60 +Professionals,53.34 +Students,31.90 +Families,91.15 +Retirees,29.43 +Professionals,28.91 +Students,11.15 +Families,90.34 +Retirees,36.99 +Professionals,33.63 +Students,9.25 +Families,92.92 +Retirees,38.69 +Professionals,99.75 +Students,18.30 +Families,58.85 +Retirees,77.33 +Professionals,74.26 +Students,8.37 +Families,85.05 +Retirees,74.67 +Professionals,58.89 +Students,18.10 +Families,95.56 +Retirees,32.25 +Professionals,105.26 +Students,13.13 +Families,93.95 +Retirees,67.15 +Professionals,66.09 +Students,11.95 +Families,66.13 +Retirees,38.27 +Professionals,76.23 +Students,39.57 +Families,71.55 +Retirees,37.52 +Professionals,43.51 +Students,36.89 +Families,94.19 +Retirees,76.23 +Professionals,27.90 +Students,32.88 +Families,92.95 +Retirees,39.50 +Professionals,35.89 +Students,17.11 +Families,76.61 +Retirees,66.60 +Professionals,42.24 +Students,28.46 +Families,80.44 +Retirees,58.78 +Professionals,39.91 +Students,16.83 +Families,79.03 +Retirees,25.18 +Professionals,54.92 +Students,35.59 +Families,110.12 +Retirees,25.08 +Professionals,110.40 +Students,16.92 +Families,116.13 +Retirees,35.66 +Professionals,118.37 +Students,25.98 +Families,77.09 +Retirees,55.59 +Professionals,54.27 +Students,20.23 +Families,60.29 +Retirees,71.52 +Professionals,111.82 +Students,12.64 +Families,83.00 +Retirees,31.12 +Professionals,39.66 +Students,33.27 +Families,87.89 +Retirees,41.88 +Professionals,44.34 +Students,23.65 +Families,92.43 +Retirees,79.36 +Professionals,47.64 +Students,28.54 +Families,99.42 +Retirees,68.81 +Professionals,47.71 +Students,7.51 +Families,99.50 +Retirees,43.19 +Professionals,41.18 +Students,31.81 +Families,66.27 +Retirees,85.46 +Professionals,106.76 +Students,46.05 +Families,92.13 +Retirees,31.30 +Professionals,63.73 +Students,44.03 +Families,99.04 +Retirees,16.75 +Professionals,64.83 +Students,10.18 +Families,65.32 +Retirees,34.29 +Professionals,29.01 +Students,28.06 +Families,119.95 +Retirees,36.50 +Professionals,33.61 +Students,24.79 +Families,87.51 +Retirees,26.41 +Professionals,37.25 +Students,32.56 +Families,74.29 +Retirees,83.78 +Professionals,25.97 +Students,25.03 +Families,68.13 +Retirees,29.14 +Professionals,127.28 +Students,40.55 +Families,85.53 +Retirees,62.93 +Professionals,114.39 +Students,11.55 +Families,74.18 +Retirees,67.02 +Professionals,54.68 +Students,30.21 +Families,84.21 +Retirees,34.02 +Professionals,69.45 +Students,15.09 +Families,79.32 +Retirees,73.89 +Professionals,89.53 +Students,32.11 +Families,90.65 +Retirees,27.71 +Professionals,50.93 +Students,36.52 +Families,75.58 +Retirees,40.29 +Professionals,40.63 +Students,26.13 +Families,82.93 +Retirees,61.58 +Professionals,47.58 +Students,36.30 +Families,105.93 +Retirees,50.91 +Professionals,71.24 +Students,31.42 +Families,92.96 +Retirees,55.15 +Professionals,79.37 +Students,41.32 +Families,29.25 +Retirees,69.19 +Professionals,53.20 +Students,27.90 +Families,57.58 +Retirees,33.05 +Professionals,24.12 +Students,32.08 +Families,107.58 +Retirees,40.47 +Professionals,108.77 +Students,25.78 +Families,82.95 +Retirees,34.13 +Professionals,33.32 +Students,11.71 +Families,68.06 +Retirees,64.66 +Professionals,52.76 +Students,8.63 +Families,131.75 +Retirees,27.51 +Professionals,49.30 +Students,19.69 +Families,122.29 +Retirees,83.01 +Professionals,28.47 +Students,74.84 +Families,70.47 +Retirees,67.93 +Professionals,49.57 +Students,22.17 +Families,88.77 +Retirees,42.04 +Professionals,83.17 +Students,19.01 +Families,92.64 +Retirees,67.23 +Professionals,94.31 +Students,30.30 +Families,107.03 +Retirees,38.99 +Professionals,79.65 +Students,11.69 +Families,58.21 +Retirees,77.41 +Professionals,36.39 +Students,23.66 +Families,88.23 +Retirees,63.42 +Professionals,28.73 +Students,12.77 +Families,65.77 +Retirees,53.89 +Professionals,47.29 +Students,32.57 +Families,62.67 +Retirees,77.20 +Professionals,82.46 +Students,19.02 +Families,78.16 +Retirees,32.47 +Professionals,67.57 +Students,26.54 +Families,86.89 +Retirees,63.76 +Professionals,42.04 +Students,30.24 +Families,106.41 +Retirees,61.04 +Professionals,77.01 +Students,30.62 +Families,99.96 +Retirees,78.07 +Professionals,42.89 +Students,13.28 +Families,78.25 +Retirees,73.12 +Professionals,73.89 +Students,16.62 +Families,90.40 +Retirees,59.17 +Professionals,45.92 +Students,10.71 +Families,128.27 +Retirees,32.31 +Professionals,46.86 +Students,26.83 +Families,87.26 +Retirees,35.13 +Professionals,47.60 +Students,10.80 +Families,107.84 +Retirees,29.43 +Professionals,92.14 +Students,12.01 +Families,116.70 +Retirees,71.94 +Professionals,31.51 +Students,11.62 +Families,83.60 +Retirees,86.03 +Professionals,64.99 +Students,23.69 +Families,76.75 +Retirees,27.09 +Professionals,54.22 +Students,12.08 +Families,77.48 +Retirees,72.76 +Professionals,77.56 +Students,38.42 +Families,87.86 +Retirees,71.49 +Professionals,51.68 +Students,22.89 +Families,77.92 +Retirees,56.04 +Professionals,33.12 +Students,12.68 +Families,81.72 +Retirees,80.94 +Professionals,41.46 +Students,19.78 +Families,76.62 +Retirees,82.60 +Professionals,56.36 +Students,19.52 +Families,61.25 +Retirees,44.39 +Professionals,67.68 +Students,16.19 +Families,78.96 +Retirees,32.36 +Professionals,61.81 +Students,22.74 +Families,73.14 +Retirees,26.22 +Professionals,131.59 +Students,17.93 +Families,111.31 +Retirees,27.90 +Professionals,47.77 +Students,11.85 +Families,83.47 +Retirees,35.49 +Professionals,104.97 +Students,17.29 +Families,34.94 +Retirees,30.59 +Professionals,32.44 +Students,21.41 +Families,100.47 +Retirees,40.92 +Professionals,42.00 +Students,22.49 +Families,53.26 +Retirees,49.81 +Professionals,33.24 +Students,23.21 +Families,76.44 +Retirees,43.24 +Professionals,89.71 +Students,13.09 +Families,57.97 +Retirees,83.90 +Professionals,70.87 +Students,23.48 +Families,74.88 +Retirees,34.16 +Professionals,66.52 +Students,26.30 +Families,59.29 +Retirees,29.50 +Professionals,114.81 +Students,46.14 +Families,81.99 +Retirees,76.99 +Professionals,36.59 +Students,29.03 +Families,89.62 +Retirees,72.63 +Professionals,64.46 +Students,30.48 +Families,85.68 +Retirees,77.84 +Professionals,69.04 +Students,10.32 +Families,104.92 +Retirees,34.47 +Professionals,42.50 +Students,16.74 +Families,19.81 +Retirees,31.51 +Professionals,78.40 +Students,12.00 +Families,97.02 +Retirees,72.76 +Professionals,55.79 +Students,59.65 +Families,93.33 +Retirees,40.58 +Professionals,40.36 +Students,13.57 +Families,63.48 +Retirees,27.85 +Professionals,55.90 +Students,14.24 +Families,93.57 +Retirees,26.16 +Professionals,76.47 +Students,15.87 +Families,116.40 +Retirees,29.74 +Professionals,23.16 +Students,16.44 +Families,61.65 +Retirees,34.01 +Professionals,83.52 +Students,8.78 +Families,110.22 +Retirees,67.71 +Professionals,99.38 +Students,15.49 +Families,90.03 +Retirees,67.06 +Professionals,54.17 +Students,17.86 +Families,96.83 +Retirees,58.86 +Professionals,34.45 +Students,26.70 +Families,124.13 +Retirees,50.75 +Professionals,31.43 +Students,22.20 +Families,91.17 +Retirees,31.06 +Professionals,40.44 +Students,30.91 +Families,115.20 +Retirees,86.17 +Professionals,89.57 +Students,21.38 +Families,86.21 +Retirees,56.91 +Professionals,76.33 +Students,14.50 +Families,71.77 +Retirees,27.04 +Professionals,46.48 +Students,22.01 +Families,110.17 +Retirees,94.17 +Professionals,64.28 +Students,53.51 +Families,102.68 +Retirees,31.78 +Professionals,44.19 +Students,21.16 +Families,91.50 +Retirees,36.09 +Professionals,64.95 +Students,51.95 +Families,69.50 +Retirees,42.32 +Professionals,39.93 +Students,24.27 +Families,96.80 +Retirees,28.31 +Professionals,92.35 +Students,9.85 +Families,71.31 +Retirees,65.72 +Professionals,64.36 +Students,28.77 +Families,47.46 +Retirees,27.97 +Professionals,41.95 +Students,33.05 +Families,53.74 +Retirees,78.07 +Professionals,51.79 +Students,20.23 +Families,97.86 +Retirees,24.92 +Professionals,54.77 +Students,17.10 +Families,91.45 +Retirees,64.00 +Professionals,75.75 +Students,41.91 +Families,49.63 +Retirees,64.68 +Professionals,37.48 +Students,22.22 +Families,62.43 +Retirees,65.32 +Professionals,112.75 +Students,26.71 +Families,65.83 +Retirees,66.30 +Professionals,52.39 +Students,17.96 +Families,82.11 +Retirees,79.22 +Professionals,47.43 +Students,14.02 +Families,97.98 +Retirees,73.20 +Professionals,173.06 +Students,18.41 +Families,86.44 +Retirees,43.61 +Professionals,113.15 +Students,6.77 +Families,86.80 +Retirees,27.95 +Professionals,56.72 +Students,44.58 +Families,62.78 +Retirees,73.02 +Professionals,42.28 +Students,24.80 +Families,105.11 +Retirees,35.14 +Professionals,94.24 +Students,32.34 +Families,89.36 +Retirees,78.54 +Professionals,40.18 +Students,20.14 +Families,84.46 +Retirees,76.15 +Professionals,61.36 +Students,31.88 +Families,68.35 +Retirees,69.22 +Professionals,47.20 +Students,15.58 +Families,108.67 +Retirees,34.79 +Professionals,47.03 +Students,16.72 +Families,89.77 +Retirees,66.94 +Professionals,88.97 +Students,47.72 +Families,69.54 +Retirees,24.67 +Professionals,83.66 diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-renamed/case.json b/agents/evals/fixtures/cases/violin-basic-pygal-renamed/case.json new file mode 100644 index 00000000000..4a4975d23c8 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-renamed/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "violin-basic", + "library": "pygal", + "locale": "de", + "perturbation": "renamed", + "bindings": [ + { + "role": "category", + "column": "segment" + }, + { + "role": "value", + "column": "basket_eur" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "renamed", + "synthetic", + "renamed-headers" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, renamed)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-renamed/data.csv b/agents/evals/fixtures/cases/violin-basic-pygal-renamed/data.csv new file mode 100644 index 00000000000..f88e643436c --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-renamed/data.csv @@ -0,0 +1,401 @@ +segment,basket_eur +Students,14.07 +Families,98.65 +Retirees,63.77 +Professionals,54.23 +Students,7.03 +Families,89.88 +Retirees,34.77 +Professionals,50.78 +Students,17.69 +Families,134.75 +Retirees,30.60 +Professionals,62.20 +Students,14.92 +Families,115.29 +Retirees,21.91 +Professionals,67.09 +Students,19.17 +Families,110.73 +Retirees,28.02 +Professionals,54.26 +Students,21.51 +Families,79.17 +Retirees,39.53 +Professionals,43.37 +Students,10.80 +Families,49.56 +Retirees,76.84 +Professionals,74.95 +Students,14.05 +Families,46.72 +Retirees,49.78 +Professionals,41.90 +Students,27.46 +Families,76.29 +Retirees,80.98 +Professionals,68.49 +Students,23.83 +Families,56.71 +Retirees,64.30 +Professionals,97.86 +Students,32.82 +Families,70.32 +Retirees,80.67 +Professionals,35.59 +Students,19.89 +Families,76.06 +Retirees,72.90 +Professionals,70.40 +Students,14.21 +Families,81.29 +Retirees,25.11 +Professionals,51.93 +Students,18.37 +Families,85.01 +Retirees,40.22 +Professionals,44.24 +Students,17.86 +Families,93.67 +Retirees,43.56 +Professionals,91.76 +Students,33.28 +Families,102.97 +Retirees,41.06 +Professionals,100.33 +Students,33.28 +Families,79.74 +Retirees,62.88 +Professionals,27.55 +Students,41.19 +Families,107.49 +Retirees,31.48 +Professionals,121.52 +Students,14.52 +Families,73.63 +Retirees,71.69 +Professionals,46.11 +Students,28.97 +Families,105.38 +Retirees,66.12 +Professionals,41.76 +Students,24.41 +Families,106.45 +Retirees,32.50 +Professionals,22.59 +Students,22.51 +Families,89.34 +Retirees,84.89 +Professionals,39.16 +Students,34.24 +Families,100.71 +Retirees,37.17 +Professionals,24.74 +Students,16.87 +Families,82.53 +Retirees,23.43 +Professionals,31.85 +Students,24.66 +Families,94.35 +Retirees,78.00 +Professionals,152.39 +Students,21.58 +Families,109.73 +Retirees,77.38 +Professionals,68.12 +Students,23.87 +Families,99.19 +Retirees,32.37 +Professionals,40.72 +Students,16.47 +Families,88.25 +Retirees,15.73 +Professionals,58.83 +Students,52.98 +Families,89.35 +Retirees,28.87 +Professionals,61.93 +Students,19.83 +Families,93.21 +Retirees,30.55 +Professionals,37.59 +Students,36.60 +Families,67.98 +Retirees,35.47 +Professionals,42.28 +Students,36.05 +Families,78.23 +Retirees,58.26 +Professionals,45.58 +Students,35.68 +Families,113.11 +Retirees,35.93 +Professionals,44.83 +Students,14.89 +Families,92.40 +Retirees,81.76 +Professionals,37.09 +Students,33.40 +Families,61.53 +Retirees,35.59 +Professionals,60.61 +Students,16.87 +Families,102.93 +Retirees,87.60 +Professionals,92.86 +Students,21.85 +Families,77.35 +Retirees,33.76 +Professionals,92.10 +Students,22.59 +Families,73.61 +Retirees,32.53 +Professionals,35.00 +Students,29.83 +Families,83.79 +Retirees,79.26 +Professionals,21.34 +Students,23.59 +Families,112.80 +Retirees,75.69 +Professionals,34.25 +Students,43.61 +Families,96.90 +Retirees,36.36 +Professionals,33.52 +Students,20.37 +Families,83.75 +Retirees,66.22 +Professionals,35.49 +Students,20.87 +Families,99.93 +Retirees,43.49 +Professionals,40.22 +Students,14.19 +Families,86.40 +Retirees,87.92 +Professionals,104.52 +Students,33.49 +Families,91.78 +Retirees,33.64 +Professionals,68.52 +Students,22.35 +Families,64.32 +Retirees,34.77 +Professionals,59.34 +Students,24.31 +Families,85.21 +Retirees,71.52 +Professionals,50.91 +Students,17.60 +Families,82.48 +Retirees,64.85 +Professionals,58.28 +Students,22.13 +Families,96.84 +Retirees,72.02 +Professionals,57.37 +Students,32.78 +Families,91.75 +Retirees,34.03 +Professionals,42.43 +Students,31.11 +Families,119.85 +Retirees,22.88 +Professionals,59.60 +Students,12.00 +Families,70.55 +Retirees,60.50 +Professionals,31.89 +Students,41.34 +Families,78.24 +Retirees,41.48 +Professionals,30.75 +Students,12.81 +Families,77.10 +Retirees,32.53 +Professionals,134.60 +Students,14.69 +Families,88.97 +Retirees,61.03 +Professionals,30.28 +Students,23.28 +Families,75.89 +Retirees,31.14 +Professionals,42.42 +Students,26.10 +Families,82.91 +Retirees,41.48 +Professionals,33.35 +Students,9.96 +Families,103.82 +Retirees,71.73 +Professionals,85.63 +Students,35.51 +Families,78.14 +Retirees,62.85 +Professionals,52.55 +Students,53.34 +Families,75.90 +Retirees,38.24 +Professionals,75.53 +Students,23.10 +Families,81.99 +Retirees,69.59 +Professionals,73.99 +Students,34.39 +Families,77.69 +Retirees,69.91 +Professionals,71.06 +Students,32.25 +Families,65.71 +Retirees,57.54 +Professionals,37.26 +Students,20.66 +Families,70.86 +Retirees,64.51 +Professionals,159.68 +Students,34.78 +Families,100.48 +Retirees,75.07 +Professionals,31.08 +Students,14.78 +Families,95.59 +Retirees,71.47 +Professionals,54.85 +Students,4.32 +Families,70.61 +Retirees,74.01 +Professionals,20.50 +Students,42.51 +Families,75.42 +Retirees,32.80 +Professionals,81.24 +Students,23.32 +Families,61.32 +Retirees,19.58 +Professionals,33.11 +Students,57.91 +Families,93.61 +Retirees,94.53 +Professionals,43.36 +Students,14.60 +Families,71.45 +Retirees,41.11 +Professionals,60.85 +Students,14.60 +Families,84.60 +Retirees,85.70 +Professionals,77.59 +Students,13.23 +Families,89.29 +Retirees,77.35 +Professionals,53.24 +Students,16.74 +Families,59.05 +Retirees,27.50 +Professionals,70.45 +Students,21.61 +Families,100.58 +Retirees,71.62 +Professionals,79.96 +Students,29.96 +Families,106.74 +Retirees,39.18 +Professionals,90.13 +Students,37.92 +Families,95.36 +Retirees,62.76 +Professionals,75.71 +Students,16.92 +Families,83.62 +Retirees,83.22 +Professionals,65.27 +Students,31.29 +Families,106.47 +Retirees,29.12 +Professionals,31.34 +Students,19.09 +Families,106.04 +Retirees,38.32 +Professionals,60.85 +Students,35.39 +Families,105.89 +Retirees,37.83 +Professionals,22.69 +Students,35.81 +Families,88.24 +Retirees,38.00 +Professionals,35.94 +Students,15.70 +Families,73.16 +Retirees,69.72 +Professionals,38.93 +Students,14.32 +Families,83.62 +Retirees,42.96 +Professionals,76.75 +Students,9.38 +Families,61.61 +Retirees,80.80 +Professionals,52.17 +Students,27.20 +Families,108.44 +Retirees,40.82 +Professionals,140.54 +Students,17.99 +Families,86.15 +Retirees,32.49 +Professionals,41.02 +Students,42.45 +Families,73.40 +Retirees,26.13 +Professionals,75.92 +Students,15.44 +Families,93.99 +Retirees,29.36 +Professionals,107.85 +Students,23.13 +Families,101.09 +Retirees,47.31 +Professionals,47.67 +Students,10.26 +Families,130.57 +Retirees,54.57 +Professionals,28.86 +Students,13.84 +Families,76.21 +Retirees,69.06 +Professionals,36.92 +Students,23.10 +Families,98.27 +Retirees,35.71 +Professionals,29.50 +Students,31.28 +Families,100.72 +Retirees,65.58 +Professionals,39.39 +Students,11.18 +Families,126.08 +Retirees,71.56 +Professionals,31.64 +Students,31.11 +Families,96.31 +Retirees,74.67 +Professionals,29.91 +Students,28.16 +Families,104.00 +Retirees,24.53 +Professionals,53.33 +Students,35.20 +Families,65.06 +Retirees,13.32 +Professionals,59.25 +Students,43.60 +Families,71.94 +Retirees,25.58 +Professionals,72.96 +Students,13.80 +Families,119.24 +Retirees,72.04 +Professionals,36.08 diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-x10/case.json b/agents/evals/fixtures/cases/violin-basic-pygal-x10/case.json new file mode 100644 index 00000000000..8ef230129ee --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-x10/case.json @@ -0,0 +1,24 @@ +{ + "spec_id": "violin-basic", + "library": "pygal", + "locale": "en", + "perturbation": "x10", + "bindings": [ + { + "role": "category", + "column": "Customer Segment" + }, + { + "role": "value", + "column": "Basket Value (EUR)" + } + ], + "expected": "accepted", + "tags": [ + "violin", + "x10", + "synthetic", + "scaled-values" + ], + "source": "synthetic: agents/evals/make_fixtures.py (seed 808, x10)" +} diff --git a/agents/evals/fixtures/cases/violin-basic-pygal-x10/data.csv b/agents/evals/fixtures/cases/violin-basic-pygal-x10/data.csv new file mode 100644 index 00000000000..abbd5353be7 --- /dev/null +++ b/agents/evals/fixtures/cases/violin-basic-pygal-x10/data.csv @@ -0,0 +1,401 @@ +Customer Segment,Basket Value (EUR) +Students,140.71 +Families,986.53 +Retirees,637.72 +Professionals,542.28 +Students,70.26 +Families,898.84 +Retirees,347.68 +Professionals,507.84 +Students,176.87 +Families,1347.47 +Retirees,305.97 +Professionals,621.98 +Students,149.17 +Families,1152.86 +Retirees,219.08 +Professionals,670.90 +Students,191.66 +Families,1107.32 +Retirees,280.16 +Professionals,542.65 +Students,215.11 +Families,791.70 +Retirees,395.27 +Professionals,433.72 +Students,107.97 +Families,495.61 +Retirees,768.35 +Professionals,749.53 +Students,140.49 +Families,467.17 +Retirees,497.76 +Professionals,419.03 +Students,274.56 +Families,762.89 +Retirees,809.81 +Professionals,684.87 +Students,238.26 +Families,567.08 +Retirees,642.99 +Professionals,978.59 +Students,328.25 +Families,703.24 +Retirees,806.71 +Professionals,355.95 +Students,198.95 +Families,760.62 +Retirees,729.01 +Professionals,704.04 +Students,142.09 +Families,812.89 +Retirees,251.09 +Professionals,519.29 +Students,183.72 +Families,850.15 +Retirees,402.25 +Professionals,442.42 +Students,178.57 +Families,936.74 +Retirees,435.65 +Professionals,917.62 +Students,332.76 +Families,1029.66 +Retirees,410.57 +Professionals,1003.26 +Students,332.82 +Families,797.39 +Retirees,628.77 +Professionals,275.52 +Students,411.87 +Families,1074.88 +Retirees,314.83 +Professionals,1215.17 +Students,145.18 +Families,736.26 +Retirees,716.93 +Professionals,461.07 +Students,289.74 +Families,1053.81 +Retirees,661.15 +Professionals,417.59 +Students,244.11 +Families,1064.46 +Retirees,324.99 +Professionals,225.87 +Students,225.10 +Families,893.45 +Retirees,848.91 +Professionals,391.62 +Students,342.36 +Families,1007.05 +Retirees,371.74 +Professionals,247.40 +Students,168.71 +Families,825.31 +Retirees,234.31 +Professionals,318.54 +Students,246.59 +Families,943.48 +Retirees,779.96 +Professionals,1523.89 +Students,215.76 +Families,1097.25 +Retirees,773.82 +Professionals,681.16 +Students,238.67 +Families,991.91 +Retirees,323.74 +Professionals,407.21 +Students,164.74 +Families,882.47 +Retirees,157.30 +Professionals,588.27 +Students,529.82 +Families,893.51 +Retirees,288.67 +Professionals,619.32 +Students,198.29 +Families,932.10 +Retirees,305.53 +Professionals,375.88 +Students,365.97 +Families,679.81 +Retirees,354.71 +Professionals,422.84 +Students,360.49 +Families,782.27 +Retirees,582.59 +Professionals,455.79 +Students,356.81 +Families,1131.06 +Retirees,359.31 +Professionals,448.26 +Students,148.93 +Families,923.99 +Retirees,817.62 +Professionals,370.86 +Students,334.02 +Families,615.33 +Retirees,355.89 +Professionals,606.06 +Students,168.67 +Families,1029.31 +Retirees,876.03 +Professionals,928.56 +Students,218.52 +Families,773.49 +Retirees,337.57 +Professionals,921.04 +Students,225.93 +Families,736.15 +Retirees,325.28 +Professionals,350.01 +Students,298.32 +Families,837.86 +Retirees,792.59 +Professionals,213.40 +Students,235.92 +Families,1128.00 +Retirees,756.87 +Professionals,342.49 +Students,436.10 +Families,969.04 +Retirees,363.61 +Professionals,335.23 +Students,203.66 +Families,837.48 +Retirees,662.20 +Professionals,354.93 +Students,208.75 +Families,999.32 +Retirees,434.87 +Professionals,402.16 +Students,141.93 +Families,864.00 +Retirees,879.21 +Professionals,1045.16 +Students,334.87 +Families,917.85 +Retirees,336.39 +Professionals,685.20 +Students,223.52 +Families,643.16 +Retirees,347.66 +Professionals,593.41 +Students,243.10 +Families,852.06 +Retirees,715.20 +Professionals,509.06 +Students,176.00 +Families,824.77 +Retirees,648.48 +Professionals,582.82 +Students,221.32 +Families,968.37 +Retirees,720.18 +Professionals,573.74 +Students,327.77 +Families,917.53 +Retirees,340.32 +Professionals,424.34 +Students,311.11 +Families,1198.52 +Retirees,228.81 +Professionals,595.97 +Students,119.97 +Families,705.53 +Retirees,604.97 +Professionals,318.89 +Students,413.40 +Families,782.39 +Retirees,414.82 +Professionals,307.52 +Students,128.13 +Families,770.97 +Retirees,325.29 +Professionals,1345.98 +Students,146.90 +Families,889.71 +Retirees,610.32 +Professionals,302.84 +Students,232.77 +Families,758.94 +Retirees,311.45 +Professionals,424.25 +Students,261.04 +Families,829.08 +Retirees,414.77 +Professionals,333.49 +Students,99.57 +Families,1038.18 +Retirees,717.35 +Professionals,856.30 +Students,355.13 +Families,781.36 +Retirees,628.47 +Professionals,525.46 +Students,533.38 +Families,758.96 +Retirees,382.37 +Professionals,755.27 +Students,231.03 +Families,819.90 +Retirees,695.94 +Professionals,739.94 +Students,343.92 +Families,776.86 +Retirees,699.05 +Professionals,710.57 +Students,322.53 +Families,657.07 +Retirees,575.38 +Professionals,372.56 +Students,206.61 +Families,708.64 +Retirees,645.12 +Professionals,1596.83 +Students,347.82 +Families,1004.79 +Retirees,750.69 +Professionals,310.82 +Students,147.83 +Families,955.90 +Retirees,714.71 +Professionals,548.52 +Students,43.21 +Families,706.06 +Retirees,740.05 +Professionals,205.02 +Students,425.10 +Families,754.18 +Retirees,327.99 +Professionals,812.42 +Students,233.18 +Families,613.24 +Retirees,195.79 +Professionals,331.07 +Students,579.06 +Families,936.10 +Retirees,945.29 +Professionals,433.58 +Students,146.04 +Families,714.48 +Retirees,411.10 +Professionals,608.48 +Students,145.97 +Families,846.03 +Retirees,857.05 +Professionals,775.91 +Students,132.25 +Families,892.91 +Retirees,773.48 +Professionals,532.39 +Students,167.43 +Families,590.46 +Retirees,275.05 +Professionals,704.46 +Students,216.06 +Families,1005.83 +Retirees,716.16 +Professionals,799.60 +Students,299.63 +Families,1067.41 +Retirees,391.82 +Professionals,901.35 +Students,379.18 +Families,953.61 +Retirees,627.57 +Professionals,757.11 +Students,169.17 +Families,836.16 +Retirees,832.18 +Professionals,652.74 +Students,312.94 +Families,1064.68 +Retirees,291.18 +Professionals,313.43 +Students,190.94 +Families,1060.42 +Retirees,383.16 +Professionals,608.46 +Students,353.88 +Families,1058.88 +Retirees,378.34 +Professionals,226.94 +Students,358.14 +Families,882.36 +Retirees,380.05 +Professionals,359.41 +Students,156.99 +Families,731.62 +Retirees,697.22 +Professionals,389.33 +Students,143.22 +Families,836.22 +Retirees,429.65 +Professionals,767.50 +Students,93.80 +Families,616.14 +Retirees,807.99 +Professionals,521.67 +Students,272.03 +Families,1084.45 +Retirees,408.15 +Professionals,1405.39 +Students,179.92 +Families,861.50 +Retirees,324.93 +Professionals,410.24 +Students,424.48 +Families,734.04 +Retirees,261.30 +Professionals,759.23 +Students,154.41 +Families,939.92 +Retirees,293.63 +Professionals,1078.47 +Students,231.28 +Families,1010.88 +Retirees,473.10 +Professionals,476.68 +Students,102.57 +Families,1305.73 +Retirees,545.69 +Professionals,288.55 +Students,138.36 +Families,762.11 +Retirees,690.56 +Professionals,369.20 +Students,230.97 +Families,982.70 +Retirees,357.05 +Professionals,294.96 +Students,312.80 +Families,1007.21 +Retirees,655.76 +Professionals,393.87 +Students,111.85 +Families,1260.84 +Retirees,715.56 +Professionals,316.42 +Students,311.08 +Families,963.14 +Retirees,746.66 +Professionals,299.06 +Students,281.64 +Families,1040.00 +Retirees,245.28 +Professionals,533.34 +Students,352.01 +Families,650.60 +Retirees,133.19 +Professionals,592.52 +Students,435.99 +Families,719.42 +Retirees,255.80 +Professionals,729.56 +Students,137.97 +Families,1192.38 +Retirees,720.36 +Professionals,360.81 diff --git a/agents/evals/make_fixtures.py b/agents/evals/make_fixtures.py index bb06bdf2c29..efa6bac91ac 100644 --- a/agents/evals/make_fixtures.py +++ b/agents/evals/make_fixtures.py @@ -1,42 +1,60 @@ -"""Generate the synthetic spike-X fixture cases: 10 specs x 4 Python libraries x 6 perturbations. +"""Generate the synthetic spike-X fixture cases: 10 specs x 6 Python libraries x 6 perturbations. Every dataset is invented and drawn from a seeded NumPy generator, so a rerun writes byte-identical files. Run it from the repository root: - uv run --extra agents python -m agents.evals.make_fixtures # (re)write the 240 cases + uv run --extra agents python -m agents.evals.make_fixtures # (re)write the 360 cases uv run --extra agents python -m agents.evals.make_fixtures --check # exit 1 when a file is stale It writes `agents/evals/fixtures/cases/<spec>-<library>-<perturbation>/` with -`case.json` and `data.csv` and leaves every other case directory alone (the three -hand-written cases `scatter-basic-matplotlib`, `bar-grouped-seaborn` and -`scatter-basic-matplotlib-german-message` stay as they are). A NumPy upgrade that +`case.json` and `data.csv` and leaves every other case directory alone (the seven +hand-written cases, such as `scatter-basic-matplotlib` and `bar-grouped-seaborn`, and +the stress cases of `make_stress.py` stay as they are). A NumPy upgrade that changes a random stream makes `--check` and the unit test fail; rerun the generator and commit the result. The libraries are matplotlib and seaborn (since the first -fixtures) and plotnine and altair (since 2026-10-25, step 1b of -`agentic/specs/261024-agent-all-libraries.md`); every library of a spec gets the same -datasets and bindings, so only `library` and the case id differ between them. +fixtures), plotnine and altair (since 2026-10-25, step 1b of +`agentic/specs/261024-agent-all-libraries.md`), and pygal and lets-plot (`letsplot`, +since 2026-10-26, step 1c); every library of a spec gets the same datasets and +bindings, so only `library` and the case id differ between them. A new library adds +case directories and changes none that exist. **The ten specs.** Each covers another plot family, and the readiness scan -(`agents/anyplot/code/readiness.py`, through `opening.assess` with the four libraries -enabled) marks each of its four files `clean` or `coupled`, never `blocked` -(`tests/unit/agents/evals/test_make_fixtures.py` asserts it). The cells below were -computed on 2026-10-25; the heatmap's matplotlib file, `clean` in the table's first -version, is `coupled` now (`color-scale`: its `TwoSlopeNorm(vmin=-1, vmax=1)`). -plotnine and altair size their canvas on the save, so their reasons also carry a -`canvas:` note, which does not change the status: - -| Spec | Family | matplotlib | seaborn | plotnine | altair | -|---|---|---|---|---|---| -| `scatter-basic` | scatter | coupled | coupled | coupled | coupled | -| `line-basic` | line (numeric x) | coupled | coupled | coupled | coupled | -| `bar-grouped` | bar (grouped) | coupled | coupled | coupled | coupled | -| `histogram-basic` | histogram | coupled | coupled | coupled | coupled | -| `box-basic` | box | coupled | coupled | coupled | coupled | -| `heatmap-basic` | heatmap | coupled | coupled | coupled | coupled | -| `area-basic` | area | coupled | coupled | coupled | coupled | -| `violin-basic` | violin | coupled | coupled | coupled | coupled | -| `pie-basic` | pie | coupled | clean | clean | clean | -| `line-timeseries` | time series | coupled | coupled | coupled | coupled | +(`agents/anyplot/code/readiness.py`, through `opening.assess` with the six libraries +enabled) marks each of its six files `clean` or `coupled`, except two pygal files +that it blocks (`tests/unit/agents/evals/test_make_fixtures.py` asserts both and names +the two). The cells below were computed on 2026-10-26; the first four columns are +unchanged since 2026-10-25. The heatmap's matplotlib file, `clean` in the table's first +version, is `coupled` now (`color-scale`: its `TwoSlopeNorm(vmin=-1, vmax=1)`). The +heatmap's pygal file writes a hand-built HTML page from a `with open(...)` body that +also assigns a name nothing else reads; the normaliser's HTML rule drops such a body, +so the file is `coupled`, not `blocked`. plotnine and altair size their canvas on the save, so their reasons also carry a +`canvas:` note, which does not change the status; the normaliser rewrites the canvas of +pygal and lets-plot, so theirs carry none: + +| Spec | Family | matplotlib | seaborn | plotnine | altair | pygal | letsplot | +|---|---|---|---|---|---|---|---| +| `scatter-basic` | scatter | coupled | coupled | coupled | coupled | coupled | coupled | +| `line-basic` | line (numeric x) | coupled | coupled | coupled | coupled | clean | coupled | +| `bar-grouped` | bar (grouped) | coupled | coupled | coupled | coupled | clean | coupled | +| `histogram-basic` | histogram | coupled | coupled | coupled | coupled | blocked | coupled | +| `box-basic` | box | coupled | coupled | coupled | coupled | coupled | coupled | +| `heatmap-basic` | heatmap | coupled | coupled | coupled | coupled | coupled | coupled | +| `area-basic` | area | coupled | coupled | coupled | coupled | clean | coupled | +| `violin-basic` | violin | coupled | coupled | coupled | coupled | coupled | coupled | +| `pie-basic` | pie | coupled | clean | clean | clean | clean | clean | +| `line-timeseries` | time series | coupled | coupled | coupled | coupled | blocked | coupled | + +The two blocked pygal files have shapes that step 1c does not adapt, so the readiness +scan blocks the session of each of their 12 cases until the catalogue file changes: + +- `histogram-basic` draws an annotation layer over the chart's PNG bytes with PIL + (`io`, `PIL.Image`, `ImageDraw` and `ImageFont`, and a `render_to_png()` with no + target). +- `line-timeseries` draws its random walk with the standard `random` module, which no + plot profile admits. + +The cases are written for both anyway: the datasets are the same for every library, +and the cases need no change once the files are eligible. **The six perturbations** (the datasets of the design's spike-X row): @@ -57,11 +75,17 @@ **The smoke cases.** The tag `smoke` marks one case per spec, cycling through the perturbations and alternating matplotlib and seaborn (`SMOKE_CYCLE`, as since the first fixtures), and one case for each library outside that cycle (`LIBRARY_SMOKE`): -`scatter-basic-plotnine-renamed` and `scatter-basic-altair-renamed`. `scatter-basic` -is the spec whose plotnine and altair files were rendered under the harness guard when -step 1b landed; `renamed` puts headers with a dot (`Werbebudget in Tsd. CHF`) into the -library's own column syntax: plotnine's `aes` strings, and altair's field strings, where -Vega-Lite reads an unescaped `.` as nested access (`prompts/library/altair.md`). +`scatter-basic-<library>-renamed` for plotnine and altair (since step 1b) and for pygal +and letsplot (since step 1c). `scatter-basic` is the spec whose files of each of these +libraries were rendered under the harness guard when the library's step landed, and it +is eligible for all four. `renamed` puts headers with spaces and a dot +(`Werbebudget in Tsd. CHF`) into the library's own column syntax: plotnine's `aes` +strings; altair's field strings, where Vega-Lite reads an unescaped `.` as nested access +(`prompts/library/altair.md`); and lets-plot's `aes` strings and tooltip lines, where a +variable name with spaces needs braces (`@{...}`). pygal has no column syntax: it takes +plain lists and never titles an axis from a column name (`prompts/library/pygal.md`), so +its case asks the adaptation to build the `(x, y)` points from the renamed columns and to +pass the headers to `x_title` and `y_title` itself. """ import argparse @@ -84,7 +108,7 @@ CASES_DIR = Path(__file__).resolve().parent / "fixtures" / "cases" -LIBRARIES: tuple[str, ...] = ("matplotlib", "seaborn", "plotnine", "altair") +LIBRARIES: tuple[str, ...] = ("matplotlib", "seaborn", "plotnine", "altair", "pygal", "letsplot") PERTURBATIONS: tuple[str, ...] = ("renamed", "x10", "n12", "n5000", "date", "decimal-comma") SMOKE_TAG = "smoke" SMOKE_CYCLE: tuple[str, ...] = ("matplotlib", "seaborn") @@ -92,6 +116,8 @@ LIBRARY_SMOKE: dict[str, tuple[str, str]] = { "plotnine": ("scatter-basic", "renamed"), "altair": ("scatter-basic", "renamed"), + "pygal": ("scatter-basic", "renamed"), + "letsplot": ("scatter-basic", "renamed"), } """The one smoke case `(spec, perturbation)` of each library outside `SMOKE_CYCLE` (module docstring).""" SOURCE = "synthetic: agents/evals/make_fixtures.py" diff --git a/agents/evals/matrix.py b/agents/evals/matrix.py index cb3951f838b..52617be414d 100644 --- a/agents/evals/matrix.py +++ b/agents/evals/matrix.py @@ -1599,8 +1599,9 @@ def _prepare_and_run(args: argparse.Namespace, settings: "AgentSettings", argv: raise SetupError(str(exc)) from exc if not cases: raise SetupError(f"no case matches --cases {args.cases!r}") - # Since 2026-10-25 the smoke set holds a plotnine and an altair case, which the default `AGENT_LIBRARIES` - # (matplotlib and seaborn) blocks as `library-disabled`; the readiness scan reads the settings, not the case. + # The smoke set holds a plotnine and an altair case (since 2026-10-25) and a pygal and a lets-plot case (since + # 2026-10-26), which the default `AGENT_LIBRARIES` (matplotlib and seaborn) blocks as `library-disabled`; the + # readiness scan reads the settings, not the case. A smoke or full run needs all six libraries enabled. disabled = sorted({case.library for case in cases} - set(settings.libraries)) if disabled: _echo( diff --git a/agents/evals/report.py b/agents/evals/report.py index 31c1e6d46a7..84bce4ff35b 100644 --- a/agents/evals/report.py +++ b/agents/evals/report.py @@ -30,8 +30,8 @@ out. **Diff.** `compare` measures both reports over the case ids they share (all repeats of -each), so a smoke run is judged against the same smoke cases of a full baseline (14 since -2026-10-25), not against the baseline's whole-matrix rate; each report's own full rate is +each), so a smoke run is judged against the same smoke cases of a full baseline (16 since +2026-10-26), not against the baseline's whole-matrix rate; each report's own full rate is an extra row. Run as a module, it merges two reports into one blind gallery and scores the export: diff --git a/agents/renderer/Dockerfile b/agents/renderer/Dockerfile index 3cf59b8b2dc..0ec3813ec5d 100644 --- a/agents/renderer/Dockerfile +++ b/agents/renderer/Dockerfile @@ -40,11 +40,15 @@ COPY pyproject.toml uv.lock README.md ./ # loads libcairo through cairocffi: the runtime stage installs `libcairo2`. # lets-plot rasterises in its own native bridge (Kotlin/Native with ImageMagick # and fontconfig linked in), which needs only the libraries the slim image has. -# Their fonts are set up in the runtime stage below. No ADK: nothing in -# the renderer imports it. `--no-install-project` keeps the project itself out -# of the venv, so a sandbox's interpreter finds no anyplot package on its path; -# the service imports `agents.renderer` from the working directory, which -# uvicorn puts on `sys.path`. +# Their fonts are set up in the runtime stage below. The bridge's ImageMagick is a +# zero-configuration build: it reads no policy.xml from any path (MAGICK_CONFIGURE_PATH, +# MAGICK_HOME and $HOME included, 2026-10-26), so no policy file can narrow it, and +# its compiled-in delegates run gs, curl, soffice, ffmpeg and others by name. This +# image installs none of them; ci-image.yml fails when one is on the sandbox's PATH. +# No ADK: nothing in the renderer imports it. `--no-install-project` keeps the +# project itself out of the venv, so a sandbox's interpreter finds no anyplot +# package on its path; the service imports `agents.renderer` from the working +# directory, which uvicorn puts on `sys.path`. # The `convert` extra (python-calamine, pyarrow) is the file conversion's readers # (`harness.py --convert`, agents/anyplot/render/convert.py). RUN uv venv && uv sync --frozen --no-install-project --extra lib-matplotlib --extra lib-seaborn \ diff --git a/agents/renderer/commands.py b/agents/renderer/commands.py index 41f818d3ed6..d7f97dcefe7 100644 --- a/agents/renderer/commands.py +++ b/agents/renderer/commands.py @@ -106,7 +106,8 @@ class RuntimeCommand: """The language's command, run by the harness in exec mode with `code_file` appended; empty for Python, whose plot the harness runs in process.""" env: Mapping[str, str] = field(default_factory=lambda: MappingProxyType({})) - """The row's own environment, on top of `PATH`, `HOME`, `ANYPLOT_THEME` and the limit variables.""" + """The row's own environment, after `ANYPLOT_THEME` and a Python row's matplotlib settings, whose values it may + replace, and before `PATH`, `HOME` and the limit variables, which it never replaces (`executor.sandbox_env`).""" toolchain: tuple[str, ...] = () """Binaries the image must carry on `SANDBOX_PATH` for the row to run.""" rlimit_as: bool = True @@ -134,13 +135,17 @@ def _row(language: Language, library: str) -> RuntimeCommand: code_file = CODE_FILE_OVERRIDES.get(library, CODE_FILES[language]) if language == "python": if library == "letsplot": - # lets-plot rasterises in its Kotlin/Native bridge (ImageMagick linked in): under the configured - # 1 GiB every 3200x1800 export aborts ("Out of memory trying to allocate", SIGABRT). pyarrow's - # mimalloc pool reserves a 1 GiB arena on the first pandas string column, so the row takes Arrow's - # system allocator, as conversions do; then 2048 MiB held all 42 renders of the spike of 2026-10-26 - # up to 4800x2700 and 3600x3600 (VmPeak 1697 MiB) and still stops a 6400x3600 one (2580 MiB). In - # the renderer image with this row the canvas-size renders took a wall p95 of 7.69 s (max 15.5 s); - # the guarded host sweep of the 284 eligible catalogue files, canvas rewrite applied, 12.5 s. + # lets-plot rasterises in its Kotlin/Native bridge (ImageMagick linked in). An allocation it cannot + # make under RLIMIT_AS kills the process ("Out of memory trying to allocate ... Aborting."): by + # SIGABRT (exit 134) on a developer machine and by SIGSEGV (exit 139) in the renderer image, with + # either Arrow pool (measured on 2026-10-26). pyarrow's mimalloc pool reserves a 1 GiB arena on the + # first pandas string column, which kills even a minimal 3200x1800 chart at 1024 and 1536 MiB, so + # the row takes Arrow's system allocator, as conversions do. With it, 18 of the spike's 42 + # canvas-size renders still die at the configured 1 GiB; 2048 MiB held all 42 renders of the spike + # of 2026-10-26 up to 4800x2700 and 3600x3600 (VmPeak 1697 MiB) and still stops a 6400x3600 one + # (2580 MiB). In the renderer image with this row the canvas-size renders took a wall p95 of 7.69 s + # (max 15.5 s); the guarded host sweep of the 284 eligible catalogue files, canvas rewrite applied, + # 12.5 s. return RuntimeCommand( language, code_file, diff --git a/agents/renderer/executor.py b/agents/renderer/executor.py index 4f4b789a3a3..60a3f09abe8 100644 --- a/agents/renderer/executor.py +++ b/agents/renderer/executor.py @@ -419,6 +419,11 @@ def sandbox_env( the configured one is on. Without a row (a data run, a conversion, the tests' direct calls) the Python settings and the configured limits apply. + A row's value replaces a matplotlib setting but never a fixed key, which come after it: `PATH` + stays `SANDBOX_PATH`, the path the toolchain check and the image's delegate check (ci-image.yml) + read, and `HOME`, the bytecode switch, the BLAS threads and the limit variables stay the + renderer's, as in the local backend (`PythonRuntime.env`). + A data run or a conversion (`theme` None) gets no theme and no matplotlib settings: it imports no plotting library. A conversion also gets Arrow's system allocator (`ARROW_DEFAULT_MEMORY_POOL=system`), so pyarrow's buffers come from the same `malloc` as everything else under the address-space limit; with the bundled @@ -437,9 +442,9 @@ def sandbox_env( **(command.env if command is not None else {}), } env = { + **plot, "PATH": SANDBOX_PATH, "HOME": "/tmp", - **plot, "PYTHONDONTWRITEBYTECODE": "1", # One BLAS thread: Agg renders on one core, and every thread reserves address # space under RLIMIT_AS and counts toward RLIMIT_NPROC. diff --git a/changelog.d/agent-pygal-letsplot.md b/changelog.d/agent-pygal-letsplot.md new file mode 100644 index 00000000000..3e9d1bd5614 --- /dev/null +++ b/changelog.d/agent-pygal-letsplot.md @@ -0,0 +1,48 @@ +### Added + +- **"Use with my data" can adapt and render pygal and lets-plot.** The agent + network's Python runtime (`agents/anyplot/render/runtimes/`) now serves the + catalogue's pygal and lets-plot files next to matplotlib, seaborn, plotnine and + altair. pygal saves through `render_to_png` and `cairosvg.svg2png` for the PNG and + `render_to_file` for the HTML, whose target and file type the validator pins + because libcairo writes the PNG past the plot guard; lets-plot saves through + `ggsave` with `path="."`. The validator gains both import surfaces, keeps + cairosvg's CSS stack unreachable, rules pygal's `css=`, `js=` and `defs=` config, + and admits lets-plot's tooltip and label builders' `.format` with literal + arguments. The normaliser rewrites pygal's HTML writes to `render_to_file`, + expands lets-plot's star import from a static copy of `lets_plot.__all__`, removes + its `lets-plot-images` epilogue, and sets both libraries' canvas, because R2's + pixel cap refuses the catalogue's 4800x2700 PNGs outright; its four new guard + rules and a new target form also lift plotnine from 264 to 267 and altair from 269 + to 273 eligible files. The plot guard imports cairosvg before it is armed and lets + cssselect2 compile pygal's CSS selectors; the renderer image installs both + libraries and libcairo, and lets-plot's row runs with its own 2048 MiB address + space and Arrow's system allocator, which its native rasteriser needs. 209 of 325 + pygal and 284 of 325 lets-plot files are eligible. The eval fixtures cover both + libraries: 120 more generated cases (360 in all) and one smoke case each (16 in the + smoke set). `AGENT_LIBRARIES` keeps its default `matplotlib,seaborn` until each + library's eval matrix reaches 80 %. + +### Changed + +- **R2 refuses a render as blank only when 99.7 % of it is one colour, not 98 %.** + The agent network's blocking PNG check (`agents/anyplot/render/png.py`) refused + sparse but complete charts: 33 of the 195 eligible pygal renders and lets-plot's + point-basic (98.38 %) are 98 % one colour or more, the sparsest pygal one 99.44 %. + A bare canvas (99.93 %) or a title alone (99.78 %) still fails. The cutoff holds + for every library, and it refuses nothing the old one accepted. + +### Fixed + +- **The validator no longer lets a renamed save, a rebound `THEME` or a match + capture through.** In plotnine's profile a save name imported under another name or + used as a value (`from plotnine import ggsave as keep`, `g = ggsave`, + `[ggsave][0]`, `functools.partial(ggsave, plot)`) escaped the save rule, so the + exported code could write anywhere. In the matplotlib, seaborn, plotnine and altair + profiles a second binding of `THEME` (`THEME = "x/../../elsewhere"` after the theme + block) moved every save the same way, because the save rule checks the target's + form, not the value of `THEME`. And a `match` capture could rebind a name that + plotnine's expression rule read as a fixed string, handing plotnine code to + evaluate. Every profile now refuses the first as a `banned-call` and any binding of + `THEME` but its theme block as a `savefig-target`, and the expression rule counts a + match capture as a binding. diff --git a/core/canvas.py b/core/canvas.py index db889c2af48..7335b8facb2 100644 --- a/core/canvas.py +++ b/core/canvas.py @@ -246,7 +246,7 @@ def check_blank( """AR-04 (EMPTY_PLOT): the PNG has at least ``min_bytes`` and at most ``max_blank_ratio`` of one color. The defaults are the rubric's (10 KB, 95 %). A gate with another cutoff - passes its own: the agents' R2 check uses 98 %, which is more permissive, + passes its own: the agents' R2 check uses 99.7 %, which is more permissive, because only an image above ``max_blank_ratio`` fails. """ if not path.is_file(): diff --git a/docs/concepts/agent-network.md b/docs/concepts/agent-network.md index 7bbffff38f5..13fbad04dc2 100644 --- a/docs/concepts/agent-network.md +++ b/docs/concepts/agent-network.md @@ -12,7 +12,7 @@ This document describes the agent network that lets a visitor paste their own da | Product step 2 | "Find the right plot type", built on the catalogue knowledge that also backs the MCP server | | Result delivery | Users see and copy both the image and the code: the plot is shown inline in the theme it was rendered in (light unless the user asked for a dark plot), a light and dark switch renders the other theme on demand without any model call, and the image can be copied to the clipboard and downloaded as PNG; the code is shown with syntax highlighting, copied with one click, and downloaded together with `data.csv` so it runs unchanged | | Plot attribution | Owner decision of 2026-10-10 (variant `s1c-jb-sq2` of the comparison): every PNG the service serves carries a footer strip below the plot, "made with any.plot()" on the left and "anyplot.ai/<spec-id>" on the right, in JetBrains Mono with the dot drawn as a brand-green square. It is composited at image level after the run and never written into the user's code, so the exported `plot.py` reproduces the plot without it. MonoLisa, the site's own font, is not used for it, because its EULA covers desktop, web, application and ePub use only. See [Footer strip](#footer-strip) | -| Render scope | Python first, designed so every further library is additive. Phase 1 serves matplotlib and seaborn; since 2026-10-25 the runtime registry also has runtimes for plotnine and altair (step 1b of [the phase-2 plan](../../agentic/specs/261024-agent-all-libraries.md)). `AGENT_LIBRARIES` still defaults to `matplotlib,seaborn`: the owner enables plotnine and altair after each one's eval matrix reaches 80 %. The other 11 libraries are planned | +| Render scope | Python first, designed so every further library is additive. Phase 1 serves matplotlib and seaborn. The runtime registry also has runtimes for plotnine and altair since 2026-10-25, and for pygal and lets-plot since 2026-10-26 (steps 1b and 1c of [the phase-2 plan](../../agentic/specs/261024-agent-all-libraries.md)). `AGENT_LIBRARIES` still defaults to `matplotlib,seaborn`: the owner enables each of the four after its eval matrix reaches 80 %. The other 9 libraries are planned | | Data input | Paste text only (CSV, TSV, semicolon CSV, a table aligned with spaces, JSON including API answers that wrap their records, a Python literal), hard cap 1 MB (200 KB until 2026-10-14); data the assistant computes (`run_data_code`, `generate_data`, `prepare_data`) up to 2 MB | | Access | Visible only in local development and for admins, gated exactly like `/debug/*`; not public in phase 1 | | Guardrail scope | Allowed: choosing plots, the user's data for them, adapting, rendering and styling, and questions about catalogue code (styling, exports). Everything else gets a fixed refusal | @@ -282,17 +282,25 @@ Since live test round 5 of 2026-10-15 the parse also handles these cases: `agents/anyplot/code/` has no ADK import. Every version has two forms: the **working form** contains the literal placeholder `df = load_user_data()` and is what the adapter edits; the **run form** has the loader substituted and the normaliser applied and is what runs and what the user downloads. Order of operations: apply the edits to the working form, validate with the ADAPTED profile (the placeholder is allowed), normalise, substitute the loader, then render and export the run form. `base="previous"` and every repair attempt always get the latest validated working form; if the previous attempt failed validation, the next one gets the original plus the previous attempt's edits as `previous_plan`. -- **Normaliser** (per runtime; for Python, every library with a save rule in `regions.SAVE_RULES`: matplotlib and seaborn, and plotnine and altair since 2026-10-25): strip the `sys.path` guard, the catalogue header and the catalogue title (the title string becomes `""`; the call that shows it stays), and rewrite a save target that is a path ending in the theme file to the literal `f"plot-{THEME}.png"` (altair's second file to `f"plot-{THEME}.html"`). For matplotlib and seaborn it also drops `bbox_inches`, keeps the figure size and rescales the dpi so the output hits 3200x1800 or 2400x2400 exactly (within the canvas gate's 16 px when the aspect is a hair off and no dpi is exact). That canvas rewrite stays matplotlib's (`SaveRule.canvas`): plotnine sizes its canvas on the save (`width=`, `height=`, `units=`, `dpi=`) and altair through the chart's size times `scale_factor`, padded by its PIL block, so for those two the normaliser only notes that the render relies on the R3 canvas gate, and the readiness scan reports the note as a `canvas:` reason. The canvas is never an LLM repair target. -- **Readiness scan** on the normalised original: `blocked` (the 13 map specs, a library that is not enabled, a SECURITY validator failure, no `THEME` block, a save call of the library's rule that writes anything but `f"plot-{THEME}.png"` (altair also `f"plot-{THEME}.html"`), or a last save of the PNG that is missing or not a module-level statement), `coupled` (literal limits, literal color-scale limits, centers and colorbar ticks, a colorbar at literal figure coordinates (`cbar_pos`), data-coordinate annotations, literal statistics, short palettes, hard-coded date locators; these findings go to the adapter as hints. The two colorbar categories since live test round 8 of 2026-10-16, where heatmap-basic in seaborn kept `vmin=0, vmax=100, center=50` for data of 32 to 93 and the top-left colorbar after the adapter dropped the dendrogram), or `clean`. -- **Edits** apply in order. Each `find` must match exactly once and may not overlap a protected region. Matching goes from strict to tolerant and is never fuzzy: an exact substring first, then the same with the blanks before line breaks ignored, then whole lines whose words agree once indentation and runs of blanks outside string literals are ignored, with the replacement moved by the one indentation shift between them. A string literal's text must agree exactly, and a line inside a multi-line literal never matches this way. The first tier that finds anything decides, so more than one match there is a failure. A `find` that matches, in any tier, only the code before an earlier edit of the same plan changed it is reported as such (`stale_match`). Protected regions are found by AST: the `THEME` assignment, every theme token (a module-level assignment that tests `THEME == ...` and is built only from literals, `THEME` and earlier tokens: `PAGE_BG`, `ELEVATED_BG`, `INK*`, `GRID`, `BRAND`), the placeholder line, and the final save statement: the last module-level statement that writes `f"plot-{THEME}.png"` with a save call of the library's rule (`savefig`, plotnine's `save` or `ggsave`, altair's `save`), because altair's files end on the HTML save and pad the PNG inside an `if` after the save that is protected. A theme conditional that reads the data, such as box-basic's `_tight_text_color = INK if THEME == "dark" else IMPRINT_PALETTE[tightest_idx]`, is plot code the adapter may change. After a plan, a protected statement must keep its meaning, compared as a syntax tree, so a full file that re-states a token in other quotes or spacing passes. A plan refused for that drift alone gets its protected statements restored once the round's check retry is spent (see the loop changes above). The `IMPRINT` palette list is not protected: it stays one literal list, assigned once, that keeps its existing entries in order and may only be extended with further positions from `core/palette.py`, which the validator checks. With more than eight groups the adapter keeps palette colors for the seven largest and draws the rest in the theme's muted ink as one "Other" group, which the reviewer accepts under VQ-07. +- **Normaliser** (per runtime; for Python, every library with a save rule in `regions.SAVE_RULES`: matplotlib and seaborn, plotnine and altair since 2026-10-25, pygal and lets-plot since 2026-10-26): strip the `sys.path` guard, the catalogue header and the catalogue title (the title string becomes `""`; the call that shows it stays), and rewrite a save target that is a path ending in the theme file to the literal `f"plot-{THEME}.png"` (the second file of altair, pygal and lets-plot to `f"plot-{THEME}.html"`). Since 2026-10-26 the guard strip takes four more shapes in every library: an `importlib.util.find_spec` test around imports, a `try` whose `finally` only restores `sys.path`, `del sys.modules[...]` in the guard, and `importlib.import_module("m").ATTR`, which becomes `from m import ATTR`. Two libraries get rewrites of their own: + - pygal's HTML write (`with open(f"plot-{THEME}.html", "wb") as f: f.write(chart.render())`) becomes `chart.render_to_file(f"plot-{THEME}.html")`, which writes the same bytes. Its other HTML and SVG writes (hand-built pages, post-processed SVG) are dropped, together with the statements that only fed them, also from a `with open(...)` body that assigns names nothing else reads. + - lets-plot's star import becomes an explicit import of the names the file uses (from the static `lets_plot.__all__` of 4.11.0 in `letsplot_names.py`), the `export_ggsave` alias becomes `ggsave`, every save gets `path="."`, and the epilogue that moved the files out of `./lets-plot-images` is removed. + + The canvas rewrite is per library (`SaveRule.canvas`), and the canvas is never an LLM repair target: + - matplotlib and seaborn: the normaliser drops `bbox_inches`, keeps the figure size and rescales the dpi so the output hits 3200x1800 or 2400x2400 exactly (within the canvas gate's 16 px when the aspect is a hair off and no dpi is exact). + - pygal (since 2026-10-26): a chart built at another literal size with the target's aspect, in the catalogue 4800x2700 or 3600x3600, saves through `cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png", output_width=3200, output_height=1800)` (or 2400 by 2400), with the same layout. A hand-built SVG passed to `svg2png` gets the output size from its root `<svg>`, and a size set after the chart's constructor leaves the save alone with a note. The rewrite applies to 94 catalogue files. + - lets-plot (since 2026-10-26): only `scale=` on the PNG save changes, because the PNG is the `ggsize` times the scale. The rewrite applies to 117 catalogue files. Both rewrites exist because R2's pixel cap (11.52 MP) refuses a 4800x2700 or 3600x3600 PNG outright; lets-plot's scale even sits in the protected save, out of the adapter's reach. + - plotnine and altair have no canvas rewrite yet. plotnine sizes its canvas on the save (`width=`, `height=`, `units=`, `dpi=`) and altair through the chart's size times `scale_factor`, padded by its PIL block, so for those two the normaliser only notes that the render relies on the R3 canvas gate, and the readiness scan reports the note as a `canvas:` reason. +- **Readiness scan** on the normalised original: `blocked` (the 13 map specs, a library that is not enabled, a SECURITY validator failure, no `THEME` block, a save call of the library's rule that writes anything but `f"plot-{THEME}.png"` (altair, pygal and lets-plot also `f"plot-{THEME}.html"`) or, for pygal, a file type its save name does not write, a lets-plot `ggsave` without `path="."`, or a last save of the PNG that is missing or not a module-level statement), `coupled` (literal limits, literal color-scale limits, centers and colorbar ticks, a colorbar at literal figure coordinates (`cbar_pos`), data-coordinate annotations, literal statistics, short palettes, hard-coded date locators; these findings go to the adapter as hints. The two colorbar categories since live test round 8 of 2026-10-16, where heatmap-basic in seaborn kept `vmin=0, vmax=100, center=50` for data of 32 to 93 and the top-left colorbar after the adapter dropped the dendrogram), or `clean`. +- **Edits** apply in order. Each `find` must match exactly once and may not overlap a protected region. Matching goes from strict to tolerant and is never fuzzy: an exact substring first, then the same with the blanks before line breaks ignored, then whole lines whose words agree once indentation and runs of blanks outside string literals are ignored, with the replacement moved by the one indentation shift between them. A string literal's text must agree exactly, and a line inside a multi-line literal never matches this way. The first tier that finds anything decides, so more than one match there is a failure. A `find` that matches, in any tier, only the code before an earlier edit of the same plan changed it is reported as such (`stale_match`). Protected regions are found by AST: the `THEME` assignment, every theme token (a module-level assignment that tests `THEME == ...` and is built only from literals, `THEME` and earlier tokens: `PAGE_BG`, `ELEVATED_BG`, `INK*`, `GRID`, `BRAND`), the placeholder line, and the final save statement: the last module-level statement that writes `f"plot-{THEME}.png"` with a save call of the library's rule (`savefig`, plotnine's `save` or `ggsave`, altair's `save`, pygal's `render_to_png` or `cairosvg.svg2png`, lets-plot's `ggsave`), because altair's, pygal's and lets-plot's files end on the HTML save, and altair's pad the PNG inside an `if` after the save that is protected. A theme conditional that reads the data, such as box-basic's `_tight_text_color = INK if THEME == "dark" else IMPRINT_PALETTE[tightest_idx]`, is plot code the adapter may change. After a plan, a protected statement must keep its meaning, compared as a syntax tree, so a full file that re-states a token in other quotes or spacing passes. A plan refused for that drift alone gets its protected statements restored once the round's check retry is spent (see the loop changes above). The `IMPRINT` palette list is not protected: it stays one literal list, assigned once, that keeps its existing entries in order and may only be extended with further positions from `core/palette.py`, which the validator checks. With more than eight groups the adapter keeps palette colors for the seven largest and draws the rest in the theme's muted ink as one "Other" group, which the reviewer accepts under VQ-07. - **Loader**: exactly one `df = load_user_data()` in the working form. The server replaces it with `pd.read_csv("data.csv", dtype=..., parse_dates=[...])` using a relative path, so the exported code also works in notebooks. A dataset with a number column adds `float_precision="round_trip"` (since 2026-10-15): pandas' default float reader misread about one in four 17-digit numbers by one unit in the last place, so the plot did not draw the values `data.csv` holds. A dataset with a date column adds `date_format="ISO8601"`: `data.csv` writes ISO dates only, and without it pandas guessed a format per column and warned "Could not infer format" for years such as 0001. -- **Validator profiles.** The SECURITY rules run on the normalised original (eligibility) and on every adapted working form: `ast.parse` on at most 48 KB; imports only from COMMON (numpy, pandas, math, statistics, datetime, collections, itertools, functools, textwrap, colorsys, re, and since the owner's decision of 2026-10-10 the pure computing modules warnings, typing, calendar, decimal, fractions, zoneinfo, enum, dataclasses, operator, bisect, heapq, numbers and cmath; not `string`, `locale` or `random`) or the per-library allowlist (the plotting submodules, for matplotlib and seaborn also the bundled `mpl_toolkits.{mplot3d,axes_grid1,axisartist}`, `scipy.{stats,interpolate,signal,cluster.hierarchy,spatial,optimize,special,integrate,ndimage,fft,linalg,constants}`, sklearn without `datasets`, `statsmodels.{api,nonparametric,tsa,graphics}`; since 2026-10-25 for plotnine that matplotlib stack plus `plotnine` and `mizani`, and for altair `altair` and the module `PIL.Image`, which the catalogue's padding block uses; `vl_convert` stays out, because altair reaches it internally and its own functions read files and open sockets for image hrefs; third-party helpers such as cartopy or adjustText stay out); never `statsmodels.formula`, `scipy.io`, `scipy.datasets`, `plotnine.data`, `plotnine.watermark`, `plotnine.animation`, `altair.datasets`, altair's `jupyter`, `utils.execeval`, `utils.server` and `utils.html`, sys, pathlib, importlib, subprocess, socket, urllib, requests, shutil, ctypes, pickle or io; `os` only as `getenv("ANYPLOT_THEME", ...)`; a `banned-import` message names the module and what to use instead, and the finding carries a label of the path for the attribution log (its longest prefix in a closed vocabulary of module names, else `?`); each admitted module was walked for names that read, write, fetch or evaluate, and those are banned (`warnings.formatwarning`, `showwarning` and `warn_explicit`, `zoneinfo.reset_tzpath`, `available_timezones` and `ZoneInfo.from_file`, `typing.get_type_hints` and `ForwardRef`, `operator.attrgetter` and `methodcaller`, `enum.global_enum`, calendar's `LocaleTextCalendar`, `LocaleHTMLCalendar` and `different_locale`, which set the process locale, and `calendar.main`, which reaches them and is banned on the calendar module only, because a column may be called `main`); module re-exports that reach what the import rules keep out are banned as attributes on any object and as `from` imports (`sys`, `os`, `builtins`, enum's `bltns`, `modules`, `inspect`, `subprocess`, `importlib`, `pathlib`, `shutil`, `socket`, `linecache`, `CodeType`, `FunctionType`), and so is any private name (one leading underscore) of an imported module, such as `collections._sys` or `dataclasses._FuncBuilder`; both rules cover the components of an import path below its root as well, so `import scipy.fft._backend as backend` is refused; a module bound by `import` is only ever the receiver of an attribute, never a value, so `[calendar][0]` is refused; and the dangerous private helpers a walk of the allowed modules found (`_sys`, `_locale`, `_random`, `_tzpath`, `_common`, `_getcategory`, `_FuncBuilder` and numpy's `_datasource`) are banned by name on any object, so a module reached through an attribute chain or a `from` import cannot hand them out either; banned names `eval`, `exec`, `compile`, `open`, `__import__`, `input`, `breakpoint`, `globals`, `locals`, `vars`, `getattr`, `setattr`, `delattr`, `memoryview`, `exit`, `quit` and the three-argument `type()`; every name, attribute or keyword matching `^__\w+__$` and any string literal containing a dunder identifier; banned attributes `.format`, `.format_map`, pandas `.eval` and `.query`, `memmap`, `ctypeslib`, `f2py`, `matplotlib.use`, `show`; banned calls: pandas `read_*`, `ExcelFile`, `HDFStore` and the I/O writers (`to_csv`, `to_pickle`, `to_parquet`, `to_excel`, `to_sql`, `to_hdf`, `to_feather`, `to_json`, `to_html`, `to_clipboard`, but not `to_datetime` or `to_numpy`), `np.load*`, `save*`, `savetxt`, `fromfile`, `fromregex`, `DataSource`, `loadtxt`, `genfromtxt`, `ndarray.tofile`, `plt.imread`, `matplotlib.image.imread`, `matplotlib.cbook.get_sample_data`, `mpl.rc_file`, `load_dataset`, `fetch_*`, `urlopen`; no class, async, await, yield, global or nonlocal statements, no star or relative imports; no `http(s)://`, `ftp://`, `file:` or `data:` literals; string literals at most 200 characters and at most 2,000 characters of new literal text per plan; every call of a save name (`regions.SAVE_NAMES`: `savefig`, `save`, `ggsave`) is checked against the library's save rule (`regions.SAVE_RULES`, which replaced the savefig rule on 2026-10-25): a name the rule does not list is a `banned-call` (`np.save` with matplotlib; `save` itself left the banned I/O names for this rule), the file argument (the rule's positional, `fname=`, `filename=` or `fp=`; `ggsave` takes the plot first and the file second) is exactly `f"plot-{THEME}.png"`, for altair also `f"plot-{THEME}.html"`, a save takes no `**` arguments, plotnine's `save` and `ggsave` and altair's `save` take only the keywords the rule lists (the size, the dpi, altair's `scale_factor` and embedding options; `path=`, `webdriver=` and `engine=` are findings), a file without a save of the PNG is a finding, and a save name or `.open` is only ever called where it is named (`f = plot.save; f("x")` would hide the target); `.open` is admitted only in altair's profile and only on the PNG, for the catalogue's PIL padding block (`Image.open(f"plot-{THEME}.png")`, then `_canvas.save(f"plot-{THEME}.png")`, which the save rule checks); `def` and `lambda` stay allowed for formatters. The ADAPTATION rules run on adapted code only: exactly one placeholder; no RNG used to create data (a seeded `np.random.default_rng(<int literal>)` is allowed for jitter and subsampling, and the row-fidelity gate catches fabricated data); numeric literal lists of at most 20 items; the palette prefix preserved. SECURITY failures reject the code and get a repair attempt while one is allowed; ADAPTATION failures become defect lines. Every bypass named here is a validator-corpus test. The review of 2026-10-14 found that the validator, a list of banned names, accepted `np.testing.measure("...")`, which compiles and runs any string, so a survey walked every public function of the allowed packages for `exec`, `eval`, `compile`, processes, sockets, fetches, import by name and pickle, and every module they hand out as an attribute; its routes are closed by kind, not one by one: submodules that test, build, start programs or import by name (`testing`, `tests`, `distutils`, `backends`, `animation`, `texmanager`, `dviread`, `sphinxext`, `pylab`, pandas' `computation` and `compat`, seaborn's `external`, sklearn's `externals`, `discovery` and `estimator_checks`, statsmodels' `x13` and `iolib`) are banned like the re-exports, as attributes, `from` imports and import path components, and a test pins that every public first-level submodule of numpy, pandas, matplotlib, seaborn, scikit-learn, the toolkits and the admitted statsmodels packages is either reviewed as safe or banned, so an upgrade that adds one fails until someone reviews it; single helpers (`test()`, which runs pytest, `add_newdoc` and `import_module`, `switch_backend`, `register_backend`, `TexManager`, `math_to_image`, `thumbnail`, `json_dump`, the seaborn and statsmodels fetchers, `datasets`, the `print_*` canvas writers and the `x13_*` runners) are banned like `.show`; modules re-exported as attributes (`mpl.tempfile`, `mpl.logging`, pickle, pkgutil, pydoc, the file, archive and network modules, `sklearn.<module>.scipy`) joined the re-export list; and an attribute path resolved through an import must stay inside the import surface, so `scipy.datasets.face()` after `import scipy.stats` is refused. Settings that start programs or import by name are their own rule (`rc-key`): a dotted string literal naming `text.usetex`, `text.latex.*`, `pgf.*`, `animation.*` (the ffmpeg and ImageMagick paths), `ps.usedistiller`, `webagg.*`, a key ending `_path`, or `backend` (pandas' `plotting.backend` too) is a finding anywhere, and in a settings position (an `rcParams` subscript, a key of a settings dict, a `**{...}` keyword) the bare `backend` and `usetex` are too; `rcParams` is written only with a literal key or `.update` with a dict literal, `rc_context` and `rc=` take literal dicts and no settings file (`fname`), `style.context` takes a literal dict or a style name, never a path to a style sheet, `rc(group, ...)` takes a literal group; the keywords `usetex=` and `backend=` are banned on every call, the value `"TeX"` (`ismath="TeX"`) is a finding, and a save takes no `format=` but its file's own type (`"png"`, altair's `"html"`); plotnine's `theme_matplotlib(rc=...)` follows the `rc_context` rules, literal keys and no settings file. The cache and spill directories of scikit-learn and joblib are banned too (Fable review of #12177, after a survey of the admitted libraries' public signatures): the keywords `memory=` (`Pipeline`, `make_pipeline`, `AgglomerativeClustering`, `FeatureAgglomeration`, `OPTICS`), `temp_folder=` and `cachedir=` on every call, also as string keys of a dict literal unpacked into a call, and the helpers `Memory`, `check_memory` and `Parallel`, whose cache or spill directory is a positional parameter; `location=` stays allowed, because matplotlib's colorbar and secondary axes take it as a side. The render guard refuses those writes in the sandbox; the rule keeps them out of the exported code, which runs unguarded on the user's machine. A key built at run time still passes these rules, which is why the harness arms its plot guard (see [Render](#render)). plotnine and altair (step 1b of the phase-2 plan, 2026-10-25) brought routes of their own; their public submodules were walked on 2026-10-24 and the walk was checked adversarially on 2026-10-25, and `validate.py`'s module docstring and sets list every name. Three of them go beyond a banned name. plotnine compiles and evaluates a string that is not a column name wherever it takes an aesthetic or a facet, with real builtins and the plot's namespace, so `aes(x='open("/etc/passwd").read()')` is code: every string literal passed to `aes`, `after_stat`, `after_scale`, `stage`, `facet_wrap`, `facet_grid` or `qplot` (`EXPRESSION_CALLS`) is parsed as a Python expression, each side and term of a facet formula on its own, and walked with this profile's name, attribute, call and dunder rules; a bare column name and a text that does not parse (a column such as "True Label") pass, and those calls take `**` only from a dict literal and `*` only from a list or tuple literal, so every string they evaluate is in the walk. `formula=` is a banned keyword on every call, because statsmodels hands it to patsy, which `exec`s Python while it parses (`stat_smooth`, `stat_quantile`; the render guard refuses that `exec`). And altair's image mark is banned (`mark_image`, `Url*` and the keyword `url=`), because vl-convert's SVG renderer reads a `file://` href from disk in native code the audit hook never sees, together with `Chart.from_dict` and `from_json` in altair's profile only (`LIBRARY_BANS`), whose spec the string rules cannot read. Among the names: every plotnine plot's `.environment`, whose namespace holds the `os` module as a value; altair's `limit_rows`, whose narwhals frame hands out the pyarrow module, `transformed_data`, which loads `url` data in VegaFusion, and its plugin and renderer registries; and the `pathlib.Path` and polars writers among the banned I/O names. +- **Validator profiles.** The SECURITY rules run on the normalised original (eligibility) and on every adapted working form: `ast.parse` on at most 48 KB; imports only from COMMON (numpy, pandas, math, statistics, datetime, collections, itertools, functools, textwrap, colorsys, re, and since the owner's decision of 2026-10-10 the pure computing modules warnings, typing, calendar, decimal, fractions, zoneinfo, enum, dataclasses, operator, bisect, heapq, numbers and cmath; not `string`, `locale` or `random`) or the per-library allowlist (the plotting submodules, for matplotlib and seaborn also the bundled `mpl_toolkits.{mplot3d,axes_grid1,axisartist}`, `scipy.{stats,interpolate,signal,cluster.hierarchy,spatial,optimize,special,integrate,ndimage,fft,linalg,constants}`, sklearn without `datasets`, `statsmodels.{api,nonparametric,tsa,graphics}`; since 2026-10-25 for plotnine that matplotlib stack plus `plotnine` and `mizani`, and for altair `altair` and the module `PIL.Image`, which the catalogue's padding block uses; `vl_convert` stays out, because altair reaches it internally and its own functions read files and open sockets for image hrefs; since 2026-10-26 for pygal `pygal` and `cairosvg`, and for lets-plot `lets_plot`, while `cairocffi`, `cssselect2`, `tinycss2`, `xml.etree` and PIL stay out of both; third-party helpers such as cartopy or adjustText stay out); never `statsmodels.formula`, `scipy.io`, `scipy.datasets`, `plotnine.data`, `plotnine.watermark`, `plotnine.animation`, `altair.datasets`, altair's `jupyter`, `utils.execeval`, `utils.server` and `utils.html`, pygal's `etree`, cairosvg's `test_api`, lets-plot's `geo_data`, `tilesets`, `settings_utils`, `frontend_context` and `plot.geom_livemap_`, sys, pathlib, importlib, subprocess, socket, urllib, requests, shutil, ctypes, pickle or io; `os` only as `getenv("ANYPLOT_THEME", ...)`; a `banned-import` message names the module and what to use instead, and the finding carries a label of the path for the attribution log (its longest prefix in a closed vocabulary of module names, else `?`); each admitted module was walked for names that read, write, fetch or evaluate, and those are banned (`warnings.formatwarning`, `showwarning` and `warn_explicit`, `zoneinfo.reset_tzpath`, `available_timezones` and `ZoneInfo.from_file`, `typing.get_type_hints` and `ForwardRef`, `operator.attrgetter` and `methodcaller`, `enum.global_enum`, calendar's `LocaleTextCalendar`, `LocaleHTMLCalendar` and `different_locale`, which set the process locale, and `calendar.main`, which reaches them and is banned on the calendar module only, because a column may be called `main`); module re-exports that reach what the import rules keep out are banned as attributes on any object and as `from` imports (`sys`, `os`, `builtins`, enum's `bltns`, `modules`, `inspect`, `subprocess`, `importlib`, `pathlib`, `shutil`, `socket`, `linecache`, `CodeType`, `FunctionType`), and so is any private name (one leading underscore) of an imported module, such as `collections._sys` or `dataclasses._FuncBuilder`; both rules cover the components of an import path below its root as well, so `import scipy.fft._backend as backend` is refused; a module bound by `import` is only ever the receiver of an attribute, never a value, so `[calendar][0]` is refused; and the dangerous private helpers a walk of the allowed modules found (`_sys`, `_locale`, `_random`, `_tzpath`, `_common`, `_getcategory`, `_FuncBuilder` and numpy's `_datasource`) are banned by name on any object, so a module reached through an attribute chain or a `from` import cannot hand them out either; banned names `eval`, `exec`, `compile`, `open`, `__import__`, `input`, `breakpoint`, `globals`, `locals`, `vars`, `getattr`, `setattr`, `delattr`, `memoryview`, `exit`, `quit` and the three-argument `type()`; every name, attribute or keyword matching `^__\w+__$` and any string literal containing a dunder identifier; banned attributes `.format`, `.format_map`, pandas `.eval` and `.query`, `memmap`, `ctypeslib`, `f2py`, `matplotlib.use`, `show`; banned calls: pandas `read_*`, `ExcelFile`, `HDFStore` and the I/O writers (`to_csv`, `to_pickle`, `to_parquet`, `to_excel`, `to_sql`, `to_hdf`, `to_feather`, `to_json`, `to_html`, `to_clipboard`, but not `to_datetime` or `to_numpy`), `np.load*`, `save*`, `savetxt`, `fromfile`, `fromregex`, `DataSource`, `loadtxt`, `genfromtxt`, `ndarray.tofile`, `plt.imread`, `matplotlib.image.imread`, `matplotlib.cbook.get_sample_data`, `mpl.rc_file`, `load_dataset`, `fetch_*`, `urlopen`; no class, async, await, yield, global or nonlocal statements, no star or relative imports; no `http(s)://`, `ftp://`, `file:` or `data:` literals; string literals at most 200 characters and at most 2,000 characters of new literal text per plan; every call of a save name (`regions.SAVE_NAMES`: `savefig`, `save`, `ggsave`, and since 2026-10-26 `render_to_png`, `render_to_file` and `svg2png`) is checked against the library's save rule (`regions.SAVE_RULES`, which replaced the savefig rule on 2026-10-25): a name the rule does not list is a `banned-call` (`np.save` with matplotlib; `save` itself left the banned I/O names for this rule), the file argument (the rule's positional, `fname=`, `filename=` or `fp=`, or `write_to=` for `svg2png`, which takes every argument by keyword; `ggsave` takes the plot first and the file second) is exactly `f"plot-{THEME}.png"`, for altair, pygal and lets-plot also `f"plot-{THEME}.html"`, lets-plot's `ggsave` passes exactly `path="."` (`SaveRule.directory`), a save takes no `**` arguments, plotnine's `save` and `ggsave` and altair's `save` take only the keywords the rule lists (the size, the dpi, altair's `scale_factor` and embedding options; `path=`, `webdriver=` and `engine=` are findings), pygal's `render_to_png` takes only `filename` and `dpi` and `render_to_file` only `filename` (their `**kwargs` reach the chart's config), each pygal save name writes only its own file type (`render_to_png` and `svg2png` the PNG, `render_to_file` the HTML; `SaveRule.writes`), `svg2png` never takes `url=`, `file_obj=` or `unsafe=` (they read through cairosvg's unrestricted fetcher), a file without a save of the PNG is a finding, and a save name or `.open` is only ever called where it is named (`f = plot.save; f("x")` would hide the target); since 2026-10-26 a save name imported under another name (`from plotnine import ggsave as keep`), anything imported under a save name, and a bare save name that is not a call's callee (`g = ggsave`, `[ggsave][0](...)`, `functools.partial(ggsave, plot)`) are a `banned-call` in every profile, which closes a route the plotnine profile of 2026-10-25 left open in the exported code (the plot guard refused the write in the sandbox); since the same day `THEME`, part of every save target, keeps its theme block's value in every profile: any binding of it but the first module-level theme block after `import os` is a `savefig-target` finding, and any binding of `os` but that import an `os-use` finding; `.open` is admitted only in altair's profile and only on the PNG, for the catalogue's PIL padding block (`Image.open(f"plot-{THEME}.png")`, then `_canvas.save(f"plot-{THEME}.png")`, which the save rule checks); `def` and `lambda` stay allowed for formatters. The ADAPTATION rules run on adapted code only: exactly one placeholder; no RNG used to create data (a seeded `np.random.default_rng(<int literal>)` is allowed for jitter and subsampling, and the row-fidelity gate catches fabricated data); numeric literal lists of at most 20 items; the palette prefix preserved. SECURITY failures reject the code and get a repair attempt while one is allowed; ADAPTATION failures become defect lines. Every bypass named here is a validator-corpus test. The review of 2026-10-14 found that the validator, a list of banned names, accepted `np.testing.measure("...")`, which compiles and runs any string, so a survey walked every public function of the allowed packages for `exec`, `eval`, `compile`, processes, sockets, fetches, import by name and pickle, and every module they hand out as an attribute; its routes are closed by kind, not one by one: submodules that test, build, start programs or import by name (`testing`, `tests`, `distutils`, `backends`, `animation`, `texmanager`, `dviread`, `sphinxext`, `pylab`, pandas' `computation` and `compat`, seaborn's `external`, sklearn's `externals`, `discovery` and `estimator_checks`, statsmodels' `x13` and `iolib`) are banned like the re-exports, as attributes, `from` imports and import path components, and a test pins that every public first-level submodule of numpy, pandas, matplotlib, seaborn, scikit-learn, the toolkits and the admitted statsmodels packages is either reviewed as safe or banned, so an upgrade that adds one fails until someone reviews it; single helpers (`test()`, which runs pytest, `add_newdoc` and `import_module`, `switch_backend`, `register_backend`, `TexManager`, `math_to_image`, `thumbnail`, `json_dump`, the seaborn and statsmodels fetchers, `datasets`, the `print_*` canvas writers and the `x13_*` runners) are banned like `.show`; modules re-exported as attributes (`mpl.tempfile`, `mpl.logging`, pickle, pkgutil, pydoc, the file, archive and network modules, `sklearn.<module>.scipy`) joined the re-export list; and an attribute path resolved through an import must stay inside the import surface, so `scipy.datasets.face()` after `import scipy.stats` is refused. Settings that start programs or import by name are their own rule (`rc-key`): a dotted string literal naming `text.usetex`, `text.latex.*`, `pgf.*`, `animation.*` (the ffmpeg and ImageMagick paths), `ps.usedistiller`, `webagg.*`, a key ending `_path`, or `backend` (pandas' `plotting.backend` too) is a finding anywhere, and in a settings position (an `rcParams` subscript, a key of a settings dict, a `**{...}` keyword) the bare `backend` and `usetex` are too; `rcParams` is written only with a literal key or `.update` with a dict literal, `rc_context` and `rc=` take literal dicts and no settings file (`fname`), `style.context` takes a literal dict or a style name, never a path to a style sheet, `rc(group, ...)` takes a literal group; the keywords `usetex=` and `backend=` are banned on every call, the value `"TeX"` (`ismath="TeX"`) is a finding, and a save takes no `format=` but its file's own type (`"png"`, altair's `"html"`); plotnine's `theme_matplotlib(rc=...)` follows the `rc_context` rules, literal keys and no settings file. The cache and spill directories of scikit-learn and joblib are banned too (Fable review of #12177, after a survey of the admitted libraries' public signatures): the keywords `memory=` (`Pipeline`, `make_pipeline`, `AgglomerativeClustering`, `FeatureAgglomeration`, `OPTICS`), `temp_folder=` and `cachedir=` on every call, also as string keys of a dict literal unpacked into a call, and the helpers `Memory`, `check_memory` and `Parallel`, whose cache or spill directory is a positional parameter; `location=` stays allowed, because matplotlib's colorbar and secondary axes take it as a side. The render guard refuses those writes in the sandbox; the rule keeps them out of the exported code, which runs unguarded on the user's machine. A key built at run time still passes these rules, which is why the harness arms its plot guard (see [Render](#render)). plotnine and altair (step 1b of the phase-2 plan, 2026-10-25) brought routes of their own; their public submodules were walked on 2026-10-24 and the walk was checked adversarially on 2026-10-25, and `validate.py`'s module docstring and sets list every name. Three of them go beyond a banned name. plotnine compiles and evaluates a string that is not a column name wherever it takes an aesthetic or a facet, with real builtins and the plot's namespace, so `aes(x='open("/etc/passwd").read()')` is code: every string literal passed to `aes`, `after_stat`, `after_scale`, `stage`, `facet_wrap`, `facet_grid` or `qplot` (`EXPRESSION_CALLS`) is parsed as a Python expression, each side and term of a facet formula on its own, and walked with this profile's name, attribute, call and dunder rules; a bare column name and a text that does not parse (a column such as "True Label") pass, and those calls take `**` only from a dict literal and `*` only from a list or tuple literal, so every string they evaluate is in the walk. `formula=` is a banned keyword on every call, because statsmodels hands it to patsy, which `exec`s Python while it parses (`stat_smooth`, `stat_quantile`; the render guard refuses that `exec`). And altair's image mark is banned (`mark_image`, `Url*` and the keyword `url=`), because vl-convert's SVG renderer reads a `file://` href from disk in native code the audit hook never sees, together with `Chart.from_dict` and `from_json` in altair's profile only (`LIBRARY_BANS`), whose spec the string rules cannot read. Among the names: every plotnine plot's `.environment`, whose namespace holds the `os` module as a value; altair's `limit_rows`, whose narwhals frame hands out the pyarrow module, `transformed_data`, which loads `url` data in VegaFusion, and its plugin and renderer registries; and the `pathlib.Path` and polars writers among the banned I/O names. pygal and lets-plot (step 1c, 2026-10-26) got the same walk of their public submodules, pinned by the same test (pygal 3.1.3, cairosvg 2.9.1, lets-plot 4.11.0), and rules of their own. libcairo writes pygal's PNG with its own `fopen`, which the audit hook never sees, so the static pin of the save target, not the plot guard, holds `render_to_png` and `svg2png` to the plot file. cairosvg's CSS stack builds code from the chart's stylesheet (`CODE_BUILDERS`, see [Render](#render)), so `cssselect2`, `tinycss2`, `cairocffi` and cairosvg's `css`, `parser`, `surface`, `url` and `image` modules are unreachable, and pygal's config keywords have a rule: `defs=` is refused, `js=` takes only an empty list, `css=` takes only inline rules and pygal's three package stylesheets (`file://style.css` and its siblings, exempt from the URL rule in that position alone), and `.css` and `.js` are only ever the single target of a plain assignment. Every `**` in pygal's profile is a dict literal with string keys or a name bound once and used only that way, a `googlefont:` value counts as a URL literal, and the SVG namespace names (`http://www.w3.org/2000/svg` and `http://www.w3.org/1999/xlink`) are exempt from the URL rule in pygal's profile only. lets-plot's geocoding, map tiles, livemap and browser contexts are denied (the modules above and 23 helpers such as `geocode` and `to_png`), `LetsPlot` is admitted only as `LetsPlot.setup_html()` with no arguments (`LetsPlot.set`, `setup_show_ext` and `cfg` are refused), and `.props` is banned. The `.format` ban has one exemption, in lets-plot's profile only: a `.format` with string-literal arguments at the end of a chain of `layer_tooltips()`, `layer_labels()` or `smooth_labels()` builder methods, each of which returns the builder, imported from `lets_plot` under a name bound once (59 catalogue files use it, and 53 of them are eligible only through it). The plotnine expression rule changed too: a name it reads as a module-level string must be bound exactly once, match captures included, so `case COLUMN:` can no longer rebind it to code. ### Render -`agents/anyplot/render/` defines `RenderJob{job_id, language, library, source, data_csv, themes, timeout_s}` and two protocols: `RuntimeAdapter` (one per library, from the registry `runtimes.runtime_for`: `file_name`, `command` as the CI command verbatim, `env`, `loader_block`, `normalise`, `validate`, `collect`, and since 2026-10-24 the language's code conventions the pipeline checks against (`regions`, `readiness`, `security`, `adaptation`, `apply_plan`, `restore_protected`, `new_literals`), its error grammar (`error_summary`), its export with the code artifact's name (`export`, `code_artifact`: `plot.py`, `plot.R`, `plot.jl`, `plot.js`, `plot.tsx`, which `schemas.ArtifactName`, the artifact route and the feedback case follow) and the render time a repair reserves (`render_p95_s`)) and `RenderBackend` with the backends `remote` (phase 1: the `anyplot-renderer` service, `AGENT_RENDERER=remote` with `AGENT_RENDER_URL`), `sandbox` (sandboxes launched inside the agents service; a stub that phase 1 does not use), `local` (development only; refuses `ENVIRONMENT=production`; always `docker run --rm --network none --read-only --tmpfs /tmp -v <rundir>:/work <renderer image> /app/.venv/bin/python -I /opt/anyplot/harness.py plot.py` with the production renderer image, fails if Docker is missing, no bare-subprocess fallback) and `fake` (unit tests, fixture PNGs). The registry serves matplotlib, seaborn, plotnine and altair, all four through `PythonRuntime` (plotnine and altair since 2026-10-25), which hands its library to the regions, the readiness scan, the edits, the normaliser and the validator, so each library gets its own save rule and import surface. plotnine draws through matplotlib, so its renders carry the probe and its advisory gates; altair renders in vl-convert's embedded V8 with no matplotlib figure, writes no probe, and is judged by the host gates alone. +`agents/anyplot/render/` defines `RenderJob{job_id, language, library, source, data_csv, themes, timeout_s}` and two protocols: `RuntimeAdapter` (one per library, from the registry `runtimes.runtime_for`: `file_name`, `command` as the CI command verbatim, `env`, `loader_block`, `normalise`, `validate`, `collect`, and since 2026-10-24 the language's code conventions the pipeline checks against (`regions`, `readiness`, `security`, `adaptation`, `apply_plan`, `restore_protected`, `new_literals`), its error grammar (`error_summary`), its export with the code artifact's name (`export`, `code_artifact`: `plot.py`, `plot.R`, `plot.jl`, `plot.js`, `plot.tsx`, which `schemas.ArtifactName`, the artifact route and the feedback case follow) and the render time a repair reserves (`render_p95_s`)) and `RenderBackend` with the backends `remote` (phase 1: the `anyplot-renderer` service, `AGENT_RENDERER=remote` with `AGENT_RENDER_URL`), `sandbox` (sandboxes launched inside the agents service; a stub that phase 1 does not use), `local` (development only; refuses `ENVIRONMENT=production`; always `docker run --rm --network none --read-only --tmpfs /tmp -v <rundir>:/work <renderer image> /app/.venv/bin/python -I /opt/anyplot/harness.py plot.py` with the production renderer image, fails if Docker is missing, no bare-subprocess fallback) and `fake` (unit tests, fixture PNGs). The registry serves matplotlib, seaborn, plotnine, altair, pygal and lets-plot (`letsplot`), all six through `PythonRuntime` (plotnine and altair since 2026-10-25, pygal and lets-plot since 2026-10-26), which hands its library to the regions, the readiness scan, the edits, the normaliser and the validator, so each library gets its own save rule and import surface. plotnine draws through matplotlib, so its renders carry the probe and its advisory gates. altair renders in vl-convert's embedded V8, pygal through cairosvg and libcairo, and lets-plot in its Kotlin/Native bridge (ImageMagick linked in): none of them draws a matplotlib figure or writes a probe, so the host gates alone judge them. -The renderer is a service of its own (owner decision of 2026-10-10), so the deployed agents service and a developer's `adk web` render in the same sandboxes. `agents/renderer/` has no ADK import and no `__init__.py` (`adk web agents` would list it as an agent). `POST /render` takes the `RenderJob` as JSON and answers per theme the exit code, a timeout flag, a stderr tail of at most 2,000 characters, the probe, the PNG as base64 (at most 10 MB), the attempts and a reason (`timeout`, `disk_budget`, `file_budget`, `memory`, `launcher` or `output_rejected`) with the measured value and the limit, plus the slot wait, the total time and `MemAvailable`; `POST /run-data` (since 2026-10-14) takes `{job_id, source, timeout_s}` (at most 16 KB of source and 30 s) and runs one data snippet as `snippet.py` with the harness in data mode (`harness.py --data`), in the same render slot, under the same memory floor, watchdog, kill path and launcher retry, with no theme and no matplotlib environment; it answers `{exit_code, timed_out, reason, measured, limit, csv_text, stderr_tail, wall_s, attempts}` plus the timings, the version and `MemAvailable`, where `csv_text` is the `out.csv` the harness wrote, read only after exit code 0 with `read_regular` under the 2 MB cap of computed data as strict UTF-8 (anything else is `output_rejected`). `POST /convert` (since 2026-10-15) takes `{job_id, data_base64, sheet?, timeout_s}` (at most 5 MiB of file and 15 s) and reads one binary data file with the harness in convert mode (`harness.py --convert input.bin`, the converter `convert.py` beside the harness, Arrow's system allocator), in the same slot and under the same limits; it answers `{exit_code, timed_out, reason, refusal, measured, limit, text, meta, wall_s, attempts}`, where `text` (at most 1 MiB) and `meta` (`wire.ConvertMeta`: kind, format, rows, columns, sheet, at most ten sheet names, warning counts) are read only after exit code 0 (see the conversion under [Request flow](#request-flow-for-use-with-my-data)). In data mode the harness imports everything the DATA profile allows, every module of `pandas.core`, `pandas.tseries` and `pandas.api` (pandas loads some lazily) and every time zone, reads and compiles the snippet, opens `out.csv`, and then arms an audit hook (`sys.addaudithook`) that refuses, for the rest of the process, every `open` (reading too), every `import` of a module not loaded yet, `ctypes.*`, `os.system`, `os.exec*`, `os.posix_spawn`, `os.spawn*`, `os.fork*`, `subprocess.*`, `socket.*`, every filesystem change and listing (`os.listdir`, `os.scandir`), every route to a frame (`gi_frame`, `cr_frame`, `ag_frame`, `tb_frame`, `sys._getframe`), because a frame's `f_builtins` hands out `open` and `__import__` past the validator (the Fable security review of 2026-10-14 ran `(i for i in range(1)).gi_frame.f_builtins['open']` end to end), and every `exec` and `compile` but the snippet's own run and three code builders that fill a fixed template with names they checked as identifiers (`namedtuple`, which `DataFrame.itertuples()` uses, dataclasses, scipy's distributions). CPython raises no audit event for `os.stat`, reading `os.environ` or `function.__globals__`, nor for importing a module that is loaded already; those stay the validator's; it takes `df` from the run's globals (a DataFrame, no MultiIndex columns, a non-default index reset into columns, names as text, at most 20,000 rows, 50 columns and 2 MB of CSV, 200 KB until 2026-10-14) and writes it through the handle opened before the hook. The snippet never chooses the exit code (the harness catches everything it raises, `SystemExit` included), each refusal has its own code, and a refusal the snippet caught still refuses the run. The plot mode arms an audit hook of its own (`PlotGuard`, since 2026-10-14), after the limits, the font cache and the probe are set up and the plot file is compiled: it refuses every `exec` but the plot's own run, the module bodies of an import (an import frame met before any plot frame, walking up from the caller) and the three code builders; a code object or function built by hand and a `__code__` assignment; every `open` that writes anything but `plot-<theme>.png`, `probe-<theme>.json` and, since 2026-10-25, `plot-<theme>.html` (altair's second file, which stays in the sandbox: no backend collects it); `subprocess.*`, `os.system`, `os.exec*`, `os.posix_spawn`, `os.spawn*`, `os.fork*`, `socket.*`, `ctypes.*` (except threadpoolctl's, which scikit-learn uses to limit BLAS threads), filesystem changes and `os.chdir`; and, since the Fable review of #12177, every route to a frame (`gi_frame`, `cr_frame`, `ag_frame`, `tb_frame`, `sys._getframe`, `sys._current_frames`) while plot code is on the stack, so neither the plot nor library code it called (`pd.Series([g]).apply(getattr, args=("gi_frame",))`) reaches a frame's `f_builtins`. Two kinds of frame reader stay allowed: an import body (an import frame met before any plot frame, as for `exec`), and a short list of library functions that read a name or a value and return no frame (`FRAME_READERS`: pandas' chained-assignment check, the caller lookup of statsmodels' graphics, and `traceback.extract_stack` and `extract_tb`, which pyparsing calls while matplotlib builds and runs its mathtext parser, and through which the interpreter prints a failed plot's traceback, so the error line still reaches the repair; and since 2026-10-25 plotnine's `Environment.capture`, which walks from `inspect.currentframe()` to the plot's own frame and keeps its `f_locals` and `f_globals`, the namespace the plot has anyway, to look column names up in `aes("x")`; every plotnine file failed without it with `call-stack is not that deep!`). A stack with no plot frame gets no frame either: a worker thread runs a callable the plot submitted (`ThreadPoolExecutor.submit(sys._current_frames)`) with no plot frame above it, and the frames it returned reached `run_plot`'s locals and let the plot disarm the guard (#12181 review). For the same reason both guards refuse `gc.get_objects`, `gc.get_referrers` and `gc.get_referents`, which hand out the guard object itself, and every callback the interpreter hands a real frame (Fable review of #12181, reproduced in both modes): `sys.settrace` and `sys.setprofile` (also raised by `threading`'s `settrace`, `setprofile` and their `_all_threads` forms) and `sys.monitoring.register_callback`, the one PEP 669 call with an audit event. A trace function walks `f_back`, which raises no event, to the locals of `run_plot` or `run_data_snippet`, where the guard sits. `signal.signal`, whose handler gets the interrupted frame and which raises no event, is replaced by a refusal before arming, like `os.mkfifo`. The guard's own state stays a plain attribute: CPython gives in-process code no state that a reference cannot reach, so the defence is that no route hands the code under test a reference. The validator bans `settrace`, `setprofile`, `settrace_all_threads`, `setprofile_all_threads` and `monitoring` as attributes on any object and as `from` imports as a second layer. `inspect.currentframe` and `logging.currentframe`, which return their caller's frame, are replaced before the guard is armed: `logging.currentframe` answers None, as in data mode, and since 2026-10-25 `inspect.currentframe` answers its caller's frame to a `FRAME_READERS` entry and None to every other caller (`frame_for_readers`, a `sys._getframe(1)` the guard judges like any other frame route, with a refusal turned into None), while data mode keeps None for every caller. Where a helper answers None, pandas reports a warning at stack level 0 and a log record names "(unknown file)". The `open` event carries no `dir_fd`, so an `os.open` write passes only with an absolute path, and the calls that raise no audit event at all (`os.mkfifo`, `os.mknod`, `_posixsubprocess.fork_exec`) are replaced by a refusal before either mode's hook is armed. Imports, reads and `compile` stay allowed: the plot imports its libraries lazily, matplotlib reads fonts and style sheets and compiles colour and cycler strings while it draws, and a compiled code object runs only through the refused routes. A refusal raises `PermissionError`, so library code that tolerates a read-only filesystem or a missing tool (matplotlib's cache writes, `ctypes.util.find_library`, loky's `lscpu`) carries on; the harness runs scikit-learn's two process lookups (libc for threadpoolctl, the physical cores for loky) before arming when the plot names sklearn, because refused they fail the render or oversubscribe the CPU past `RLIMIT_CPU`. A sweep of the 650 catalogue matplotlib and seaborn files on a developer machine (Python 3.13.12, the locked plotting stack) rendered all 474 that pass the SECURITY profile under the guard; the seven it newly failed fetch over the network, call `os.chdir` or `load_dataset`, which the validator refuses anyway. With the frame refusals, a sweep of the 572 files the readiness scan admits today (clean or coupled: 285 matplotlib, 287 seaborn) rendered 565 under the guard before and after the change, with no refusal logged; the seven failures are the plots' own (each divides by the length of a title the normaliser emptied). `tests/unit/agents/runtime/test_harness_guard.py` renders six normalised catalogue files under the guard (scikit-learn, a statsmodels graphic, mathtext, a seaborn `KMeans` file, and since 2026-10-25 the `scatter-basic` files of plotnine and altair; the last three are skipped where their library is not installed, as in CI's test job; the renderer-image job of `ci-image.yml` renders a seaborn, a plotnine and an altair plot through the harness in the image, the altair one without `RLIMIT_AS`). The sweep has not yet been repeated in the renderer image, and not at all for plotnine and altair. `POST /render/{job_id}/cancel` stops that job's render or data run; `GET /status` reports the version, the slot, stuck launchers, `MemAvailable`, whether the launcher exists and whether the run volume is in place. `agents/renderer/wire.py` is the JSON contract that both the service and the `remote` backend read. The renderer only runs code and returns its outputs; the host gates and the probe gates below stay in the agents service, and R1 turns a reason into a line that names the limit and the measured value, so the repair knows what to change. Every route needs an IAM-forwarded ID token whose `aud` is in `RENDERER_AUDIENCES` (the service URL, which the deploy adds, plus the OAuth client ids of the owner's user tokens) and whose `email` is in `RENDERER_ALLOWED_CALLERS`; the check is the one of `/v1`, reads `X-Serverless-Authorization` whenever it is present, and is skipped only in development. An unexpected error answers `500 {"detail": "internal"}` and is logged by its class only, so the `remote` backend never mistakes it for a front-end error and runs the job again. +The renderer is a service of its own (owner decision of 2026-10-10), so the deployed agents service and a developer's `adk web` render in the same sandboxes. `agents/renderer/` has no ADK import and no `__init__.py` (`adk web agents` would list it as an agent). `POST /render` takes the `RenderJob` as JSON and answers per theme the exit code, a timeout flag, a stderr tail of at most 2,000 characters, the probe, the PNG as base64 (at most 10 MB), the attempts and a reason (`timeout`, `disk_budget`, `file_budget`, `memory`, `launcher` or `output_rejected`) with the measured value and the limit, plus the slot wait, the total time and `MemAvailable`; `POST /run-data` (since 2026-10-14) takes `{job_id, source, timeout_s}` (at most 16 KB of source and 30 s) and runs one data snippet as `snippet.py` with the harness in data mode (`harness.py --data`), in the same render slot, under the same memory floor, watchdog, kill path and launcher retry, with no theme and no matplotlib environment; it answers `{exit_code, timed_out, reason, measured, limit, csv_text, stderr_tail, wall_s, attempts}` plus the timings, the version and `MemAvailable`, where `csv_text` is the `out.csv` the harness wrote, read only after exit code 0 with `read_regular` under the 2 MB cap of computed data as strict UTF-8 (anything else is `output_rejected`). `POST /convert` (since 2026-10-15) takes `{job_id, data_base64, sheet?, timeout_s}` (at most 5 MiB of file and 15 s) and reads one binary data file with the harness in convert mode (`harness.py --convert input.bin`, the converter `convert.py` beside the harness, Arrow's system allocator), in the same slot and under the same limits; it answers `{exit_code, timed_out, reason, refusal, measured, limit, text, meta, wall_s, attempts}`, where `text` (at most 1 MiB) and `meta` (`wire.ConvertMeta`: kind, format, rows, columns, sheet, at most ten sheet names, warning counts) are read only after exit code 0 (see the conversion under [Request flow](#request-flow-for-use-with-my-data)). In data mode the harness imports everything the DATA profile allows, every module of `pandas.core`, `pandas.tseries` and `pandas.api` (pandas loads some lazily) and every time zone, reads and compiles the snippet, opens `out.csv`, and then arms an audit hook (`sys.addaudithook`) that refuses, for the rest of the process, every `open` (reading too), every `import` of a module not loaded yet, `ctypes.*`, `os.system`, `os.exec*`, `os.posix_spawn`, `os.spawn*`, `os.fork*`, `subprocess.*`, `socket.*`, every filesystem change and listing (`os.listdir`, `os.scandir`), every route to a frame (`gi_frame`, `cr_frame`, `ag_frame`, `tb_frame`, `sys._getframe`), because a frame's `f_builtins` hands out `open` and `__import__` past the validator (the Fable security review of 2026-10-14 ran `(i for i in range(1)).gi_frame.f_builtins['open']` end to end), and every `exec` and `compile` but the snippet's own run and three code builders that fill a fixed template with names they checked as identifiers (`namedtuple`, which `DataFrame.itertuples()` uses, dataclasses, scipy's distributions). CPython raises no audit event for `os.stat`, reading `os.environ` or `function.__globals__`, nor for importing a module that is loaded already; those stay the validator's; it takes `df` from the run's globals (a DataFrame, no MultiIndex columns, a non-default index reset into columns, names as text, at most 20,000 rows, 50 columns and 2 MB of CSV, 200 KB until 2026-10-14) and writes it through the handle opened before the hook. The snippet never chooses the exit code (the harness catches everything it raises, `SystemExit` included), each refusal has its own code, and a refusal the snippet caught still refuses the run. The plot mode arms an audit hook of its own (`PlotGuard`, since 2026-10-14), after the limits, the font cache and the probe are set up and the plot file is compiled: it refuses every `exec` but the plot's own run, the module bodies of an import (an import frame met before any plot frame, walking up from the caller) and the code builders (`CODE_BUILDERS`: the three above, plotnine's `Environment.eval` since 2026-10-25, and since 2026-10-26 cssselect2's selector compiler, which pygal's PNG export runs once per CSS selector of the chart and which quotes every string the stylesheet controls with `repr`); a code object or function built by hand and a `__code__` assignment; every `open` that writes anything but `plot-<theme>.png`, `probe-<theme>.json` and, since 2026-10-25, `plot-<theme>.html` (the second file of altair, and since 2026-10-26 of pygal and lets-plot, which stays in the sandbox: no backend collects it; libcairo writes pygal's PNG natively, past this hook, so the validator's pin holds that path); `subprocess.*`, `os.system`, `os.exec*`, `os.posix_spawn`, `os.spawn*`, `os.fork*`, `socket.*`, `ctypes.*` (except threadpoolctl's, which scikit-learn uses to limit BLAS threads), filesystem changes and `os.chdir`; and, since the Fable review of #12177, every route to a frame (`gi_frame`, `cr_frame`, `ag_frame`, `tb_frame`, `sys._getframe`, `sys._current_frames`) while plot code is on the stack, so neither the plot nor library code it called (`pd.Series([g]).apply(getattr, args=("gi_frame",))`) reaches a frame's `f_builtins`. Two kinds of frame reader stay allowed: an import body (an import frame met before any plot frame, as for `exec`), and a short list of library functions that read a name or a value and return no frame (`FRAME_READERS`: pandas' chained-assignment check, the caller lookup of statsmodels' graphics, and `traceback.extract_stack` and `extract_tb`, which pyparsing calls while matplotlib builds and runs its mathtext parser, and through which the interpreter prints a failed plot's traceback, so the error line still reaches the repair; and since 2026-10-25 plotnine's `Environment.capture`, which walks from `inspect.currentframe()` to the plot's own frame and keeps its `f_locals` and `f_globals`, the namespace the plot has anyway, to look column names up in `aes("x")`; every plotnine file failed without it with `call-stack is not that deep!`). A stack with no plot frame gets no frame either: a worker thread runs a callable the plot submitted (`ThreadPoolExecutor.submit(sys._current_frames)`) with no plot frame above it, and the frames it returned reached `run_plot`'s locals and let the plot disarm the guard (#12181 review). For the same reason both guards refuse `gc.get_objects`, `gc.get_referrers` and `gc.get_referents`, which hand out the guard object itself, and every callback the interpreter hands a real frame (Fable review of #12181, reproduced in both modes): `sys.settrace` and `sys.setprofile` (also raised by `threading`'s `settrace`, `setprofile` and their `_all_threads` forms) and `sys.monitoring.register_callback`, the one PEP 669 call with an audit event. A trace function walks `f_back`, which raises no event, to the locals of `run_plot` or `run_data_snippet`, where the guard sits. `signal.signal`, whose handler gets the interrupted frame and which raises no event, is replaced by a refusal before arming, like `os.mkfifo`. The guard's own state stays a plain attribute: CPython gives in-process code no state that a reference cannot reach, so the defence is that no route hands the code under test a reference. The validator bans `settrace`, `setprofile`, `settrace_all_threads`, `setprofile_all_threads` and `monitoring` as attributes on any object and as `from` imports as a second layer. `inspect.currentframe` and `logging.currentframe`, which return their caller's frame, are replaced before the guard is armed: `logging.currentframe` answers None, as in data mode, and since 2026-10-25 `inspect.currentframe` answers its caller's frame to a `FRAME_READERS` entry and None to every other caller (`frame_for_readers`, a `sys._getframe(1)` the guard judges like any other frame route, with a refusal turned into None), while data mode keeps None for every caller. Where a helper answers None, pandas reports a warning at stack level 0 and a log record names "(unknown file)". The `open` event carries no `dir_fd`, so an `os.open` write passes only with an absolute path, and the calls that raise no audit event at all (`os.mkfifo`, `os.mknod`, `_posixsubprocess.fork_exec`) are replaced by a refusal before either mode's hook is armed. Imports, reads and `compile` stay allowed: the plot imports its libraries lazily, matplotlib reads fonts and style sheets and compiles colour and cycler strings while it draws, and a compiled code object runs only through the refused routes. A refusal raises `PermissionError`, so library code that tolerates a read-only filesystem or a missing tool (matplotlib's cache writes, `ctypes.util.find_library`, loky's `lscpu`) carries on; the harness runs scikit-learn's two process lookups (libc for threadpoolctl, the physical cores for loky) before arming when the plot names sklearn, because refused they fail the render or oversubscribe the CPU past `RLIMIT_CPU`, and since 2026-10-26 it imports cairosvg before arming when the plot names pygal or cairosvg (`warm_cairo`), because cairocffi loads libcairo at import time through the same kind of lookups (`ctypes.util.find_library`, which runs `ldconfig`). A sweep of the 650 catalogue matplotlib and seaborn files on a developer machine (Python 3.13.12, the locked plotting stack) rendered all 474 that pass the SECURITY profile under the guard; the seven it newly failed fetch over the network, call `os.chdir` or `load_dataset`, which the validator refuses anyway. With the frame refusals, a sweep of the 572 files the readiness scan admits today (clean or coupled: 285 matplotlib, 287 seaborn) rendered 565 under the guard before and after the change, with no refusal logged; the seven failures are the plots' own (each divides by the length of a title the normaliser emptied). `tests/unit/agents/runtime/test_harness_guard.py` renders nine normalised catalogue files under the guard (scikit-learn, a statsmodels graphic, mathtext, a seaborn `KMeans` file, since 2026-10-25 the `scatter-basic` files of plotnine and altair, and since 2026-10-26 pygal's `scatter-basic` and `line-basic`, whose 4800x2700 chart the canvas rewrite saves at 3200x1800, and lets-plot's `scatter-basic`; the last six are skipped where their library is not installed, as in CI's test job; the renderer-image job of `ci-image.yml` renders a seaborn, a plotnine, an altair, a pygal and a lets-plot plot through the harness in the image, the altair one without `RLIMIT_AS` and the lets-plot one with its row's environment and 2048 MiB). The sweep has not yet been repeated in the renderer image. On a developer machine the spikes of 2026-10-26 rendered 273 of the 325 catalogue pygal files under the guard (the failures are the files' own off-target writes, `os.chdir` calls, missing modules and guard shapes, which the normaliser strips or the validator refuses, and one `RLIMIT_CPU` kill, waveform-audio) and 273 of the 284 eligible lets-plot files (10 divide by the length of the emptied title, and calibration-curve does not render with lets-plot 4.11.0 at all); plotnine and altair have no sweep yet. `POST /render/{job_id}/cancel` stops that job's render or data run; `GET /status` reports the version, the slot, stuck launchers, `MemAvailable`, whether the launcher exists and whether the run volume is in place. `agents/renderer/wire.py` is the JSON contract that both the service and the `remote` backend read. The renderer only runs code and returns its outputs; the host gates and the probe gates below stay in the agents service, and R1 turns a reason into a line that names the limit and the measured value, so the repair knows what to change. Every route needs an IAM-forwarded ID token whose `aud` is in `RENDERER_AUDIENCES` (the service URL, which the deploy adds, plus the OAuth client ids of the owner's user tokens) and whose `email` is in `RENDERER_ALLOWED_CALLERS`; the check is the one of `/v1`, reads `X-Serverless-Authorization` whenever it is present, and is skipped only in development. An unexpected error answers `500 {"detail": "internal"}` and is logged by its class only, so the `remote` backend never mistakes it for a front-end error and runs the job again. The sandbox command per theme, started with `asyncio.create_subprocess_exec` in a session of its own and never a shell, with a fresh name and a fresh run directory for every launch: @@ -328,15 +336,15 @@ uvicorn does not cancel a request handler whose client went away, so `POST /rend The `remote` backend mints the ID token for `AGENT_RENDER_URL`, the renderer's service URL, from the metadata server on Cloud Run; in development it sends `AGENT_RENDER_TOKEN` when set, or the `id_token` of the developer's Application Default Credentials (`agents/README.md`). It retries a connection error or a Cloud Run front-end 429 or 5xx without the renderer's JSON `detail` after 1, 3, 8 and 15 s within 30 s (spike S saw a 500, then a 429, and a 200 about 17 s after the first request to a service scaled to zero), never the renderer's own refusals. A `launcher` reason becomes `RendererUnavailable`, because it is the renderer's failure and not the code's, so it spends no repair and the theme toggle records no try; every other failure maps to `RendererUnavailable` too, and its message is logged. -A run renders one theme, the one `PipelineArgs.theme` names, and the host gates judge exactly the themes of the job (an output for another theme is ignored, a missing one fails R1). The theme toggle renders the other theme of a finished version later, as a job of its own with the same code and `data.csv`, and adds its PNG to the version's render. Renders are strictly serial per instance, because spikes S and S2 showed one 4 GiB instance serves one sandbox at a time safely. No backend keeps a semaphore of its own: `Services.backend` wraps whichever backend `make_backend` built in `SerialRenderer` (`render/serial.py`), which renders one theme per slot under `AGENT_RENDER_CONCURRENCY` slots, 1 by default, so every backend is serial by construction, `adk web` runs included; the `remote` backend therefore sends one theme per request. The renderer holds one render slot of its own on top, because the deployed agents service and a developer's `adk web` call it independently. A freed slot goes to a waiting pipeline render before a waiting theme toggle, so a run waits for at most the render in progress; a render's timeout starts when it runs. The theme toggle records a theme that failed the host gates and renders it at most twice; a renderer that could not run is not recorded. `harness.py` (copied into the renderer image at `/opt/anyplot/harness.py`) prints its `HARNESS` start line, sets the resource limits soft and hard alike (CPU seconds and file size always; the address space and the process count when the renderer passes them, because outside a sandbox `RLIMIT_NPROC` counts every process of the user), copies the baked font cache into `MPLCONFIGDIR`, appends the installed fallback families (`FALLBACK_FAMILIES` in `harness.py`: Noto Sans, Noto Sans CJK JP, and the Noto Sans faces for Arabic, Hebrew, the nine Indic scripts, Thai, Khmer, Myanmar, Ethiopic and two symbol blocks) to every font lookup after the font the code chose, so DejaVu Sans stays the catalogue's first font and text in any of those scripts still draws, whatever `font.family` the code or seaborn's `set_theme` set; records every code point matplotlib reports as having no glyph in any font of its text, plain text and `$…$` math alike, as `missing_glyphs` in the probe; registers a `Figure.savefig` probe that writes `probe-<theme>.json` (plotnine saves a figure built without a canvas, so since 2026-10-25 the probe gives it the Agg canvas a PNG save would; altair draws no matplotlib figure and gets no probe), compiles the plot file and runs it as `__main__` under the plot guard, and prints its peak memory and CPU time in a closing `HARNESS` line. +A run renders one theme, the one `PipelineArgs.theme` names, and the host gates judge exactly the themes of the job (an output for another theme is ignored, a missing one fails R1). The theme toggle renders the other theme of a finished version later, as a job of its own with the same code and `data.csv`, and adds its PNG to the version's render. Renders are strictly serial per instance, because spikes S and S2 showed one 4 GiB instance serves one sandbox at a time safely. No backend keeps a semaphore of its own: `Services.backend` wraps whichever backend `make_backend` built in `SerialRenderer` (`render/serial.py`), which renders one theme per slot under `AGENT_RENDER_CONCURRENCY` slots, 1 by default, so every backend is serial by construction, `adk web` runs included; the `remote` backend therefore sends one theme per request. The renderer holds one render slot of its own on top, because the deployed agents service and a developer's `adk web` call it independently. A freed slot goes to a waiting pipeline render before a waiting theme toggle, so a run waits for at most the render in progress; a render's timeout starts when it runs. The theme toggle records a theme that failed the host gates and renders it at most twice; a renderer that could not run is not recorded. `harness.py` (copied into the renderer image at `/opt/anyplot/harness.py`) prints its `HARNESS` start line, sets the resource limits soft and hard alike (CPU seconds and file size always; the address space and the process count when the renderer passes them, because outside a sandbox `RLIMIT_NPROC` counts every process of the user), copies the baked font cache into `MPLCONFIGDIR`, appends the installed fallback families (`FALLBACK_FAMILIES` in `harness.py`: Noto Sans, Noto Sans CJK JP, and the Noto Sans faces for Arabic, Hebrew, the nine Indic scripts, Thai, Khmer, Myanmar, Ethiopic and two symbol blocks) to every font lookup after the font the code chose, so DejaVu Sans stays the catalogue's first font and text in any of those scripts still draws, whatever `font.family` the code or seaborn's `set_theme` set; records every code point matplotlib reports as having no glyph in any font of its text, plain text and `$…$` math alike, as `missing_glyphs` in the probe; registers a `Figure.savefig` probe that writes `probe-<theme>.json` (plotnine saves a figure built without a canvas, so since 2026-10-25 the probe gives it the Agg canvas a PNG save would; altair, pygal and lets-plot draw no matplotlib figure and get no probe), compiles the plot file and runs it as `__main__` under the plot guard, and prints its peak memory and CPU time in a closing `HARNESS` line. -Host gates: R1 (exit code and outputs present) and R2 (PNG hardening: `lstat` with no symlinks, at most 10 MB, magic bytes, Pillow under `MAX_IMAGE_PIXELS`, non-blank with less than 98 % background, re-encode) are blocking; a render that fails either is discarded and never becomes `best`. R3 (canvas within 16 px through `core/canvas.py`, lifted from `.github/workflows/impl-review.yml`) is repair-triggering with a fallback: an R3 miss after normalisation is a defect line for the repair; if it persists after the last allowed attempt, the host pads the PNG of the rendered theme to the target canvas (never crops), the padded artifact counts as having passed the host gates, and the result ships as `needs_attention` with the residual line `canvas padded after render (<theme>)` and the VQ-05 line for that theme, never silently. A job with both themes pads each theme that missed and keeps the other theme's PNG as it rendered. The theme toggle answers a padded theme as `needs_attention` with the reason `canvas_padded`. The probe gates (G3 clipping, G5 annotation out of view, G7 overlapping text: tick labels among themselves, and since 2026-10-12 every other drawn text (axis label, title, legend text, annotation, or a text no role names) against any drawn text by more than 3 px, named by role and never by content, with a polar hint when an axis label of polar axes is involved, after the owner's polar case where the radial label `y` sat on the `270°` tick label and the reviewer called it missing; G8 row fidelity, G9 more than 500,000 plotted points, G10 characters without a glyph, and since 2026-10-15 G11 per-mark value labels and decorations past what the marks leave room for, and G12 a decimal mark that is not the plot language's) are advisory because in-sandbox data can be tampered with: they can only trigger a repair or add notes, never fail a render. Since 2026-10-12 the probe also describes each polar axes (`polar`: the radial labels' angle, the visible theta span and a histogram of the plotted points by 5° of angle and by tenth of the radius range, all in the axes' own theta coordinates), and `agents/anyplot/render/polar.py` turns it into a measured target, not a gate: when the radial tick labels' ray holds plotted points and a ray every 22.5° inside the span holds at most half as many, `GateReport.repair_hints` gets one line such as "polar radial tick labels: at 67.5° they sit on 10 plotted points → ax.set_rlabel_position(270), the freest direction, 0 points there. Likely cause: ...". It never starts a repair; a repair attempt that runs for other findings carries the latest render's line first among its `hints`, and the adapter prompt says to apply it with exactly that value. The owner's case of that day (seaborn `polar-scatter`, `y = sin(x)`) had the repair guess 67.5°, onto the data; evenly spread angles give no line, but a cardioid does, because a point counts only when its distance from the ray as a share of the radius is small and it is outside the innermost tenth. The first attempt gets no such hint: nothing is rendered yet, and the angle of the user's column as the plot will draw it (degrees or radians, offset, direction) is only known from the render. A renderer limit that stopped a run (`memory`, `disk_budget`, `file_budget`, `output_rejected`) is recorded as `R1-<reason>` among the failed gates. The defect-line helpers (`DEFECT_RE`, `weakness_class`, `defect_ids`, and the `format_defect` builder) live in `core/defects.py`, the canonical stdlib-only implementation, and the PNG auto-reject checks (AR-04 blank and AR-07 format; R2 calls `check_blank` with its 98 % threshold) live next to the canvas gate in `core/canvas.py`, so the agents image needs no `automation/` or `scripts/` files. `automation/scripts/regen_gate.py` keeps a parity-tested copy of the grammar, because the workflows run it as a single-file copy with the runner's system Python, where `core` is not importable. The pipeline switches to `core.defects` in the later change that also switches the canvas gate and updates the copy sites: the `cp` step in `impl-review.yml`, the `git show` in `impl-generate.yml`, `review_retest.py materialize`, and the overlay in `review-retest.yml`. +Host gates: R1 (exit code and outputs present) and R2 (PNG hardening: `lstat` with no symlinks, at most 10 MB, magic bytes, Pillow under `MAX_IMAGE_PIXELS`, non-blank with less than 99.7 % of the canvas in one colour, re-encode) are blocking; a render that fails either is discarded and never becomes `best`. R3 (canvas within 16 px through `core/canvas.py`, lifted from `.github/workflows/impl-review.yml`) is repair-triggering with a fallback: an R3 miss after normalisation is a defect line for the repair; if it persists after the last allowed attempt, the host pads the PNG of the rendered theme to the target canvas (never crops), the padded artifact counts as having passed the host gates, and the result ships as `needs_attention` with the residual line `canvas padded after render (<theme>)` and the VQ-05 line for that theme, never silently. A job with both themes pads each theme that missed and keeps the other theme's PNG as it rendered. The theme toggle answers a padded theme as `needs_attention` with the reason `canvas_padded`. The probe gates (G3 clipping, G5 annotation out of view, G7 overlapping text: tick labels among themselves, and since 2026-10-12 every other drawn text (axis label, title, legend text, annotation, or a text no role names) against any drawn text by more than 3 px, named by role and never by content, with a polar hint when an axis label of polar axes is involved, after the owner's polar case where the radial label `y` sat on the `270°` tick label and the reviewer called it missing; G8 row fidelity, G9 more than 500,000 plotted points, G10 characters without a glyph, and since 2026-10-15 G11 per-mark value labels and decorations past what the marks leave room for, and G12 a decimal mark that is not the plot language's) are advisory because in-sandbox data can be tampered with: they can only trigger a repair or add notes, never fail a render. Since 2026-10-12 the probe also describes each polar axes (`polar`: the radial labels' angle, the visible theta span and a histogram of the plotted points by 5° of angle and by tenth of the radius range, all in the axes' own theta coordinates), and `agents/anyplot/render/polar.py` turns it into a measured target, not a gate: when the radial tick labels' ray holds plotted points and a ray every 22.5° inside the span holds at most half as many, `GateReport.repair_hints` gets one line such as "polar radial tick labels: at 67.5° they sit on 10 plotted points → ax.set_rlabel_position(270), the freest direction, 0 points there. Likely cause: ...". It never starts a repair; a repair attempt that runs for other findings carries the latest render's line first among its `hints`, and the adapter prompt says to apply it with exactly that value. The owner's case of that day (seaborn `polar-scatter`, `y = sin(x)`) had the repair guess 67.5°, onto the data; evenly spread angles give no line, but a cardioid does, because a point counts only when its distance from the ray as a share of the radius is small and it is outside the innermost tenth. The first attempt gets no such hint: nothing is rendered yet, and the angle of the user's column as the plot will draw it (degrees or radians, offset, direction) is only known from the render. A renderer limit that stopped a run (`memory`, `disk_budget`, `file_budget`, `output_rejected`) is recorded as `R1-<reason>` among the failed gates. The defect-line helpers (`DEFECT_RE`, `weakness_class`, `defect_ids`, and the `format_defect` builder) live in `core/defects.py`, the canonical stdlib-only implementation, and the PNG auto-reject checks (AR-04 blank and AR-07 format; R2 measures with their `dominant_color` and its own 99.7 % threshold, 98 % until 2026-10-26: sparse pygal and lets-plot charts reach 98 % to 99.44 %, a bare canvas or a title alone 99.78 % and more) live next to the canvas gate in `core/canvas.py`, so the agents image needs no `automation/` or `scripts/` files. `automation/scripts/regen_gate.py` keeps a parity-tested copy of the grammar, because the workflows run it as a single-file copy with the runner's system Python, where `core` is not importable. The pipeline switches to `core.defects` in the later change that also switches the canvas gate and updates the copy sites: the `cp` step in `impl-review.yml`, the `git show` in `impl-generate.yml`, `review_retest.py materialize`, and the overlay in `review-retest.yml`. **Scripts and fonts.** Plot text can be in the scripts most users' data and languages bring: the renderer image installs Noto Sans, Noto Sans CJK and the Noto Sans faces of the scripts DejaVu Sans lacks (37 files, 46.8 MB, Regular and Bold where the family has both), and the harness appends them to every font lookup, so a Chinese title or a Devanagari tick label draws with the right glyphs while the code's own first font stays in charge of Latin text. Right-to-left scripts work: the pinned matplotlib lays text out through libraqm, so Arabic and Hebrew render shaped and in reading order, within one label aligned by the code's `ha`. Three limits remain, and G10 reports the first and the last: a `$…$` math string uses matplotlib's math fonts without fallback and draws `¤` for every character they lack, so non-Latin words belong outside math text; Han characters take the Japanese regional forms of the CJK face until a caller passes the plot's language (`text.language`, a follow-up with the language chip); and a character outside the installed families draws as a Last Resort placeholder box. Most pictographs are not in that last group, because Noto Sans Symbols2 or DejaVu Sans draws them as monochrome outlines (📈, 📊, ⚠, 😀), but 🔥, ✅, the flag letters, Tibetan and Mongolian have no glyph in any installed font. G10 counts those characters deterministically from matplotlib's own reports, names up to three of them with their code points (`U+1F525 🔥 fire`), tells the repair that a user's column name stays as it is, and keeps the line in the result's residual lines even when the reviewer passed the render, because a measured missing glyph is not a judgement. **Label density and number formats.** Two findings of the live tests of 2026-10-14/15 became measured gates. The catalogue draws some elements once per mark of its few example marks: bar-grouped puts a value label, a dot and a drop shadow on each of its 12 bars, and the adapter kept them on the 52 bars of 26 regions times two series, because "keep the same style" and the reviewer's house-style exemption covered them. The harness's `density_report` (probe field `density`, per axes) counts the bars and points, the texts at a data coordinate whose anchor sits at a bar's end, inside a bar's segment (`bar_label(label_type="center")`) or on a point (`ax.annotate`, `ax.bar_label`, `ax.text`; heatmap cell text and callouts in axes coordinates are not value labels, and neither is a text matplotlib clips away in a zoomed view), which of them are numbers, the dots on bar ends (scatter marks or `plot(..., "o")` markers) and the shadowed bars, and measures the median bar label width against the space between neighbouring labelled bars (unlabelled bars between them, such as an offset shadow series, do not shrink it). Bar ends come from the bars' data coordinates, so an inverted axis works. G11 writes a VQ-03 line (owner, 2026-10-15: the thresholds stay) when more than `MAX_VALUE_LABELS` (25) bar positions carry a label (a stacked bar's segment labels count once), when more than 25 numeric labels sit on points (named points, the point of scatter-annotated, never count), from six labels on when a bar label is wider than 90 % of the space per bar, or when more than `MAX_DECORATIONS` (25) dots or shadows are drawn. The adapter prompt and the reviewer's and scorer's house-style exemption now say that an element whose count grows with the data is not house style. The rule itself has one source shared with the catalogue pipeline: the "Per-mark Labels and Decorations" section of `prompts/default-style-guide.md` and the VQ-03 paragraph of `prompts/quality-criteria.md`, which the adapter reads verbatim; `adapter.md` only points at it. Second, number formats followed English whatever the plot language ("6.0 M" and "5.30" in German plots), and `locale` is a banned import. `language.NUMBER_FORMATS` is the server's table of the decimal mark, the thousands mark and the words for large numbers per language of `ENGLISH_NAMES` (`de`: `,`, `.`, Tsd./Mio./Mrd.); the adapter's static instruction carries it with the rule to format through a `FuncFormatter` or an f-string whose marks are swapped through a placeholder (`.replace(",", "_").replace(".", DECIMAL).replace("_", THOUSANDS)`), exact for the space-grouped languages too. A region such as `de-CH` with its apostrophe (7'184'003) is a follow-up of its own setting (owner, 2026-10-15). G12 reads the probe's `labels` field (the drawn texts by kind, from block F) and its `tick_axes` field (`harness.tick_axes`: whether each axis's tick labels are numbers, dates, categories or labels the code set itself), and writes a VQ-06 line when an annotation, or a tick label of a numeric axis, uses the other decimal mark, mathtext read as drawn: a single point followed by other than three digits in a decimal-comma language (`5.30`, `6.0 M`, `5.30 €`), a point after a whole part of 0 (`0.125`), a point after a comma, or commas grouping thousands; dates (a zero-padded `14.10` in an annotation reads as a day and month), years, version strings, titles, legend entries and tick labels the code set itself never count, and no label text reaches the line. -Later languages reuse the CI commands: `Rscript plot.R`; `julia --project=/opt/julia plot.jl` with a stacked `JULIA_DEPOT_PATH` and a pinned `JULIA_CPU_TARGET`; `node /opt/anyplot/js-render/render.mjs plot.js` with `window.ANYPLOT_DATA` injected; bokeh and plotly write their page and the JavaScript harness's Chromium screenshots it as a second child (the plot guard refuses a browser started from plot code; `agentic/specs/261024-agent-all-libraries.md`). Since 2026-10-24 the renderer holds these commands in one table (`agents/renderer/commands.py`, keyed by the job's `(language, library)`, the library checked against the catalogue's fifteen) and never takes a command from a request; a non-Python row runs through the harness's exec mode (`harness.py --exec -- <command> plot.<ext>`: the start line, the limits set and inherited, the end line from the child's rusage), so the launcher retry, the watchdog and the kill path hold for every language; a row says which limits differ (`RLIMIT_AS` off for the JavaScript and Julia rows, whose V8, Chromium and LLVM reserve address space far beyond their resident memory, and `RLIMIT_NPROC` off for the JavaScript row alone, whose one Chromium render runs 77 tasks; since 2026-10-25 `RLIMIT_AS` is off for altair's Python row too, because vl-convert's embedded V8 aborts at start under any limit up to 64 GiB while its resident set is about 270 MiB) and what render time a repair reserves; `GET /status` reports under `languages` which toolchains the image carries, and a job in a language without one is `503 runtime_unavailable`. +Later languages reuse the CI commands: `Rscript plot.R`; `julia --project=/opt/julia plot.jl` with a stacked `JULIA_DEPOT_PATH` and a pinned `JULIA_CPU_TARGET`; `node /opt/anyplot/js-render/render.mjs plot.js` with `window.ANYPLOT_DATA` injected; bokeh and plotly write their page and the JavaScript harness's Chromium screenshots it as a second child (the plot guard refuses a browser started from plot code; `agentic/specs/261024-agent-all-libraries.md`). Since 2026-10-24 the renderer holds these commands in one table (`agents/renderer/commands.py`, keyed by the job's `(language, library)`, the library checked against the catalogue's fifteen) and never takes a command from a request; a non-Python row runs through the harness's exec mode (`harness.py --exec -- <command> plot.<ext>`: the start line, the limits set and inherited, the end line from the child's rusage), so the launcher retry, the watchdog and the kill path hold for every language; a row says which limits differ (`RLIMIT_AS` off for the JavaScript and Julia rows, whose V8, Chromium and LLVM reserve address space far beyond their resident memory, and `RLIMIT_NPROC` off for the JavaScript row alone, whose one Chromium render runs 77 tasks; since 2026-10-25 `RLIMIT_AS` is off for altair's Python row too, because vl-convert's embedded V8 aborts at start under any limit up to 64 GiB while its resident set is about 270 MiB), which limit it sets in place of the configured one (since 2026-10-26 lets-plot's Python row has its own 2048 MiB, `RuntimeCommand.rlimit_as_mb`, because its Kotlin/Native rasteriser aborts every 3200x1800 export under the configured 1 GiB while 2048 MiB still stops a runaway scale, which a 6400x3600 export shows at 2580 MiB; the renderer's switch still rules, so a configured limit of 0 leaves every row unlimited), which environment it adds (lets-plot's: Arrow's system allocator, `ARROW_DEFAULT_MEMORY_POOL=system`, because pyarrow's default pool reserves a 1 GiB arena on the first pandas string column, and `FONTCONFIG_FILE=/opt/anyplot/fonts.conf` for the fontconfig its bridge links; an in-process row's environment and limit reach the sandbox through `executor.sandbox_env` and the local Docker backend through `PythonRuntime.env`) and what render time a repair reserves; `GET /status` reports under `languages` which toolchains the image carries, and a job in a language without one is `503 runtime_unavailable`. ### Footer strip @@ -417,11 +425,11 @@ Testing a newer model version, the other provider's arm, a different judge model Built on 2026-10-10: the harness, the two fixture generators and the 146 fixture cases, 150 since 2026-10-15 (the 127 of the full matrix and the 23 stress cases with their model-free `--static` stage), the reports, the diff, the review gallery, the blind two-run gallery with its scoring, the model-free catalogue eligibility sweep `agents/evals/eligibility.py` (`agents/README.md`, "Run the regression harness"), and the judge-only scope eval `agents/evals/scope.py` with its refusal recall and false-refusal rate (`agents/README.md`, "Run the scope eval"; its first run passed both gates). Not built yet: `--prompts <dir>`, the Gemini baseline, and the CI workflow. -- **Fixture cases**, each a directory with `case.json` (spec, library, bindings, expected `accepted`, `rejected` or `unknown`, tags, the perturbation and the source of the data, and optionally a session `language` that the harness chooses through the language route before the first turn; a promoted case carries its session's when that was detected or chosen), `data.csv`, and an optional `change_request.txt`. Two sources: the committed synthetic fixtures in `agents/evals/fixtures/cases/<id>/`, which are the spike-X matrix (10 specs times matplotlib and seaborn times 6 perturbation datasets) and, since 2026-10-25, the same specs and datasets for plotnine and altair (240 generated cases, written by the seeded generator `agents/evals/make_fixtures.py`) plus seven hand-written cases (one of them, since 2026-10-12, a German follow-up message that sets the session language; four, since 2026-10-15, choose a language and cover label density and number formats) and the 23 stress cases of `agents/evals/make_stress.py` (tag `stress`, left out of `full`; see [Bounds](#bounds)), and the promoted feedback cases synced from the private bucket into the gitignored `agents/evals/.cases/` directory (never committed, because they hold users' data). The tag `smoke` marks the 14 cases of the smoke set (12 until 2026-10-25, when one plotnine and one altair case joined). The scope set is the judge-only case file `agents/evals/scope.evalset.json` (see Evals below); the injection and code-escape sets stay as flow evals. +- **Fixture cases**, each a directory with `case.json` (spec, library, bindings, expected `accepted`, `rejected` or `unknown`, tags, the perturbation and the source of the data, and optionally a session `language` that the harness chooses through the language route before the first turn; a promoted case carries its session's when that was detected or chosen), `data.csv`, and an optional `change_request.txt`. Two sources: the committed synthetic fixtures in `agents/evals/fixtures/cases/<id>/`, which are the spike-X matrix (10 specs times matplotlib and seaborn times 6 perturbation datasets) and the same specs and datasets for plotnine and altair (since 2026-10-25) and for pygal and lets-plot (since 2026-10-26; 360 generated cases, written by the seeded generator `agents/evals/make_fixtures.py`, of which the readiness scan blocks the 12 on the pygal files of `histogram-basic` and `line-timeseries`) plus seven hand-written cases (one of them, since 2026-10-12, a German follow-up message that sets the session language; four, since 2026-10-15, choose a language and cover label density and number formats) and the 23 stress cases of `agents/evals/make_stress.py` (tag `stress`, left out of `full`; see [Bounds](#bounds)), and the promoted feedback cases synced from the private bucket into the gitignored `agents/evals/.cases/` directory (never committed, because they hold users' data). The tag `smoke` marks the 16 cases of the smoke set (12 until 2026-10-25, when one plotnine and one altair case joined, and 14 until 2026-10-26, when one pygal and one lets-plot case joined). The scope set is the judge-only case file `agents/evals/scope.evalset.json` (see Evals below); the injection and code-escape sets stay as flow evals. - **Harness** (`agents/evals/matrix.py`, the spike-X runner made permanent): runs every case through the real `/v1` flow in-process (httpx `ASGITransport` against `agents.main:app`, the same plugins and run queue, the models from the settings, and the render backend `--renderer` names: `remote` against a deployed renderer, `local` in Docker, or `fake` for a dry run of everything but the render) with candidate settings that are passed only to the harness: `--provider` (alone it selects that provider's default models; the settings refuse a model from the other provider), `--model`, `--judge-model`, `--location`, `--cases smoke|full|stress|<glob>`, `--static` (only the model-free static stage of `agents/evals/stress.py`: parse, eligibility, bindings, loader, prompt sizes and the stand-in renders), `--repeats N`, `--budget-usd` (stop before a case that could take the estimated list-price cost past it), and `--gcloud-token` (mint the developer's renderer token with the gcloud CLI and renew it before its one-hour expiry). Before the first case it renders each library's catalogue file once through the configured backend, without a model call, and stops with exit code 2 when that fails; during the run a pipeline that ended in `RendererUnavailable` (the `error` class on its `pipeline_result` attribution line), or three errors in a row, stop it with exit code 4, so an outage never becomes a matrix of failed runs or a baseline. Per case it records the status and reason, attempts, gate failures by gate, validator rejections, edit-apply failures, the reviewer verdict, LLM calls, `model_version`, tokens (prompt, candidates, thoughts, cached, cache writes, the judge's input and output), cost at list price, the time to the first event, the end-to-end time and the render time, and, since report schema 2, the stage that stopped each attempt and the run (for example `adapter_truncated`, `edit_apply` or `reviewer_defects`, never a bare `validation`), the shipped and the last reviewed attempt, each attempt's adapter outcome, finish reason and plan shape, the edit-failure kinds, every model call's finish reason and tokens, the answers that failed their schema, by agent kind and outcome (`answer_outcomes`: `repaired` or `refused`) and by broken rule (`answer_rules`), the edits each tolerant matching tier applied (`edit_tolerant`), and the module labels of banned imports (`banned_imports`). It reads them from the stream and from the content-free attribution lines that the pipeline, the Budget plugin and the judges write per request id. It writes `<out>/<date>-<model>.json`, a Markdown summary, and a review gallery of 30 renders sampled at random from the runs that passed, with an accept and reject pair each and a JSON export, and prints a diff table against `agents/evals/baselines/<pinned-model>.json` (or `--baseline`) over the cases both reports hold: pass rate, accept-match rate (cases whose outcome matches the case's expected outcome), cost per successful plot, p50 and p95 latency, and every case that flipped. A run passes when it ships a render that passed every deterministic gate (no padded canvas, no ADAPTATION finding); every rate counts harness errors as runs that did not pass. The owner's judgement is the acceptance measure: to compare two arms, `python -m agents.evals.report blind` merges both reports into one gallery of the same cases with the arm hidden in a separate key file, and `report score` gives the acceptance per arm. The exit code is 1 when the pass rate on the shared cases drops below the baseline minus a tolerance (5 percentage points by default) or a run crashed in the harness, 2 for a setup error, 3 when the budget stopped the run, and 4 for an outage. - **Baselines.** `agents/evals/baselines/claude-haiku-5-5.json` is committed with the default model: the thinking run of 2026-10-11 on main at `e2e25ef61` (122 cases with one run each, root thinking 1,024 and adapter thinking 2,048, through the deployed renderer; 122 passed, 62 `ok`), which replaced the thinking-off rerun of spike X of 2026-10-10 (244 runs). `gemini-3.8-flash.json` follows with the Gemini arm, so the price and quality comparison is a diff between two reports. `--save-baseline` refuses a run that stopped early, holds promoted cases, or has a run that ended in an error. A model bump is a PR that changes the `AGENT_MODEL` default and adds the new baseline file; a unit test asserts that a baseline exists for the pinned model once any baseline is committed. The same mechanism covers judge-model bumps and ADK upgrades, because the ADK version is part of the report stamp. - **CI.** `.github/workflows/agents-eval.yml` has `workflow_dispatch` inputs `provider`, `model`, `judge_model`, `location`, `cases` (smoke or full) and `repeats`, and a nightly `smoke` run on the pinned model. It authenticates through Workload Identity Federation, sets `GOOGLE_CLOUD_LOCATION=eu`, uploads the report as an artifact and writes the diff table into the job summary. It mirrors the candidate-versus-baseline pattern of `review-retest.yml` (see [Review retest](../workflows/review-retest.md)). A lifecycle probe in the nightly run calls `models.get` on the pinned model and fails loudly on a 404 or a retirement notice, so a forced bump of the pinned model, or of the Gemini arm's short-term 3.8 Flash tier, is noticed before users are. -- **Cost.** A full run is 127 cases (123 until 2026-10-15) times at most 2 attempts. Measured on 2026-10-10 at list price for the full matrix: $0.52 on the Claude Haiku 5.5 arm ($0.0051 per passed plot, median $0.0041, 4.77 model calls per run) and $15.89 on the Gemini 3.8 Flash arm ($0.169 per passed plot, median $0.124, 4.80 model calls per run, $3.99 of it on failed runs); `smoke` (12 cases) is about a tenth of a full run. Both fit inside the spend cap. +- **Cost.** A full run is 367 cases (123 until 2026-10-15, 127 until 2026-10-25 and 247 until 2026-10-26) times at most 2 attempts. Measured on 2026-10-10 at list price for the full matrix of that day: $0.52 on the Claude Haiku 5.5 arm ($0.0051 per passed plot, median $0.0041, 4.77 model calls per run) and $15.89 on the Gemini 3.8 Flash arm ($0.169 per passed plot, median $0.124, 4.80 model calls per run, $3.99 of it on failed runs); both fit inside the spend cap, and `smoke` (12 cases) was about a tenth of that run. Today's full run holds about three times as many cases, and the smoke set's 16 are about 4 % of them. ## Serving and infrastructure @@ -470,7 +478,7 @@ tests/unit/agents/* tests/unit/api/test_agent_router.py tests/integration/agen `agents/anyplot/code/` exists since 2026-10-09: `validate.py` (the two-profile AST validator), `regions.py` (the AST spans of the THEME block, the Imprint palette, the placeholder, the save calls and the canvas keywords, shared by the other modules; since 2026-10-25 also the save rule per library, `SAVE_RULES`), `normalise.py`, `readiness.py`, `edits.py`, `loader.py` and `export.py`, with tests in `tests/unit/agents/code/`. Their docstrings hold the exact rules. The 13 map specs are the specs tagged both `plot_type: map` and `data_type: geospatial`. `readiness.scan` takes the spec id as a keyword argument, because the map rule needs it and the normalised code no longer carries the catalogue header. -Files to modify: `pyproject.toml` (the extra `agents = ["google-adk==2.11.0"]`; the `agents-eval` extra with `google-adk[eval]` was dropped on 2026-10-12, unused, because its litellm and nltk carried security alerts; setuptools include `agents*`; ruff `known-first-party`; coverage source; regenerate `uv.lock` and run `uv lock --check`; assert that the lock never contains `openai-agents`, which also installs a top-level `agents` module), `.dockerignore` (`!agents`, `!prompts/default-style-guide.md`, `!prompts/library`), `core/config.py` (`agent_*` settings with the pinned defaults, `_strip_secret` entries), `api/routers/debug.py`, `api/main.py`, `api/cloudbuild.yaml` (env vars, secret binding, 401 smoke), `automation/scripts/regen_gate.py` (switch to `core/defects.py`, loaded from a sibling copy in script mode, together with its copy sites), `.github/workflows/{ci-tests,ci-lint,ci-image}.yml`, a new `.github/workflows/agents-eval.yml`, `app/src/routes/{index.tsx,paths.ts}`, `global-config.ts`, `vite-env.d.ts`, `SpecPage.tsx`, `SpecDetailView.tsx`, `DebugPage.tsx`, `app/Dockerfile`, `app/cloudbuild.yaml`, `docs/index.md`, `docs/reference/{api,plausible,mcp,repository,database}.md`, `docs/development.md`, `CLAUDE.md` and `.github/copilot-instructions.md` (an `agents/**` routing row, kept in sync), and one `changelog.d/<slug>.md` per PR. `agents/Dockerfile` builds from `python:3.13-slim` with `uv sync --frozen --extra agents`, runs as a non-root user and starts `uvicorn agents.main:app --port 8080`; its `agents/` copy must include `agents/anyplot/render/fonts/`, because the service loads the footer-strip fonts at start and refuses to start without them, and it copies the catalogue prompt sources `agents/anyplot/policy.py` reads (`prompts/default-style-guide.md`, `prompts/library/`, `prompts/quality-criteria.md` and the two workflow prompts `impl-repair-claude.md` and `ai-quality-review.md`) to their repository paths; `tests/unit/agents/test_image.py` holds that list against every file an import of `agents.main` opens and against the root `.dockerignore`; the plotting extras, the fallback fonts (`/usr/share/fonts/noto`, from a `fonts` build stage that keeps only the allowlisted files of `fonts-noto-core` and `fonts-noto-cjk`) and the baked matplotlib font cache (`/opt/mplconfig`, whose bake fails when a fallback family is missing) belong to the renderer image, `agents/renderer/Dockerfile`, which installs `--extra lib-matplotlib --extra lib-seaborn` and, since 2026-10-25, `--extra lib-plotnine --extra lib-altair` without ADK, links matplotlib's DejaVu Serif and DejaVu Sans Mono into `/usr/share/fonts` for vl-convert's `serif` and `monospace` (altair files that name those families draw no text without them), and copies the harness to `/opt/anyplot/harness.py`. The `deploy-renderer` trigger (an owner task) fires on `agents/renderer/**`, `agents/anyplot/render/harness.py`, `pyproject.toml` and `uv.lock`. The `deploy-agents` trigger (an owner task) fires on `agents/**` except `agents/evals/**`, `core/**`, `prompts/library/**`, `prompts/default-style-guide.md`, `prompts/quality-criteria.md`, `prompts/workflow-prompts/impl-repair-claude.md`, `prompts/workflow-prompts/ai-quality-review.md`, `pyproject.toml`, `uv.lock`, `README.md` and `.dockerignore`, so an edit to any prompt source the service sends to the model redeploys it. +Files to modify: `pyproject.toml` (the extra `agents = ["google-adk==2.11.0"]`; the `agents-eval` extra with `google-adk[eval]` was dropped on 2026-10-12, unused, because its litellm and nltk carried security alerts; setuptools include `agents*`; ruff `known-first-party`; coverage source; regenerate `uv.lock` and run `uv lock --check`; assert that the lock never contains `openai-agents`, which also installs a top-level `agents` module), `.dockerignore` (`!agents`, `!prompts/default-style-guide.md`, `!prompts/library`), `core/config.py` (`agent_*` settings with the pinned defaults, `_strip_secret` entries), `api/routers/debug.py`, `api/main.py`, `api/cloudbuild.yaml` (env vars, secret binding, 401 smoke), `automation/scripts/regen_gate.py` (switch to `core/defects.py`, loaded from a sibling copy in script mode, together with its copy sites), `.github/workflows/{ci-tests,ci-lint,ci-image}.yml`, a new `.github/workflows/agents-eval.yml`, `app/src/routes/{index.tsx,paths.ts}`, `global-config.ts`, `vite-env.d.ts`, `SpecPage.tsx`, `SpecDetailView.tsx`, `DebugPage.tsx`, `app/Dockerfile`, `app/cloudbuild.yaml`, `docs/index.md`, `docs/reference/{api,plausible,mcp,repository,database}.md`, `docs/development.md`, `CLAUDE.md` and `.github/copilot-instructions.md` (an `agents/**` routing row, kept in sync), and one `changelog.d/<slug>.md` per PR. `agents/Dockerfile` builds from `python:3.13-slim` with `uv sync --frozen --extra agents`, runs as a non-root user and starts `uvicorn agents.main:app --port 8080`; its `agents/` copy must include `agents/anyplot/render/fonts/`, because the service loads the footer-strip fonts at start and refuses to start without them, and it copies the catalogue prompt sources `agents/anyplot/policy.py` reads (`prompts/default-style-guide.md`, `prompts/library/`, `prompts/quality-criteria.md` and the two workflow prompts `impl-repair-claude.md` and `ai-quality-review.md`) to their repository paths; `tests/unit/agents/test_image.py` holds that list against every file an import of `agents.main` opens and against the root `.dockerignore`; the plotting extras, the fallback fonts (`/usr/share/fonts/noto`, from a `fonts` build stage that keeps only the allowlisted files of `fonts-noto-core` and `fonts-noto-cjk`) and the baked matplotlib font cache (`/opt/mplconfig`, whose bake fails when a fallback family is missing) belong to the renderer image, `agents/renderer/Dockerfile`, which installs `--extra lib-matplotlib --extra lib-seaborn`, since 2026-10-25 `--extra lib-plotnine --extra lib-altair` and since 2026-10-26 `--extra lib-pygal --extra lib-letsplot`, all without ADK. It links matplotlib's DejaVu Serif and DejaVu Sans Mono into `/usr/share/fonts` for vl-convert's `serif` and `monospace` (altair files that name those families draw no text without them) and, since 2026-10-26, DejaVu Sans next to them, which lets-plot's bridge draws its default text in (it falls back to a Noto Sans face without it). Since 2026-10-26 it also installs Debian's `libcairo2` for cairosvg, which brings `libfontconfig1`, `/etc/fonts/fonts.conf` and Debian's DejaVu core fonts (other bytes under the same names; matplotlib keeps resolving its own copies, and the seaborn, plotnine and altair renders of `ci-image.yml` stayed byte-identical), and copies `agents/renderer/fonts.conf` (one font directory, no cache directory) to `/opt/anyplot/fonts.conf` for lets-plot's row. The ImageMagick linked into lets-plot's bridge is a zero-configuration build that reads no `policy.xml`, so the image installs none of the programs its delegates run (`gs`, `curl`, `soffice`, `ffmpeg` and others), and a `ci-image.yml` step fails when any of 39 such programs is on the sandbox's `PATH` (since 2026-10-26). It copies the harness to `/opt/anyplot/harness.py`. The `deploy-renderer` trigger (an owner task) fires on `agents/renderer/**`, `agents/anyplot/render/harness.py`, `pyproject.toml` and `uv.lock`. The `deploy-agents` trigger (an owner task) fires on `agents/**` except `agents/evals/**`, `core/**`, `prompts/library/**`, `prompts/default-style-guide.md`, `prompts/quality-criteria.md`, `prompts/workflow-prompts/impl-repair-claude.md`, `prompts/workflow-prompts/ai-quality-review.md`, `pyproject.toml`, `uv.lock`, `README.md` and `.dockerignore`, so an edit to any prompt source the service sends to the model redeploys it. Reused code: the `api/mcp/server.py` tool bodies move into `core/catalogue/queries.py`; `core/database/repositories.py` (`SpecRepository.get_by_id_with_code`, `ImplRepository.get_code`); `core/utils.strip_noqa_comments`; `core/constants.py` (`LIBRARIES_METADATA`, `LIBRARY_LANGUAGES`, `INTERACTIVE_LIBRARIES`); `core/palette.py`; the defect grammar through `core/defects.py` and the canvas gate and PNG auto-reject checks through `core/canvas.py`; the render invocation shape of `agentic/workflows/modules/regen/render.py` (copied, not imported); `automation/js-render/render.mjs` for the JS runtime later; the per-IP-hash rate-limit pattern of `api/routers/feedback.py` and `api/request_context.client_ip` for the public phase. @@ -485,7 +493,7 @@ Owner tasks 1 to 6 come first. Then run the spikes: | M | One call on `eu` and `global` for both arms: `claude-haiku-5-5` through the Anthropic Vertex SDK and gemini-3.8-flash plus gemini-3.5-flash-lite through google-genai (and, for the record, the alias); the reported model version and usage; free `countTokens` on the adapter and reviewer prefixes | Recorded; under $0.01 (done on 2026-10-09: both arms answer on `eu`) | | S | A Cloud Run sandbox in europe-west4: the deploy works; matplotlib and seaborn render with egress blocked; a blocked fetch fails fast; RSS and time at 2 and 4 vCPU; concurrent sandboxes before OOM; cold start; whether the IAM-forwarded ID-token claims are visible to the container and in what signature state; a probe suite (metadata server, DNS and HTTP egress, `/proc/1/environ`, writes outside `/work`, sudo, fork and memory bombs). Run `gcloud components update` first, because the local SDK 534 lacks the flag; ideally in a throwaway project | Everything blocked or contained | | G | Can a sandbox read sibling run directories or files the host writes at runtime? | No; otherwise use `--rootfs` with a toolchain-only tree or one render per instance | -| X | Adaptation: 10 specs times matplotlib and seaborn times 6 datasets (renamed, x10, n=12, n=5000, date, decimal comma; the cases are in `agents/evals/fixtures/cases/` and run with `agents/evals/matrix.py`, see `agents/README.md`) on both arms, `claude-haiku-5-5` and gemini-3.8-flash, so the owner picks the phase-1 default by cost and acceptance; plotly only on figure-level gates because the phase-1 image has no Chrome. Pass means all deterministic gates plus an owner blind accept or reject on a sample of 30 renders (`python -m agents.evals.report blind` shows both arms' renders of the same cases without naming the arm). Also reports post-normaliser eligibility under the SECURITY profile and the files blocked for a missing `THEME` block or a non-literal save target (`agents/evals/eligibility.py`, no model call; since 2026-10-25 it sweeps plotnine and altair too) | Under $25 | +| X | Adaptation: 10 specs times matplotlib and seaborn times 6 datasets (renamed, x10, n=12, n=5000, date, decimal comma; the cases are in `agents/evals/fixtures/cases/` and run with `agents/evals/matrix.py`, see `agents/README.md`) on both arms, `claude-haiku-5-5` and gemini-3.8-flash, so the owner picks the phase-1 default by cost and acceptance; plotly only on figure-level gates because the phase-1 image has no Chrome. Pass means all deterministic gates plus an owner blind accept or reject on a sample of 30 renders (`python -m agents.evals.report blind` shows both arms' renders of the same cases without naming the arm). Also reports post-normaliser eligibility under the SECURITY profile and the files blocked for a missing `THEME` block or a non-literal save target (`agents/evals/eligibility.py`, no model call; it sweeps plotnine and altair too since 2026-10-25, and pygal and lets-plot since 2026-10-26) | Under $25 | | C | Does a NodeTool `Event(message)` arrive before the function response under `StreamingMode.NONE`? | Yes | | F | Does a plugin's `on_tool_error` catch a `ValueError`? Is the content returned when `before_run` halts emitted? | Both observed | | A′ | Does the reviewer read a canary string from callback-injected images on a single-turn agent with `include_contents='none'` while its structured output still applies (the native `response_schema` on Gemini, the `output_config.format` on Claude)? | Exact match; fallback is a `view_render` tool returning Parts, which reintroduces the Preview multimodal-function-response path | @@ -521,7 +529,7 @@ The pipeline owns this workstream, not the agent network: it makes catalogue cod ### Phase 2: toward public use, all 15 libraries and discovery -Libraries, each one `RuntimeAdapter` enabled through `AGENT_LIBRARIES` after its eval matrix reaches 80 %: first plotnine and altair (their runtimes built on 2026-10-25, step 1b of [the phase-2 plan](../../agentic/specs/261024-agent-all-libraries.md); both stay off until the owner's matrix run passes), then lets-plot and pygal (no browser); then plotly and bokeh (Chromium fixes); then JS through `render.mjs` with `window.ANYPLOT_DATA`, a `page.route` deny-all and a tree-sitter deny-list; then R (ragg and a readr loader); then Julia (a precompiled depot, a pinned `JULIA_CPU_TARGET`, and asynchronous submit-and-poll if renders exceed 60 s; Cloud Run jobs and worker pools also support sandboxes). Discovery follows the phase-2 flow above. +Libraries, each one `RuntimeAdapter` enabled through `AGENT_LIBRARIES` after its eval matrix reaches 80 %: first plotnine and altair (their runtimes built on 2026-10-25, step 1b of [the phase-2 plan](../../agentic/specs/261024-agent-all-libraries.md)), then lets-plot and pygal (no browser; their runtimes built on 2026-10-26, step 1c), all four off until the owner's matrix run for each passes; then plotly and bokeh (Chromium fixes); then JS through `render.mjs` with `window.ANYPLOT_DATA`, a `page.route` deny-all and a tree-sitter deny-list; then R (ragg and a readr loader); then Julia (a precompiled depot, a pinned `JULIA_CPU_TARGET`, and asynchronous submit-and-poll if renders exceed 60 s; Cloud Run jobs and worker pools also support sandboxes). Discovery follows the phase-2 flow above. Hard gates before any non-owner use: the legal-page PR (`LegalPage.tsx` plus a pinned test per store), anyplot-api on a dedicated service account, database sessions with a purge, GCS artifacts with a lifecycle, persisted budget counters, Model Armor and `ToolCallIntegrityPlugin`, Turnstile with server-side verification plus a Cloudflare rate rule plus per-IP-hash database quotas plus a signed anonymous identity, routes moved out of `/debug`, and owner decisions on the Vertex 24 h cache and the abuse-logging exception. @@ -533,7 +541,7 @@ Hard gates before any non-owner use: the legal-page PR (`LegalPage.tsx` plus a p - **Run locally.** ```bash - uv sync --extra agents --extra lib-matplotlib --extra lib-seaborn --extra lib-plotnine --extra lib-altair --extra test + uv sync --extra agents --extra lib-matplotlib --extra lib-seaborn --extra lib-plotnine --extra lib-altair --extra lib-pygal --extra lib-letsplot --extra test gcloud auth application-default login export ENVIRONMENT=development GOOGLE_GENAI_USE_ENTERPRISE=TRUE GOOGLE_CLOUD_PROJECT=anyplot GOOGLE_CLOUD_LOCATION=eu \ AGENT_LOCATION=eu AGENT_PROVIDER=anthropic-vertex AGENT_MODEL=claude-haiku-5-5 \ diff --git a/tests/unit/agents/code/test_normalise.py b/tests/unit/agents/code/test_normalise.py index 25754ecd1f1..d507662207b 100644 --- a/tests/unit/agents/code/test_normalise.py +++ b/tests/unit/agents/code/test_normalise.py @@ -722,6 +722,65 @@ def test_pygal_feeder_with_a_save_call_stays() -> None: assert "png = chart.render_to_png()" in result and "open(" not in result +def test_pygal_html_page_that_assigns_inside_its_block_goes() -> None: + """heatmap-basic renders the chart into a name inside the `with` and writes a page around it.""" + code = pygal_code(""" + chart = pygal.XY(width=3200, height=1800) + chart.render_to_png(f"plot-{THEME}.png") + with open(f"plot-{THEME}.html", "w", encoding="utf-8") as fout: + pygal_svg = chart.render(is_unicode=True) + fout.write(f"<html><body>{pygal_svg}</body></html>") + """) + report = normalise_report(code, library="pygal") + + assert report.code.endswith('chart.render_to_png(f"plot-{THEME}.png")\n') + assert report.changes == ("removed the HTML write through open() at lines 11-13",) + assert norm(code, "pygal") == report.code + + +@pytest.mark.parametrize( + "block", + [ + # the name is read after the block + 'with open(f"plot-{THEME}.html", "w") as f:\n page = "<html/>"\n f.write(page)\nprint(page)', + # the assignment holds a save call + 'with open(f"plot-{THEME}.html", "w") as f:\n png = chart.render_to_png()\n f.write(str(png))', + # a tuple target, and a statement that is neither a write nor an assignment + 'with open(f"plot-{THEME}.html", "w") as f:\n a, b = "<", ">"\n f.write(a + b)', + 'with open(f"plot-{THEME}.html", "w") as f:\n print("page")\n f.write("<html/>")', + # nothing written + 'with open(f"plot-{THEME}.html", "w") as f:\n page = "<html/>"', + ], +) +def test_pygal_html_block_that_does_more_stays(block: str) -> None: + code = pygal_code('chart = pygal.XY(width=3200, height=1800)\nchart.render_to_png(f"plot-{THEME}.png")\n') + ( + block + "\n" + ) + assert norm(code, "pygal") == code + + +def test_pygal_html_step_repeats_once_a_removed_feeder_frees_a_target() -> None: + """A hand-built page's target is named again in a feeder of the SVG write; once that goes, the page goes too.""" + code = pygal_code(""" + chart = pygal.XY(width=3200, height=1800) + chart.render_to_png(f"plot-{THEME}.png") + link = f"plot-{THEME}.html" + with open(f"plot-{THEME}.svg", "w") as f: + f.write(link) + with open(f"plot-{THEME}.html", "w") as f: + f.write("<html/>") + """) + report = normalise_report(code, library="pygal") + + assert report.code.endswith('chart.render_to_png(f"plot-{THEME}.png")\n') + assert report.changes == ( + "removed the SVG write through open() at lines 12-13", + "removed link, which only fed a removed write, at line 11", + "removed the HTML write through open() at lines 11-12", + ) + assert report.notes == () # the first pass's "named again" note is gone with the name + + def test_html_writes_stay_for_the_other_libraries() -> None: code = THEME_BLOCK + 'with open(f"plot-{THEME}.html", "w") as f:\n f.write(chart.render(is_unicode=True))\n' assert norm(code) == code @@ -829,8 +888,9 @@ def test_pygal_from_import_of_svg2png_is_used() -> None: ("body", "note", "pixels"), [ ( - 'chart = pygal.XY(width=size, height=size)\nchart.render_to_png(f"plot-{THEME}.png")', - "canvas: the chart's width= at line 10 is not a positive numeric literal; the PNG size is left as it is", + 'chart = pygal.XY(width=size * 2, height=size)\nchart.render_to_png(f"plot-{THEME}.png")', + "canvas: the chart's width= at line 10 is not a positive number or a module-level name bound once to " + "one; the PNG size is left as it is", None, ), ( @@ -848,7 +908,53 @@ def test_pygal_from_import_of_svg2png_is_used() -> None: ( "a = pygal.XY(width=4800, height=2700)\nb = pygal.Bar(width=4800, height=2700)\n" 'cairosvg.svg2png(bytestring=merge(a, b), write_to=f"plot-{THEME}.png")', - "canvas: 2 pygal charts in the file, none traced from the save at line 12; the PNG size is left as it is", + "canvas: no pygal chart traced from the save at line 12 (the file has 2); the PNG size is left as it is", + None, + ), + ( + 'cairosvg.svg2png(bytestring=build(size).encode(), write_to=f"plot-{THEME}.png")', + "canvas: no pygal chart traced from the save at line 10; the PNG size is left as it is", + None, + ), + # sizes pygal reads at render, after the constructor: never its 800x600 then + ( + 'chart = pygal.Bar()\nchart.width = 4800\nchart.height = 2700\nchart.render_to_png(f"plot-{THEME}.png")', + "canvas: chart.width at line 11 sets the chart's size after its constructor; the PNG size is left as it is", + None, + ), + ( + 'chart = pygal.Bar()\nc = chart\nc.config.height = 2700\nchart.render_to_png(f"plot-{THEME}.png")', + "canvas: c.config.height at line 12 sets the chart's size after its constructor; the PNG size is left as " + "it is", + None, + ), + ( + 'chart = pygal.Bar()\nchart.config(width=4800, height=2700)\nchart.render_to_png(f"plot-{THEME}.png")', + "canvas: chart.config(...) at line 11 may set the chart's size after its constructor; the PNG size is " + "left as it is", + None, + ), + ( + 'cfg = pygal.Config()\nchart = pygal.Bar(config=cfg)\nchart.render_to_png(f"plot-{THEME}.png")', + "canvas: the chart at line 11 takes a pygal.Config, which may set its size; the PNG size is left as it is", + None, + ), + ( + 'chart = pygal.Bar(pygal.Config)\nchart.render_to_png(f"plot-{THEME}.png")', + "canvas: the chart at line 10 takes positional arguments (a pygal.Config) or **kwargs; the PNG size is " + "left as it is", + None, + ), + ( + "chart = pygal.Bar()\n" + 'cairosvg.svg2png(bytestring=chart.render(width=size, height=2700), write_to=f"plot-{THEME}.png")', + "canvas: the render at line 11 takes keywords that may set the chart's size; the PNG size is left as it is", + None, + ), + # a save that writes no PNG: the readiness scan blocks it, the canvas step leaves it alone + ( + 'chart = pygal.Bar(width=4800, height=2700)\nchart.render_to_file(f"plot-{THEME}.png")', + "canvas: the render_to_file at line 11 writes no PNG; nothing to normalise", None, ), ], @@ -869,6 +975,141 @@ def test_pygal_canvas_already_on_target_is_kept() -> None: assert measure_canvas(code, library="pygal").pixels == LANDSCAPE +@pytest.mark.parametrize( + ("build", "size", "line", "target"), + [ + # dendrogram-radial: implicitly joined f-strings and the module constants they interpolate + ( + """ + W, H = 4800, 2700 + svg = ( + '<?xml version="1.0" encoding="utf-8"?>\\n' + f'<svg xmlns="http://www.w3.org/2000/svg" width="{W}" height="{H}">\\n' + f'<rect width="{W}" height="{H}" fill="{PAGE_BG}"/>\\n' + "\\n".join(elems) + "</svg>" + ) + """, + "4800x2700", + 14, + LANDSCAPE, + ), + # histogram-2d: the root tag in a list the file appends to and joins + ( + """ + svg_parts = [] + svg_parts.append('<svg width="4800" height="2700" viewBox="0 0 4800 2700">') + for elem in elems: + svg_parts.append(f'<g width="{elem}"/>') + svg_parts.append("</svg>") + svg = "\\n".join(svg_parts) + """, + "4800x2700", + 13, + LANDSCAPE, + ), + # ternary-density: one triple-quoted f-string, px units and another name for the size + ( + ''' + chart_width = 3600 + chart_height = 3600 + title_svg = f'<text x="{chart_width / 2}">t</text>' + svg = f"""<svg xmlns="http://www.w3.org/2000/svg" width="{chart_width}px" height="{chart_height}px"> + {title_svg} + </svg>""" + ''', + "3600x3600", + 15, + SQUARE, + ), + ], +) +def test_pygal_hand_built_svg_renders_the_canvas(build: str, size: str, line: int, target: tuple[int, int]) -> None: + """Four catalogue files draw their own SVG at 4800x2700 or 3600x3600 and convert it with svg2png.""" + code = pygal_code( + "import cairosvg\n\nelems = []\n" + + source(build) + + 'cairosvg.svg2png(bytestring=svg.encode("utf-8"), write_to=f"plot-{THEME}.png")\n' + ) + report = normalise_report(code, library="pygal") + + width, height = target + assert report.code.endswith( + f'cairosvg.svg2png(bytestring=svg.encode("utf-8"), write_to=f"plot-{{THEME}}.png", output_width={width}, ' + f"output_height={height})\n" + ) + assert report.changes == ( + f"canvas: hand-built SVG {size} (the <svg> root at line {line}) renders {size}; the save renders " + f"{width}x{height} through cairosvg.svg2png(output_width={width}, output_height={height})", + ) + before = measure_canvas(code, library="pygal") + assert before.pixels == tuple(int(side) for side in size.split("x")) + assert (before.note or "").startswith(f"pygal renders {size} (the <svg> root at line {line}), target ") + assert measure_canvas(report.code, library="pygal").pixels == target + assert norm(code, "pygal") == report.code + + +@pytest.mark.parametrize( + ("build", "note"), + [ + ( + 'svg = f\'<svg width="{W * 2}" height="2700"></svg>\'', + "the <svg> root at line 12 has no width= of a number or a module-level name bound once to one", + ), + ( + 'W = 3200\nsvg = f\'<svg width="{W}" height="1800"></svg>\'', # W is bound twice + "the <svg> root at line 13 has no width= of a number or a module-level name bound once to one", + ), + ( + 'svg = \'<svg width="4800" height="100%"></svg>\'', + "the <svg> root at line 12 has no height= of a number or a module-level name bound once to one", + ), + ( + 'inner = \'<svg width="800" height="600"/>\'\nsvg = \'<svg width="4800" height="2700">\' + inner', + "no pygal chart traced from the save at line 14, and 2 <svg> tags at line 12, 13", + ), + ], +) +def test_pygal_hand_built_svg_of_unknown_size_is_left_alone(build: str, note: str) -> None: + code = pygal_code("import cairosvg\n\nW = 4800\n" + build + "\n") + ( + 'cairosvg.svg2png(bytestring=svg.encode(), write_to=f"plot-{THEME}.png")\n' + ) + report = normalise_report(code, library="pygal") + + assert report.code == code + assert f"canvas: {note}; the PNG size is left as it is" in report.notes, report.notes + canvas = measure_canvas(code, library="pygal") + assert canvas.pixels is None and canvas.note == f"pygal canvas unknown: {note}" + + +def test_pygal_output_size_names_are_read() -> None: + """chord-basic and ecg-twelve-lead size the PNG through module constants; `W = H = 2400` binds both once.""" + code = pygal_code(""" + import cairosvg + + W = H = 2400 + chart = pygal.XY(width=W, height=H) + cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png", output_width=W, output_height=H) + """) + assert measure_canvas(code, library="pygal").pixels == SQUARE + assert norm(code, "pygal") == code + + +def test_pygal_import_below_the_save_is_not_used() -> None: + """An `import cairosvg` after the save would come too late for the rewritten save; one goes into the imports.""" + code = pygal_code(""" + chart = pygal.Bar(width=4800, height=2700) + chart.render_to_png(f"plot-{THEME}.png") + import cairosvg + """) + result = norm(code, "pygal") + lines = result.splitlines() + + assert lines.index("import cairosvg") < next(i for i, line in enumerate(lines) if "cairosvg.svg2png(" in line) + assert result.endswith( + 'cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.png", output_width=3200, ' + "output_height=1800)\nimport cairosvg\n" + ) + + # --- lets-plot ----------------------------------------------------------------------------- @@ -1008,12 +1249,26 @@ def styled(plot): ), ( "from lets_plot import *\nplot = ggplot() + theme(legend_position='top')\ntheme = None\n", - "star import: theme is read before the file binds it; the star import at line 1 stays", + "star import: theme may be read before the file binds it; the star import at line 1 stays", + ), + # the statement reads the name before it binds it + ( + "from lets_plot import *\nlabs = labs(title='t')\nplot = ggplot() + labs\n", + "star import: labs may be read before the file binds it; the star import at line 1 stays", + ), + # bound only when the condition holds: without the star import the read would raise NameError + ( + "import os\nfrom lets_plot import *\nif os.getenv('X'):\n labs = None\nplot = labs(title='t')\n", + "star import: labs may be read before the file binds it; the star import at line 2 stays", ), ( "try:\n from lets_plot import *\nexcept ImportError:\n pass\n", "star import: it is not a module-level statement; the star import at line 2 stays", ), + ( + "from lets_plot import *; plot = ggplot()\n", + "star import: it shares its line with other code; the star import at line 1 stays", + ), ], ) def test_letsplot_star_import_refusals_keep_it_with_a_note(code: str, note: str) -> None: @@ -1023,6 +1278,31 @@ def test_letsplot_star_import_refusals_keep_it_with_a_note(code: str, note: str) assert note in report.notes, report.notes +def test_letsplot_star_import_names_bound_where_they_are_read() -> None: + """column-stratigraphic binds `margin` (a lets-plot name) in a loop and reads it there; a `with` body always + runs.""" + code = source(""" + import os + + from lets_plot import * + + THEME = os.getenv("ANYPLOT_THEME", "light") + for row in range(2): + margin = 0.03 + print(row + margin) + with open(os.devnull) as handle: + labs = handle.name + plot = ggplot() + geom_point(size=len(labs)) + scale_x_log10() + scale_x_log2() + plot += GGBunch() + LetsPlot.setup_html() + """) + result = norm(code, "letsplot") + + assert result.startswith( + "import os\n\nfrom lets_plot import (\n GGBunch,\n LetsPlot,\n geom_point,\n ggplot,\n" + " scale_x_log2,\n scale_x_log10,\n)\n" + ) # ruff's order-by-type: classes first, then natural order + + def test_letsplot_unused_star_import_goes() -> None: code = 'import os\nfrom lets_plot import *\n\nTHEME = os.getenv("ANYPLOT_THEME", "light")\n' report = normalise_report(code, library="letsplot") @@ -1169,6 +1449,16 @@ def test_letsplot_returned_path_becomes_the_save() -> None: assert measure_canvas(report.code, library="letsplot").pixels == LANDSCAPE +def test_letsplot_every_returned_path_of_a_name_becomes_the_save() -> None: + """A name bound to two ggsave returns: one pass unwraps both, so a second pass changes nothing.""" + saves = 'png_path = ggsave(plot, f"plot-{THEME}.png", path=".", scale=2)\nshutil.move(png_path, "out.png")\n' + code = "import shutil\n" + LETSPLOT_HEAD + "plot = ggplot(df) + geom_point() + ggsize(1600, 900)\n" + saves * 2 + result = norm(code, "letsplot") + + assert "png_path" not in result and "shutil" not in result + assert result.count('ggsave(plot, f"plot-{THEME}.png", path=".", scale=2)\n') == 2 + + def test_letsplot_statement_that_does_more_than_move_stays_with_a_note() -> None: code = LETSPLOT_HEAD + source(""" lp_dir = "lets-plot-images" @@ -1193,8 +1483,11 @@ def test_letsplot_statement_that_does_more_than_move_stays_with_a_note() -> None ("ggsize(900, 900)", "scale=3", "scale=2.667", SQUARE), ("ggsize(800, 450)", "", ", scale=4", LANDSCAPE), # lets-plot's default scale is 2 ("ggsize(800, 450)", "dpi=150", "dpi=150, scale=2.56", LANDSCAPE), # dpi= scales by dpi / 96 - ("ggsize(1600, 900)", "w=16, h=9, unit='in', dpi=100", "dpi=100, scale=2", LANDSCAPE), - ("ggsize(1600, 960)", "scale=3", "scale=1.874", (2998, 1799)), # tier 2: inside the canvas, under R2's cap + # w= and h= in px; in a physical unit lets-plot can render one pixel short of the model + ("ggsize(1600, 900)", "w=1600, h=900, unit='px'", "unit='px', scale=2", LANDSCAPE), + # tier 2: inside the canvas, under R2's cap; the exact fit is as short as the decimal below it + ("ggsize(1600, 960)", "scale=3", "scale=1.875", (3000, 1800)), + ("ggsize(1600, 970)", "scale=3", "scale=1.855", (2968, 1799)), # the fit 1.85567... is longer ], ) def test_letsplot_canvas_changes_only_the_scale(plot: str, save: str, scale: str, pixels: tuple[int, int]) -> None: diff --git a/tests/unit/agents/code/test_readiness.py b/tests/unit/agents/code/test_readiness.py index 072cb4fcd03..5a6803860d4 100644 --- a/tests/unit/agents/code/test_readiness.py +++ b/tests/unit/agents/code/test_readiness.py @@ -212,11 +212,12 @@ def test_normalised_file_is_clean_and_on_the_canvas(self, code: str, library: st @pytest.mark.parametrize( ("code", "library", "reason"), [ + # an unknown size can land over R2's pixel cap: no padding is promised ( PYGAL.replace("width=4800, height=2700", "width=W, height=H"), "pygal", - "canvas: pygal canvas unknown: the chart's width= at line 9 is not a positive numeric literal; the " - "render relies on the R3 canvas gate and padding", + "canvas: pygal canvas unknown: the chart's width= at line 9 is not a positive number or a module-level " + "name bound once to one; the PNG size shows only in the render, and R2 refuses one over its pixel cap", ), ( LETSPLOT.replace("ggsize(1600, 900)", "ggsize(800, 853)"), @@ -224,6 +225,13 @@ def test_normalised_file_is_clean_and_on_the_canvas(self, code: str, library: st "canvas: lets-plot renders 2400x2559 from 800x853 (ggsize at line 16) at scale 3, target 2400x2400; the " "render relies on the R3 canvas gate and padding", ), + # a known size over the cap: R2 refuses it before R3 sees it + ( + PYGAL.replace("width=4800, height=2700", "width=4800, height=3000"), + "pygal", + "canvas: pygal renders 4800x3000 (the saved chart at line 9), target 3200x1800; R2 refuses a PNG over " + "its pixel cap", + ), ], ) def test_a_canvas_the_normaliser_cannot_set_is_a_note(self, code: str, library: str, reason: str) -> None: @@ -231,6 +239,47 @@ def test_a_canvas_the_normaliser_cannot_set_is_a_note(self, code: str, library: assert result.status == "clean" and result.reasons == [reason] + def test_a_hand_built_svg_gets_the_canvas(self) -> None: + """dendrogram-radial and three more pygal files draw their SVG at 4800x2700 or 3600x3600 by hand.""" + code = source(""" + import os + + import cairosvg + + THEME = os.getenv("ANYPLOT_THEME", "light") + PAGE_BG = "#FAF8F1" if THEME == "light" else "#1A1A17" + df = load_user_data() + W, H = 4800, 2700 + svg = f'<svg xmlns="http://www.w3.org/2000/svg" width="{W}" height="{H}"><rect fill="{PAGE_BG}"/></svg>' + cairosvg.svg2png(bytestring=svg.encode(), write_to=f"plot-{THEME}.png") + """) + before = scan(code, spec_id="scatter-basic", library="pygal", enabled_libraries=SIX_ENABLED) + + assert before.reasons == [ + "canvas: pygal renders 4800x2700 (the <svg> root at line 9), target 3200x1800; R2 refuses a PNG over its " + "pixel cap" + ] + assert scan_normalised(code, "pygal") == Readiness("clean", [], []) + + @pytest.mark.parametrize( + ("save", "reason"), + [ + ( + 'chart.render_to_file(f"plot-{THEME}.png")', # SVG text in the PNG + "savefig-target: render_to_file writes only .html files, not f'plot-{THEME}.png' at line 11", + ), + ( + 'chart.render_to_png(f"plot-{THEME}.html")', # a PNG in the HTML + "savefig-target: render_to_png writes only .png files, not f'plot-{THEME}.html' at line 11", + ), + ], + ) + def test_a_save_name_that_writes_another_kind_of_file_is_blocked(self, save: str, reason: str) -> None: + code = PYGAL.replace('chart.render_to_png(f"plot-{THEME}.png")', save) + result = scan_normalised(code, "pygal") + + assert result.status == "blocked" and reason in result.reasons, result.reasons + def test_a_letsplot_save_without_the_directory_is_blocked(self) -> None: """Unnormalised: lets-plot would write into ./lets-plot-images, which the plot sandbox refuses.""" result = scan(LETSPLOT, spec_id="scatter-basic", library="letsplot", enabled_libraries=SIX_ENABLED) diff --git a/tests/unit/agents/code/test_validate.py b/tests/unit/agents/code/test_validate.py index a0c50d58503..f662aa26de7 100644 --- a/tests/unit/agents/code/test_validate.py +++ b/tests/unit/agents/code/test_validate.py @@ -22,6 +22,7 @@ MAX_STRING_CHARS, MODULE_ESCAPES, PLACEHOLDER, + THEME_BINDING_MESSAGE, UNSAFE_HELPERS, UNSAFE_SUBMODULES, Finding, @@ -46,6 +47,8 @@ THEME = os.getenv("ANYPLOT_THEME", "light") df = pd.DataFrame({"a": [1, 2, 3]}) """ +THEME_LINE = 'THEME = os.getenv("ANYPLOT_THEME", "light")' +"""The theme block of every library's minimal file below.""" FOOTER = """ fig, ax = plt.subplots(figsize=(8, 4.5), dpi=400) plt.savefig(f"plot-{THEME}.png", dpi=400) @@ -605,11 +608,16 @@ def test_other_os_use_is_a_finding(self, body: str) -> None: assert "os-use" in security_rules(body) def test_variable_named_os_without_the_import_is_not_os(self) -> None: + """Neither `os-use` nor `module-value` sees the variable; the theme block read through the alias is no theme + block (`regions.is_theme_assignment`), so its THEME is the one finding.""" code = plot("os = np.ones(3)\ntotal = os.sum()\n").replace("import os\n", "import os as _o\n") code = code.replace( 'THEME = os.getenv("ANYPLOT_THEME", "light")', 'THEME = _o.getenv("ANYPLOT_THEME", "light")' ) - assert validate_security(code, library="matplotlib") == [] + findings = validate_security(code, library="matplotlib") + assert [(f.rule, f.message, f.line) for f in findings] == [ + ("savefig-target", THEME_BINDING_MESSAGE, HEADER.splitlines().index(THEME_LINE) + 1) + ] # --- names, calls, attributes --------------------------------------------------------------- @@ -2131,6 +2139,31 @@ def letsplot_plot(body: str = "") -> str: pytest.param("import cairosvg\nc = [cairosvg.colors][0].tinycss2\n", {"banned-attribute"}, id="tinycss2 by name"), pytest.param("import cairosvg\nt = cairosvg.test_api\n", {"banned-attribute"}, id="test_api"), ] +# Each pygal save name writes one kind of file (`SaveRule.writes`; the correctness review of 2026-10-26): the name in +# its own save's place passes, and the same name in the HTML save's place writing the other file is a finding. +PYGAL_FILE_TYPES = [ + pytest.param( + PYGAL_PNG_SAVE, + PYGAL_PNG_SAVE, + 'chart.render_to_png(f"plot-{THEME}.html")', + 'render_to_png writes only f"plot-{THEME}.png"', + id="render_to_png", + ), + pytest.param( + PYGAL_PNG_SAVE, + "import cairosvg\n" + SVG2PNG, + 'cairosvg.svg2png(bytestring=chart.render(), write_to=f"plot-{THEME}.html")', + 'svg2png writes only f"plot-{THEME}.png"', + id="svg2png", + ), + pytest.param( + PYGAL_HTML_SAVE, + PYGAL_HTML_SAVE, + 'chart.render_to_file(f"plot-{THEME}.png")', + 'render_to_file writes only f"plot-{THEME}.html"', + id="render_to_file", + ), +] PYGAL_NEAR_ROUTES = [ pytest.param("svg = chart.render()\n", id="render"), pytest.param("svg = chart.render(is_unicode=True)\n", id="render as text"), @@ -2316,6 +2349,24 @@ def test_a_file_that_saves_no_png_is_a_finding(self) -> None: findings = validate_security(swapped(pygal_plot(), PYGAL_PNG_SAVE, ""), library="pygal") assert [(f.rule, f.message, f.line) for f in findings] == [("savefig-target", NO_PNG_SAVE, None)] + @pytest.mark.parametrize(("place", "right", "wrong", "message"), PYGAL_FILE_TYPES) + def test_a_save_name_writes_only_its_own_file_type(self, place: str, right: str, wrong: str, message: str) -> None: + code = swapped(pygal_plot(), place, right) + assert validate_security(code, library="pygal") == [] + wrong_code = swapped(code, PYGAL_HTML_SAVE, wrong) + findings = validate_security(wrong_code, library="pygal") + line = wrong_code.splitlines().index(wrong) + 1 + assert [(f.rule, f.message, f.line) for f in findings] == [("savefig-target", message, line)] + + def test_svg_text_in_the_png_is_no_png_save(self) -> None: + """`render_to_file` writes SVG text, so a file whose one PNG save is `render_to_file` writes no PNG.""" + new = 'chart.render_to_file(f"plot-{THEME}.png")' + findings = validate_security(swapped(pygal_plot(), PYGAL_PNG_SAVE, new), library="pygal") + assert [(f.rule, f.message) for f in findings] == [ + ("savefig-target", 'render_to_file writes only f"plot-{THEME}.html"'), + ("savefig-target", NO_PNG_SAVE), + ] + @pytest.mark.parametrize( ("body", "expected"), [ @@ -2657,6 +2708,139 @@ def test_numpy_save_is_a_banned_call_in_every_profile(library: str, body: str) - assert "banned-call" in rules_of(library_plot(library, body), library) +# THEME names every save's file, and libcairo writes pygal's PNG where the render guard never looks, so in every +# profile the name keeps the theme block's value (the security review of 2026-10-26): a body that binds THEME, the +# 1-based line of the binding in it, and the other rules the body breaks. +THEME_BINDINGS = [ + pytest.param('THEME = "../x"\n', 1, set(), id="a second assignment"), + pytest.param('THEME = os.getenv("ANYPLOT_THEME", "dark")\n', 1, set(), id="the theme block twice"), + pytest.param('THEME += "x"\n', 1, set(), id="augmented"), + pytest.param('THEME: str = "x"\n', 1, set(), id="annotated"), + pytest.param('THEME, n = "x", 1\n', 1, set(), id="unpacked"), + pytest.param('for THEME in ["x"]:\n pass\n', 1, set(), id="for"), + pytest.param("import warnings\nwith warnings.catch_warnings() as THEME:\n pass\n", 2, set(), id="with"), + pytest.param("try:\n pass\nexcept ValueError as THEME:\n pass\n", 3, set(), id="except"), + pytest.param('match "x":\n case THEME:\n pass\n', 2, set(), id="match capture"), + pytest.param('match ["x"]:\n case [*THEME]:\n pass\n', 2, set(), id="match star"), + pytest.param("match {}:\n case {**THEME}:\n pass\n", 2, set(), id="match rest"), + pytest.param('n = (THEME := "x")\n', 1, set(), id="walrus"), + pytest.param('names = [THEME for THEME in ["x"]]\n', 1, set(), id="comprehension"), + pytest.param("from textwrap import dedent as THEME\n", 1, set(), id="from import"), + pytest.param("import textwrap as THEME\n", 1, {"module-value"}, id="import"), + pytest.param('def THEME():\n return "x"\n', 1, set(), id="def"), + pytest.param('def f(THEME="x"):\n return THEME\n', 1, set(), id="parameter"), + pytest.param("f = lambda THEME: THEME\n", 1, set(), id="lambda parameter"), + pytest.param('def f():\n THEME = "x"\n return THEME\n', 2, set(), id="a local"), + pytest.param("def f():\n global THEME\n", 2, {"banned-statement"}, id="global"), + pytest.param( + 'def f():\n THEME = "x"\n\n def g():\n nonlocal THEME\n', 5, {"banned-statement"}, id="nonlocal" + ), + pytest.param("del THEME\n", 1, set(), id="del"), + pytest.param("type THEME = str\n", 1, set(), id="type alias"), + pytest.param("def f[THEME]():\n pass\n", 1, set(), id="type parameter"), +] +THEME_READS = [ + pytest.param("upper = THEME.upper()\n", id="a read"), + pytest.param("def f(theme=THEME):\n return theme\n", id="a default"), + pytest.param('d = dict(THEME="x")\n', id="a keyword"), + pytest.param('labels = {"THEME": THEME}\n', id="a dict key"), + pytest.param('THEME_BG = "#FAF8F1" if THEME == "light" else "#1A1A17"\n', id="another name"), +] +# With `import os`, the name is bound by nothing else: each of these hands the theme block another object's `getenv`. +OS_BINDINGS = [ + pytest.param( + 'import functools\n\n\ndef g():\n pass\n\n\ng.getenv = lambda *a: "../x"\n\n\n' + '@functools.wraps(g, assigned=("getenv",), updated=())\ndef os():\n pass\n', + 12, + id="def under wraps", + ), + pytest.param("from textwrap import dedent as os\n", 1, id="from import"), + pytest.param("import textwrap as os\n", 1, id="import"), + pytest.param("try:\n pass\nexcept ValueError as os:\n pass\n", 3, id="except"), + pytest.param("def f(os):\n return 1\n", 1, id="parameter"), + pytest.param('match "x":\n case os:\n pass\n', 2, id="match capture"), +] + + +def body_line(code: str, body: str, line: int) -> int: + """The line of `code` that is line `line` of `body`, which `code` holds once.""" + assert code.count(body) == 1, body + return code.count("\n", 0, code.index(body)) + line + + +@pytest.mark.parametrize("library", CODE_LIBRARIES) +@pytest.mark.parametrize(("body", "line", "others"), THEME_BINDINGS) +def test_a_binding_of_theme_is_refused_in_every_profile(library: str, body: str, line: int, others: set[str]) -> None: + code = library_plot(library, body) + findings = validate_security(code, library=library) + assert {f.rule for f in findings} == {"savefig-target"} | others + assert ("savefig-target", THEME_BINDING_MESSAGE, body_line(code, body, line)) in { + (f.rule, f.message, f.line) for f in findings + } + + +@pytest.mark.parametrize("library", CODE_LIBRARIES) +@pytest.mark.parametrize("body", THEME_READS) +def test_a_read_of_theme_passes_in_every_profile(library: str, body: str) -> None: + assert rules_of(library_plot(library, body), library) == set() + + +@pytest.mark.parametrize("library", CODE_LIBRARIES) +@pytest.mark.parametrize( + "block", + [ + pytest.param('THEME = os.environ.get("ANYPLOT_THEME", "light")', id="os.environ.get"), + pytest.param('THEME = os.getenv("ANYPLOT_THEME", "light").lower()', id="a call on the lookup"), + pytest.param('THEME = T = os.getenv("ANYPLOT_THEME", "light")', id="two targets"), + ], +) +def test_a_theme_block_of_another_shape_is_a_finding(library: str, block: str) -> None: + """The theme block is the shape `regions.is_theme_assignment` accepts, which readiness looks for too.""" + code = swapped(library_plot(library), THEME_LINE, block) + findings = validate_security(code, library=library) + assert [(f.rule, f.message, f.line) for f in findings] == [ + ("savefig-target", THEME_BINDING_MESSAGE, code.splitlines().index(block) + 1) + ] + + +@pytest.mark.parametrize("library", CODE_LIBRARIES) +@pytest.mark.parametrize( + "block", + [ + pytest.param('THEME: str = os.getenv("ANYPLOT_THEME", "light")', id="annotated"), + pytest.param('THEME = os.getenv("ANYPLOT_THEME")', id="no default"), + pytest.param('THEME = os.getenv("ANYPLOT_THEME", default="light")', id="default by keyword"), + ], +) +def test_a_theme_block_regions_accepts_passes(library: str, block: str) -> None: + assert rules_of(swapped(library_plot(library), THEME_LINE, block), library) == set() + + +@pytest.mark.parametrize("library", CODE_LIBRARIES) +def test_the_theme_block_reads_the_imported_os(library: str) -> None: + """Without `import os`, `os` is a name the file binds, and its `getenv` returns what the file says.""" + code = swapped(library_plot(library, "def os():\n pass\n"), "import os\n", "") + findings = validate_security(code, library=library) + assert [(f.rule, f.message, f.line) for f in findings] == [ + ("savefig-target", THEME_BINDING_MESSAGE, code.splitlines().index(THEME_LINE) + 1) + ] + + +@pytest.mark.parametrize("library", CODE_LIBRARIES) +@pytest.mark.parametrize(("body", "line"), OS_BINDINGS) +def test_a_binding_of_the_imported_os_is_refused(library: str, body: str, line: int) -> None: + code = library_plot(library, body) + findings = validate_security(code, library=library) + assert [(f.rule, f.message, f.line) for f in findings] == [ + ("os-use", "'os' may only be bound by import os", body_line(code, body, line)) + ] + + +def test_data_code_may_bind_theme() -> None: + """A data snippet saves nothing, so the THEME pin, a `savefig-target` rule, is no rule of the DATA profile.""" + assert validate_data_code('import pandas as pd\nTHEME = "x"\nTHEME = "y"\ndf = pd.DataFrame()\n') == [] + + # --- the catalogue corpus ---------------------------------------------------------------------- diff --git a/tests/unit/agents/evals/test_cases.py b/tests/unit/agents/evals/test_cases.py index 4e1bf9c379b..6704f0ebb03 100644 --- a/tests/unit/agents/evals/test_cases.py +++ b/tests/unit/agents/evals/test_cases.py @@ -30,7 +30,7 @@ def test_every_committed_case_loads() -> None: cases = load_cases(promoted_dir=Path("/nonexistent")) stress = [case for case in cases if "stress" in case.tags] - assert len(cases) - len(stress) == 247 # 240 generated plus the seven hand-written cases + assert len(cases) - len(stress) == 367 # 360 generated plus the seven hand-written cases assert len(stress) == 23 and all(case.case_id.startswith("stress-") for case in stress) assert [case.case_id for case in cases] == sorted(case.case_id for case in cases) assert {case.origin for case in cases} == {"fixtures"} @@ -72,15 +72,15 @@ def test_selection_by_smoke_full_and_globs() -> None: cases = load_cases(promoted_dir=Path("/nonexistent")) smoke = select_cases(cases, "smoke") - assert len(smoke) == 14 and all("smoke" in case.tags for case in smoke) + assert len(smoke) == 16 and all("smoke" in case.tags for case in smoke) full = select_cases(cases, "full") - assert len(full) == 247 and full == [case for case in cases if "stress" not in case.tags] + assert len(full) == 367 and full == [case for case in cases if "stress" not in case.tags] stress = select_cases(cases, "stress") assert len(stress) == 23 and all("stress" in case.tags for case in stress) assert len(select_cases(cases, "stress-compute-*")) == 3 assert len(select_cases(cases, "*-seaborn-n5000")) == 10 picked = select_cases(cases, "pie-basic-*, scatter-basic-matplotlib") - assert len(picked) == 25 and picked[-1].case_id == "scatter-basic-matplotlib" # 24 pie-basic cases, four libraries + assert len(picked) == 37 and picked[-1].case_id == "scatter-basic-matplotlib" # 36 pie-basic cases, six libraries assert select_cases(cases, "nothing-*") == [] diff --git a/tests/unit/agents/evals/test_make_fixtures.py b/tests/unit/agents/evals/test_make_fixtures.py index 09907af4a44..863520198aa 100644 --- a/tests/unit/agents/evals/test_make_fixtures.py +++ b/tests/unit/agents/evals/test_make_fixtures.py @@ -29,6 +29,12 @@ CASE_KEYS = {"spec_id", "library", "locale", "perturbation", "bindings", "expected", "tags", "source"} FAMILIES = {"scatter", "line", "bar", "histogram", "box", "heatmap", "area", "violin", "pie", "time-series"} +BLOCKED = frozenset({("histogram-basic", "pygal"), ("line-timeseries", "pygal")}) +"""The `(spec, library)` files the readiness scan blocks for SECURITY findings; the generator's docstring says why. + +Their cases are written all the same. A change that makes one of them eligible fails the readiness test until +the pair leaves this set and its cell in the docstring's table changes with it. +""" @pytest.fixture(scope="module") @@ -58,11 +64,11 @@ def test_check_mode_reports_a_stale_file(tmp_path, capsys: pytest.CaptureFixture assert "stale: pie-basic-seaborn-n12/data.csv" in capsys.readouterr().err -def test_ten_specs_of_ten_families_times_four_libraries_times_six_perturbations(files: dict[str, str]) -> None: +def test_ten_specs_of_ten_families_times_six_libraries_times_six_perturbations(files: dict[str, str]) -> None: assert len(SPECS) == 10 and {spec.family for spec in SPECS} == FAMILIES - assert LIBRARIES == ("matplotlib", "seaborn", "plotnine", "altair") + assert LIBRARIES == ("matplotlib", "seaborn", "plotnine", "altair", "pygal", "letsplot") ids = {name.split("/")[0] for name in files} - assert len(ids) == 240 + assert len(ids) == 360 assert ids == { case_id(spec.spec_id, library, perturbation) for spec in SPECS @@ -104,7 +110,7 @@ def test_smoke_covers_every_spec_perturbation_and_library(files: dict[str, str]) smoke = [case for case in smoke if SMOKE_TAG in case["tags"]] cycle = [case for case in smoke if case["library"] in SMOKE_CYCLE] - assert len(smoke) == len(SPECS) + len(LIBRARY_SMOKE) == 12 + assert len(smoke) == len(SPECS) + len(LIBRARY_SMOKE) == 14 assert set(SMOKE_CYCLE) | set(LIBRARY_SMOKE) == set(LIBRARIES) and not set(SMOKE_CYCLE) & set(LIBRARY_SMOKE) assert len(cycle) == len(SPECS) assert {case["spec_id"] for case in cycle} == {spec.spec_id for spec in SPECS} @@ -115,7 +121,7 @@ def test_smoke_covers_every_spec_perturbation_and_library(files: dict[str, str]) def test_a_new_library_never_moves_the_smoke_cycle(files: dict[str, str]) -> None: - """The ten cycle cases are the ones of `--cases smoke` before step 1b; plotnine and altair add one each.""" + """The ten cycle cases are the ones of `--cases smoke` before step 1b; every later library adds one.""" smoke = sorted( name.split("/")[0] for name, text in files.items() @@ -131,20 +137,29 @@ def test_a_new_library_never_moves_the_smoke_cycle(files: dict[str, str]) -> Non "line-timeseries-seaborn-n5000", "pie-basic-matplotlib-n12", "scatter-basic-altair-renamed", + "scatter-basic-letsplot-renamed", "scatter-basic-matplotlib-renamed", "scatter-basic-plotnine-renamed", + "scatter-basic-pygal-renamed", "violin-basic-seaborn-x10", ] @pytest.mark.parametrize("spec", SPECS, ids=lambda spec: spec.spec_id) def test_every_case_parses_binds_and_is_eligible(spec: make_fixtures.SpecFixture, files: dict[str, str]) -> None: - """The cases test the adaptation, never the parser: no warning, complete bindings, an eligible pair.""" + """The cases test the adaptation, never the parser: no warning, complete bindings, an eligible pair. + + The `BLOCKED` pairs are the exception: blocked, and for SECURITY findings, not for a disabled library. + """ settings = AgentSettings(libraries=list(LIBRARIES)) # the default enables matplotlib and seaborn only for library in LIBRARIES: snapshot = snapshot_from_repo(spec.spec_id, library) eligibility, _ = assess(snapshot, library, settings) - assert eligibility.status in ("clean", "coupled"), (library, eligibility.reasons) + if (spec.spec_id, library) in BLOCKED: + assert eligibility.status == "blocked", (library, eligibility.reasons) + assert any(reason.startswith("security: ") for reason in eligibility.reasons), eligibility.reasons + else: + assert eligibility.status in ("clean", "coupled"), (library, eligibility.reasons) roles = parse_roles(snapshot.data_roles) for perturbation in PERTURBATIONS: directory = case_id(spec.spec_id, library, perturbation) diff --git a/tests/unit/agents/renderer/test_language_rows.py b/tests/unit/agents/renderer/test_language_rows.py index 039b4dc7933..2f156d5ff21 100644 --- a/tests/unit/agents/renderer/test_language_rows.py +++ b/tests/unit/agents/renderer/test_language_rows.py @@ -67,6 +67,30 @@ def test_an_in_process_row_brings_its_environment_and_its_own_limit(self, config assert pygal == sandbox_env(limited, "light", 60, command=command_for("python", "matplotlib")) assert pygal["ANYPLOT_RLIMIT_AS_MB"] == "1024" and "ARROW_DEFAULT_MEMORY_POOL" not in pygal + def test_an_in_process_row_env_comes_after_the_matplotlib_keys_and_before_the_fixed_ones( + self, config: ExecutorConfig + ) -> None: + """The merge order `sandbox_env` states: a row's own value replaces a matplotlib setting, and never `PATH`, + `HOME`, the bytecode switch or a limit variable.""" + limited = replace(config, rlimit_as_mb=1024) + row = replace( + command_for("python", "pygal"), + env={ + "MPLBACKEND": "svg", + "PATH": "/opt/row/bin", + "HOME": "/opt/row", + "PYTHONDONTWRITEBYTECODE": "0", + "ANYPLOT_RLIMIT_AS_MB": "0", + "ANYPLOT_RLIMIT_CPU_S": "0", + }, + ) + values = sandbox_env(limited, "light", 60, command=row) + + assert values["MPLBACKEND"] == "svg" and values["MPLCONFIGDIR"] == config.mplconfig + assert values["PATH"] == SANDBOX_PATH and values["HOME"] == "/tmp" + assert values["PYTHONDONTWRITEBYTECODE"] == "1" + assert values["ANYPLOT_RLIMIT_AS_MB"] == "1024" and values["ANYPLOT_RLIMIT_CPU_S"] == "60" + def test_a_row_limit_never_switches_a_configured_off_limit_on(self, config: ExecutorConfig) -> None: """`RENDERER_RLIMIT_AS_MB=0` turns address-space limits off for every row, lets-plot's own value included.""" unlimited = sandbox_env(config, "dark", 60, command=command_for("python", "letsplot")) diff --git a/tests/unit/agents/runtime/test_harness_guard.py b/tests/unit/agents/runtime/test_harness_guard.py index eb76d9c86be..af966c55bd6 100644 --- a/tests/unit/agents/runtime/test_harness_guard.py +++ b/tests/unit/agents/runtime/test_harness_guard.py @@ -53,6 +53,15 @@ def render_file(tmp_path: Path, code: str) -> tuple[int, str]: return done.returncode, done.stderr +def import_or_skip(module: str) -> None: + """Skip the test unless `module` imports here: `pytest.importorskip` skips only an ImportError, but cairosvg's + import raises OSError when cairocffi finds no libcairo on the machine.""" + try: + importlib.import_module(module) + except (ImportError, OSError) as exc: + pytest.skip(f"{module} does not import here: {type(exc).__name__}: {exc}") + + def run_data(tmp_path: Path, code: str) -> tuple[int, str | None, str]: """Exit code, `out.csv` (None when missing) and stderr of one data-mode run in `tmp_path`.""" (tmp_path / "snippet.py").write_text(code, encoding="utf-8") @@ -409,7 +418,7 @@ def test_pygal_renders_its_png_and_html( """pygal's PNG goes through cairosvg: `warm_cairo` loads libcairo before the guard, and cssselect2 compiles the chart's stylesheet into lambdas through `eval` (`CODE_BUILDERS`). No matplotlib figure, so no probe.""" pytest.importorskip("pygal") - pytest.importorskip("cairosvg") + import_or_skip("cairosvg") code = ( f"import os\n\n{imports}import pygal\n\nTHEME = os.environ['ANYPLOT_THEME']\n" f"chart = pygal.Bar(width={size[0]}, height={size[1]}, title='t')\nchart.add('y', [1, 3, 2])\n" @@ -485,6 +494,18 @@ def test_a_caught_frame_refusal_still_renders(self, tmp_path: Path) -> None: assert (tmp_path / "plot-light.png").exists() +@pytest.mark.parametrize("error", [ModuleNotFoundError("No module named 'cairosvg'"), OSError("no library called")]) +def test_a_library_that_does_not_import_skips_its_case(monkeypatch: pytest.MonkeyPatch, error: Exception) -> None: + """A missing module and a missing libcairo under an installed cairosvg (cairocffi's OSError) both skip.""" + + def fail(name: str) -> None: + raise error + + monkeypatch.setattr(importlib, "import_module", fail) + with pytest.raises(pytest.skip.Exception, match=type(error).__name__): + import_or_skip("cairosvg") + + REPO_ROOT = Path(__file__).resolve().parents[4] CATALOGUE_UNDER_GUARD = [ pytest.param("ice-basic", "matplotlib", id="ice-basic/matplotlib: scikit-learn GradientBoostingRegressor"), @@ -523,7 +544,7 @@ def test_catalogue_files_render_under_the_guard(tmp_path: Path, spec_id: str, li from core.utils import strip_noqa_comments for module in LIBRARY_MODULES.get(library, ()): - pytest.importorskip(module) + import_or_skip(module) source = REPO_ROOT / "plots" / spec_id / "implementations" / "python" / f"{library}.py" if not source.exists(): pytest.skip(f"{spec_id}/{library} is absent") diff --git a/tests/unit/agents/runtime/test_render.py b/tests/unit/agents/runtime/test_render.py index a62e698507c..b8ae25ec22f 100644 --- a/tests/unit/agents/runtime/test_render.py +++ b/tests/unit/agents/runtime/test_render.py @@ -139,6 +139,26 @@ def test_harden_rejects(self, data: bytes, message: str) -> None: with pytest.raises(PngRejected, match=message): harden(data) + @staticmethod + def sparse_png(drawn_pixels: int) -> bytes: + """A 1000x100 background with `drawn_pixels` of ink in one strip of 10 rows: 100,000 pixels in all.""" + image = Image.new("RGB", (1000, 100), "#FAF8F1") + image.paste((0, 158, 115), (0, 0, drawn_pixels // 10, 10)) + buffer = io.BytesIO() + image.save(buffer, format="PNG") + return buffer.getvalue() + + def test_a_sparse_render_passes_the_blank_check(self) -> None: + """99.5 % one colour, as sparse as the sparsest eligible pygal render (network-directed, 99.44 %): drawn.""" + hardened = harden(self.sparse_png(500)) + + assert (hardened.width, hardened.height) == (1000, 100) + + def test_a_canvas_with_only_a_title_is_blank(self) -> None: + """99.8 % one colour, the share of a pygal chart with only its title (99.78 %): nothing was drawn.""" + with pytest.raises(PngRejected, match=r"99\.8% one colour \(#FAF8F1\)"): + harden(self.sparse_png(200)) + def test_read_output_refuses_symlinks_and_size(self, tmp_path: Path) -> None: target = tmp_path / "secret.txt" target.write_text("host file") From 2238d3c186941e3970198985f92342c39ccd0de8 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 26 Oct 2026 05:43:08 +0000 Subject: [PATCH 4/6] docs(changelog): reference #12405 in the pygal and lets-plot fragment Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WbjVqBweiXjUZKp626ZFWm --- changelog.d/agent-pygal-letsplot.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/changelog.d/agent-pygal-letsplot.md b/changelog.d/agent-pygal-letsplot.md index 3e9d1bd5614..4d36d372b18 100644 --- a/changelog.d/agent-pygal-letsplot.md +++ b/changelog.d/agent-pygal-letsplot.md @@ -21,7 +21,7 @@ pygal and 284 of 325 lets-plot files are eligible. The eval fixtures cover both libraries: 120 more generated cases (360 in all) and one smoke case each (16 in the smoke set). `AGENT_LIBRARIES` keeps its default `matplotlib,seaborn` until each - library's eval matrix reaches 80 %. + library's eval matrix reaches 80 %. (#12405) ### Changed @@ -30,7 +30,7 @@ sparse but complete charts: 33 of the 195 eligible pygal renders and lets-plot's point-basic (98.38 %) are 98 % one colour or more, the sparsest pygal one 99.44 %. A bare canvas (99.93 %) or a title alone (99.78 %) still fails. The cutoff holds - for every library, and it refuses nothing the old one accepted. + for every library, and it refuses nothing the old one accepted. (#12405) ### Fixed @@ -45,4 +45,4 @@ plotnine's expression rule read as a fixed string, handing plotnine code to evaluate. Every profile now refuses the first as a `banned-call` and any binding of `THEME` but its theme block as a `savefig-target`, and the expression rule counts a - match capture as a binding. + match capture as a binding. (#12405) From ac14b3fbc0a0122b27f2cdfa3787f2d421a0dc41 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 26 Oct 2026 05:56:27 +0000 Subject: [PATCH 5/6] fix(renderer): enforce the delegate PATH check in every image build The Copilot review of #12405: the check that no program lets-plot's native ImageMagick can start is on the sandbox's PATH ran only in the CI image job, while the production image is built by Cloud Build, so a base-image or dependency change could reach production unseen. The list moves into agents/renderer/delegates.py, the Dockerfile runs it (every build fails when one of the 39 programs is on SANDBOX_PATH), and the CI step runs the same module once more in the built image. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WbjVqBweiXjUZKp626ZFWm --- .github/workflows/ci-image.yml | 39 +++------ agentic/specs/261024-agent-all-libraries.md | 16 ++-- agents/renderer/Dockerfile | 7 ++ agents/renderer/delegates.py | 92 ++++++++++++++++++++ tests/unit/agents/renderer/test_delegates.py | 53 +++++++++++ 5 files changed, 173 insertions(+), 34 deletions(-) create mode 100644 agents/renderer/delegates.py create mode 100644 tests/unit/agents/renderer/test_delegates.py diff --git a/.github/workflows/ci-image.yml b/.github/workflows/ci-image.yml index af392926fbc..099e40d71b6 100644 --- a/.github/workflows/ci-image.yml +++ b/.github/workflows/ci-image.yml @@ -878,38 +878,21 @@ jobs: # Native code the audit hook cannot see finds no program to run. lets-plot's bridge links # ImageMagick with a compiled-in delegate map that runs programs by name through /bin/sh - # (gs, curl, soffice, ffmpeg, rsvg-convert, inkscape and the rest listed below). That - # ImageMagick is a zero-configuration build: it reads no policy.xml, so no policy file can - # switch the delegates off (an export with a policy denying PNG under MAGICK_CONFIGURE_PATH - # still wrote its PNG, 2026-10-26). matplotlib calls fc-list when it finds it. So the - # sandbox's PATH (SANDBOX_PATH of agents/renderer/executor.py, read in the image) must - # carry none of them, next to RLIMIT_NPROC and the sandbox itself. node stays on the list - # until the JavaScript runtime (step 3 of agentic/specs/261024-agent-all-libraries.md) - # installs it as its row's toolchain. + # (gs, curl, soffice, ffmpeg, rsvg-convert, inkscape and the rest that + # agents/renderer/delegates.py lists). That ImageMagick is a zero-configuration build: it + # reads no policy.xml, so no policy file can switch the delegates off (an export with a + # policy denying PNG under MAGICK_CONFIGURE_PATH still wrote its PNG, 2026-10-26). + # matplotlib calls fc-list when it finds it. So the sandbox's PATH (SANDBOX_PATH of + # agents/renderer/executor.py) must carry none of them, next to RLIMIT_NPROC and the + # sandbox itself. node stays on the list until the JavaScript runtime (step 3 of + # agentic/specs/261024-agent-all-libraries.md) installs it as its row's toolchain. - name: No delegate program on the sandbox PATH if: steps.check.outputs.should_build == 'true' run: | set -euo pipefail - docker run --rm --network none anyplot-renderer:ci /app/.venv/bin/python -c ' - import shutil - import sys - - from agents.renderer.executor import SANDBOX_PATH - - PROGRAMS = ( - "gs", "ghostscript", "curl", "wget", "soffice", "libreoffice", "ffmpeg", "inkscape", "rsvg-convert", - "fc-list", "fc-match", "magick", "convert", "identify", "dot", "java", "node", - # The other programs of the delegate map. - "bpgdec", "bpgenc", "xdg-open", "uniconvertor", "ufraw-batch", "dvips", "xterm", "hp2xx", "html2ps", - "ilbmtoppm", "ppmtoilbm", "lepton", "JxrDecApp", "JxrEncApp", "pcl6", "gxps", "xclip", "cwebp", "dwebp", - "lpr", "mrsidgeodecode", "gimp", - ) - found = {name: shutil.which(name, path=SANDBOX_PATH) for name in PROGRAMS} - found = {name: path for name, path in found.items() if path is not None} - if found: - sys.exit(f"on the sandbox PATH {SANDBOX_PATH}: {found}") - print(f"OK: none of {len(PROGRAMS)} delegate programs on {SANDBOX_PATH}") - ' + # The image build ran the same check (agents/renderer/Dockerfile); this runs it + # once more in the image the job just built, as the sandbox would see it. + docker run --rm --network none anyplot-renderer:ci /app/.venv/bin/python -m agents.renderer.delegates # The file conversion inside the image (harness.py --convert): every format the # page sends, with the image's slimmed pyarrow (owner decision of 2026-10-15), diff --git a/agentic/specs/261024-agent-all-libraries.md b/agentic/specs/261024-agent-all-libraries.md index 433bfc0f403..442aafdf991 100644 --- a/agentic/specs/261024-agent-all-libraries.md +++ b/agentic/specs/261024-agent-all-libraries.md @@ -447,10 +447,13 @@ reasons (a file can have several causes): and a 4800x2700 chart through `svg2png` at 3200x1800, the canvas rewrite's form) and a lets-plot plot through the harness in the image; the lets-plot step takes its environment and limit from the command table's row and also fails on "Fontconfig - error" in stderr. A new step fails when any of 39 programs (those the bridge's - ImageMagick delegates to, such as `gs`, `curl`, `soffice` and `ffmpeg`, ImageMagick's - own tools, `fc-list`, `fc-match`, `java` and `node`) is on the sandbox's `PATH`, read - from `executor.SANDBOX_PATH` in the image. + error" in stderr. The image build itself fails when any of 39 programs (those the + bridge's ImageMagick delegates to, such as `gs`, `curl`, `soffice` and `ffmpeg`, + ImageMagick's own tools, `fc-list`, `fc-match`, `java` and `node`; + `agents/renderer/delegates.py`) is on the sandbox's `PATH` (`executor.SANDBOX_PATH`), + so the Cloud Build deploy enforces it as well as the CI job, which runs the check once + more in the built image (the Copilot review of #12405: a CI-only check would let a + base-image change reach production unseen). - **Host gates.** R2's blank check refuses a canvas that is 99.7 % one colour, not 98 %, for every library (see the table below). - **Evals.** `eligibility.py` sweeps all six libraries. `make_fixtures.py` writes the @@ -644,8 +647,9 @@ bridge (the owner questions below). What stays from 1b's list, and what 1c adds: `label:`, `msl:`) never reach a coder, and `geom_imshow` builds an in-memory `data:` href from an array and reads no file, so admitted code cannot steer the native layer. The bridge's native process starts are bounded by the image's `PATH`, - `RLIMIT_NPROC` and the sandbox, and since 2026-10-26 `ci-image.yml` fails when any - of 39 delegate programs is on the sandbox's `PATH`. No ImageMagick policy ships: + `RLIMIT_NPROC` and the sandbox, and since 2026-10-26 every build of the renderer + image, the Cloud Build deploy included, fails when any of 39 delegate programs is on + the sandbox's `PATH` (`agents/renderer/delegates.py`). No ImageMagick policy ships: the bridge's ImageMagick is a zero-configuration build that reads no `policy.xml` and no `MAGICK_*` variable (a policy denying every coder and delegate changed no export, on the host or in the image). The two `fc-list` starts in the review's diff --git a/agents/renderer/Dockerfile b/agents/renderer/Dockerfile index 0ec3813ec5d..1ff7ee6b69c 100644 --- a/agents/renderer/Dockerfile +++ b/agents/renderer/Dockerfile @@ -149,6 +149,13 @@ COPY --from=builder /app/VERSION ./agents/renderer/VERSION COPY agents/anyplot/render/harness.py /opt/anyplot/harness.py COPY agents/anyplot/render/convert.py /opt/anyplot/convert.py +# lets-plot's native ImageMagick starts its delegate programs (Ghostscript, curl, +# ffmpeg, ...) by name from PATH, where the plot guard's audit hook cannot see a +# process start, and it reads no policy that could forbid them. The build fails when +# one of them is on the sandbox's PATH (agents/renderer/delegates.py), so every build +# of this file enforces it: the Cloud Build deploy as well as the CI image job. +RUN .venv/bin/python -m agents.renderer.delegates + # The fallback fonts and their OFL notices. matplotlib scans /usr/share/fonts # recursively without fontconfig (font_manager.findSystemFonts), so one # directory is enough; it must be in place before the cache bake below. diff --git a/agents/renderer/delegates.py b/agents/renderer/delegates.py new file mode 100644 index 00000000000..5c2172562c0 --- /dev/null +++ b/agents/renderer/delegates.py @@ -0,0 +1,92 @@ +"""The programs lets-plot's native ImageMagick can start, which no render may find on the sandbox's `PATH`. + +lets-plot rasterises in its native bridge (`lets_plot_kotlin_bridge`), which links ImageMagick 7. +That ImageMagick is a zero-configuration build: it reads no `policy.xml` and no `MAGICK_*` +variable (measured on 2026-10-26, on a developer machine and in the renderer image), and its +delegate map, compiled in, starts the programs below by name from `PATH` through `execvp`, +`popen` and `system`. A native process start raises no audit event, so the harness's plot guard +cannot refuse one. The security review of 2026-10-26 found no route from code the validator +admits to a delegate; this module keeps a delegate from being there to start when the base image +or a dependency changes. + +The renderer image's build runs it (`agents/renderer/Dockerfile`), so every build of the image +fails when one of the programs is on `SANDBOX_PATH`, the path every sandboxed run gets: the Cloud +Build deploy and the CI image job build the same file, and the CI job runs it once more in the +built image (`.github/workflows/ci-image.yml`). The list is the brief of that review (the +programs ImageMagick's delegates and fonts reach for) plus every other program the bridge's +delegate map names. `node` is on it because the image ships none; a JavaScript runtime that adds +one changes this list in the same change. + + .venv/bin/python -m agents.renderer.delegates + +exits 0 and prints one line when none is found, and exits 1 naming each one that is. +""" + +import shutil + +from .executor import SANDBOX_PATH + + +DELEGATE_PROGRAMS: tuple[str, ...] = ( + "gs", + "ghostscript", + "curl", + "wget", + "soffice", + "libreoffice", + "ffmpeg", + "inkscape", + "rsvg-convert", + "fc-list", + "fc-match", + "magick", + "convert", + "identify", + "dot", + "java", + "node", + # The other programs of the bridge's compiled-in delegate map. + "bpgdec", + "bpgenc", + "xdg-open", + "uniconvertor", + "ufraw-batch", + "dvips", + "xterm", + "hp2xx", + "html2ps", + "ilbmtoppm", + "ppmtoilbm", + "lepton", + "JxrDecApp", + "JxrEncApp", + "pcl6", + "gxps", + "xclip", + "cwebp", + "dwebp", + "lpr", + "mrsidgeodecode", + "gimp", +) +"""Every program a render must not find on `SANDBOX_PATH`.""" + + +def delegates_on_path(path: str = SANDBOX_PATH) -> dict[str, str]: + """The delegate programs `path` resolves, by name: empty in a correct image.""" + found = {name: shutil.which(name, path=path) for name in DELEGATE_PROGRAMS} + return {name: location for name, location in found.items() if location is not None} + + +def main() -> int: + found = delegates_on_path() + if found: + listed = ", ".join(f"{name} ({location})" for name, location in sorted(found.items())) + print(f"delegate programs on the sandbox PATH {SANDBOX_PATH}: {listed}") + return 1 + print(f"OK: none of {len(DELEGATE_PROGRAMS)} delegate programs on {SANDBOX_PATH}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/unit/agents/renderer/test_delegates.py b/tests/unit/agents/renderer/test_delegates.py new file mode 100644 index 00000000000..b1a1307dd48 --- /dev/null +++ b/tests/unit/agents/renderer/test_delegates.py @@ -0,0 +1,53 @@ +"""The delegate check of the renderer image: no program lets-plot's native ImageMagick can start is on the sandbox PATH.""" + +from pathlib import Path + +import pytest + +from agents.renderer import delegates +from agents.renderer.executor import SANDBOX_PATH + + +REPO_ROOT = Path(__file__).resolve().parents[4] + + +def test_a_clean_path_passes(monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]) -> None: + monkeypatch.setattr(delegates.shutil, "which", lambda name, path=None: None) + + assert delegates.main() == 0 + assert f"none of {len(delegates.DELEGATE_PROGRAMS)} delegate programs on {SANDBOX_PATH}" in capsys.readouterr().out + + +def test_a_delegate_on_the_sandbox_path_fails_and_is_named( + monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] +) -> None: + looked_up: list[str | None] = [] + + def which(name: str, path: str | None = None) -> str | None: + looked_up.append(path) + return "/usr/bin/gs" if name == "gs" else None + + monkeypatch.setattr(delegates.shutil, "which", which) + + assert delegates.main() == 1 + assert "gs (/usr/bin/gs)" in capsys.readouterr().out + assert set(looked_up) == {SANDBOX_PATH} # the sandbox's PATH, never the process's own + + +def test_the_list_covers_the_review_s_programs() -> None: + reviewed = {"gs", "curl", "soffice", "ffmpeg", "inkscape", "rsvg-convert", "fc-list", "magick", "convert", "node"} + + assert reviewed <= set(delegates.DELEGATE_PROGRAMS) + assert len(set(delegates.DELEGATE_PROGRAMS)) == len(delegates.DELEGATE_PROGRAMS) + + +def test_every_build_of_the_image_runs_the_check() -> None: + """The Dockerfile runs it, so the Cloud Build deploy enforces it as well as the CI job, which runs it again.""" + dockerfile = (REPO_ROOT / "agents" / "renderer" / "Dockerfile").read_text(encoding="utf-8") + workflow = (REPO_ROOT / ".github" / "workflows" / "ci-image.yml").read_text(encoding="utf-8") + + assert "RUN .venv/bin/python -m agents.renderer.delegates" in dockerfile + assert dockerfile.index("COPY agents/renderer/ ./agents/renderer/") < dockerfile.index( + "-m agents.renderer.delegates" + ) + assert "/app/.venv/bin/python -m agents.renderer.delegates" in workflow From 2afe4e8ea7cd7f71156eb168f71862ac05cbe45c Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 26 Oct 2026 06:10:53 +0000 Subject: [PATCH 6/6] Give the local render the renderer's sandbox environment PythonRuntime.env, which the local Docker backend passes, now matches executor.sandbox_env for the library's row key for key: the sandbox PATH the image build's delegate check reads, the BLAS thread caps, the deployed file-size limit and RLIMIT_AS (the row's own, or 1 GiB unless the row switches it off). RLIMIT_NPROC stays out: the container runs as the developer's uid, whose processes on the whole machine count against it, so --pids-limit bounds them instead. A test pins the parity and the deployed limit constants. The agent-network doc names the build-time delegate check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WbjVqBweiXjUZKp626ZFWm --- agents/anyplot/render/runtimes/python.py | 27 +++++++++--- docs/concepts/agent-network.md | 4 +- tests/unit/agents/runtime/test_runtimes.py | 51 ++++++++++++---------- 3 files changed, 51 insertions(+), 31 deletions(-) diff --git a/agents/anyplot/render/runtimes/python.py b/agents/anyplot/render/runtimes/python.py index e49683cfe64..47ff5531430 100644 --- a/agents/anyplot/render/runtimes/python.py +++ b/agents/anyplot/render/runtimes/python.py @@ -23,6 +23,7 @@ from typing import Any from agents.renderer.commands import command_for +from agents.renderer.executor import SANDBOX_PATH from agents.renderer.wire import run_cpu_seconds from ...code.edits import AppliedPlan, apply_plan, new_literals, restore_protected @@ -52,7 +53,9 @@ DATA_RLIMIT_AS_MB = 1024 DATA_RLIMIT_NPROC = 64 """The renderer's deployed `RENDERER_RLIMIT_AS_MB` and `RENDERER_RLIMIT_NPROC` (pinned by a test), which the local -backend's data runs apply as well.""" +backend's data runs apply as well, and its renders the address-space limit.""" +RENDER_RLIMIT_FSIZE_MB = 50 +"""The renderer's deployed `RENDERER_RLIMIT_FSIZE_MB` (pinned by a test), which the local backend's renders apply.""" class PythonRuntime: @@ -88,9 +91,17 @@ def command(self, theme: Theme) -> list[str]: return [self.python, *INTERPRETER_FLAGS, self.harness, self.file_name] def env(self, theme: Theme) -> dict[str, str]: - """A render's environment. The library's command row adds its own variables after the matplotlib settings - and its own address-space limit, as the renderer's `sandbox_env` does; a render here otherwise keeps no - `RLIMIT_AS`, so a row without a limit of its own gets none.""" + """A render's environment in the local Docker backend, its one caller: the renderer's `sandbox_env` for the + library's command row under the deployed limits, key for key (pinned by a test). The matplotlib settings, + then the row's own variables, then the fixed keys no row replaces: `PATH` is the sandbox's, the path the + image build's delegate check reads (`agents/renderer/delegates.py`), and the limits are the deployed ones, + the row's own `RLIMIT_AS` where it has one and none where the row switches it off (altair). + + One limit stays out: the container runs as the developer's user (`--user`), and Linux counts that user's + processes on the whole machine against `RLIMIT_NPROC`, so 64 would stop lets-plot's threads on a busy + desktop; the container's `--pids-limit` bounds the processes instead. Until 2026-10-26 a local render also + kept the image's `PATH`, no `RLIMIT_AS` and the harness's default file size (the Copilot review of #12405). + """ row = command_for(self.language, self.library) env = { "ANYPLOT_THEME": theme, @@ -100,12 +111,16 @@ def env(self, theme: Theme) -> dict[str, str]: # MPLCONFIGDIR and skips the copy where the directory does not exist. "ANYPLOT_MPL_SEED": MPL_SEED, **row.env, + "PATH": SANDBOX_PATH, "HOME": "/tmp", "PYTHONDONTWRITEBYTECODE": "1", + "OPENBLAS_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", "ANYPLOT_RLIMIT_CPU_S": str(self.cpu_seconds), + "ANYPLOT_RLIMIT_FSIZE_MB": str(RENDER_RLIMIT_FSIZE_MB), } - if row.rlimit_as_mb is not None: - env["ANYPLOT_RLIMIT_AS_MB"] = str(row.rlimit_as_mb) + if row.rlimit_as: + env["ANYPLOT_RLIMIT_AS_MB"] = str(row.rlimit_as_mb or DATA_RLIMIT_AS_MB) return env def data_command(self) -> list[str]: diff --git a/docs/concepts/agent-network.md b/docs/concepts/agent-network.md index 13fbad04dc2..c3e6a90a6c4 100644 --- a/docs/concepts/agent-network.md +++ b/docs/concepts/agent-network.md @@ -344,7 +344,7 @@ Host gates: R1 (exit code and outputs present) and R2 (PNG hardening: `lstat` wi **Label density and number formats.** Two findings of the live tests of 2026-10-14/15 became measured gates. The catalogue draws some elements once per mark of its few example marks: bar-grouped puts a value label, a dot and a drop shadow on each of its 12 bars, and the adapter kept them on the 52 bars of 26 regions times two series, because "keep the same style" and the reviewer's house-style exemption covered them. The harness's `density_report` (probe field `density`, per axes) counts the bars and points, the texts at a data coordinate whose anchor sits at a bar's end, inside a bar's segment (`bar_label(label_type="center")`) or on a point (`ax.annotate`, `ax.bar_label`, `ax.text`; heatmap cell text and callouts in axes coordinates are not value labels, and neither is a text matplotlib clips away in a zoomed view), which of them are numbers, the dots on bar ends (scatter marks or `plot(..., "o")` markers) and the shadowed bars, and measures the median bar label width against the space between neighbouring labelled bars (unlabelled bars between them, such as an offset shadow series, do not shrink it). Bar ends come from the bars' data coordinates, so an inverted axis works. G11 writes a VQ-03 line (owner, 2026-10-15: the thresholds stay) when more than `MAX_VALUE_LABELS` (25) bar positions carry a label (a stacked bar's segment labels count once), when more than 25 numeric labels sit on points (named points, the point of scatter-annotated, never count), from six labels on when a bar label is wider than 90 % of the space per bar, or when more than `MAX_DECORATIONS` (25) dots or shadows are drawn. The adapter prompt and the reviewer's and scorer's house-style exemption now say that an element whose count grows with the data is not house style. The rule itself has one source shared with the catalogue pipeline: the "Per-mark Labels and Decorations" section of `prompts/default-style-guide.md` and the VQ-03 paragraph of `prompts/quality-criteria.md`, which the adapter reads verbatim; `adapter.md` only points at it. Second, number formats followed English whatever the plot language ("6.0 M" and "5.30" in German plots), and `locale` is a banned import. `language.NUMBER_FORMATS` is the server's table of the decimal mark, the thousands mark and the words for large numbers per language of `ENGLISH_NAMES` (`de`: `,`, `.`, Tsd./Mio./Mrd.); the adapter's static instruction carries it with the rule to format through a `FuncFormatter` or an f-string whose marks are swapped through a placeholder (`.replace(",", "_").replace(".", DECIMAL).replace("_", THOUSANDS)`), exact for the space-grouped languages too. A region such as `de-CH` with its apostrophe (7'184'003) is a follow-up of its own setting (owner, 2026-10-15). G12 reads the probe's `labels` field (the drawn texts by kind, from block F) and its `tick_axes` field (`harness.tick_axes`: whether each axis's tick labels are numbers, dates, categories or labels the code set itself), and writes a VQ-06 line when an annotation, or a tick label of a numeric axis, uses the other decimal mark, mathtext read as drawn: a single point followed by other than three digits in a decimal-comma language (`5.30`, `6.0 M`, `5.30 €`), a point after a whole part of 0 (`0.125`), a point after a comma, or commas grouping thousands; dates (a zero-padded `14.10` in an annotation reads as a day and month), years, version strings, titles, legend entries and tick labels the code set itself never count, and no label text reaches the line. -Later languages reuse the CI commands: `Rscript plot.R`; `julia --project=/opt/julia plot.jl` with a stacked `JULIA_DEPOT_PATH` and a pinned `JULIA_CPU_TARGET`; `node /opt/anyplot/js-render/render.mjs plot.js` with `window.ANYPLOT_DATA` injected; bokeh and plotly write their page and the JavaScript harness's Chromium screenshots it as a second child (the plot guard refuses a browser started from plot code; `agentic/specs/261024-agent-all-libraries.md`). Since 2026-10-24 the renderer holds these commands in one table (`agents/renderer/commands.py`, keyed by the job's `(language, library)`, the library checked against the catalogue's fifteen) and never takes a command from a request; a non-Python row runs through the harness's exec mode (`harness.py --exec -- <command> plot.<ext>`: the start line, the limits set and inherited, the end line from the child's rusage), so the launcher retry, the watchdog and the kill path hold for every language; a row says which limits differ (`RLIMIT_AS` off for the JavaScript and Julia rows, whose V8, Chromium and LLVM reserve address space far beyond their resident memory, and `RLIMIT_NPROC` off for the JavaScript row alone, whose one Chromium render runs 77 tasks; since 2026-10-25 `RLIMIT_AS` is off for altair's Python row too, because vl-convert's embedded V8 aborts at start under any limit up to 64 GiB while its resident set is about 270 MiB), which limit it sets in place of the configured one (since 2026-10-26 lets-plot's Python row has its own 2048 MiB, `RuntimeCommand.rlimit_as_mb`, because its Kotlin/Native rasteriser aborts every 3200x1800 export under the configured 1 GiB while 2048 MiB still stops a runaway scale, which a 6400x3600 export shows at 2580 MiB; the renderer's switch still rules, so a configured limit of 0 leaves every row unlimited), which environment it adds (lets-plot's: Arrow's system allocator, `ARROW_DEFAULT_MEMORY_POOL=system`, because pyarrow's default pool reserves a 1 GiB arena on the first pandas string column, and `FONTCONFIG_FILE=/opt/anyplot/fonts.conf` for the fontconfig its bridge links; an in-process row's environment and limit reach the sandbox through `executor.sandbox_env` and the local Docker backend through `PythonRuntime.env`) and what render time a repair reserves; `GET /status` reports under `languages` which toolchains the image carries, and a job in a language without one is `503 runtime_unavailable`. +Later languages reuse the CI commands: `Rscript plot.R`; `julia --project=/opt/julia plot.jl` with a stacked `JULIA_DEPOT_PATH` and a pinned `JULIA_CPU_TARGET`; `node /opt/anyplot/js-render/render.mjs plot.js` with `window.ANYPLOT_DATA` injected; bokeh and plotly write their page and the JavaScript harness's Chromium screenshots it as a second child (the plot guard refuses a browser started from plot code; `agentic/specs/261024-agent-all-libraries.md`). Since 2026-10-24 the renderer holds these commands in one table (`agents/renderer/commands.py`, keyed by the job's `(language, library)`, the library checked against the catalogue's fifteen) and never takes a command from a request; a non-Python row runs through the harness's exec mode (`harness.py --exec -- <command> plot.<ext>`: the start line, the limits set and inherited, the end line from the child's rusage), so the launcher retry, the watchdog and the kill path hold for every language; a row says which limits differ (`RLIMIT_AS` off for the JavaScript and Julia rows, whose V8, Chromium and LLVM reserve address space far beyond their resident memory, and `RLIMIT_NPROC` off for the JavaScript row alone, whose one Chromium render runs 77 tasks; since 2026-10-25 `RLIMIT_AS` is off for altair's Python row too, because vl-convert's embedded V8 aborts at start under any limit up to 64 GiB while its resident set is about 270 MiB), which limit it sets in place of the configured one (since 2026-10-26 lets-plot's Python row has its own 2048 MiB, `RuntimeCommand.rlimit_as_mb`, because its Kotlin/Native rasteriser aborts every 3200x1800 export under the configured 1 GiB while 2048 MiB still stops a runaway scale, which a 6400x3600 export shows at 2580 MiB; the renderer's switch still rules, so a configured limit of 0 leaves every row unlimited), which environment it adds (lets-plot's: Arrow's system allocator, `ARROW_DEFAULT_MEMORY_POOL=system`, because pyarrow's default pool reserves a 1 GiB arena on the first pandas string column, and `FONTCONFIG_FILE=/opt/anyplot/fonts.conf` for the fontconfig its bridge links; an in-process row's environment and limit reach the sandbox through `executor.sandbox_env` and the local Docker backend through `PythonRuntime.env`, which since 2026-10-26 is `sandbox_env` key for key, the sandbox's `PATH` and limits included, but `RLIMIT_NPROC`: the local container runs as the developer's user, whose processes on the whole machine count against it, so `--pids-limit` bounds the processes there) and what render time a repair reserves; `GET /status` reports under `languages` which toolchains the image carries, and a job in a language without one is `503 runtime_unavailable`. ### Footer strip @@ -478,7 +478,7 @@ tests/unit/agents/* tests/unit/api/test_agent_router.py tests/integration/agen `agents/anyplot/code/` exists since 2026-10-09: `validate.py` (the two-profile AST validator), `regions.py` (the AST spans of the THEME block, the Imprint palette, the placeholder, the save calls and the canvas keywords, shared by the other modules; since 2026-10-25 also the save rule per library, `SAVE_RULES`), `normalise.py`, `readiness.py`, `edits.py`, `loader.py` and `export.py`, with tests in `tests/unit/agents/code/`. Their docstrings hold the exact rules. The 13 map specs are the specs tagged both `plot_type: map` and `data_type: geospatial`. `readiness.scan` takes the spec id as a keyword argument, because the map rule needs it and the normalised code no longer carries the catalogue header. -Files to modify: `pyproject.toml` (the extra `agents = ["google-adk==2.11.0"]`; the `agents-eval` extra with `google-adk[eval]` was dropped on 2026-10-12, unused, because its litellm and nltk carried security alerts; setuptools include `agents*`; ruff `known-first-party`; coverage source; regenerate `uv.lock` and run `uv lock --check`; assert that the lock never contains `openai-agents`, which also installs a top-level `agents` module), `.dockerignore` (`!agents`, `!prompts/default-style-guide.md`, `!prompts/library`), `core/config.py` (`agent_*` settings with the pinned defaults, `_strip_secret` entries), `api/routers/debug.py`, `api/main.py`, `api/cloudbuild.yaml` (env vars, secret binding, 401 smoke), `automation/scripts/regen_gate.py` (switch to `core/defects.py`, loaded from a sibling copy in script mode, together with its copy sites), `.github/workflows/{ci-tests,ci-lint,ci-image}.yml`, a new `.github/workflows/agents-eval.yml`, `app/src/routes/{index.tsx,paths.ts}`, `global-config.ts`, `vite-env.d.ts`, `SpecPage.tsx`, `SpecDetailView.tsx`, `DebugPage.tsx`, `app/Dockerfile`, `app/cloudbuild.yaml`, `docs/index.md`, `docs/reference/{api,plausible,mcp,repository,database}.md`, `docs/development.md`, `CLAUDE.md` and `.github/copilot-instructions.md` (an `agents/**` routing row, kept in sync), and one `changelog.d/<slug>.md` per PR. `agents/Dockerfile` builds from `python:3.13-slim` with `uv sync --frozen --extra agents`, runs as a non-root user and starts `uvicorn agents.main:app --port 8080`; its `agents/` copy must include `agents/anyplot/render/fonts/`, because the service loads the footer-strip fonts at start and refuses to start without them, and it copies the catalogue prompt sources `agents/anyplot/policy.py` reads (`prompts/default-style-guide.md`, `prompts/library/`, `prompts/quality-criteria.md` and the two workflow prompts `impl-repair-claude.md` and `ai-quality-review.md`) to their repository paths; `tests/unit/agents/test_image.py` holds that list against every file an import of `agents.main` opens and against the root `.dockerignore`; the plotting extras, the fallback fonts (`/usr/share/fonts/noto`, from a `fonts` build stage that keeps only the allowlisted files of `fonts-noto-core` and `fonts-noto-cjk`) and the baked matplotlib font cache (`/opt/mplconfig`, whose bake fails when a fallback family is missing) belong to the renderer image, `agents/renderer/Dockerfile`, which installs `--extra lib-matplotlib --extra lib-seaborn`, since 2026-10-25 `--extra lib-plotnine --extra lib-altair` and since 2026-10-26 `--extra lib-pygal --extra lib-letsplot`, all without ADK. It links matplotlib's DejaVu Serif and DejaVu Sans Mono into `/usr/share/fonts` for vl-convert's `serif` and `monospace` (altair files that name those families draw no text without them) and, since 2026-10-26, DejaVu Sans next to them, which lets-plot's bridge draws its default text in (it falls back to a Noto Sans face without it). Since 2026-10-26 it also installs Debian's `libcairo2` for cairosvg, which brings `libfontconfig1`, `/etc/fonts/fonts.conf` and Debian's DejaVu core fonts (other bytes under the same names; matplotlib keeps resolving its own copies, and the seaborn, plotnine and altair renders of `ci-image.yml` stayed byte-identical), and copies `agents/renderer/fonts.conf` (one font directory, no cache directory) to `/opt/anyplot/fonts.conf` for lets-plot's row. The ImageMagick linked into lets-plot's bridge is a zero-configuration build that reads no `policy.xml`, so the image installs none of the programs its delegates run (`gs`, `curl`, `soffice`, `ffmpeg` and others), and a `ci-image.yml` step fails when any of 39 such programs is on the sandbox's `PATH` (since 2026-10-26). It copies the harness to `/opt/anyplot/harness.py`. The `deploy-renderer` trigger (an owner task) fires on `agents/renderer/**`, `agents/anyplot/render/harness.py`, `pyproject.toml` and `uv.lock`. The `deploy-agents` trigger (an owner task) fires on `agents/**` except `agents/evals/**`, `core/**`, `prompts/library/**`, `prompts/default-style-guide.md`, `prompts/quality-criteria.md`, `prompts/workflow-prompts/impl-repair-claude.md`, `prompts/workflow-prompts/ai-quality-review.md`, `pyproject.toml`, `uv.lock`, `README.md` and `.dockerignore`, so an edit to any prompt source the service sends to the model redeploys it. +Files to modify: `pyproject.toml` (the extra `agents = ["google-adk==2.11.0"]`; the `agents-eval` extra with `google-adk[eval]` was dropped on 2026-10-12, unused, because its litellm and nltk carried security alerts; setuptools include `agents*`; ruff `known-first-party`; coverage source; regenerate `uv.lock` and run `uv lock --check`; assert that the lock never contains `openai-agents`, which also installs a top-level `agents` module), `.dockerignore` (`!agents`, `!prompts/default-style-guide.md`, `!prompts/library`), `core/config.py` (`agent_*` settings with the pinned defaults, `_strip_secret` entries), `api/routers/debug.py`, `api/main.py`, `api/cloudbuild.yaml` (env vars, secret binding, 401 smoke), `automation/scripts/regen_gate.py` (switch to `core/defects.py`, loaded from a sibling copy in script mode, together with its copy sites), `.github/workflows/{ci-tests,ci-lint,ci-image}.yml`, a new `.github/workflows/agents-eval.yml`, `app/src/routes/{index.tsx,paths.ts}`, `global-config.ts`, `vite-env.d.ts`, `SpecPage.tsx`, `SpecDetailView.tsx`, `DebugPage.tsx`, `app/Dockerfile`, `app/cloudbuild.yaml`, `docs/index.md`, `docs/reference/{api,plausible,mcp,repository,database}.md`, `docs/development.md`, `CLAUDE.md` and `.github/copilot-instructions.md` (an `agents/**` routing row, kept in sync), and one `changelog.d/<slug>.md` per PR. `agents/Dockerfile` builds from `python:3.13-slim` with `uv sync --frozen --extra agents`, runs as a non-root user and starts `uvicorn agents.main:app --port 8080`; its `agents/` copy must include `agents/anyplot/render/fonts/`, because the service loads the footer-strip fonts at start and refuses to start without them, and it copies the catalogue prompt sources `agents/anyplot/policy.py` reads (`prompts/default-style-guide.md`, `prompts/library/`, `prompts/quality-criteria.md` and the two workflow prompts `impl-repair-claude.md` and `ai-quality-review.md`) to their repository paths; `tests/unit/agents/test_image.py` holds that list against every file an import of `agents.main` opens and against the root `.dockerignore`; the plotting extras, the fallback fonts (`/usr/share/fonts/noto`, from a `fonts` build stage that keeps only the allowlisted files of `fonts-noto-core` and `fonts-noto-cjk`) and the baked matplotlib font cache (`/opt/mplconfig`, whose bake fails when a fallback family is missing) belong to the renderer image, `agents/renderer/Dockerfile`, which installs `--extra lib-matplotlib --extra lib-seaborn`, since 2026-10-25 `--extra lib-plotnine --extra lib-altair` and since 2026-10-26 `--extra lib-pygal --extra lib-letsplot`, all without ADK. It links matplotlib's DejaVu Serif and DejaVu Sans Mono into `/usr/share/fonts` for vl-convert's `serif` and `monospace` (altair files that name those families draw no text without them) and, since 2026-10-26, DejaVu Sans next to them, which lets-plot's bridge draws its default text in (it falls back to a Noto Sans face without it). Since 2026-10-26 it also installs Debian's `libcairo2` for cairosvg, which brings `libfontconfig1`, `/etc/fonts/fonts.conf` and Debian's DejaVu core fonts (other bytes under the same names; matplotlib keeps resolving its own copies, and the seaborn, plotnine and altair renders of `ci-image.yml` stayed byte-identical), and copies `agents/renderer/fonts.conf` (one font directory, no cache directory) to `/opt/anyplot/fonts.conf` for lets-plot's row. The ImageMagick linked into lets-plot's bridge is a zero-configuration build that reads no `policy.xml`, so the image installs none of the programs its delegates run (`gs`, `curl`, `soffice`, `ffmpeg` and others), and the image build fails when any of 39 such programs is on the sandbox's `PATH` (`agents/renderer/delegates.py`, which `ci-image.yml` runs again in the built image; since 2026-10-26). It copies the harness to `/opt/anyplot/harness.py`. The `deploy-renderer` trigger (an owner task) fires on `agents/renderer/**`, `agents/anyplot/render/harness.py`, `pyproject.toml` and `uv.lock`. The `deploy-agents` trigger (an owner task) fires on `agents/**` except `agents/evals/**`, `core/**`, `prompts/library/**`, `prompts/default-style-guide.md`, `prompts/quality-criteria.md`, `prompts/workflow-prompts/impl-repair-claude.md`, `prompts/workflow-prompts/ai-quality-review.md`, `pyproject.toml`, `uv.lock`, `README.md` and `.dockerignore`, so an edit to any prompt source the service sends to the model redeploys it. Reused code: the `api/mcp/server.py` tool bodies move into `core/catalogue/queries.py`; `core/database/repositories.py` (`SpecRepository.get_by_id_with_code`, `ImplRepository.get_code`); `core/utils.strip_noqa_comments`; `core/constants.py` (`LIBRARIES_METADATA`, `LIBRARY_LANGUAGES`, `INTERACTIVE_LIBRARIES`); `core/palette.py`; the defect grammar through `core/defects.py` and the canvas gate and PNG auto-reject checks through `core/canvas.py`; the render invocation shape of `agentic/workflows/modules/regen/render.py` (copied, not imported); `automation/js-render/render.mjs` for the JS runtime later; the per-IP-hash rate-limit pattern of `api/routers/feedback.py` and `api/request_context.client_ip` for the public phase. diff --git a/tests/unit/agents/runtime/test_runtimes.py b/tests/unit/agents/runtime/test_runtimes.py index 6ff3728f8b2..03adccbfe6f 100644 --- a/tests/unit/agents/runtime/test_runtimes.py +++ b/tests/unit/agents/runtime/test_runtimes.py @@ -109,37 +109,42 @@ class TestRowEnvironment: """The local Docker backend renders with the library's command row as the renderer's `sandbox_env` does (1c).""" @pytest.mark.parametrize("library", sorted(RUNTIME_LIBRARIES)) - def test_the_render_env_carries_the_row_env_and_its_own_limit(self, library: str) -> None: + def test_the_render_env_is_the_renderers_key_for_key(self, library: str) -> None: + """The deployed `sandbox_env` of the library's row, but for the two paths of the image's font cache, which a + local render names as the image does, and the process limit, which the container's `--pids-limit` replaces + (`PythonRuntime.env`): the PATH the delegate check reads, the file size, the threads and every row value.""" from agents.renderer.commands import command_for - from agents.renderer.executor import ExecutorConfig, sandbox_env + from agents.renderer.executor import SANDBOX_PATH, ExecutorConfig, sandbox_env from agents.renderer.settings import RendererSettings row = command_for("python", library) - local = runtime_for(library).env("dark") + local = runtime_for(library, cpu_seconds=60).env("dark") deployed = sandbox_env(ExecutorConfig.from_settings(RendererSettings()), "dark", 60, command=row) - for key, value in row.env.items(): - assert local[key] == deployed[key] == value, key - if row.rlimit_as_mb is not None: - assert local["ANYPLOT_RLIMIT_AS_MB"] == deployed["ANYPLOT_RLIMIT_AS_MB"] == str(row.rlimit_as_mb) - else: - assert "ANYPLOT_RLIMIT_AS_MB" not in local # a local render keeps no configured limit, as before 1c - assert local["ANYPLOT_THEME"] == "dark" and local["MPLBACKEND"] == "Agg" and local["HOME"] == "/tmp" + own_paths = {"MPLCONFIGDIR", "ANYPLOT_MPL_SEED"} + deployed.pop("ANYPLOT_RLIMIT_NPROC", None) + + assert set(local) == set(deployed) + assert {key: value for key, value in local.items() if key not in own_paths} == { + key: value for key, value in deployed.items() if key not in own_paths + } + assert local["PATH"] == SANDBOX_PATH and "ANYPLOT_RLIMIT_NPROC" not in local + assert ("ANYPLOT_RLIMIT_AS_MB" in local) is row.rlimit_as # altair's V8 runs without one + + def test_the_deployed_limits_are_the_renderers_defaults(self) -> None: + from agents.anyplot.render.runtimes.python import DATA_RLIMIT_AS_MB, DATA_RLIMIT_NPROC, RENDER_RLIMIT_FSIZE_MB + from agents.renderer.settings import RendererSettings + + deployed = RendererSettings() + assert (DATA_RLIMIT_AS_MB, DATA_RLIMIT_NPROC, RENDER_RLIMIT_FSIZE_MB) == ( + deployed.rlimit_as_mb, + deployed.rlimit_nproc, + deployed.rlimit_fsize_mb, + ) def test_lets_plot_gets_its_allocator_fontconfig_and_limit_locally(self) -> None: env = runtime_for("letsplot", cpu_seconds=45).env("light") assert env["ARROW_DEFAULT_MEMORY_POOL"] == "system" and env["FONTCONFIG_FILE"] == "/opt/anyplot/fonts.conf" assert env["ANYPLOT_RLIMIT_AS_MB"] == "2048" and env["ANYPLOT_RLIMIT_CPU_S"] == "45" - def test_the_other_python_libraries_keep_the_render_env_they_had(self) -> None: - keys = { - "ANYPLOT_THEME", - "MPLBACKEND", - "MPLCONFIGDIR", - "ANYPLOT_MPL_SEED", - "HOME", - "PYTHONDONTWRITEBYTECODE", - "ANYPLOT_RLIMIT_CPU_S", - } - for library in ("matplotlib", "seaborn", "plotnine", "altair", "pygal"): - assert set(runtime_for(library).env("light")) == keys, library - assert set(PythonRuntime().env("light")) == keys + def test_a_runtime_without_a_library_renders_as_matplotlib(self) -> None: + assert PythonRuntime().env("light") == runtime_for("matplotlib").env("light")