diff --git a/.gitignore b/.gitignore
index ee5f51a..2f295e9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -146,4 +146,6 @@ cython_debug/
/output
# Pycache
-*.pyc
\ No newline at end of file
+*.pyc
+# AgentOps session artifacts
+.agents/
diff --git a/drillholes-demo/app.py b/drillholes-demo/app.py
new file mode 100644
index 0000000..4b5ec83
--- /dev/null
+++ b/drillholes-demo/app.py
@@ -0,0 +1,116 @@
+import dash
+from dash import dcc, html, Input, Output, callback, clientside_callback
+import dash_mantine_components as dmc
+
+from pages import cross_section, downhole_logs, comparison, explorer, block_model
+from utils import create_header, create_nav_sidebar, NAV_ITEMS
+import callbacks.cross_section # noqa: F401 — registers callbacks
+import callbacks.downhole # noqa: F401
+import callbacks.comparison # noqa: F401
+import callbacks.block_model # noqa: F401
+# Explorer page is fully driven by assets/explorer.js — no Python callbacks.
+
+app = dash.Dash(
+ __name__,
+ meta_tags=[{"name": "viewport", "content": "width=device-width, initial-scale=1"}],
+ external_stylesheets=dmc.styles.ALL,
+ suppress_callback_exceptions=True,
+)
+app.title = "Drillhole Visualizer — WA Au-Cu Porphyry"
+server = app.server
+
+app.layout = dmc.MantineProvider(
+ id="mantine-provider",
+ forceColorScheme="light",
+ children=[
+ dcc.Location(id="url", refresh=False),
+ dcc.Store(id="measure-store"),
+ dmc.AppShell(
+ [
+ dmc.AppShellHeader(create_header(), withBorder=True),
+ dmc.AppShellMain(
+ html.Div(
+ [
+ create_nav_sidebar(),
+ dmc.Container(id="page-content", fluid=True, p="md", className="main-content"),
+ ],
+ className="main-layout",
+ ),
+ ),
+ ],
+ header={"height": 60},
+ padding=0,
+ ),
+ ],
+)
+
+clientside_callback(
+ """
+ function(n_clicks) {
+ if (n_clicks === undefined || n_clicks === null) {
+ var nu = window.dash_clientside.no_update;
+ return [nu, nu, nu, nu, nu, nu, nu, nu];
+ }
+ var collapsed = (n_clicks % 2) !== 0;
+ if (collapsed) {
+ return [
+ "filter-sidebar collapsed",
+ "pad-0 justify-center",
+ "basil:caret-right-solid",
+ {"display": "none"},
+ null,
+ {"display": "none"},
+ {"display": "none"},
+ {"display": "none"}
+ ];
+ }
+ return [
+ "filter-sidebar",
+ "title-pad space-between",
+ "charm:cross",
+ null,
+ {"display": "none"},
+ null,
+ null,
+ null
+ ];
+ }
+ """,
+ Output("filter-sidebar", "className"),
+ Output("sidebar-title-div", "className"),
+ Output("sidebar-btn-icon", "icon"),
+ Output("sidebar-title", "style"),
+ Output("sidebar-collapsed-title-div", "style"),
+ Output("sidebar-outer-div", "style"),
+ Output("sidebar-inner-div", "style"),
+ Output("sidebar-btn-div", "style"),
+ Input("sidebar-btn", "n_clicks"),
+)
+
+
+@callback(Output("page-content", "children"), Input("url", "pathname"))
+def display_page(pathname):
+ if pathname == "/downhole-logs":
+ return downhole_logs.layout()
+ elif pathname == "/comparison":
+ return comparison.layout()
+ elif pathname == "/explorer":
+ return explorer.layout()
+ elif pathname == "/block-model":
+ return block_model.layout()
+ else:
+ return cross_section.layout()
+
+
+@callback(
+ [Output(item["id"], "active") for item in NAV_ITEMS],
+ Input("url", "pathname"),
+)
+def update_nav_active(pathname):
+ path = pathname or "/"
+ return [item["href"] == path for item in NAV_ITEMS]
+
+
+if __name__ == "__main__":
+ app.run(debug=True, port=8051)
+
diff --git a/drillholes-demo/assets/explorer.js b/drillholes-demo/assets/explorer.js
new file mode 100644
index 0000000..4fbfa75
--- /dev/null
+++ b/drillholes-demo/assets/explorer.js
@@ -0,0 +1,588 @@
+/*
+ * Drill-Hole Cross-Section Explorer — port of the CodePen of the same name.
+ *
+ * The CodePen renders into a single #chart div with raw Plotly.js. Dash
+ * unmounts/remounts the page on every SPA route change, so we wrap the
+ * codepen body in a MutationObserver-driven init() that re-binds whenever
+ * the #explorer-chart div appears in the DOM. assets/*.js loads on every
+ * Dash page; the early-out at the top of init() makes this a no-op when
+ * the explorer page isn't mounted.
+ */
+(function () {
+ var initialized = false;
+ var retryTimer = null;
+
+ function scheduleRetry() {
+ if (retryTimer) return;
+ retryTimer = setTimeout(function () {
+ retryTimer = null;
+ init();
+ }, 100);
+ }
+
+ function init() {
+ var gd = document.getElementById("explorer-chart");
+ if (!gd) {
+ initialized = false;
+ return;
+ }
+ if (initialized) return;
+ // Dash 4 lazy-loads Plotly.js when a dcc.Graph mounts. Poll until it's
+ // available rather than bailing once.
+ if (!window.Plotly) {
+ scheduleRetry();
+ return;
+ }
+ initialized = true;
+
+ /* ===== begin verbatim CodePen JS ===== */
+ var holeNames = ["DH-001", "DH-002", "DH-003", "DH-004"];
+ var holeColors = ["#2563eb", "#16a34a", "#d97706", "#9333ea"];
+ var yAxes = ["y", "y2", "y3", "y4"];
+ var xAxes = ["x", "x2", "x3", "x4"];
+ var domainXs = [
+ [0.05, 0.22],
+ [0.3, 0.47],
+ [0.55, 0.72],
+ [0.8, 0.97],
+ ];
+
+ function makeLog(seed, nPoints) {
+ var depths = [],
+ values = [];
+ var v = 30 + seed * 5;
+ for (var i = 0; i <= nPoints; i++) {
+ var d = i * (100 / nPoints);
+ depths.push(d);
+ v +=
+ Math.sin(d * 0.12 + seed) * 3 +
+ Math.cos(d * 0.07 - seed * 2) * 2 +
+ (Math.random() - 0.5) * 4;
+ v = Math.max(5, Math.min(95, v));
+ if (d > 35 + seed * 3 && d < 70 - seed * 2) v += 15;
+ values.push(v);
+ }
+ return { depths: depths, values: values };
+ }
+
+ var units = [
+ {
+ name: "Overburden",
+ tops: [0, 0, 0, 0],
+ bots: [10, 8, 13, 9],
+ fill: "rgba(139,90,43,0.22)",
+ line: "rgba(139,90,43,0.7)",
+ },
+ {
+ name: "Upper Sandstone",
+ tops: [10, 8, 13, 9],
+ bots: [28, 25, 30, 26],
+ fill: "rgba(194,178,128,0.22)",
+ line: "rgba(194,178,128,0.7)",
+ },
+ {
+ name: "Ore Zone",
+ tops: [28, 25, 30, 26],
+ bots: [68, 64, 72, 66],
+ fill: "rgba(220,50,50,0.18)",
+ line: "rgba(220,50,50,0.7)",
+ },
+ {
+ name: "Lower Shale",
+ tops: [68, 64, 72, 66],
+ bots: [85, 82, 88, 84],
+ fill: "rgba(80,120,80,0.18)",
+ line: "rgba(80,120,80,0.7)",
+ },
+ {
+ name: "Basement Gneiss",
+ tops: [85, 82, 88, 84],
+ bots: [100, 100, 100, 100],
+ fill: "rgba(100,100,160,0.18)",
+ line: "rgba(100,100,160,0.7)",
+ },
+ ];
+
+ var traces = [];
+ for (var h = 0; h < 4; h++) {
+ var log = makeLog(h, 80);
+ var c = holeColors[h];
+ var r = parseInt(c.slice(1, 3), 16),
+ g = parseInt(c.slice(3, 5), 16),
+ b = parseInt(c.slice(5, 7), 16);
+ traces.push({
+ x: log.values,
+ y: log.depths,
+ xaxis: xAxes[h],
+ yaxis: yAxes[h],
+ type: "scatter",
+ mode: "lines",
+ name: holeNames[h],
+ line: { color: c, width: 1.5 },
+ fill: "tozerox",
+ fillcolor: "rgba(" + r + "," + g + "," + b + ",0.18)",
+ hoverinfo: "none",
+ });
+ }
+
+ var baseShapes = [];
+
+ units.forEach(function (u) {
+ for (var i = 0; i < 3; i++) {
+ baseShapes.push({
+ type: "path",
+ xref: "paper",
+ yref: [yAxes[i], yAxes[i + 1], yAxes[i + 1], yAxes[i]],
+ path:
+ "M " +
+ domainXs[i][1] +
+ " " +
+ u.tops[i] +
+ " L " +
+ domainXs[i + 1][0] +
+ " " +
+ u.tops[i + 1] +
+ " L " +
+ domainXs[i + 1][0] +
+ " " +
+ u.bots[i + 1] +
+ " L " +
+ domainXs[i][1] +
+ " " +
+ u.bots[i] +
+ " Z",
+ fillcolor: u.fill,
+ line: { color: u.line, width: 1 },
+ });
+ }
+ });
+
+ for (var hh = 0; hh < 4; hh++) {
+ baseShapes.push({
+ type: "rect",
+ xref: xAxes[hh],
+ yref: yAxes[hh],
+ x0: 0,
+ x1: 100,
+ y0: units[2].tops[hh],
+ y1: units[2].bots[hh],
+ fillcolor: "rgba(220,50,50,0.10)",
+ line: { width: 0 },
+ layer: "below",
+ });
+ }
+
+ var depthRange = [105, -5];
+ var valRange = [0, 100];
+
+ function yAxisCfg(extra) {
+ return Object.assign(
+ {
+ range: depthRange,
+ gridcolor: "#ecedf0",
+ zerolinecolor: "#e2e4e9",
+ linecolor: "#d1d5db",
+ tickfont: { color: "#6b7280", size: 9 },
+ },
+ extra || {}
+ );
+ }
+
+ function xAxisCfg(domain, anchor, title) {
+ return {
+ domain: domain,
+ anchor: anchor,
+ range: valRange,
+ gridcolor: "#ecedf0",
+ zerolinecolor: "#e2e4e9",
+ linecolor: "#d1d5db",
+ tickfont: { color: "#6b7280", size: 9 },
+ title: {
+ text: title,
+ font: { size: 11, color: "#4b5563" },
+ standoff: 6,
+ },
+ };
+ }
+
+ var layout = {
+ paper_bgcolor: "#fff",
+ plot_bgcolor: "#fafbfc",
+ font: { color: "#1e2028" },
+ margin: { l: 55, r: 16, t: 44, b: 44 },
+ showlegend: true,
+ legend: {
+ x: 0.5,
+ y: 1.07,
+ xanchor: "center",
+ orientation: "h",
+ bgcolor: "rgba(255,255,255,0)",
+ font: { color: "#4b5563", size: 11 },
+ },
+
+ hoveranywhere: true,
+ clickanywhere: true,
+ hovermode: "closest",
+
+ shapes: baseShapes.slice(),
+
+ yaxis: yAxisCfg({
+ domain: [0, 1],
+ anchor: "x",
+ title: {
+ text: "Depth (m)",
+ font: { size: 11, color: "#4b5563" },
+ standoff: 6,
+ },
+ }),
+ yaxis2: yAxisCfg({
+ domain: [0, 1],
+ anchor: "x2",
+ title: {
+ text: "Depth (m)",
+ font: { size: 11, color: "#4b5563" },
+ standoff: 6,
+ },
+ }),
+ yaxis3: yAxisCfg({
+ domain: [0, 1],
+ anchor: "x3",
+ title: {
+ text: "Depth (m)",
+ font: { size: 11, color: "#4b5563" },
+ standoff: 6,
+ },
+ }),
+ yaxis4: yAxisCfg({
+ domain: [0, 1],
+ anchor: "x4",
+ title: {
+ text: "Depth (m)",
+ font: { size: 11, color: "#4b5563" },
+ standoff: 6,
+ },
+ }),
+
+ xaxis: xAxisCfg(domainXs[0], "y", "DH-001"),
+ xaxis2: xAxisCfg(domainXs[1], "y2", "DH-002"),
+ xaxis3: xAxisCfg(domainXs[2], "y3", "DH-003"),
+ xaxis4: xAxisCfg(domainXs[3], "y4", "DH-004"),
+
+ annotations: [],
+ };
+
+ var clicks = [];
+
+ function dot(xa, ya, xval, depth) {
+ var axObj =
+ gd._fullLayout[ya === "y" ? "yaxis" : "yaxis" + ya.slice(1)];
+ var xAxObj =
+ gd._fullLayout[xa === "x" ? "xaxis" : "xaxis" + xa.slice(1)];
+ var px = 4;
+ var rx =
+ (px * (xAxObj.range[1] - xAxObj.range[0])) / (xAxObj._length || 1);
+ var ry =
+ (px * (axObj.range[1] - axObj.range[0])) / (axObj._length || 1);
+ return {
+ type: "circle",
+ xref: xa,
+ yref: ya,
+ x0: xval - rx,
+ x1: xval + rx,
+ y0: depth - ry,
+ y1: depth + ry,
+ fillcolor: "rgba(220,38,38,0.5)",
+ line: { color: "#dc2626", width: 1.5 },
+ };
+ }
+
+ function getClickInfo(data) {
+ var depth, xval, holeIdx;
+ if (data.points && data.points.length > 0) {
+ var pt = data.points[0];
+ depth = pt.y;
+ xval = pt.x;
+ var traceXa = pt.data.xaxis || "x";
+ holeIdx =
+ traceXa === "x" ? 0 : parseInt(traceXa.replace("x", "")) - 1;
+ } else if (data.yvals && data.yvals.length > 0) {
+ depth = data.yvals[0];
+ xval = data.xvals ? data.xvals[0] : 50;
+ if (data.xaxes && data.xaxes.length > 0) {
+ var axId = data.xaxes[0]._id || "";
+ holeIdx = axId === "x" ? 0 : parseInt(axId.replace("x", "")) - 1;
+ }
+ }
+ if (depth !== undefined && holeIdx !== undefined) {
+ return { depth: depth, xval: xval, holeIdx: holeIdx };
+ }
+ return null;
+ }
+
+ Plotly.newPlot(gd, traces, layout, {
+ responsive: true,
+ displayModeBar: true,
+ modeBarButtonsToRemove: ["lasso2d", "select2d"],
+ displaylogo: false,
+ }).then(function () {
+ gd.on("plotly_hover", function (d) {
+ var gs = gd._fullLayout._size;
+ var layer = gd._fullLayout._hoverlayer;
+
+ layer.selectAll(".pseudo-spike").remove();
+
+ var yPos = d.event.offsetY;
+
+ layer
+ .insert("line", ":first-child")
+ .attr({
+ x1: gs.l,
+ x2: gs.l + gs.w,
+ y1: yPos,
+ y2: yPos,
+ "stroke-width": 1,
+ stroke: "rgba(100,100,100,0.4)",
+ "stroke-dasharray": "4,3",
+ })
+ .classed("pseudo-spike", true);
+
+ var depthVal = d.yvals
+ ? d.yvals[0]
+ : d.points && d.points.length > 0
+ ? d.points[0].y
+ : null;
+ if (depthVal !== null) {
+ layer
+ .append("rect")
+ .attr({
+ x: gs.l - 52,
+ y: yPos - 9,
+ width: 48,
+ height: 18,
+ rx: 3,
+ fill: "#4b5563",
+ })
+ .classed("pseudo-spike", true);
+ layer
+ .append("text")
+ .attr({
+ x: gs.l - 48,
+ y: yPos + 4,
+ fill: "white",
+ "font-size": "10px",
+ "font-family": "Inter, Segoe UI, system-ui, sans-serif",
+ })
+ .text(depthVal.toFixed(1) + " m")
+ .classed("pseudo-spike", true);
+ }
+
+ if (d.points && d.points.length > 0) {
+ var pt = d.points[0];
+ var tc = pt.data.line.color;
+ var xax = pt.xaxis;
+ var yax = pt.yaxis;
+
+ var mkX =
+ xax._offset +
+ ((pt.x - xax.range[0]) / (xax.range[1] - xax.range[0])) *
+ xax._length;
+ var mkY =
+ yax._offset +
+ ((pt.y - yax.range[1]) / (yax.range[0] - yax.range[1])) *
+ yax._length;
+
+ layer
+ .append("circle")
+ .attr({
+ cx: mkX,
+ cy: mkY,
+ r: 4.5,
+ fill: tc,
+ stroke: "white",
+ "stroke-width": 2,
+ })
+ .classed("pseudo-spike", true);
+
+ var yStr = pt.y.toFixed(1) + " m";
+ var lblW = yStr.length * 6.5 + 18;
+ var lblH = 20;
+ var gap = 10;
+ var lx = mkX + gap;
+ if (lx + lblW > gs.l + gs.w) lx = mkX - lblW - gap;
+ var ly = mkY - lblH / 2;
+
+ layer
+ .append("rect")
+ .attr({ x: lx, y: ly, width: lblW, height: lblH, rx: 10, fill: tc })
+ .classed("pseudo-spike", true);
+
+ layer
+ .append("text")
+ .attr({
+ x: lx + lblW / 2,
+ y: ly + 13,
+ fill: "white",
+ "font-size": "10.5px",
+ "font-family": "Inter, Segoe UI, system-ui, sans-serif",
+ "font-weight": "600",
+ "text-anchor": "middle",
+ })
+ .text(yStr)
+ .classed("pseudo-spike", true);
+ }
+
+ var depth, holeName, xval;
+ if (d.points && d.points.length > 0) {
+ var pt2 = d.points[0];
+ depth = pt2.y;
+ xval = pt2.x;
+ holeName = pt2.data.name;
+ } else if (d.yvals && d.yvals.length > 0) {
+ depth = d.yvals[0];
+ xval = d.xvals ? d.xvals[0] : null;
+ if (d.xaxes && d.xaxes.length > 0) {
+ var axId = d.xaxes[0]._id || "";
+ var hIdx = axId === "x" ? 0 : parseInt(axId.replace("x", "")) - 1;
+ holeName = holeNames[hIdx] || "--";
+ }
+ }
+ if (depth !== undefined) {
+ var depthEl = document.getElementById("cursor-depth");
+ var holeEl = document.getElementById("cursor-hole");
+ var valueEl = document.getElementById("cursor-value");
+ if (depthEl) depthEl.textContent = depth.toFixed(1) + " m";
+ if (holeEl) holeEl.textContent = holeName || "--";
+ if (valueEl)
+ valueEl.textContent =
+ xval !== null && xval !== undefined ? xval.toFixed(1) : "--";
+ }
+ });
+
+ gd.on("plotly_unhover", function () {
+ if (gd._fullLayout && gd._fullLayout._hoverlayer) {
+ gd._fullLayout._hoverlayer.selectAll(".pseudo-spike").remove();
+ }
+ var depthEl = document.getElementById("cursor-depth");
+ var holeEl = document.getElementById("cursor-hole");
+ var valueEl = document.getElementById("cursor-value");
+ if (depthEl) depthEl.textContent = "--";
+ if (holeEl) holeEl.textContent = "--";
+ if (valueEl) valueEl.textContent = "--";
+ });
+
+ gd.on("plotly_click", function (data) {
+ var info = getClickInfo(data);
+ if (!info) return;
+
+ var distEl = document.getElementById("distance-result");
+ var xa = xAxes[info.holeIdx];
+ var ya = yAxes[info.holeIdx];
+
+ if (clicks.length >= 2) {
+ clicks = [];
+ Plotly.relayout(gd, {
+ shapes: baseShapes.slice(),
+ annotations: [],
+ });
+ if (distEl) distEl.style.display = "none";
+ return;
+ }
+
+ clicks.push({
+ depth: info.depth,
+ xval: info.xval,
+ holeIdx: info.holeIdx,
+ xa: xa,
+ ya: ya,
+ });
+
+ if (clicks.length === 1) {
+ if (distEl) {
+ distEl.style.display = "block";
+ distEl.innerHTML =
+ "Point 1: " +
+ info.depth.toFixed(1) +
+ " m on " +
+ holeNames[info.holeIdx];
+ }
+ Plotly.relayout(gd, {
+ shapes: baseShapes.concat([dot(xa, ya, info.xval, info.depth)]),
+ annotations: [],
+ });
+ } else {
+ var a = clicks[0],
+ b = clicks[1];
+
+ if (a.holeIdx !== b.holeIdx) {
+ clicks.pop();
+ return;
+ }
+
+ var dist = Math.abs(b.depth - a.depth);
+ var mx = (a.xval + b.xval) / 2;
+ var my = (a.depth + b.depth) / 2;
+
+ if (distEl) {
+ distEl.style.display = "block";
+ distEl.innerHTML =
+ "" +
+ dist.toFixed(1) +
+ " m on " +
+ holeNames[a.holeIdx];
+ }
+
+ Plotly.relayout(gd, {
+ shapes: baseShapes.concat([
+ dot(a.xa, a.ya, a.xval, a.depth),
+ dot(b.xa, b.ya, b.xval, b.depth),
+ {
+ type: "line",
+ xref: a.xa,
+ yref: a.ya,
+ x0: a.xval,
+ y0: a.depth,
+ x1: b.xval,
+ y1: b.depth,
+ line: { color: "#dc2626", width: 2 },
+ },
+ ]),
+ annotations: [
+ {
+ x: mx,
+ y: my,
+ xref: a.xa,
+ yref: a.ya,
+ text: dist.toFixed(1) + " m",
+ showarrow: false,
+ font: { color: "#dc2626", size: 12 },
+ bgcolor: "rgba(255,255,255,0.9)",
+ bordercolor: "#dc2626",
+ borderwidth: 1,
+ borderpad: 4,
+ },
+ ],
+ });
+ }
+ });
+ });
+ /* ===== end verbatim CodePen JS ===== */
+ }
+
+ var observer = new MutationObserver(function () {
+ if (!document.getElementById("explorer-chart")) {
+ initialized = false;
+ return;
+ }
+ init();
+ });
+
+ if (document.body) {
+ observer.observe(document.body, { childList: true, subtree: true });
+ } else {
+ document.addEventListener("DOMContentLoaded", function () {
+ observer.observe(document.body, { childList: true, subtree: true });
+ init();
+ });
+ }
+ init();
+})();
diff --git a/drillholes-demo/assets/plotly-logo-old.png b/drillholes-demo/assets/plotly-logo-old.png
new file mode 100644
index 0000000..653c836
Binary files /dev/null and b/drillholes-demo/assets/plotly-logo-old.png differ
diff --git a/drillholes-demo/assets/plotly-logo.png b/drillholes-demo/assets/plotly-logo.png
new file mode 100644
index 0000000..a037590
Binary files /dev/null and b/drillholes-demo/assets/plotly-logo.png differ
diff --git a/drillholes-demo/assets/styles.css b/drillholes-demo/assets/styles.css
new file mode 100644
index 0000000..2b36734
--- /dev/null
+++ b/drillholes-demo/assets/styles.css
@@ -0,0 +1,390 @@
+/* ===== Base ===== */
+*, *::before, *::after { box-sizing: border-box; }
+
+body {
+ background-color: #f8f9fa;
+ color: #495057;
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+ margin: 0;
+ padding: 0;
+ min-height: 100vh;
+}
+
+/* ===== Scrollbars ===== */
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: rgba(0, 0, 0, 0.05);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb {
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: rgba(0, 0, 0, 0.3);
+}
+
+/* ===== AppShell header ===== */
+.app-header {
+ background: #ffffff;
+ border-bottom: 1px solid #dee2e6;
+}
+
+.brand-title {
+ font-size: 1.05rem;
+ font-weight: 700;
+ color: #212529;
+ letter-spacing: -0.01em;
+ margin: 0;
+}
+
+.brand-subtitle {
+ font-size: 0.78rem;
+ color: #6c757d;
+ margin: 0;
+}
+
+/* ===== Collapsible Nav Sidebar ===== */
+.filter-sidebar {
+ width: 220px;
+ min-width: 220px;
+ flex-shrink: 0;
+ transition: width 0.2s ease;
+ display: flex !important;
+ flex-direction: column !important;
+ background-color: #ffffff !important;
+ border-right: 1px solid #dee2e6 !important;
+}
+
+.filter-sidebar.collapsed {
+ width: 50px !important;
+ min-width: 50px !important;
+}
+
+.sidebar-outer {
+ overflow-y: auto;
+ flex: 1;
+ padding: 4px 0;
+}
+
+.sidebar-inner {
+ overflow-x: hidden;
+ scrollbar-width: thin;
+}
+
+.sidebar-collapsed-title {
+ width: 150px;
+ color: #adb5bd;
+ font-size: 12px;
+ white-space: pre;
+ letter-spacing: 0.04em;
+}
+
+.sidebar-btn {
+ border-radius: 4px !important;
+}
+
+.title-pad {
+ padding: 22px 12px 10px 12px !important;
+ border-bottom: 1px solid #f1f3f5;
+}
+
+/* Layout helpers */
+.flex-column { flex-direction: column; }
+.justify-center { justify-content: center; }
+.space-between { justify-content: space-between; }
+.pad-0 { padding: 0 !important; }
+
+/* Main content flex wrapper */
+.main-layout {
+ display: flex;
+ height: 100%;
+ min-height: 0;
+}
+
+.main-content {
+ flex: 1;
+ min-width: 0;
+ overflow: auto;
+}
+
+/* Sidebar NavLink styling */
+.filter-sidebar .mantine-NavLink-root {
+ border-radius: 6px;
+ font-size: 0.85rem;
+ color: #6c757d;
+ margin: 1px 6px;
+ padding: 8px 10px;
+}
+
+.filter-sidebar .mantine-NavLink-root:hover {
+ background-color: #f1f3f5;
+ color: #343a40;
+}
+
+.filter-sidebar .mantine-NavLink-root[data-active="true"] {
+ background-color: #fff7e6;
+ color: #d48806;
+ font-weight: 600;
+ border-left: 3px solid #e8a020;
+ border-radius: 0 6px 6px 0;
+ padding-left: 7px;
+}
+
+/* ===== Paper hover elevation ===== */
+.mantine-Paper-root {
+ transition: box-shadow 0.2s ease;
+}
+
+.mantine-Paper-root:hover {
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+}
+
+/* ===== KPI cards ===== */
+.kpi-card {
+ background: #ffffff !important;
+ border: 1px solid #dee2e6 !important;
+ border-top: 3px solid #e8a020 !important;
+}
+
+/* ===== Chart containers ===== */
+.chart-paper {
+ background: #ffffff !important;
+ border: 1px solid #dee2e6 !important;
+}
+
+/* ===== Strip log panels ===== */
+.strip-log-panel {
+ border-right: 1px solid #dee2e6;
+}
+
+/* ===== Measurement readout ===== */
+.measure-readout {
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
+ font-size: 0.85rem;
+ color: #d48806;
+ background: #fff7e6;
+ border: 1px solid #ffd666;
+ border-radius: 6px;
+ padding: 8px 12px;
+ min-height: 36px;
+ display: flex;
+ align-items: center;
+}
+
+/* ===== Table ===== */
+.data-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.8rem;
+}
+
+.data-table th {
+ background: #f1f3f5;
+ color: #6c757d;
+ text-transform: uppercase;
+ font-size: 0.7rem;
+ font-weight: 600;
+ letter-spacing: 0.05em;
+ padding: 8px 10px;
+ text-align: left;
+ border-bottom: 2px solid #dee2e6;
+}
+
+.data-table td {
+ padding: 6px 10px;
+ border-bottom: 1px solid #e9ecef;
+ color: #495057;
+}
+
+.data-table tr:hover td {
+ background: #f8f9fa;
+}
+
+/* ===== Scrollable table wrapper ===== */
+.table-scroll {
+ max-height: 420px;
+ overflow-y: auto;
+}
+
+.table-scroll::-webkit-scrollbar { width: 5px; }
+.table-scroll::-webkit-scrollbar-track { background: #f1f3f5; }
+.table-scroll::-webkit-scrollbar-thumb { background: #ced4da; border-radius: 3px; }
+
+/* ===== Section titles ===== */
+.section-title {
+ font-size: 0.9rem;
+ font-weight: 600;
+ color: #212529;
+ margin: 0 0 4px;
+}
+
+.section-description {
+ font-size: 0.75rem;
+ color: #6c757d;
+ margin: 0 0 12px;
+}
+
+/* ===== Legend swatch ===== */
+.lith-swatch {
+ display: inline-block;
+ width: 12px;
+ height: 12px;
+ border-radius: 2px;
+ margin-right: 6px;
+ vertical-align: middle;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+/* ===== Depth cursor line — targeted via JS class injection ===== */
+.depth-cursor-line {
+ stroke: #e8a020 !important;
+ stroke-width: 1.5px !important;
+ stroke-dasharray: 5, 3 !important;
+ opacity: 0.85 !important;
+}
+
+/* ===== Mantine overrides ===== */
+.mantine-Badge-root {
+ text-transform: none;
+}
+
+.mantine-NavLink-root[data-active="true"] {
+ font-weight: 600;
+}
+
+/* ===== Plotly modebar ===== */
+.js-plotly-plot .plotly .modebar {
+ top: 5px !important;
+ right: 5px !important;
+}
+
+.js-plotly-plot .plotly .modebar-btn {
+ font-size: 14px !important;
+}
+
+/* ===== Tip paper (accent left border) ===== */
+.tip-paper {
+ display: none !important;
+ border-left: 3px solid #e8a020 !important;
+}
+
+/* ===== Y-axis interaction hint overlay ===== */
+.y-axis-hint {
+ position: absolute;
+ left: 62px;
+ top: 54px;
+ font-size: 9px;
+ color: #adb5bd;
+ background: rgba(255, 255, 255, 0.93);
+ padding: 2px 8px;
+ border-radius: 10px;
+ border: 1px solid #dee2e6;
+ pointer-events: none;
+ z-index: 10;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ white-space: nowrap;
+ font-family: Inter, sans-serif;
+ animation: hint-fade-in 0.9s ease-out;
+}
+
+@keyframes hint-fade-in {
+ from { opacity: 0; transform: translateY(-4px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* ===== Feature chip badges ===== */
+.feature-chips .mantine-Badge-root {
+ cursor: help;
+}
+
+/* ===== DashTour overrides ===== */
+[data-tour-elem="helper"] {
+ font-family: Inter, -apple-system, sans-serif !important;
+ font-size: 0.875rem !important;
+ color: #212529 !important;
+ line-height: 1.5 !important;
+ max-width: 320px !important;
+}
+
+[data-tour-elem="badge"] {
+ background: #e8a020 !important;
+}
+
+/* ===== Responsive ===== */
+@media (max-width: 768px) {
+ .brand-title { font-size: 0.95rem; }
+ .brand-subtitle { display: none; }
+ .horizontal-nav .mantine-NavLink-root { padding: 6px 10px; font-size: 0.8rem; }
+ .horizontal-nav .mantine-NavLink-label { font-size: 0.8rem; }
+}
+
+@media print {
+ .mantine-AppShell-header,
+ .mantine-Button-root,
+ .mantine-Select-root,
+ .mantine-MultiSelect-root {
+ display: none !important;
+ }
+
+ .mantine-Paper-root {
+ break-inside: avoid;
+ box-shadow: none !important;
+ border: 1px solid #dee2e6 !important;
+ }
+}
+
+/* ===== Explorer page sidebar (CodePen port) ===== */
+.explorer-info-panel {
+ background: #f8f9fb !important;
+}
+
+.explorer-panel-title {
+ font-size: 10px;
+ text-transform: uppercase;
+ letter-spacing: 0.8px;
+ color: #8b8fa3;
+ font-weight: 600;
+ margin: 0 0 8px;
+}
+
+.explorer-info-row {
+ display: flex;
+ justify-content: space-between;
+ padding: 6px 0;
+ font-size: 12px;
+ border-bottom: 1px solid #ecedf0;
+}
+
+.explorer-info-row:last-child {
+ border-bottom: none;
+}
+
+.explorer-info-label {
+ color: #8b8fa3;
+}
+
+.explorer-info-value {
+ color: #1e2028;
+ font-weight: 500;
+ font-variant-numeric: tabular-nums;
+}
+
+.explorer-distance-result {
+ background: #eef4ff;
+ border: 1px solid #b6d0f7;
+ border-radius: 6px;
+ padding: 8px 12px;
+ margin-top: 6px;
+ font-size: 12px;
+ color: #2563eb;
+ display: none;
+}
diff --git a/drillholes-demo/callbacks/__init__.py b/drillholes-demo/callbacks/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/drillholes-demo/callbacks/block_model.py b/drillholes-demo/callbacks/block_model.py
new file mode 100644
index 0000000..a1be587
--- /dev/null
+++ b/drillholes-demo/callbacks/block_model.py
@@ -0,0 +1,30 @@
+from dash import callback, Input, Output, Patch, no_update
+
+
+@callback(
+ Output("bm-grid", "dashGridOptions"),
+ Input("bm-quick-filter", "value"),
+)
+def update_quick_filter(search_value):
+ patch = Patch()
+ patch["quickFilterText"] = search_value or ""
+ return patch
+
+
+@callback(
+ Output("bm-row-count", "children"),
+ Input("bm-grid", "virtualRowData"),
+)
+def update_row_count(virtual_rows):
+ if virtual_rows is None:
+ return no_update
+ return f"{len(virtual_rows):,} rows"
+
+
+@callback(
+ Output("bm-grid", "exportDataAsCsv"),
+ Input("bm-export-btn", "n_clicks"),
+ prevent_initial_call=True,
+)
+def export_csv(n_clicks):
+ return True
diff --git a/drillholes-demo/callbacks/comparison.py b/drillholes-demo/callbacks/comparison.py
new file mode 100644
index 0000000..5cbec8d
--- /dev/null
+++ b/drillholes-demo/callbacks/comparison.py
@@ -0,0 +1,31 @@
+from dash import Input, Output, callback
+from pages.comparison import build_comparison_figure
+from utils import load_data, GRADE_LABELS
+
+
+@callback(
+ Output("comparison-chart", "figure"),
+ [Input("hole-checklist", "value"),
+ Input("grade-selector", "value")],
+)
+def update_comparison(selected_holes, grade_col):
+ holes = (selected_holes or [])[:10]
+ return build_comparison_figure(holes, grade_col)
+
+
+@callback(
+ [Output("badge-hole-count", "children"),
+ Output("badge-total-meters", "children"),
+ Output("badge-grade", "children")],
+ [Input("hole-checklist", "value"),
+ Input("grade-selector", "value")],
+)
+def update_comparison_badges(selected_holes, grade_col):
+ holes = (selected_holes or [])[:10]
+ collar, _, _, _ = load_data()
+ total_m = int(collar.loc[collar["HOLEID"].isin(holes), "TOTDEPTH"].sum())
+ return (
+ f"Holes selected: {len(holes)}",
+ f"Combined meters: {total_m:,} m",
+ f"Grade: {GRADE_LABELS.get(grade_col, grade_col)}",
+ )
diff --git a/drillholes-demo/callbacks/cross_section.py b/drillholes-demo/callbacks/cross_section.py
new file mode 100644
index 0000000..81ee873
--- /dev/null
+++ b/drillholes-demo/callbacks/cross_section.py
@@ -0,0 +1,102 @@
+from dash import Input, Output, State, callback, clientside_callback
+
+from pages.cross_section import _build_figure
+from utils import load_data
+
+
+@callback(
+ Output("cross-section-chart", "figure"),
+ Input("section-orientation", "value"),
+)
+def update_cross_section(orientation):
+ collar, _, _, survey = load_data()
+ return _build_figure(collar, survey, orientation)
+
+
+@callback(
+ Output("cs-tour", "isOpen"),
+ Input("cs-tour-btn", "n_clicks"),
+ prevent_initial_call=True,
+)
+def open_cs_tour(_):
+ return True
+
+
+# Hide the Y-axis hint on first meaningful chart interaction (pan, zoom).
+clientside_callback(
+ """
+ function(relayoutData, currentStyle) {
+ if (!relayoutData) return currentStyle || {"display": "flex"};
+ var ignored = {"autosize": 1, "width": 1, "height": 1};
+ var keys = Object.keys(relayoutData).filter(function(k) {
+ return !ignored[k];
+ });
+ if (keys.length > 0) {
+ return {"display": "none"};
+ }
+ return currentStyle || {"display": "flex"};
+ }
+ """,
+ Output("cs-yaxis-hint", "style"),
+ Input("cross-section-chart", "relayoutData"),
+ State("cs-yaxis-hint", "style"),
+ prevent_initial_call=True,
+)
+
+
+# Elevation cursor — tracks mouse elevation across all three panels.
+clientside_callback(
+ """
+ function(hoverData, figure) {
+ if (!hoverData || !hoverData.points || !hoverData.points.length) {
+ return window.dash_clientside.no_update;
+ }
+ var elev = hoverData.points[0].y;
+ if (elev == null) return window.dash_clientside.no_update;
+ var fig = JSON.parse(JSON.stringify(figure));
+ if (!fig.layout.shapes) return window.dash_clientside.no_update;
+ for (var i = 0; i < fig.layout.shapes.length; i++) {
+ var n = fig.layout.shapes[i].name || "";
+ if (n === "elev-cursor-1" || n === "elev-cursor-2" || n === "elev-cursor-3") {
+ fig.layout.shapes[i].y0 = elev;
+ fig.layout.shapes[i].y1 = elev;
+ fig.layout.shapes[i].visible = true;
+ }
+ }
+ return fig;
+ }
+ """,
+ Output("cross-section-chart", "figure", allow_duplicate=True),
+ Input("cross-section-chart", "hoverData"),
+ State("cross-section-chart", "figure"),
+ prevent_initial_call=True,
+)
+
+
+# Click to pin a marker line at the clicked elevation across all three panels.
+clientside_callback(
+ """
+ function(clickData, figure) {
+ if (!clickData || !clickData.points || !clickData.points.length) {
+ return window.dash_clientside.no_update;
+ }
+ var elev = clickData.points[0].y;
+ if (elev == null) return window.dash_clientside.no_update;
+ var fig = JSON.parse(JSON.stringify(figure));
+ if (!fig.layout.shapes) return window.dash_clientside.no_update;
+ for (var i = 0; i < fig.layout.shapes.length; i++) {
+ var n = fig.layout.shapes[i].name || "";
+ if (n.indexOf("measure-span-") === 0) {
+ fig.layout.shapes[i].y0 = elev - 0.5;
+ fig.layout.shapes[i].y1 = elev + 0.5;
+ fig.layout.shapes[i].visible = true;
+ }
+ }
+ return fig;
+ }
+ """,
+ Output("cross-section-chart", "figure", allow_duplicate=True),
+ Input("cross-section-chart", "clickData"),
+ State("cross-section-chart", "figure"),
+ prevent_initial_call=True,
+)
diff --git a/drillholes-demo/callbacks/downhole.py b/drillholes-demo/callbacks/downhole.py
new file mode 100644
index 0000000..63d751f
--- /dev/null
+++ b/drillholes-demo/callbacks/downhole.py
@@ -0,0 +1,177 @@
+"""
+Downhole callbacks:
+1. Hole selector → rebuild strip log figure
+2. Clientside callback: hoverData → update depth cursor shape (zero Python round-trip)
+3. Python callback: clickData → click-to-measure state machine
+4. Clear button → reset measurement
+"""
+
+import json
+import plotly.graph_objects as go
+from dash import Input, Output, State, callback, clientside_callback, no_update, ctx
+import dash
+
+from pages.downhole_logs import _strip_log_figure
+from utils import load_data
+
+
+@callback(
+ Output("strip-log-chart", "figure"),
+ Input("hole-selector", "value"),
+)
+def update_strip_log(hole_id):
+ collar, assay, lith, survey = load_data()
+ return _strip_log_figure(hole_id, collar, assay, lith, survey)
+
+
+@callback(
+ [Output("kpi-hole-depth", "children"),
+ Output("kpi-lith-count", "children")],
+ Input("hole-selector", "value"),
+)
+def update_hole_kpis(hole_id):
+ collar, _, lith, _ = load_data()
+ row = collar.loc[collar["HOLEID"] == hole_id]
+ depth = int(row["TOTDEPTH"].iloc[0]) if not row.empty else 0
+ lith_count = int(lith[lith["HOLEID"] == hole_id].shape[0])
+ return f"{depth} m", str(lith_count)
+
+
+# ── Depth cursor — clientside for zero latency ──────────────────────────────
+# Plot-wide hover events fire even over empty plot areas (not just data points).
+# The transparent sentinel traces in each panel ensure hoverData is populated
+# anywhere along the depth axis.
+clientside_callback(
+ """
+ function(hoverData, figure) {
+ if (!hoverData || !hoverData.points || hoverData.points.length === 0) {
+ return window.dash_clientside.no_update;
+ }
+ var depth = hoverData.points[0].y;
+ if (depth === undefined || depth === null) {
+ return window.dash_clientside.no_update;
+ }
+ // Deep-copy so Dash detects the change
+ var fig = JSON.parse(JSON.stringify(figure));
+ if (!fig.layout.shapes) return window.dash_clientside.no_update;
+ for (var i = 0; i < fig.layout.shapes.length; i++) {
+ if (fig.layout.shapes[i].name === 'depth-cursor') {
+ fig.layout.shapes[i].y0 = depth;
+ fig.layout.shapes[i].y1 = depth;
+ fig.layout.shapes[i].visible = true;
+ }
+ }
+ return fig;
+ }
+ """,
+ Output("strip-log-chart", "figure", allow_duplicate=True),
+ Input("strip-log-chart", "hoverData"),
+ State("strip-log-chart", "figure"),
+ prevent_initial_call=True,
+)
+
+
+# ── Click-to-measure state machine ──────────────────────────────────────────
+@callback(
+ [Output("measure-readout", "children"),
+ Output("measure-store", "data"),
+ Output("strip-log-chart", "figure", allow_duplicate=True)],
+ [Input("strip-log-chart", "clickData"),
+ Input("measure-clear-btn", "n_clicks")],
+ [State("measure-store", "data"),
+ State("strip-log-chart", "figure")],
+ prevent_initial_call=True,
+)
+def handle_click_measure(click_data, clear_clicks, store, current_fig):
+ triggered = ctx.triggered_id
+
+ # Clear button
+ if triggered == "measure-clear-btn":
+ fig = go.Figure(current_fig)
+ for shape in fig.layout.shapes:
+ if shape.name == "measure-span":
+ shape.visible = False
+ fig.layout.annotations = [
+ a for a in fig.layout.annotations if "click again" not in (a.text or "")
+ ]
+ return "Click a depth to start measuring", None, fig
+
+ # Click events
+ if not click_data or not click_data.get("points"):
+ return no_update, no_update, no_update
+
+ depth = click_data["points"][0].get("y")
+ if depth is None:
+ return no_update, no_update, no_update
+
+ fig = go.Figure(current_fig)
+
+ # Strip any pending "click again" prompt before updating
+ fig.layout.annotations = [
+ a for a in fig.layout.annotations if "click again" not in (a.text or "")
+ ]
+
+ if store is None or store.get("first_depth") is None:
+ # First click: store depth
+ new_store = {"first_depth": float(depth)}
+ readout = f"From: {depth:.1f} m — click again to set end depth"
+
+ # Show a thin line at the first click depth
+ for shape in fig.layout.shapes:
+ if shape.name == "measure-span":
+ shape.y0 = float(depth)
+ shape.y1 = float(depth) + 0.5
+ shape.visible = True
+
+ # On-chart prompt so user knows a second click is needed
+ fig.add_annotation(
+ x=0.5, y=float(depth) + 10,
+ xref="paper", yref="y",
+ text="↓ click again to set end depth",
+ showarrow=True, arrowhead=2,
+ arrowcolor="#e8a020", ax=0, ay=22,
+ font=dict(size=10, color="#e8a020", family="monospace"),
+ bgcolor="rgba(255,255,255,0.9)",
+ bordercolor="#e8a020", borderwidth=1,
+ xanchor="center",
+ )
+
+ return readout, new_store, fig
+
+ else:
+ # Second click: compute interval, draw span
+ d1 = store["first_depth"]
+ d2 = float(depth)
+ lo, hi = min(d1, d2), max(d1, d2)
+ thickness = hi - lo
+
+ for shape in fig.layout.shapes:
+ if shape.name == "measure-span":
+ shape.y0 = lo
+ shape.y1 = hi
+ shape.visible = True
+
+ # Add annotation showing the thickness
+ fig.add_annotation(
+ x=0.98, y=(lo + hi) / 2,
+ xref="paper", yref="y",
+ text=f" {thickness:.1f} m ",
+ showarrow=False,
+ font=dict(size=11, color="#d48806", family="monospace"),
+ bgcolor="rgba(255,255,255,0.9)",
+ bordercolor="#e8a020",
+ borderwidth=1,
+ xanchor="right",
+ )
+
+ readout = f"{lo:.1f} m — {hi:.1f} m = {thickness:.1f} m interval"
+ return readout, None, fig # reset store for next measurement
+
+
+@callback(
+ Output("dl-tour", "isOpen"),
+ Input("dl-tour-btn", "n_clicks"),
+ prevent_initial_call=True,
+)
+def open_dl_tour(_):
+ return True
diff --git a/drillholes-demo/components/__init__.py b/drillholes-demo/components/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/drillholes-demo/components/overview_widgets.py b/drillholes-demo/components/overview_widgets.py
new file mode 100644
index 0000000..373a1f0
--- /dev/null
+++ b/drillholes-demo/components/overview_widgets.py
@@ -0,0 +1,132 @@
+"""Reusable widgets sourced from the retired Overview page."""
+
+import pandas as pd
+import plotly.graph_objects as go
+from dash import html
+
+from utils import CHART_LAYOUT
+
+
+def best_au_intercept(assay: pd.DataFrame, min_width: float = 4.0) -> str:
+ """Best consecutive Au composite across all holes (min cumulative width in m)."""
+ best_grade, best_hole, best_from, best_to = 0.0, "", 0.0, 0.0
+ for hole_id, grp in assay.groupby("HOLEID"):
+ grp = grp.sort_values("FROM").reset_index(drop=True)
+ for i in range(len(grp)):
+ for j in range(i + 1, min(i + 20, len(grp) + 1)):
+ sub = grp.iloc[i:j]
+ width = sub["TO"].iloc[-1] - sub["FROM"].iloc[0]
+ if width < min_width:
+ continue
+ avg = sub["Au_ppm"].mean()
+ if avg > best_grade:
+ best_grade = avg
+ best_hole = hole_id
+ best_from = sub["FROM"].iloc[0]
+ best_to = sub["TO"].iloc[-1]
+ width = best_to - best_from
+ return f"{best_grade:.2f} g/t / {width:.0f}m ({best_hole})"
+
+
+def collar_map(collar: pd.DataFrame) -> go.Figure:
+ fig = go.Figure()
+ fig.add_trace(go.Scatter(
+ x=collar["EAST"],
+ y=collar["NORTH"],
+ mode="markers+text",
+ text=collar["HOLEID"],
+ textposition="top center",
+ textfont=dict(size=8, color="#6c757d"),
+ marker=dict(
+ size=10,
+ color=collar["TOTDEPTH"],
+ colorscale="Viridis",
+ showscale=True,
+ colorbar=dict(
+ title=dict(text="Total Depth (m)", font=dict(color="#495057")),
+ tickfont=dict(color="#495057"),
+ bgcolor="#ffffff",
+ bordercolor="#dee2e6",
+ ),
+ line=dict(width=1, color="#dee2e6"),
+ ),
+ hovertemplate=(
+ "%{text}
"
+ "Easting: %{x:.1f} m MGA94
"
+ "Northing: %{y:.1f} m MGA94
"
+ "Total Depth: %{marker.color:.0f} m"
+ ""
+ ),
+ ))
+ fig.update_layout(**{
+ **CHART_LAYOUT,
+ "margin": dict(l=60, r=20, t=20, b=50),
+ "height": 460,
+ "xaxis": dict(
+ title="Easting (m MGA94 Zone 50)",
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d"),
+ title_font=dict(color="#495057"),
+ ),
+ "yaxis": dict(
+ title="Northing (m MGA94 Zone 50)",
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d"),
+ title_font=dict(color="#495057"),
+ scaleanchor="x", scaleratio=1,
+ ),
+ "hoverlabel": dict(bgcolor="#ffffff", font_color="#212529", bordercolor="#dee2e6"),
+ })
+ return fig
+
+
+def summary_table(collar: pd.DataFrame, n: int = 20):
+ cols = ["HOLEID", "EAST", "NORTH", "ELEV", "TOTDEPTH", "AZ", "DIP"]
+ rows = []
+ for _, r in collar[cols].head(n).iterrows():
+ rows.append(html.Tr([
+ html.Td(str(r["HOLEID"]), style={"color": "#d48806", "fontWeight": "600"}),
+ html.Td(f"{r['EAST']:.0f}"),
+ html.Td(f"{r['NORTH']:.0f}"),
+ html.Td(f"{r['ELEV']:.0f} m RL"),
+ html.Td(f"{r['TOTDEPTH']:.0f} m"),
+ html.Td(f"{r['AZ']:.0f}°"),
+ html.Td(f"{r['DIP']:.0f}°"),
+ ]))
+ return html.Table(
+ [html.Thead(html.Tr([html.Th(c) for c in ["Hole", "East", "North", "RL", "Depth", "Az", "Dip"]]))]
+ + [html.Tbody(rows)],
+ className="data-table",
+ )
+
+
+def depth_histogram(collar: pd.DataFrame) -> go.Figure:
+ fig = go.Figure()
+ fig.add_trace(go.Histogram(
+ x=collar["TOTDEPTH"],
+ nbinsx=15,
+ marker=dict(color="#e8a020", line=dict(color="#ffffff", width=1)),
+ hovertemplate="Depth: %{x:.0f} m
Number of holes: %{y}",
+ name="",
+ ))
+ fig.update_layout(**{
+ **CHART_LAYOUT,
+ "height": 200,
+ "margin": dict(l=50, r=20, t=10, b=40),
+ "xaxis": dict(
+ title="Total Depth (m)",
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d"),
+ title_font=dict(color="#495057"),
+ ),
+ "yaxis": dict(
+ title="Number of Holes",
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d"),
+ title_font=dict(color="#495057"),
+ ),
+ "bargap": 0.05,
+ "showlegend": False,
+ "hoverlabel": dict(bgcolor="#ffffff", font_color="#212529", bordercolor="#dee2e6"),
+ })
+ return fig
diff --git a/drillholes-demo/data/assay.csv b/drillholes-demo/data/assay.csv
new file mode 100644
index 0000000..8f3d860
--- /dev/null
+++ b/drillholes-demo/data/assay.csv
@@ -0,0 +1,7665 @@
+HOLEID,FROM,TO,Au_ppm,Cu_pct,Ag_ppm
+DH001,0.0,2.0,0.093,0.0104,0.112
+DH001,2.0,4.0,0.089,0.0057,0.092
+DH001,4.0,6.0,0.257,0.0146,0.293
+DH001,6.0,8.0,0.152,0.0169,0.199
+DH001,8.0,10.0,0.021,0.0252,0.013
+DH001,10.0,12.0,0.045,0.0195,0.064
+DH001,12.0,14.0,0.06,0.0248,0.043
+DH001,14.0,16.0,0.154,0.0091,0.088
+DH001,16.0,18.0,0.26,0.0322,0.165
+DH001,18.0,20.0,0.047,0.0141,0.059
+DH001,20.0,22.0,0.084,0.0175,0.096
+DH001,22.0,24.0,0.072,0.0089,0.068
+DH001,24.0,26.0,0.142,0.0092,0.095
+DH001,26.0,28.0,0.05,0.0194,0.033
+DH001,28.0,30.0,0.199,0.0236,0.165
+DH001,30.0,32.0,0.123,0.0124,0.071
+DH001,32.0,34.0,0.099,0.0143,0.071
+DH001,34.0,36.0,0.052,0.0134,0.041
+DH001,36.0,38.0,0.058,0.0317,0.062
+DH001,38.0,40.0,0.229,0.0569,0.257
+DH001,40.0,42.0,0.086,0.0102,0.101
+DH001,42.0,44.0,0.056,0.0108,0.053
+DH001,44.0,46.0,0.075,0.01,0.054
+DH001,46.0,48.0,0.047,0.0746,0.035
+DH001,48.0,50.0,0.068,0.0146,0.086
+DH001,50.0,52.0,0.038,0.043,0.042
+DH001,52.0,54.0,0.098,0.0093,0.101
+DH001,54.0,56.0,0.042,0.0381,0.024
+DH001,56.0,58.0,0.087,0.0054,0.124
+DH001,58.0,60.0,0.124,0.0336,0.181
+DH001,60.0,62.0,0.032,0.0213,0.023
+DH001,62.0,64.0,0.03,0.0182,0.028
+DH001,64.0,66.0,0.069,0.0073,0.036
+DH001,66.0,68.0,0.067,0.017,0.097
+DH001,68.0,70.0,0.063,0.018,0.052
+DH001,70.0,72.0,0.068,0.0149,0.086
+DH001,72.0,74.0,0.026,0.0232,0.026
+DH001,74.0,76.0,0.084,0.0296,0.126
+DH001,76.0,78.0,0.025,0.021,0.019
+DH001,78.0,80.0,0.091,0.0145,0.136
+DH001,80.0,82.0,6.815,0.3286,16.756
+DH001,82.0,84.0,0.177,0.4129,0.32
+DH001,84.0,86.0,4.823,0.1104,9.429
+DH001,86.0,88.0,6.25,0.7765,18.611
+DH001,88.0,90.0,1.696,0.4057,3.229
+DH001,90.0,92.0,0.582,0.3109,1.363
+DH001,92.0,94.0,2.473,0.266,5.225
+DH001,94.0,96.0,13.117,0.1085,26.182
+DH001,96.0,98.0,2.255,0.4508,6.26
+DH001,98.0,100.0,0.462,0.0437,1.219
+DH001,100.0,102.0,0.582,0.164,1.148
+DH001,102.0,104.0,1.031,0.2685,1.971
+DH001,104.0,106.0,4.986,0.3263,11.829
+DH001,106.0,108.0,1.818,0.5143,3.15
+DH001,108.0,110.0,0.416,0.377,0.901
+DH001,110.0,112.0,12.122,0.5063,34.421
+DH001,112.0,114.0,2.688,0.1888,7.676
+DH001,114.0,116.0,1.426,0.2694,2.573
+DH001,116.0,118.0,1.134,0.1363,2.721
+DH001,118.0,120.0,0.62,0.0517,1.21
+DH001,120.0,122.0,19.506,0.6979,35.824
+DH001,122.0,124.0,5.311,0.6961,13.635
+DH001,124.0,126.0,2.514,0.0448,6.199
+DH001,126.0,128.0,0.621,0.2618,1.687
+DH001,128.0,130.0,4.269,0.5064,9.446
+DH001,130.0,132.0,0.569,0.0398,0.889
+DH001,132.0,134.0,1.107,0.0645,2.349
+DH001,134.0,136.0,1.297,0.0944,3.746
+DH001,136.0,138.0,8.049,0.3614,12.289
+DH001,138.0,140.0,4.678,0.0881,7.102
+DH001,140.0,142.0,2.656,0.1532,7.593
+DH001,142.0,144.0,0.872,0.3355,1.411
+DH001,144.0,146.0,0.067,0.5782,0.163
+DH001,146.0,148.0,1.063,0.5068,1.839
+DH001,148.0,150.0,0.383,0.093,0.994
+DH001,150.0,152.0,0.222,0.5506,0.502
+DH001,152.0,154.0,0.532,0.1399,1.383
+DH001,154.0,156.0,6.293,0.4009,11.513
+DH001,156.0,158.0,1.371,0.1119,3.567
+DH001,158.0,160.0,0.44,0.8052,0.91
+DH001,160.0,162.0,0.552,0.1298,1.34
+DH001,162.0,164.0,0.482,0.2407,1.224
+DH001,164.0,166.0,0.163,0.1647,0.265
+DH001,166.0,168.0,0.902,0.1078,1.45
+DH001,168.0,170.0,24.561,0.2334,47.346
+DH001,170.0,172.0,0.264,0.1322,0.602
+DH001,172.0,174.0,0.651,0.4614,1.907
+DH001,174.0,176.0,1.578,0.1396,4.463
+DH001,176.0,178.0,1.032,0.1797,1.784
+DH001,178.0,180.0,0.922,0.3289,1.779
+DH001,180.0,182.0,2.001,0.1581,4.245
+DH001,182.0,184.0,1.677,0.1746,2.596
+DH001,184.0,186.0,17.046,0.0764,42.222
+DH001,186.0,188.0,0.23,0.2655,0.43
+DH001,188.0,190.0,4.0,0.2558,10.863
+DH001,190.0,192.0,2.31,0.1824,5.522
+DH001,192.0,194.0,1.572,0.2615,3.17
+DH001,194.0,196.0,0.846,0.0752,2.262
+DH001,196.0,198.0,4.282,0.2686,10.285
+DH001,198.0,200.0,2.473,0.3053,6.631
+DH001,200.0,202.0,1.994,0.1459,5.925
+DH001,202.0,204.0,1.294,0.131,3.002
+DH001,204.0,206.0,3.011,0.0725,8.977
+DH001,206.0,208.0,1.988,0.0917,5.494
+DH001,208.0,210.0,4.715,0.0811,13.991
+DH001,210.0,212.0,4.906,0.2213,14.318
+DH001,212.0,214.0,2.694,0.2182,4.408
+DH001,214.0,216.0,4.474,0.3267,10.082
+DH001,216.0,218.0,0.862,0.2476,1.946
+DH001,218.0,220.0,0.449,0.0687,0.862
+DH001,220.0,222.0,0.098,0.263,0.225
+DH001,222.0,224.0,10.696,0.1504,20.88
+DH001,224.0,226.0,1.382,0.2444,2.488
+DH001,226.0,228.0,1.278,0.4952,3.209
+DH001,228.0,230.0,3.169,0.4668,6.412
+DH001,230.0,232.0,22.192,0.1211,45.315
+DH001,232.0,234.0,0.675,0.3785,1.229
+DH001,234.0,236.0,2.516,0.0909,3.921
+DH001,236.0,238.0,0.512,0.5639,0.951
+DH001,238.0,240.0,3.455,0.3558,10.037
+DH001,240.0,242.0,0.254,0.1378,0.652
+DH001,242.0,244.0,0.392,0.885,0.684
+DH001,244.0,246.0,3.51,0.1743,6.202
+DH001,246.0,248.0,7.081,0.2174,20.476
+DH001,248.0,250.0,1.759,0.1697,2.924
+DH001,250.0,252.0,0.025,0.0161,0.013
+DH001,252.0,254.0,0.058,0.0096,0.051
+DH001,254.0,256.0,0.085,0.0062,0.07
+DH001,256.0,258.0,0.105,0.0222,0.074
+DH001,258.0,260.0,0.09,0.0305,0.129
+DH001,260.0,262.0,0.078,0.0145,0.063
+DH001,262.0,264.0,0.109,0.0202,0.146
+DH001,264.0,266.0,0.089,0.0276,0.113
+DH001,266.0,268.0,0.131,0.0283,0.188
+DH001,268.0,270.0,0.028,0.0396,0.035
+DH001,270.0,272.0,0.029,0.0128,0.016
+DH001,272.0,274.0,0.069,0.0142,0.077
+DH001,274.0,276.0,0.044,0.0123,0.034
+DH001,276.0,278.0,0.104,0.0235,0.098
+DH001,278.0,280.0,0.092,0.0234,0.086
+DH001,280.0,282.0,0.085,0.0193,0.119
+DH001,282.0,284.0,0.13,0.0242,0.131
+DH001,284.0,286.0,0.051,0.0189,0.051
+DH001,286.0,288.0,0.092,0.0552,0.098
+DH001,288.0,290.0,0.106,0.0312,0.08
+DH001,290.0,292.0,0.334,0.0152,0.49
+DH001,292.0,294.0,0.051,0.0154,0.052
+DH001,294.0,296.0,0.136,0.0215,0.148
+DH001,296.0,298.0,0.078,0.0155,0.048
+DH001,298.0,300.0,0.104,0.0128,0.058
+DH001,300.0,302.0,0.047,0.0293,0.026
+DH001,302.0,304.0,0.089,0.0177,0.103
+DH001,304.0,306.0,0.049,0.0107,0.069
+DH001,306.0,308.0,0.118,0.0216,0.128
+DH001,308.0,310.0,0.123,0.0126,0.081
+DH001,310.0,312.0,0.047,0.0351,0.046
+DH001,312.0,314.0,0.118,0.0342,0.072
+DH001,314.0,316.0,0.029,0.0127,0.024
+DH001,316.0,318.0,0.049,0.0107,0.045
+DH001,318.0,320.0,0.04,0.0217,0.03
+DH001,320.0,322.0,0.11,0.0236,0.059
+DH001,322.0,324.0,0.066,0.0529,0.076
+DH001,324.0,326.0,0.027,0.0111,0.034
+DH001,326.0,328.0,0.083,0.0172,0.068
+DH001,328.0,330.0,0.274,0.0241,0.219
+DH001,330.0,332.0,0.047,0.0111,0.035
+DH001,332.0,334.0,0.091,0.0072,0.069
+DH001,334.0,336.0,0.083,0.0164,0.07
+DH001,336.0,338.0,0.059,0.0168,0.052
+DH001,338.0,340.0,0.118,0.0314,0.121
+DH001,340.0,342.0,0.062,0.0228,0.035
+DH001,342.0,344.0,0.063,0.0272,0.094
+DH001,344.0,346.0,0.178,0.0446,0.189
+DH001,346.0,348.0,0.083,0.0184,0.083
+DH001,348.0,350.0,0.056,0.0087,0.063
+DH001,350.0,352.0,0.052,0.0191,0.069
+DH001,352.0,354.0,0.042,0.0206,0.045
+DH001,354.0,356.0,0.116,0.0546,0.133
+DH001,356.0,358.0,0.11,0.0107,0.092
+DH001,358.0,360.0,0.212,0.0115,0.126
+DH001,360.0,362.0,0.08,0.0175,0.056
+DH001,362.0,364.0,0.068,0.0339,0.083
+DH001,364.0,366.0,0.036,0.0293,0.028
+DH001,366.0,368.0,0.057,0.0083,0.031
+DH001,368.0,370.0,0.079,0.0328,0.115
+DH001,370.0,372.0,0.078,0.0257,0.077
+DH001,372.0,374.0,0.153,0.0101,0.156
+DH001,374.0,376.0,0.095,0.0315,0.133
+DH001,376.0,378.0,0.02,0.0124,0.017
+DH001,378.0,380.0,0.073,0.0233,0.058
+DH001,380.0,382.0,0.118,0.0165,0.118
+DH001,382.0,384.0,0.062,0.0226,0.035
+DH001,384.0,386.0,0.12,0.0288,0.091
+DH001,386.0,388.0,0.013,0.0097,0.009
+DH001,388.0,390.0,0.059,0.0068,0.064
+DH001,390.0,392.0,0.083,0.0318,0.053
+DH001,392.0,394.0,0.108,0.022,0.148
+DH001,394.0,396.0,0.322,0.0298,0.183
+DH001,396.0,398.0,0.107,0.0324,0.132
+DH002,0.0,2.0,0.064,0.0328,0.036
+DH002,2.0,4.0,0.384,0.0126,0.226
+DH002,4.0,6.0,0.068,0.0143,0.092
+DH002,6.0,8.0,0.016,0.0147,0.014
+DH002,8.0,10.0,0.061,0.0482,0.061
+DH002,10.0,12.0,0.178,0.0209,0.237
+DH002,12.0,14.0,0.097,0.0363,0.135
+DH002,14.0,16.0,0.111,0.022,0.084
+DH002,16.0,18.0,0.105,0.056,0.107
+DH002,18.0,20.0,0.106,0.0344,0.085
+DH002,20.0,22.0,0.083,0.0056,0.054
+DH002,22.0,24.0,0.022,0.0382,0.014
+DH002,24.0,26.0,0.15,0.0117,0.11
+DH002,26.0,28.0,0.096,0.018,0.053
+DH002,28.0,30.0,0.086,0.0731,0.047
+DH002,30.0,32.0,0.154,0.0279,0.168
+DH002,32.0,34.0,0.073,0.0066,0.037
+DH002,34.0,36.0,0.134,0.0113,0.101
+DH002,36.0,38.0,0.054,0.0388,0.057
+DH002,38.0,40.0,0.121,0.025,0.152
+DH002,40.0,42.0,0.092,0.0101,0.069
+DH002,42.0,44.0,0.09,0.0215,0.075
+DH002,44.0,46.0,0.211,0.0402,0.311
+DH002,46.0,48.0,0.066,0.0233,0.066
+DH002,48.0,50.0,0.2,0.0321,0.205
+DH002,50.0,52.0,0.048,0.0272,0.03
+DH002,52.0,54.0,0.071,0.0173,0.042
+DH002,54.0,56.0,0.066,0.0054,0.038
+DH002,56.0,58.0,0.054,0.0187,0.068
+DH002,58.0,60.0,0.07,0.0272,0.076
+DH002,60.0,62.0,0.06,0.0258,0.088
+DH002,62.0,64.0,0.031,0.0256,0.029
+DH002,64.0,66.0,0.08,0.0069,0.053
+DH002,66.0,68.0,0.03,0.0214,0.03
+DH002,68.0,70.0,0.041,0.0147,0.037
+DH002,70.0,72.0,0.056,0.0246,0.065
+DH002,72.0,74.0,0.148,0.0211,0.191
+DH002,74.0,76.0,0.049,0.008,0.038
+DH002,76.0,78.0,0.066,0.0056,0.078
+DH002,78.0,80.0,0.048,0.0403,0.035
+DH002,80.0,82.0,0.395,0.5423,0.943
+DH002,82.0,84.0,0.91,0.1346,1.975
+DH002,84.0,86.0,0.136,0.0503,0.311
+DH002,86.0,88.0,14.294,0.1575,24.508
+DH002,88.0,90.0,8.676,1.2038,25.301
+DH002,90.0,92.0,2.181,0.9585,3.618
+DH002,92.0,94.0,7.638,0.0988,15.848
+DH002,94.0,96.0,1.663,0.1037,2.772
+DH002,96.0,98.0,0.298,0.1016,0.626
+DH002,98.0,100.0,7.35,0.2011,20.766
+DH002,100.0,102.0,4.417,0.1026,8.028
+DH002,102.0,104.0,5.949,1.7912,9.226
+DH002,104.0,106.0,1.284,0.4128,3.524
+DH002,106.0,108.0,1.171,0.1616,3.408
+DH002,108.0,110.0,0.824,0.1607,2.031
+DH002,110.0,112.0,7.353,0.1376,12.347
+DH002,112.0,114.0,0.223,0.0815,0.615
+DH002,114.0,116.0,1.849,0.0862,4.294
+DH002,116.0,118.0,0.879,0.1569,2.061
+DH002,118.0,120.0,4.925,0.226,14.127
+DH002,120.0,122.0,1.323,0.29,3.776
+DH002,122.0,124.0,0.749,0.2297,1.82
+DH002,124.0,126.0,2.869,0.4105,4.375
+DH002,126.0,128.0,19.685,0.1103,52.601
+DH002,128.0,130.0,2.132,0.2059,4.828
+DH002,130.0,132.0,2.531,0.4397,5.086
+DH002,132.0,134.0,2.22,0.4284,3.905
+DH002,134.0,136.0,5.58,0.1213,12.917
+DH002,136.0,138.0,31.588,0.2024,92.394
+DH002,138.0,140.0,1.153,0.5978,1.773
+DH002,140.0,142.0,3.0,0.5,4.64
+DH002,142.0,144.0,9.595,0.4656,25.141
+DH002,144.0,146.0,3.423,0.4603,7.168
+DH002,146.0,148.0,1.081,0.8741,2.685
+DH002,148.0,150.0,5.847,0.2463,13.66
+DH002,150.0,152.0,2.255,0.7038,5.227
+DH002,152.0,154.0,0.285,0.1878,0.796
+DH002,154.0,156.0,1.722,0.0528,2.781
+DH002,156.0,158.0,5.047,0.211,10.942
+DH002,158.0,160.0,8.157,0.1446,17.754
+DH002,160.0,162.0,4.266,0.2714,12.114
+DH002,162.0,164.0,1.804,0.5151,5.178
+DH002,164.0,166.0,0.318,0.3648,0.926
+DH002,166.0,168.0,3.96,0.3092,9.905
+DH002,168.0,170.0,5.726,0.2151,8.86
+DH002,170.0,172.0,1.531,1.1236,2.83
+DH002,172.0,174.0,4.054,0.0582,11.473
+DH002,174.0,176.0,1.323,0.0421,3.517
+DH002,176.0,178.0,1.411,0.0416,2.534
+DH002,178.0,180.0,12.454,0.735,35.533
+DH002,180.0,182.0,2.352,0.6457,4.334
+DH002,182.0,184.0,8.674,0.1051,18.507
+DH002,184.0,186.0,3.771,0.0525,7.289
+DH002,186.0,188.0,34.042,0.3723,76.419
+DH002,188.0,190.0,2.772,0.2104,6.324
+DH002,190.0,192.0,0.836,0.1032,1.517
+DH002,192.0,194.0,11.551,0.101,29.744
+DH002,194.0,196.0,2.005,0.2928,5.603
+DH002,196.0,198.0,7.339,0.2384,19.039
+DH002,198.0,200.0,3.226,0.3676,8.935
+DH002,200.0,202.0,29.678,0.3249,80.749
+DH002,202.0,204.0,0.323,0.1155,0.934
+DH002,204.0,206.0,3.14,0.0483,5.209
+DH002,206.0,208.0,1.159,0.6901,2.428
+DH002,208.0,210.0,2.845,0.573,6.366
+DH002,210.0,212.0,0.676,0.1907,1.085
+DH002,212.0,214.0,0.451,0.0588,1.091
+DH002,214.0,216.0,1.079,0.163,2.383
+DH002,216.0,218.0,0.985,0.2218,2.176
+DH002,218.0,220.0,0.882,0.8402,1.775
+DH002,220.0,222.0,0.98,0.7633,1.696
+DH002,222.0,224.0,1.147,0.1971,2.994
+DH002,224.0,226.0,12.929,0.1161,24.341
+DH002,226.0,228.0,2.48,0.1014,5.138
+DH002,228.0,230.0,2.24,0.5555,6.299
+DH002,230.0,232.0,5.08,0.5862,7.864
+DH002,232.0,234.0,1.722,0.3796,4.361
+DH002,234.0,236.0,4.51,0.208,12.261
+DH002,236.0,238.0,0.706,0.7101,2.004
+DH002,238.0,240.0,15.934,0.1479,39.263
+DH002,240.0,242.0,39.3,0.0958,73.667
+DH002,242.0,244.0,2.705,0.6245,4.976
+DH002,244.0,246.0,2.171,0.1396,3.296
+DH002,246.0,248.0,0.711,0.1932,1.928
+DH002,248.0,250.0,0.664,0.1274,1.163
+DH002,250.0,252.0,0.035,0.0148,0.022
+DH002,252.0,254.0,0.065,0.016,0.032
+DH002,254.0,256.0,0.055,0.0259,0.046
+DH002,256.0,258.0,0.062,0.0233,0.042
+DH002,258.0,260.0,0.102,0.0401,0.11
+DH002,260.0,262.0,0.028,0.023,0.019
+DH002,262.0,264.0,0.072,0.0301,0.092
+DH002,264.0,266.0,0.034,0.0197,0.034
+DH002,266.0,268.0,0.071,0.0349,0.087
+DH002,268.0,270.0,0.038,0.0109,0.053
+DH002,270.0,272.0,0.066,0.0369,0.079
+DH002,272.0,274.0,0.11,0.0197,0.127
+DH002,274.0,276.0,0.049,0.0281,0.04
+DH002,276.0,278.0,0.136,0.0331,0.128
+DH002,278.0,280.0,0.074,0.0224,0.11
+DH002,280.0,282.0,0.098,0.0173,0.137
+DH002,282.0,284.0,0.125,0.0176,0.107
+DH002,284.0,286.0,0.075,0.0189,0.057
+DH002,286.0,288.0,0.09,0.0308,0.055
+DH002,288.0,290.0,0.091,0.0349,0.065
+DH002,290.0,292.0,0.091,0.0137,0.095
+DH002,292.0,294.0,0.048,0.0168,0.064
+DH002,294.0,296.0,0.038,0.0102,0.057
+DH002,296.0,298.0,0.231,0.0145,0.261
+DH002,298.0,300.0,0.064,0.0114,0.082
+DH002,300.0,302.0,0.359,0.0367,0.201
+DH002,302.0,304.0,0.121,0.0121,0.09
+DH002,304.0,306.0,0.151,0.0327,0.103
+DH002,306.0,308.0,0.062,0.0169,0.085
+DH002,308.0,310.0,0.044,0.0223,0.023
+DH002,310.0,312.0,0.031,0.0194,0.034
+DH002,312.0,314.0,0.04,0.0252,0.032
+DH002,314.0,316.0,0.129,0.0283,0.187
+DH002,316.0,318.0,0.031,0.014,0.03
+DH002,318.0,320.0,0.059,0.0129,0.073
+DH002,320.0,322.0,0.235,0.0277,0.226
+DH002,322.0,324.0,0.147,0.0244,0.168
+DH002,324.0,326.0,0.074,0.0148,0.065
+DH002,326.0,328.0,0.115,0.0145,0.107
+DH002,328.0,330.0,0.045,0.0389,0.032
+DH002,330.0,332.0,0.111,0.0312,0.063
+DH002,332.0,334.0,0.087,0.0184,0.076
+DH002,334.0,336.0,0.058,0.0146,0.048
+DH002,336.0,338.0,0.077,0.0124,0.089
+DH002,338.0,340.0,0.159,0.0257,0.145
+DH002,340.0,342.0,0.07,0.0244,0.042
+DH002,342.0,344.0,0.07,0.0297,0.064
+DH002,344.0,346.0,0.046,0.0119,0.024
+DH002,346.0,348.0,0.231,0.007,0.12
+DH002,348.0,350.0,0.036,0.0133,0.028
+DH002,350.0,352.0,0.064,0.014,0.032
+DH002,352.0,354.0,0.06,0.0088,0.062
+DH002,354.0,356.0,0.129,0.0279,0.093
+DH002,356.0,358.0,0.098,0.0257,0.06
+DH002,358.0,360.0,0.083,0.0173,0.122
+DH002,360.0,362.0,0.26,0.008,0.387
+DH002,362.0,364.0,0.047,0.0299,0.033
+DH002,364.0,366.0,0.045,0.0234,0.04
+DH002,366.0,368.0,0.114,0.0206,0.171
+DH002,368.0,370.0,0.086,0.0168,0.126
+DH002,370.0,372.0,0.116,0.0264,0.124
+DH002,372.0,374.0,0.044,0.0138,0.045
+DH002,374.0,376.0,0.132,0.0298,0.086
+DH002,376.0,378.0,0.194,0.0363,0.104
+DH002,378.0,380.0,0.05,0.0403,0.025
+DH002,380.0,382.0,0.089,0.0155,0.05
+DH002,382.0,384.0,0.034,0.0251,0.037
+DH002,384.0,386.0,0.515,0.0106,0.563
+DH002,386.0,388.0,0.111,0.0393,0.154
+DH002,388.0,390.0,0.116,0.0073,0.095
+DH002,390.0,392.0,0.043,0.0071,0.022
+DH002,392.0,394.0,0.021,0.0095,0.028
+DH002,394.0,396.0,0.05,0.0223,0.046
+DH002,396.0,398.0,0.14,0.0267,0.205
+DH002,398.0,400.0,0.082,0.0213,0.105
+DH002,400.0,402.0,0.089,0.015,0.091
+DH002,402.0,404.0,0.05,0.0226,0.026
+DH002,404.0,406.0,0.055,0.0132,0.033
+DH002,406.0,408.0,0.148,0.019,0.154
+DH002,408.0,410.0,0.133,0.0138,0.143
+DH002,410.0,412.0,0.151,0.014,0.174
+DH002,412.0,414.0,0.084,0.0324,0.085
+DH002,414.0,416.0,0.04,0.024,0.048
+DH002,416.0,418.0,0.255,0.0183,0.284
+DH002,418.0,419.0,0.102,0.0484,0.113
+DH003,0.0,2.0,0.246,0.011,0.138
+DH003,2.0,4.0,0.053,0.0205,0.059
+DH003,4.0,6.0,0.056,0.0131,0.045
+DH003,6.0,8.0,0.133,0.021,0.129
+DH003,8.0,10.0,0.068,0.0126,0.101
+DH003,10.0,12.0,0.166,0.0311,0.182
+DH003,12.0,14.0,0.016,0.0076,0.009
+DH003,14.0,16.0,0.065,0.0126,0.039
+DH003,16.0,18.0,0.175,0.0185,0.139
+DH003,18.0,20.0,0.076,0.0205,0.091
+DH003,20.0,22.0,0.106,0.0263,0.153
+DH003,22.0,24.0,0.041,0.0267,0.03
+DH003,24.0,26.0,0.067,0.0052,0.066
+DH003,26.0,28.0,0.045,0.0239,0.029
+DH003,28.0,30.0,0.092,0.0486,0.101
+DH003,30.0,32.0,0.081,0.0213,0.046
+DH003,32.0,34.0,0.083,0.0082,0.124
+DH003,34.0,36.0,0.055,0.0506,0.028
+DH003,36.0,38.0,0.152,0.0178,0.134
+DH003,38.0,40.0,0.058,0.0194,0.055
+DH003,40.0,42.0,0.051,0.0172,0.073
+DH003,42.0,44.0,0.326,0.0175,0.195
+DH003,44.0,46.0,0.073,0.0209,0.081
+DH003,46.0,48.0,0.063,0.0203,0.045
+DH003,48.0,50.0,0.094,0.0366,0.088
+DH003,50.0,52.0,0.218,0.0178,0.19
+DH003,52.0,54.0,0.061,0.0125,0.042
+DH003,54.0,56.0,0.332,0.0276,0.172
+DH003,56.0,58.0,0.174,0.0258,0.212
+DH003,58.0,60.0,0.032,0.016,0.027
+DH003,60.0,62.0,0.025,0.0311,0.019
+DH003,62.0,64.0,0.128,0.0596,0.148
+DH003,64.0,66.0,0.064,0.0194,0.052
+DH003,66.0,68.0,0.058,0.0134,0.061
+DH003,68.0,70.0,0.103,0.0066,0.151
+DH003,70.0,72.0,0.202,0.0224,0.118
+DH003,72.0,74.0,0.074,0.0184,0.108
+DH003,74.0,76.0,0.036,0.012,0.046
+DH003,76.0,78.0,0.077,0.0244,0.064
+DH003,78.0,80.0,0.102,0.0316,0.146
+DH003,80.0,82.0,2.63,0.2067,6.75
+DH003,82.0,84.0,2.041,0.6113,4.999
+DH003,84.0,86.0,0.765,0.1505,1.458
+DH003,86.0,88.0,1.422,0.329,2.841
+DH003,88.0,90.0,6.467,0.6969,11.548
+DH003,90.0,92.0,0.725,0.1083,1.228
+DH003,92.0,94.0,1.295,0.0898,2.772
+DH003,94.0,96.0,1.259,0.1304,1.97
+DH003,96.0,98.0,9.154,0.2617,25.306
+DH003,98.0,100.0,2.731,0.1769,5.639
+DH003,100.0,102.0,3.028,0.3161,9.065
+DH003,102.0,104.0,0.807,0.4436,1.985
+DH003,104.0,106.0,0.338,0.4134,0.942
+DH003,106.0,108.0,0.796,0.2215,1.908
+DH003,108.0,110.0,0.491,0.516,0.874
+DH003,110.0,112.0,0.588,0.2681,0.933
+DH003,112.0,114.0,1.265,0.4031,3.761
+DH003,114.0,116.0,0.751,0.2524,1.932
+DH003,116.0,118.0,9.833,0.1311,16.169
+DH003,118.0,120.0,0.869,0.9617,2.09
+DH003,120.0,122.0,10.959,0.132,28.123
+DH003,122.0,124.0,4.525,0.099,7.06
+DH003,124.0,126.0,5.683,0.5179,8.561
+DH003,126.0,128.0,2.348,0.4093,4.428
+DH003,128.0,130.0,0.471,0.1164,0.748
+DH003,130.0,132.0,9.569,0.8128,26.757
+DH003,132.0,134.0,3.142,0.4062,5.632
+DH003,134.0,136.0,1.852,0.1154,4.722
+DH003,136.0,138.0,3.321,0.2588,7.746
+DH003,138.0,140.0,4.286,0.2709,12.419
+DH003,140.0,142.0,2.114,0.3105,6.079
+DH003,142.0,144.0,3.468,0.3809,7.37
+DH003,144.0,146.0,2.368,0.1355,3.942
+DH003,146.0,148.0,0.577,0.6142,1.472
+DH003,148.0,150.0,4.242,1.0809,7.294
+DH003,150.0,152.0,84.615,0.186,162.536
+DH003,152.0,154.0,1.381,0.3006,3.753
+DH003,154.0,156.0,1.941,0.9244,3.317
+DH003,156.0,158.0,3.079,0.1078,5.518
+DH003,158.0,160.0,1.895,0.1372,4.091
+DH003,160.0,162.0,54.933,0.1807,90.634
+DH003,162.0,164.0,0.963,0.2141,2.822
+DH003,164.0,166.0,4.331,0.3834,8.589
+DH003,166.0,168.0,3.349,0.1107,9.64
+DH003,168.0,170.0,0.74,0.0862,1.727
+DH003,170.0,172.0,5.085,0.4874,14.336
+DH003,172.0,174.0,5.653,0.0545,13.169
+DH003,174.0,176.0,2.753,0.3685,4.283
+DH003,176.0,178.0,0.681,0.0673,1.337
+DH003,178.0,180.0,4.384,0.3875,7.097
+DH003,180.0,182.0,0.686,0.1251,1.519
+DH003,182.0,184.0,0.434,0.0715,0.774
+DH003,184.0,186.0,2.468,0.0868,4.221
+DH003,186.0,188.0,7.927,0.0788,19.52
+DH003,188.0,190.0,7.612,0.1597,20.778
+DH003,190.0,192.0,8.991,0.1747,17.853
+DH004,0.0,2.0,0.106,0.0154,0.057
+DH004,2.0,4.0,0.099,0.0305,0.069
+DH004,4.0,6.0,0.084,0.0178,0.077
+DH004,6.0,8.0,0.044,0.0305,0.038
+DH004,8.0,10.0,0.037,0.0335,0.037
+DH004,10.0,12.0,0.15,0.0374,0.188
+DH004,12.0,14.0,0.03,0.0073,0.016
+DH004,14.0,16.0,0.058,0.0116,0.044
+DH004,16.0,18.0,0.119,0.0089,0.062
+DH004,18.0,20.0,0.203,0.0107,0.291
+DH004,20.0,22.0,0.061,0.0241,0.069
+DH004,22.0,24.0,0.128,0.0289,0.158
+DH004,24.0,26.0,0.16,0.012,0.13
+DH004,26.0,28.0,0.096,0.0233,0.116
+DH004,28.0,30.0,0.049,0.0093,0.067
+DH004,30.0,32.0,0.092,0.0325,0.092
+DH004,32.0,34.0,0.035,0.0297,0.027
+DH004,34.0,36.0,0.101,0.0133,0.087
+DH004,36.0,38.0,0.049,0.0155,0.067
+DH004,38.0,40.0,0.043,0.0216,0.036
+DH004,40.0,42.0,0.061,0.0223,0.037
+DH004,42.0,44.0,0.08,0.0157,0.104
+DH004,44.0,46.0,0.157,0.0156,0.14
+DH004,46.0,48.0,0.065,0.007,0.035
+DH004,48.0,50.0,0.146,0.0064,0.125
+DH004,50.0,52.0,0.065,0.0438,0.076
+DH004,52.0,54.0,0.059,0.0352,0.05
+DH004,54.0,56.0,0.15,0.0093,0.123
+DH004,56.0,58.0,0.064,0.011,0.074
+DH004,58.0,60.0,0.097,0.0143,0.135
+DH004,60.0,62.0,0.058,0.025,0.038
+DH004,62.0,64.0,0.079,0.0147,0.04
+DH004,64.0,66.0,0.114,0.0513,0.166
+DH004,66.0,68.0,0.147,0.0858,0.21
+DH004,68.0,70.0,0.11,0.026,0.13
+DH004,70.0,72.0,0.063,0.0142,0.059
+DH004,72.0,74.0,0.074,0.0196,0.089
+DH004,74.0,76.0,0.138,0.0169,0.171
+DH004,76.0,78.0,0.162,0.027,0.099
+DH004,78.0,80.0,0.068,0.0199,0.039
+DH004,80.0,82.0,6.633,0.28,18.977
+DH004,82.0,84.0,2.404,0.1301,5.465
+DH004,84.0,86.0,2.277,0.217,3.76
+DH004,86.0,88.0,1.381,0.2334,3.131
+DH004,88.0,90.0,1.655,0.3297,3.059
+DH004,90.0,92.0,0.315,0.1689,0.5
+DH004,92.0,94.0,16.862,0.4172,33.95
+DH004,94.0,96.0,1.684,0.274,2.915
+DH004,96.0,98.0,4.251,0.1071,11.978
+DH004,98.0,100.0,3.685,0.4319,8.638
+DH004,100.0,102.0,1.471,0.0257,2.753
+DH004,102.0,104.0,10.093,0.1467,20.117
+DH004,104.0,106.0,2.715,0.2134,6.5
+DH004,106.0,108.0,2.882,0.1062,4.498
+DH004,108.0,110.0,0.478,0.2286,0.958
+DH004,110.0,112.0,3.202,0.2465,6.379
+DH004,112.0,114.0,0.352,0.0684,0.824
+DH004,114.0,116.0,2.204,0.1372,6.58
+DH004,116.0,118.0,1.592,0.1031,4.542
+DH004,118.0,120.0,2.918,0.2894,6.353
+DH004,120.0,122.0,0.997,0.2104,1.927
+DH004,122.0,124.0,2.164,0.1495,5.257
+DH004,124.0,126.0,1.206,0.0945,3.557
+DH004,126.0,128.0,0.857,0.0966,1.995
+DH004,128.0,130.0,4.578,0.1083,9.836
+DH004,130.0,132.0,0.239,0.1502,0.694
+DH004,132.0,134.0,5.989,0.1261,15.319
+DH004,134.0,136.0,0.361,0.0822,0.921
+DH004,136.0,138.0,16.533,0.3311,37.158
+DH004,138.0,140.0,0.348,0.216,0.97
+DH004,140.0,142.0,0.197,0.2475,0.535
+DH004,142.0,144.0,0.59,0.2351,1.233
+DH004,144.0,146.0,6.912,0.2489,16.284
+DH004,146.0,148.0,2.247,0.2035,5.791
+DH004,148.0,150.0,0.688,2.1203,1.868
+DH004,150.0,152.0,3.515,0.3396,10.329
+DH004,152.0,154.0,5.76,0.0618,17.033
+DH004,154.0,156.0,1.478,0.2431,3.569
+DH004,156.0,158.0,4.185,0.1325,11.081
+DH004,158.0,160.0,1.583,1.0408,2.634
+DH004,160.0,162.0,2.353,0.2348,5.056
+DH004,162.0,164.0,8.391,0.1715,23.13
+DH004,164.0,166.0,7.202,0.1451,10.981
+DH004,166.0,168.0,0.334,0.3919,0.853
+DH004,168.0,170.0,5.288,0.7185,12.63
+DH004,170.0,172.0,2.955,0.1049,8.373
+DH004,172.0,174.0,5.622,0.2421,10.332
+DH004,174.0,176.0,0.459,0.0739,1.02
+DH004,176.0,178.0,26.488,0.6636,73.581
+DH004,178.0,180.0,12.247,0.472,24.691
+DH004,180.0,182.0,1.547,0.536,4.174
+DH004,182.0,184.0,0.463,0.3637,1.126
+DH004,184.0,186.0,1.703,0.5545,3.843
+DH004,186.0,188.0,1.223,0.4545,3.62
+DH004,188.0,190.0,10.719,0.4491,23.844
+DH004,190.0,192.0,5.363,0.2759,14.174
+DH004,192.0,194.0,1.674,0.0846,3.63
+DH004,194.0,196.0,1.587,0.2707,4.332
+DH004,196.0,198.0,2.117,0.498,3.409
+DH004,198.0,200.0,1.686,0.3591,3.545
+DH004,200.0,202.0,10.876,0.3711,29.377
+DH004,202.0,204.0,2.702,0.834,7.211
+DH004,204.0,206.0,3.809,0.3453,7.587
+DH004,206.0,208.0,4.108,0.0732,6.435
+DH004,208.0,210.0,8.092,0.2968,17.458
+DH004,210.0,212.0,3.803,0.2127,8.563
+DH004,212.0,214.0,4.895,0.1247,7.372
+DH004,214.0,216.0,1.53,0.0628,2.752
+DH004,216.0,218.0,14.612,0.3035,29.097
+DH004,218.0,220.0,0.35,0.204,0.843
+DH004,220.0,222.0,1.779,0.6348,3.094
+DH004,222.0,224.0,3.918,0.0766,9.531
+DH004,224.0,226.0,1.489,0.4451,4.1
+DH004,226.0,228.0,2.752,0.2957,7.783
+DH004,228.0,230.0,3.616,0.1803,6.454
+DH004,230.0,232.0,15.281,0.5164,36.647
+DH004,232.0,234.0,4.402,0.1232,7.012
+DH004,234.0,236.0,7.695,0.0571,20.829
+DH004,236.0,238.0,1.643,0.1884,2.539
+DH004,238.0,240.0,4.47,0.1152,7.053
+DH004,240.0,242.0,2.55,0.0817,5.314
+DH004,242.0,244.0,11.676,0.8532,22.721
+DH004,244.0,246.0,0.533,0.3304,0.963
+DH004,246.0,248.0,5.317,0.4181,9.239
+DH004,248.0,250.0,2.04,0.1371,3.711
+DH004,250.0,252.0,0.101,0.0201,0.119
+DH004,252.0,254.0,0.037,0.0253,0.026
+DH004,254.0,256.0,0.086,0.0178,0.093
+DH004,256.0,258.0,0.278,0.011,0.221
+DH004,258.0,260.0,0.051,0.0139,0.07
+DH004,260.0,262.0,0.184,0.0451,0.143
+DH004,262.0,264.0,0.065,0.0637,0.044
+DH004,264.0,266.0,0.058,0.0075,0.04
+DH004,266.0,268.0,0.147,0.0614,0.213
+DH004,268.0,270.0,0.197,0.019,0.106
+DH004,270.0,272.0,0.031,0.0382,0.032
+DH004,272.0,274.0,0.08,0.0253,0.064
+DH004,274.0,276.0,0.058,0.0145,0.054
+DH004,276.0,278.0,0.089,0.0073,0.095
+DH004,278.0,280.0,0.168,0.0129,0.11
+DH004,280.0,282.0,0.07,0.0216,0.066
+DH004,282.0,284.0,0.048,0.031,0.061
+DH004,284.0,286.0,0.276,0.0187,0.373
+DH004,286.0,288.0,0.171,0.0251,0.223
+DH004,288.0,290.0,0.168,0.0132,0.191
+DH004,290.0,292.0,0.074,0.0096,0.069
+DH004,292.0,294.0,0.183,0.0206,0.268
+DH004,294.0,296.0,0.032,0.0421,0.041
+DH004,296.0,298.0,0.056,0.016,0.06
+DH004,298.0,300.0,0.193,0.015,0.284
+DH004,300.0,302.0,0.085,0.0374,0.11
+DH004,302.0,304.0,0.137,0.0262,0.094
+DH004,304.0,306.0,0.101,0.0163,0.06
+DH004,306.0,308.0,0.048,0.0184,0.066
+DH004,308.0,310.0,0.105,0.0148,0.061
+DH004,310.0,312.0,0.074,0.0083,0.093
+DH004,312.0,314.0,0.042,0.0077,0.032
+DH004,314.0,316.0,0.11,0.0238,0.073
+DH005,0.0,2.0,0.026,0.0093,0.015
+DH005,2.0,4.0,0.044,0.0249,0.056
+DH005,4.0,6.0,0.086,0.0133,0.1
+DH005,6.0,8.0,0.089,0.0146,0.13
+DH005,8.0,10.0,0.096,0.01,0.125
+DH005,10.0,12.0,0.397,0.036,0.23
+DH005,12.0,14.0,0.078,0.0069,0.046
+DH005,14.0,16.0,0.177,0.0123,0.129
+DH005,16.0,18.0,0.074,0.0108,0.109
+DH005,18.0,20.0,0.08,0.0117,0.095
+DH005,20.0,22.0,0.051,0.0238,0.027
+DH005,22.0,24.0,0.074,0.0247,0.085
+DH005,24.0,26.0,0.069,0.0232,0.064
+DH005,26.0,28.0,0.075,0.0191,0.053
+DH005,28.0,30.0,0.049,0.0269,0.025
+DH005,30.0,32.0,0.108,0.0211,0.122
+DH005,32.0,34.0,0.125,0.0292,0.133
+DH005,34.0,36.0,0.077,0.0366,0.043
+DH005,36.0,38.0,0.12,0.0211,0.111
+DH005,38.0,40.0,0.053,0.026,0.071
+DH005,40.0,42.0,0.066,0.019,0.068
+DH005,42.0,44.0,0.061,0.0396,0.064
+DH005,44.0,46.0,0.062,0.0083,0.089
+DH005,46.0,48.0,0.029,0.0251,0.033
+DH005,48.0,50.0,0.066,0.008,0.052
+DH005,50.0,52.0,0.053,0.0351,0.029
+DH005,52.0,54.0,0.056,0.0168,0.066
+DH005,54.0,56.0,0.072,0.0143,0.079
+DH005,56.0,58.0,0.075,0.0097,0.091
+DH005,58.0,60.0,0.028,0.0147,0.026
+DH005,60.0,62.0,0.098,0.0246,0.088
+DH005,62.0,64.0,0.166,0.0291,0.216
+DH005,64.0,66.0,0.143,0.0267,0.083
+DH005,66.0,68.0,0.037,0.0226,0.043
+DH005,68.0,70.0,0.158,0.0115,0.13
+DH005,70.0,72.0,0.108,0.0177,0.121
+DH005,72.0,74.0,0.103,0.0073,0.072
+DH005,74.0,76.0,0.185,0.0456,0.277
+DH005,76.0,78.0,0.067,0.0187,0.098
+DH005,78.0,80.0,0.061,0.0144,0.074
+DH005,80.0,82.0,1.419,0.3976,3.116
+DH005,82.0,84.0,1.812,0.0592,5.027
+DH005,84.0,86.0,6.092,0.2144,10.44
+DH005,86.0,88.0,0.906,0.187,2.07
+DH005,88.0,90.0,7.239,0.0273,14.236
+DH005,90.0,92.0,2.694,0.2062,4.818
+DH005,92.0,94.0,3.068,0.1748,7.846
+DH005,94.0,96.0,1.658,0.5593,4.508
+DH005,96.0,98.0,2.064,0.2584,5.634
+DH005,98.0,100.0,1.552,0.4805,4.343
+DH005,100.0,102.0,2.062,0.1885,4.035
+DH005,102.0,104.0,1.637,0.4419,4.078
+DH005,104.0,106.0,2.952,0.0907,8.265
+DH005,106.0,108.0,29.141,0.1935,52.775
+DH005,108.0,110.0,12.395,0.2796,34.0
+DH005,110.0,112.0,1.886,0.1729,4.332
+DH005,112.0,114.0,0.423,0.208,0.658
+DH005,114.0,116.0,20.503,0.239,41.293
+DH005,116.0,118.0,1.988,1.9969,3.26
+DH005,118.0,120.0,0.841,0.358,1.502
+DH005,120.0,122.0,0.438,0.1689,1.237
+DH005,122.0,124.0,0.235,0.089,0.662
+DH005,124.0,126.0,1.364,0.306,4.007
+DH005,126.0,128.0,5.243,0.0866,8.407
+DH005,128.0,130.0,0.284,0.0931,0.829
+DH005,130.0,132.0,16.397,0.2871,32.356
+DH005,132.0,134.0,2.273,0.0982,4.343
+DH005,134.0,136.0,0.52,0.0802,1.168
+DH005,136.0,138.0,1.371,0.0909,2.351
+DH005,138.0,140.0,0.467,0.2828,1.065
+DH005,140.0,142.0,12.036,0.2891,21.707
+DH005,142.0,144.0,0.899,0.2334,2.013
+DH005,144.0,146.0,1.355,0.1809,2.928
+DH005,146.0,148.0,0.518,0.072,1.065
+DH005,148.0,150.0,0.626,0.3686,1.378
+DH005,150.0,152.0,0.431,0.9349,1.28
+DH005,152.0,154.0,3.272,0.373,6.495
+DH005,154.0,156.0,0.358,0.1855,0.588
+DH005,156.0,158.0,41.912,0.0623,74.207
+DH005,158.0,160.0,0.638,0.0674,1.773
+DH005,160.0,162.0,40.729,0.1525,72.343
+DH005,162.0,164.0,0.152,0.1835,0.265
+DH005,164.0,166.0,1.019,0.2664,1.791
+DH005,166.0,168.0,3.28,0.1733,7.699
+DH005,168.0,170.0,4.948,0.2254,10.783
+DH005,170.0,172.0,5.744,0.0715,10.525
+DH005,172.0,174.0,0.899,0.0958,2.565
+DH005,174.0,176.0,3.393,0.5376,8.406
+DH005,176.0,178.0,2.859,0.5826,8.17
+DH005,178.0,180.0,2.415,0.7293,5.942
+DH005,180.0,182.0,1.545,0.1141,3.043
+DH005,182.0,183.0,9.82,0.2143,26.833
+DH006,0.0,2.0,0.025,0.0178,0.016
+DH006,2.0,4.0,0.053,0.0603,0.04
+DH006,4.0,6.0,0.064,0.0186,0.078
+DH006,6.0,8.0,0.052,0.0299,0.054
+DH006,8.0,10.0,0.05,0.0353,0.067
+DH006,10.0,12.0,0.112,0.0146,0.1
+DH006,12.0,14.0,0.051,0.0111,0.061
+DH006,14.0,16.0,0.057,0.0109,0.035
+DH006,16.0,18.0,0.094,0.0206,0.112
+DH006,18.0,20.0,0.055,0.0212,0.049
+DH006,20.0,22.0,0.07,0.0266,0.048
+DH006,22.0,24.0,0.1,0.0161,0.115
+DH006,24.0,26.0,0.036,0.0122,0.034
+DH006,26.0,28.0,0.042,0.0228,0.051
+DH006,28.0,30.0,0.048,0.0211,0.068
+DH006,30.0,32.0,0.068,0.013,0.039
+DH006,32.0,34.0,0.055,0.0304,0.069
+DH006,34.0,36.0,0.056,0.0098,0.04
+DH006,36.0,38.0,0.14,0.021,0.158
+DH006,38.0,40.0,0.194,0.0157,0.154
+DH006,40.0,42.0,0.109,0.012,0.088
+DH006,42.0,44.0,0.102,0.0208,0.124
+DH006,44.0,46.0,0.231,0.02,0.235
+DH006,46.0,48.0,0.203,0.0297,0.258
+DH006,48.0,50.0,0.082,0.0202,0.063
+DH006,50.0,52.0,0.036,0.0085,0.03
+DH006,52.0,54.0,0.046,0.0133,0.06
+DH006,54.0,56.0,0.074,0.0202,0.111
+DH006,56.0,58.0,0.062,0.0246,0.061
+DH006,58.0,60.0,0.053,0.0199,0.065
+DH006,60.0,62.0,0.081,0.013,0.082
+DH006,62.0,64.0,0.087,0.017,0.087
+DH006,64.0,66.0,0.035,0.0113,0.045
+DH006,66.0,68.0,0.074,0.0138,0.04
+DH006,68.0,70.0,0.085,0.0286,0.064
+DH006,70.0,72.0,0.104,0.014,0.098
+DH006,72.0,74.0,0.103,0.0282,0.1
+DH006,74.0,76.0,0.117,0.0174,0.165
+DH006,76.0,78.0,0.155,0.0132,0.11
+DH006,78.0,80.0,0.092,0.0225,0.124
+DH006,80.0,82.0,2.035,0.207,3.811
+DH006,82.0,84.0,1.71,0.1967,3.941
+DH006,84.0,86.0,12.171,0.0844,31.162
+DH006,86.0,88.0,0.097,0.1519,0.26
+DH006,88.0,90.0,1.207,0.5413,3.595
+DH006,90.0,92.0,2.443,0.1659,6.325
+DH006,92.0,94.0,2.173,0.1159,4.839
+DH006,94.0,96.0,1.311,0.4081,2.17
+DH006,96.0,98.0,2.396,0.121,5.367
+DH006,98.0,100.0,4.316,0.0544,10.05
+DH006,100.0,102.0,5.937,0.3163,13.529
+DH006,102.0,104.0,4.384,0.2558,7.727
+DH006,104.0,106.0,20.501,0.1684,55.546
+DH006,106.0,108.0,0.122,0.6195,0.32
+DH006,108.0,110.0,2.307,0.3489,3.673
+DH006,110.0,112.0,1.029,0.3457,2.623
+DH006,112.0,114.0,1.072,0.5497,1.79
+DH006,114.0,116.0,0.953,0.1241,2.401
+DH006,116.0,118.0,5.361,0.1003,13.546
+DH006,118.0,120.0,5.453,0.2079,10.916
+DH006,120.0,122.0,1.545,0.188,4.339
+DH006,122.0,124.0,7.543,0.1208,17.613
+DH006,124.0,126.0,2.043,0.0961,3.165
+DH006,126.0,128.0,11.698,0.2622,18.726
+DH006,128.0,130.0,3.21,0.1985,8.996
+DH006,130.0,132.0,1.727,0.2803,4.62
+DH006,132.0,134.0,12.232,0.0512,27.683
+DH006,134.0,136.0,24.369,0.2033,67.788
+DH006,136.0,138.0,1.384,0.7143,3.737
+DH006,138.0,140.0,0.813,0.129,1.448
+DH006,140.0,142.0,3.433,0.6509,5.513
+DH006,142.0,144.0,3.847,0.0769,11.287
+DH006,144.0,146.0,4.22,0.076,11.95
+DH006,146.0,148.0,3.206,0.0898,8.107
+DH006,148.0,150.0,1.988,0.3338,5.413
+DH006,150.0,152.0,4.611,0.2367,13.821
+DH006,152.0,154.0,0.772,0.1228,2.156
+DH006,154.0,156.0,1.206,0.3097,2.54
+DH006,156.0,158.0,0.179,0.119,0.457
+DH006,158.0,160.0,2.447,0.0718,5.931
+DH006,160.0,162.0,2.15,0.3035,3.728
+DH006,162.0,164.0,1.432,0.1247,4.283
+DH006,164.0,166.0,7.418,0.4307,11.853
+DH006,166.0,168.0,0.668,0.62,1.812
+DH006,168.0,170.0,3.127,0.0601,7.454
+DH006,170.0,172.0,3.261,0.1168,7.199
+DH006,172.0,174.0,4.258,1.2166,8.624
+DH006,174.0,176.0,1.634,0.2247,3.808
+DH006,176.0,178.0,8.555,0.1695,20.885
+DH006,178.0,180.0,3.192,0.3475,6.027
+DH006,180.0,182.0,1.927,0.6729,5.592
+DH006,182.0,184.0,3.947,0.8828,8.27
+DH006,184.0,186.0,15.605,0.3444,37.885
+DH006,186.0,188.0,0.532,0.1285,1.238
+DH006,188.0,190.0,3.585,1.062,9.894
+DH006,190.0,192.0,6.592,0.5655,19.181
+DH006,192.0,194.0,0.702,0.6881,1.939
+DH006,194.0,196.0,4.57,0.2628,7.026
+DH006,196.0,198.0,2.025,0.3726,3.424
+DH006,198.0,200.0,0.804,0.0964,2.351
+DH006,200.0,202.0,2.905,0.2184,6.622
+DH006,202.0,204.0,4.059,0.1351,6.505
+DH006,204.0,206.0,1.614,0.1578,4.582
+DH006,206.0,208.0,0.246,0.1185,0.484
+DH006,208.0,210.0,0.277,0.5456,0.516
+DH006,210.0,212.0,1.429,0.2818,4.24
+DH006,212.0,214.0,1.271,0.4467,3.029
+DH006,214.0,216.0,1.255,0.1177,2.417
+DH006,216.0,218.0,8.931,0.1926,15.616
+DH006,218.0,220.0,0.607,0.306,1.569
+DH006,220.0,222.0,3.57,0.1637,5.495
+DH006,222.0,224.0,1.67,0.1649,3.068
+DH006,224.0,226.0,12.063,0.0293,34.656
+DH006,226.0,228.0,1.276,0.1607,3.292
+DH006,228.0,230.0,0.945,0.1295,2.494
+DH006,230.0,232.0,3.657,0.1567,7.456
+DH006,232.0,234.0,0.788,0.6219,2.075
+DH006,234.0,236.0,3.824,0.181,10.313
+DH006,236.0,238.0,16.661,0.1919,31.818
+DH006,238.0,240.0,8.293,0.1252,23.873
+DH006,240.0,242.0,2.253,0.2232,3.932
+DH006,242.0,244.0,27.385,0.292,71.578
+DH006,244.0,246.0,3.292,0.23,8.767
+DH006,246.0,248.0,3.472,0.2716,5.219
+DH006,248.0,250.0,2.089,0.3644,3.699
+DH006,250.0,252.0,0.046,0.0831,0.051
+DH006,252.0,254.0,0.087,0.0087,0.056
+DH006,254.0,256.0,0.047,0.0147,0.038
+DH006,256.0,258.0,0.109,0.0243,0.095
+DH006,258.0,260.0,0.247,0.0101,0.328
+DH006,260.0,262.0,0.152,0.0244,0.121
+DH006,262.0,264.0,0.09,0.0145,0.124
+DH006,264.0,266.0,0.071,0.0066,0.068
+DH006,266.0,268.0,0.078,0.0144,0.082
+DH006,268.0,270.0,0.102,0.0117,0.15
+DH006,270.0,272.0,0.105,0.0237,0.108
+DH006,272.0,274.0,0.041,0.0191,0.045
+DH006,274.0,276.0,0.044,0.0126,0.041
+DH006,276.0,278.0,0.066,0.0146,0.097
+DH006,278.0,280.0,0.101,0.0217,0.067
+DH006,280.0,282.0,0.057,0.0061,0.042
+DH006,282.0,284.0,0.107,0.0167,0.123
+DH006,284.0,286.0,0.128,0.0084,0.147
+DH006,286.0,288.0,0.042,0.0444,0.055
+DH006,288.0,290.0,0.022,0.0086,0.025
+DH006,290.0,292.0,0.062,0.0094,0.084
+DH006,292.0,294.0,0.099,0.0232,0.061
+DH006,294.0,296.0,0.127,0.0151,0.13
+DH006,296.0,298.0,0.118,0.0081,0.072
+DH006,298.0,300.0,0.092,0.0348,0.09
+DH006,300.0,302.0,0.047,0.0102,0.06
+DH006,302.0,304.0,0.085,0.0145,0.095
+DH006,304.0,306.0,0.038,0.0179,0.034
+DH006,306.0,308.0,0.054,0.0397,0.068
+DH006,308.0,310.0,0.176,0.014,0.179
+DH006,310.0,312.0,0.079,0.0078,0.049
+DH006,312.0,314.0,0.076,0.0266,0.06
+DH006,314.0,316.0,0.074,0.0119,0.043
+DH006,316.0,318.0,0.099,0.022,0.134
+DH006,318.0,320.0,0.164,0.0269,0.201
+DH006,320.0,322.0,0.054,0.0111,0.057
+DH006,322.0,324.0,0.091,0.0091,0.105
+DH006,324.0,326.0,0.033,0.0178,0.02
+DH006,326.0,328.0,0.113,0.0221,0.098
+DH006,328.0,330.0,0.137,0.0148,0.203
+DH006,330.0,332.0,0.035,0.0113,0.027
+DH006,332.0,334.0,0.022,0.018,0.028
+DH006,334.0,336.0,0.087,0.0107,0.103
+DH006,336.0,338.0,0.083,0.0369,0.062
+DH006,338.0,340.0,0.052,0.0162,0.063
+DH006,340.0,342.0,0.105,0.0246,0.156
+DH006,342.0,344.0,0.057,0.016,0.074
+DH006,344.0,346.0,0.093,0.0222,0.117
+DH006,346.0,348.0,0.158,0.0135,0.169
+DH006,348.0,350.0,0.113,0.0182,0.075
+DH006,350.0,352.0,0.352,0.0122,0.243
+DH007,0.0,2.0,0.052,0.0447,0.052
+DH007,2.0,4.0,0.055,0.0237,0.071
+DH007,4.0,6.0,0.06,0.0268,0.071
+DH007,6.0,8.0,0.093,0.0179,0.132
+DH007,8.0,10.0,0.094,0.0189,0.069
+DH007,10.0,12.0,0.227,0.0108,0.159
+DH007,12.0,14.0,0.068,0.0441,0.063
+DH007,14.0,16.0,0.053,0.0113,0.047
+DH007,16.0,18.0,0.036,0.0144,0.054
+DH007,18.0,20.0,0.095,0.0143,0.078
+DH007,20.0,22.0,0.157,0.0095,0.095
+DH007,22.0,24.0,0.054,0.0408,0.043
+DH007,24.0,26.0,0.045,0.0116,0.037
+DH007,26.0,28.0,0.07,0.0168,0.074
+DH007,28.0,30.0,0.052,0.0192,0.037
+DH007,30.0,32.0,0.133,0.0169,0.187
+DH007,32.0,34.0,0.029,0.0108,0.02
+DH007,34.0,36.0,0.076,0.019,0.072
+DH007,36.0,38.0,0.04,0.0163,0.046
+DH007,38.0,40.0,0.054,0.0375,0.064
+DH007,40.0,42.0,0.098,0.0449,0.068
+DH007,42.0,44.0,0.082,0.022,0.044
+DH007,44.0,46.0,0.098,0.0105,0.139
+DH007,46.0,48.0,0.155,0.021,0.149
+DH007,48.0,50.0,0.046,0.0243,0.029
+DH007,50.0,52.0,0.016,0.0341,0.023
+DH007,52.0,54.0,0.05,0.0301,0.033
+DH007,54.0,56.0,0.054,0.0219,0.052
+DH007,56.0,58.0,0.217,0.0219,0.198
+DH007,58.0,60.0,0.132,0.0098,0.181
+DH007,60.0,62.0,0.068,0.0253,0.055
+DH007,62.0,64.0,0.099,0.0163,0.115
+DH007,64.0,66.0,0.088,0.0039,0.056
+DH007,66.0,68.0,0.121,0.0229,0.152
+DH007,68.0,70.0,0.22,0.0214,0.21
+DH007,70.0,72.0,0.154,0.022,0.149
+DH007,72.0,74.0,0.019,0.0144,0.026
+DH007,74.0,76.0,0.066,0.0273,0.06
+DH007,76.0,78.0,0.178,0.0158,0.227
+DH007,78.0,80.0,0.111,0.0388,0.094
+DH007,80.0,82.0,1.284,0.4399,2.092
+DH007,82.0,84.0,2.969,0.1765,5.995
+DH007,84.0,86.0,3.443,0.4089,8.324
+DH007,86.0,88.0,1.445,0.2906,2.588
+DH007,88.0,90.0,21.511,0.4042,48.612
+DH007,90.0,92.0,2.086,0.3485,4.828
+DH007,92.0,94.0,2.794,0.0957,4.485
+DH007,94.0,96.0,0.567,0.1579,1.07
+DH007,96.0,98.0,24.269,0.1591,47.923
+DH007,98.0,100.0,1.149,0.8412,2.132
+DH007,100.0,102.0,0.668,1.9838,1.685
+DH007,102.0,104.0,0.59,0.2158,1.451
+DH007,104.0,106.0,6.143,0.972,16.394
+DH007,106.0,108.0,1.164,0.4188,1.81
+DH007,108.0,110.0,0.644,0.0546,1.805
+DH007,110.0,112.0,0.759,0.087,1.742
+DH007,112.0,114.0,0.528,0.018,1.523
+DH007,114.0,116.0,1.263,0.1375,3.77
+DH007,116.0,118.0,1.066,0.4515,2.401
+DH007,118.0,120.0,2.115,0.1144,4.783
+DH007,120.0,122.0,0.889,0.2556,2.211
+DH007,122.0,124.0,0.716,0.4934,1.837
+DH007,124.0,126.0,1.3,0.2507,1.959
+DH007,126.0,128.0,0.786,0.2361,1.267
+DH007,128.0,130.0,0.716,0.0609,1.37
+DH007,130.0,132.0,4.395,0.128,13.168
+DH007,132.0,134.0,6.442,0.6335,19.006
+DH007,134.0,136.0,20.562,0.1189,53.962
+DH007,136.0,138.0,1.968,0.1562,4.402
+DH007,138.0,140.0,2.669,0.2781,7.829
+DH007,140.0,142.0,3.52,0.4228,6.27
+DH007,142.0,144.0,0.598,0.8116,1.576
+DH007,144.0,146.0,1.054,0.1357,1.653
+DH007,146.0,148.0,0.951,0.0799,2.466
+DH007,148.0,150.0,1.761,0.1389,3.794
+DH007,150.0,152.0,3.164,0.2759,7.977
+DH007,152.0,154.0,1.925,0.2978,4.123
+DH007,154.0,156.0,1.988,0.529,4.476
+DH007,156.0,158.0,5.763,0.1508,14.821
+DH007,158.0,160.0,3.071,0.3986,7.85
+DH007,160.0,162.0,3.694,0.1688,6.532
+DH007,162.0,164.0,4.315,0.3138,12.356
+DH007,164.0,166.0,8.426,0.1101,21.262
+DH007,166.0,168.0,15.859,0.447,43.45
+DH007,168.0,170.0,3.142,0.2525,5.293
+DH007,170.0,172.0,0.75,0.2142,1.603
+DH007,172.0,174.0,2.994,0.5508,6.264
+DH007,174.0,176.0,0.626,0.2893,1.554
+DH007,176.0,178.0,1.845,0.1767,3.326
+DH007,178.0,180.0,0.151,0.1635,0.255
+DH007,180.0,182.0,0.872,0.4583,1.913
+DH007,182.0,184.0,2.102,0.1797,4.031
+DH007,184.0,186.0,1.963,0.2096,3.743
+DH007,186.0,188.0,3.013,0.4076,5.04
+DH007,188.0,190.0,0.631,0.0551,1.365
+DH007,190.0,192.0,3.005,0.3343,5.61
+DH007,192.0,194.0,18.953,0.1371,43.192
+DH007,194.0,196.0,6.204,0.1013,15.639
+DH007,196.0,198.0,2.759,2.1946,4.759
+DH007,198.0,200.0,15.297,0.5854,30.753
+DH007,200.0,202.0,0.679,0.5209,1.13
+DH007,202.0,204.0,15.196,0.2618,45.582
+DH007,204.0,206.0,20.213,0.1699,43.724
+DH007,206.0,208.0,1.675,0.3953,3.72
+DH007,208.0,210.0,0.464,0.2107,1.316
+DH007,210.0,212.0,1.465,0.5956,2.832
+DH007,212.0,214.0,3.241,0.2356,8.313
+DH007,214.0,216.0,0.457,0.2253,0.769
+DH007,216.0,218.0,4.46,0.0561,7.496
+DH007,218.0,220.0,5.364,0.2066,15.618
+DH007,220.0,222.0,0.773,0.2953,2.029
+DH007,222.0,224.0,3.824,0.156,8.077
+DH007,224.0,226.0,2.294,0.3444,6.468
+DH007,226.0,228.0,7.162,0.1542,13.065
+DH007,228.0,230.0,23.864,0.1376,46.058
+DH007,230.0,232.0,2.057,0.2355,5.514
+DH007,232.0,234.0,2.179,0.2161,3.772
+DH008,0.0,2.0,0.02,0.0469,0.023
+DH008,2.0,4.0,0.116,0.0092,0.064
+DH008,4.0,6.0,0.055,0.0382,0.057
+DH008,6.0,8.0,0.129,0.0132,0.166
+DH008,8.0,10.0,0.071,0.0348,0.052
+DH008,10.0,12.0,0.037,0.0069,0.055
+DH008,12.0,14.0,0.05,0.0082,0.069
+DH008,14.0,16.0,0.025,0.011,0.03
+DH008,16.0,18.0,0.105,0.0201,0.103
+DH008,18.0,20.0,0.033,0.0104,0.017
+DH008,20.0,22.0,0.138,0.0288,0.073
+DH008,22.0,24.0,0.053,0.0185,0.03
+DH008,24.0,26.0,0.073,0.0507,0.079
+DH008,26.0,28.0,0.071,0.0336,0.051
+DH008,28.0,30.0,0.056,0.0141,0.079
+DH008,30.0,32.0,0.032,0.0247,0.021
+DH008,32.0,34.0,0.111,0.0119,0.126
+DH008,34.0,36.0,0.048,0.0155,0.029
+DH008,36.0,38.0,0.087,0.0101,0.105
+DH008,38.0,40.0,0.036,0.0101,0.026
+DH008,40.0,42.0,0.063,0.0293,0.054
+DH008,42.0,44.0,0.112,0.0106,0.131
+DH008,44.0,46.0,0.097,0.0134,0.053
+DH008,46.0,48.0,0.107,0.0154,0.123
+DH008,48.0,50.0,0.213,0.0168,0.157
+DH008,50.0,52.0,0.115,0.0088,0.141
+DH008,52.0,54.0,0.05,0.0119,0.05
+DH008,54.0,56.0,0.119,0.0343,0.111
+DH008,56.0,58.0,0.063,0.0065,0.087
+DH008,58.0,60.0,0.083,0.0201,0.092
+DH008,60.0,62.0,0.173,0.0271,0.189
+DH008,62.0,64.0,0.06,0.0175,0.082
+DH008,64.0,66.0,0.111,0.0219,0.124
+DH008,66.0,68.0,0.168,0.0193,0.116
+DH008,68.0,70.0,0.08,0.0211,0.059
+DH008,70.0,72.0,0.067,0.0277,0.06
+DH008,72.0,74.0,0.037,0.009,0.027
+DH008,74.0,76.0,0.168,0.0215,0.249
+DH008,76.0,78.0,0.155,0.0258,0.164
+DH008,78.0,80.0,0.232,0.0239,0.18
+DH008,80.0,82.0,0.998,0.274,2.399
+DH008,82.0,84.0,5.153,0.1041,8.976
+DH008,84.0,86.0,1.19,0.1806,3.431
+DH008,86.0,88.0,1.834,1.0116,3.735
+DH008,88.0,90.0,3.405,0.2187,6.612
+DH008,90.0,92.0,8.636,0.1149,19.506
+DH008,92.0,94.0,0.25,0.548,0.558
+DH008,94.0,96.0,2.45,0.0408,6.311
+DH008,96.0,98.0,0.752,0.1312,1.598
+DH008,98.0,100.0,3.021,0.151,6.405
+DH008,100.0,102.0,2.588,0.1608,7.522
+DH008,102.0,104.0,1.493,0.2928,3.94
+DH008,104.0,106.0,0.408,0.4923,1.221
+DH008,106.0,108.0,1.303,0.1359,3.211
+DH008,108.0,110.0,4.367,0.5496,10.239
+DH008,110.0,112.0,4.499,0.261,10.895
+DH008,112.0,114.0,21.773,0.0706,38.038
+DH008,114.0,116.0,3.554,0.2782,9.79
+DH008,116.0,118.0,6.006,0.064,15.795
+DH008,118.0,120.0,1.131,0.1298,3.269
+DH008,120.0,122.0,8.109,0.1696,12.818
+DH008,122.0,124.0,2.362,0.1092,4.631
+DH008,124.0,126.0,1.554,0.1278,3.618
+DH008,126.0,128.0,2.949,0.0625,5.37
+DH008,128.0,130.0,3.705,0.1162,7.222
+DH008,130.0,132.0,5.681,0.0807,12.593
+DH008,132.0,134.0,16.599,0.2956,25.891
+DH008,134.0,136.0,0.726,0.1483,1.765
+DH008,136.0,138.0,6.424,0.1199,18.593
+DH008,138.0,140.0,1.376,0.0968,3.913
+DH008,140.0,142.0,0.095,0.2026,0.183
+DH008,142.0,144.0,5.988,0.0493,13.238
+DH008,144.0,146.0,5.958,0.6075,8.97
+DH008,146.0,148.0,7.513,0.0688,16.4
+DH008,148.0,150.0,0.882,0.0595,2.566
+DH008,150.0,152.0,2.24,0.1154,5.541
+DH008,152.0,154.0,0.254,0.0407,0.666
+DH008,154.0,156.0,6.583,0.0964,16.054
+DH008,156.0,158.0,7.564,0.312,13.325
+DH008,158.0,160.0,8.283,0.1244,12.477
+DH008,160.0,162.0,2.178,0.1794,5.417
+DH008,162.0,164.0,2.429,0.2294,6.099
+DH008,164.0,166.0,5.825,0.1022,8.935
+DH008,166.0,168.0,1.562,0.2972,3.683
+DH008,168.0,170.0,6.482,0.1298,10.914
+DH008,170.0,172.0,1.254,0.2146,3.713
+DH008,172.0,174.0,1.596,0.6011,4.196
+DH008,174.0,176.0,3.664,0.236,6.442
+DH008,176.0,178.0,0.978,0.1015,1.716
+DH008,178.0,180.0,2.508,0.187,7.261
+DH008,180.0,182.0,10.651,0.1022,23.185
+DH008,182.0,184.0,0.397,1.1324,1.138
+DH008,184.0,186.0,3.958,0.0764,8.164
+DH008,186.0,188.0,4.1,0.1823,6.905
+DH008,188.0,190.0,35.666,0.1046,58.783
+DH008,190.0,192.0,0.776,0.8065,1.679
+DH008,192.0,194.0,1.891,0.2298,3.385
+DH008,194.0,196.0,6.476,0.1647,18.605
+DH008,196.0,198.0,4.621,0.192,11.869
+DH008,198.0,200.0,2.254,0.4216,3.745
+DH008,200.0,202.0,4.493,0.4243,7.675
+DH008,202.0,204.0,0.952,0.3765,1.801
+DH008,204.0,206.0,0.404,0.1716,0.914
+DH008,206.0,208.0,1.206,0.7301,3.296
+DH008,208.0,210.0,11.563,0.2755,21.821
+DH008,210.0,212.0,0.723,0.2253,2.035
+DH008,212.0,214.0,0.431,0.1449,0.923
+DH008,214.0,216.0,3.655,0.3227,8.691
+DH008,216.0,218.0,3.907,0.1929,8.019
+DH008,218.0,220.0,1.244,0.529,3.489
+DH008,220.0,222.0,2.548,0.7931,7.477
+DH008,222.0,224.0,2.231,0.0786,6.224
+DH008,224.0,226.0,2.014,0.2316,4.765
+DH008,226.0,228.0,4.922,0.1107,12.784
+DH008,228.0,230.0,4.031,0.1354,12.008
+DH008,230.0,232.0,2.088,0.0683,3.483
+DH008,232.0,234.0,2.751,0.1082,5.395
+DH008,234.0,236.0,0.231,0.0926,0.501
+DH008,236.0,238.0,32.4,0.399,85.651
+DH008,238.0,240.0,1.325,0.1038,2.468
+DH008,240.0,242.0,1.774,1.2123,4.136
+DH008,242.0,244.0,0.276,0.131,0.552
+DH008,244.0,246.0,2.022,0.2126,6.063
+DH008,246.0,248.0,3.534,0.0943,6.794
+DH008,248.0,250.0,4.664,0.2228,11.46
+DH008,250.0,252.0,0.044,0.0193,0.024
+DH008,252.0,254.0,0.1,0.0244,0.083
+DH008,254.0,256.0,0.144,0.019,0.196
+DH008,256.0,258.0,0.057,0.0164,0.037
+DH008,258.0,260.0,0.062,0.0115,0.058
+DH008,260.0,262.0,0.03,0.0163,0.038
+DH008,262.0,264.0,0.045,0.015,0.039
+DH008,264.0,266.0,0.103,0.0265,0.12
+DH008,266.0,268.0,0.063,0.024,0.053
+DH008,268.0,270.0,0.051,0.0333,0.056
+DH008,270.0,272.0,0.118,0.0291,0.144
+DH008,272.0,274.0,0.185,0.0223,0.13
+DH008,274.0,276.0,0.104,0.0188,0.12
+DH008,276.0,278.0,0.102,0.0157,0.146
+DH008,278.0,280.0,0.032,0.014,0.027
+DH008,280.0,282.0,0.056,0.0163,0.033
+DH008,282.0,284.0,0.1,0.0127,0.139
+DH008,284.0,286.0,0.137,0.0129,0.175
+DH008,286.0,288.0,0.134,0.031,0.087
+DH008,288.0,290.0,0.574,0.031,0.66
+DH008,290.0,292.0,0.049,0.0174,0.059
+DH008,292.0,294.0,0.229,0.0384,0.165
+DH008,294.0,296.0,0.039,0.0234,0.027
+DH008,296.0,298.0,0.034,0.0206,0.02
+DH008,298.0,300.0,0.141,0.0235,0.202
+DH008,300.0,302.0,0.045,0.0174,0.067
+DH008,302.0,304.0,0.025,0.0265,0.022
+DH008,304.0,306.0,0.139,0.0319,0.165
+DH008,306.0,308.0,0.117,0.0132,0.082
+DH008,308.0,310.0,0.088,0.0145,0.093
+DH008,310.0,312.0,0.269,0.0085,0.178
+DH008,312.0,314.0,0.045,0.0288,0.035
+DH008,314.0,316.0,0.103,0.0114,0.071
+DH008,316.0,318.0,0.143,0.0444,0.076
+DH008,318.0,320.0,0.048,0.0217,0.041
+DH008,320.0,322.0,0.087,0.038,0.112
+DH008,322.0,324.0,0.08,0.025,0.092
+DH008,324.0,326.0,0.052,0.0122,0.074
+DH008,326.0,328.0,0.168,0.039,0.158
+DH008,328.0,330.0,0.089,0.0157,0.11
+DH008,330.0,332.0,0.126,0.0112,0.089
+DH008,332.0,334.0,0.11,0.0168,0.069
+DH008,334.0,336.0,0.156,0.0268,0.194
+DH008,336.0,338.0,0.026,0.0208,0.034
+DH008,338.0,340.0,0.033,0.0132,0.031
+DH008,340.0,342.0,0.083,0.0413,0.104
+DH008,342.0,344.0,0.05,0.0238,0.052
+DH008,344.0,346.0,0.104,0.0224,0.072
+DH008,346.0,348.0,0.226,0.0318,0.138
+DH009,0.0,2.0,0.132,0.0286,0.073
+DH009,2.0,4.0,0.162,0.0201,0.104
+DH009,4.0,6.0,0.088,0.0067,0.1
+DH009,6.0,8.0,0.055,0.0101,0.039
+DH009,8.0,10.0,0.111,0.018,0.079
+DH009,10.0,12.0,0.098,0.0301,0.147
+DH009,12.0,14.0,0.073,0.0183,0.062
+DH009,14.0,16.0,0.026,0.0178,0.036
+DH009,16.0,18.0,0.076,0.0143,0.069
+DH009,18.0,20.0,0.26,0.0156,0.303
+DH009,20.0,22.0,0.272,0.0139,0.37
+DH009,22.0,24.0,0.082,0.0446,0.066
+DH009,24.0,26.0,0.099,0.0177,0.066
+DH009,26.0,28.0,0.086,0.0287,0.097
+DH009,28.0,30.0,0.068,0.0162,0.087
+DH009,30.0,32.0,0.171,0.0131,0.178
+DH009,32.0,34.0,0.103,0.0393,0.063
+DH009,34.0,36.0,0.039,0.0161,0.027
+DH009,36.0,38.0,0.07,0.0409,0.066
+DH009,38.0,40.0,0.031,0.0121,0.024
+DH009,40.0,42.0,0.119,0.0228,0.083
+DH009,42.0,44.0,0.117,0.033,0.098
+DH009,44.0,46.0,0.167,0.0157,0.142
+DH009,46.0,48.0,0.037,0.0184,0.03
+DH009,48.0,50.0,0.164,0.0083,0.082
+DH009,50.0,52.0,0.043,0.0236,0.047
+DH009,52.0,54.0,0.178,0.014,0.14
+DH009,54.0,56.0,0.186,0.0081,0.217
+DH009,56.0,58.0,0.146,0.0161,0.082
+DH009,58.0,60.0,0.145,0.0101,0.168
+DH009,60.0,62.0,0.08,0.0262,0.067
+DH009,62.0,64.0,0.054,0.0192,0.078
+DH009,64.0,66.0,0.324,0.0086,0.218
+DH009,66.0,68.0,0.043,0.0305,0.05
+DH009,68.0,70.0,0.055,0.0136,0.076
+DH009,70.0,72.0,0.1,0.0233,0.1
+DH009,72.0,74.0,0.037,0.0264,0.023
+DH009,74.0,76.0,0.165,0.0129,0.223
+DH009,76.0,78.0,0.08,0.035,0.071
+DH009,78.0,80.0,0.073,0.0119,0.089
+DH009,80.0,82.0,0.647,0.1249,1.256
+DH009,82.0,84.0,0.24,0.6186,0.514
+DH009,84.0,86.0,6.547,0.3487,9.914
+DH009,86.0,88.0,0.621,0.1995,1.785
+DH009,88.0,90.0,3.988,0.4255,8.824
+DH009,90.0,92.0,3.477,0.4675,9.895
+DH009,92.0,94.0,1.254,0.3259,2.927
+DH009,94.0,96.0,3.074,0.0955,6.59
+DH009,96.0,98.0,4.771,0.4536,12.243
+DH009,98.0,100.0,4.977,0.1457,12.146
+DH009,100.0,102.0,12.187,0.4257,33.555
+DH009,102.0,104.0,21.989,0.1271,47.592
+DH009,104.0,106.0,0.936,0.182,2.266
+DH009,106.0,108.0,1.735,0.1443,4.515
+DH009,108.0,110.0,3.397,0.138,6.643
+DH009,110.0,112.0,5.301,0.1207,11.297
+DH009,112.0,114.0,0.154,0.0932,0.386
+DH009,114.0,116.0,2.433,0.1047,3.825
+DH009,116.0,118.0,0.512,0.2559,1.379
+DH009,118.0,120.0,3.607,0.2253,8.779
+DH009,120.0,122.0,10.647,0.065,17.268
+DH009,122.0,124.0,1.365,0.1616,3.857
+DH009,124.0,126.0,12.313,0.4273,25.125
+DH009,126.0,128.0,5.023,0.3724,14.406
+DH009,128.0,130.0,6.163,0.1963,16.149
+DH009,130.0,132.0,3.843,0.2654,8.81
+DH009,132.0,134.0,2.128,0.1255,5.413
+DH009,134.0,136.0,2.112,0.2549,5.251
+DH009,136.0,138.0,0.557,0.1091,1.561
+DH009,138.0,140.0,4.383,0.0846,9.966
+DH009,140.0,142.0,3.474,0.3613,8.222
+DH009,142.0,144.0,2.058,0.8489,5.766
+DH009,144.0,146.0,7.278,0.2923,17.292
+DH009,146.0,148.0,5.272,0.1966,8.46
+DH009,148.0,150.0,1.041,0.1943,2.956
+DH009,150.0,152.0,2.991,0.3312,6.884
+DH009,152.0,154.0,0.444,0.8186,0.749
+DH009,154.0,156.0,3.807,0.0774,6.018
+DH009,156.0,158.0,4.1,0.6524,6.539
+DH009,158.0,160.0,1.917,0.261,4.068
+DH009,160.0,162.0,1.474,0.0639,2.338
+DH009,162.0,164.0,8.583,0.2089,19.961
+DH009,164.0,166.0,1.259,0.1134,2.086
+DH009,166.0,168.0,3.543,0.3303,10.612
+DH009,168.0,170.0,0.628,0.1435,1.66
+DH009,170.0,172.0,1.131,0.4175,3.203
+DH009,172.0,174.0,0.676,0.2352,1.674
+DH009,174.0,176.0,6.832,0.3056,13.309
+DH009,176.0,178.0,3.269,0.1919,8.241
+DH009,178.0,180.0,3.147,0.1709,9.217
+DH009,180.0,182.0,11.141,0.3702,31.986
+DH009,182.0,184.0,2.003,0.0814,4.927
+DH009,184.0,186.0,2.514,0.2681,6.334
+DH009,186.0,188.0,6.723,0.1283,19.706
+DH009,188.0,190.0,12.693,0.4135,19.74
+DH009,190.0,192.0,1.957,0.2055,5.145
+DH009,192.0,194.0,3.924,1.6955,6.728
+DH009,194.0,196.0,4.929,0.0579,7.786
+DH009,196.0,198.0,9.724,0.3078,25.447
+DH009,198.0,200.0,7.172,0.0539,15.204
+DH009,200.0,202.0,22.238,0.0452,45.084
+DH009,202.0,204.0,0.08,0.4726,0.225
+DH009,204.0,206.0,0.133,0.3188,0.243
+DH009,206.0,208.0,3.444,0.3562,8.002
+DH009,208.0,210.0,0.238,0.3881,0.714
+DH009,210.0,212.0,8.632,0.0455,24.162
+DH009,212.0,214.0,0.806,0.0624,2.273
+DH009,214.0,216.0,3.568,0.0711,7.831
+DH009,216.0,218.0,4.578,0.1439,7.777
+DH009,218.0,220.0,0.214,0.171,0.523
+DH009,220.0,222.0,2.725,0.3021,6.784
+DH009,222.0,224.0,1.621,0.2805,3.902
+DH009,224.0,226.0,1.985,0.2877,4.491
+DH009,226.0,228.0,1.024,0.339,2.812
+DH009,228.0,230.0,3.537,0.2282,8.032
+DH009,230.0,232.0,1.501,0.1486,3.865
+DH009,232.0,234.0,3.524,0.2685,6.872
+DH009,234.0,236.0,1.176,1.0164,2.488
+DH009,236.0,238.0,0.779,0.1008,2.01
+DH009,238.0,240.0,14.001,0.6682,24.329
+DH009,240.0,242.0,0.759,0.9503,1.737
+DH009,242.0,244.0,1.612,0.7046,3.139
+DH009,244.0,246.0,31.228,0.2723,72.581
+DH009,246.0,248.0,1.068,0.0509,2.423
+DH009,248.0,250.0,8.789,0.3603,18.154
+DH009,250.0,252.0,0.045,0.0205,0.048
+DH009,252.0,254.0,0.106,0.0199,0.153
+DH009,254.0,256.0,0.138,0.0038,0.178
+DH009,256.0,258.0,0.384,0.0086,0.201
+DH009,258.0,260.0,0.082,0.0145,0.108
+DH009,260.0,262.0,0.109,0.0198,0.115
+DH009,262.0,264.0,0.083,0.0898,0.044
+DH009,264.0,266.0,0.092,0.0078,0.108
+DH009,266.0,268.0,0.163,0.0094,0.199
+DH009,268.0,270.0,0.084,0.0363,0.095
+DH009,270.0,272.0,0.067,0.0072,0.044
+DH009,272.0,274.0,0.122,0.0075,0.135
+DH009,274.0,276.0,0.13,0.0323,0.101
+DH009,276.0,278.0,0.122,0.0238,0.156
+DH009,278.0,280.0,0.028,0.0086,0.015
+DH009,280.0,282.0,0.076,0.0222,0.102
+DH009,282.0,284.0,0.16,0.0325,0.175
+DH009,284.0,286.0,0.095,0.012,0.05
+DH009,286.0,288.0,0.1,0.0033,0.133
+DH009,288.0,290.0,0.115,0.0136,0.154
+DH009,290.0,292.0,0.067,0.0196,0.086
+DH009,292.0,294.0,0.221,0.0174,0.251
+DH009,294.0,296.0,0.169,0.0245,0.107
+DH009,296.0,298.0,0.16,0.0652,0.164
+DH009,298.0,300.0,0.088,0.0199,0.096
+DH009,300.0,302.0,0.057,0.0159,0.078
+DH009,302.0,304.0,0.04,0.0141,0.021
+DH009,304.0,306.0,0.237,0.0239,0.252
+DH009,306.0,308.0,0.053,0.0364,0.07
+DH009,308.0,310.0,0.083,0.0147,0.125
+DH009,310.0,312.0,0.045,0.0223,0.034
+DH009,312.0,314.0,0.071,0.0203,0.052
+DH009,314.0,316.0,0.105,0.0145,0.14
+DH009,316.0,318.0,0.125,0.032,0.081
+DH009,318.0,320.0,0.065,0.0113,0.05
+DH009,320.0,322.0,0.059,0.011,0.051
+DH009,322.0,324.0,0.109,0.0244,0.104
+DH009,324.0,326.0,0.13,0.0149,0.121
+DH009,326.0,328.0,0.07,0.0228,0.04
+DH009,328.0,330.0,0.065,0.0094,0.034
+DH009,330.0,332.0,0.073,0.0071,0.059
+DH009,332.0,334.0,0.146,0.0648,0.186
+DH009,334.0,336.0,0.059,0.0105,0.077
+DH009,336.0,338.0,0.093,0.0122,0.096
+DH009,338.0,340.0,0.025,0.0291,0.018
+DH009,340.0,342.0,0.08,0.009,0.053
+DH009,342.0,344.0,0.069,0.0182,0.072
+DH009,344.0,346.0,0.195,0.0264,0.227
+DH009,346.0,348.0,0.195,0.0244,0.172
+DH009,348.0,350.0,0.15,0.0313,0.091
+DH009,350.0,352.0,0.034,0.012,0.048
+DH009,352.0,354.0,0.131,0.0181,0.142
+DH009,354.0,356.0,0.181,0.0334,0.238
+DH009,356.0,358.0,0.044,0.0233,0.025
+DH009,358.0,360.0,0.031,0.0159,0.041
+DH009,360.0,362.0,0.108,0.0502,0.136
+DH009,362.0,364.0,0.357,0.02,0.401
+DH009,364.0,366.0,0.038,0.0319,0.025
+DH009,366.0,368.0,0.056,0.0348,0.081
+DH010,0.0,2.0,0.162,0.0153,0.102
+DH010,2.0,4.0,0.079,0.0271,0.109
+DH010,4.0,6.0,0.102,0.0492,0.146
+DH010,6.0,8.0,0.071,0.0277,0.068
+DH010,8.0,10.0,0.272,0.0332,0.375
+DH010,10.0,12.0,0.072,0.0244,0.052
+DH010,12.0,14.0,0.106,0.023,0.054
+DH010,14.0,16.0,0.067,0.0169,0.06
+DH010,16.0,18.0,0.23,0.0162,0.231
+DH010,18.0,20.0,0.049,0.0262,0.066
+DH010,20.0,22.0,0.218,0.0203,0.117
+DH010,22.0,24.0,0.075,0.0238,0.098
+DH010,24.0,26.0,0.085,0.0196,0.077
+DH010,26.0,28.0,0.069,0.0162,0.057
+DH010,28.0,30.0,0.417,0.01,0.303
+DH010,30.0,32.0,0.046,0.0174,0.066
+DH010,32.0,34.0,0.117,0.02,0.08
+DH010,34.0,36.0,0.054,0.0162,0.061
+DH010,36.0,38.0,0.032,0.0102,0.043
+DH010,38.0,40.0,0.13,0.0207,0.139
+DH010,40.0,42.0,0.027,0.0087,0.035
+DH010,42.0,44.0,0.015,0.0338,0.013
+DH010,44.0,46.0,0.136,0.0117,0.084
+DH010,46.0,48.0,0.563,0.0059,0.828
+DH010,48.0,50.0,0.028,0.0227,0.032
+DH010,50.0,52.0,0.089,0.0116,0.062
+DH010,52.0,54.0,0.034,0.0341,0.032
+DH010,54.0,56.0,0.035,0.0407,0.022
+DH010,56.0,58.0,0.258,0.0337,0.151
+DH010,58.0,60.0,0.078,0.0195,0.113
+DH010,60.0,62.0,0.107,0.02,0.095
+DH010,62.0,64.0,0.08,0.0352,0.04
+DH010,64.0,66.0,0.065,0.0138,0.077
+DH010,66.0,68.0,0.035,0.0126,0.029
+DH010,68.0,70.0,0.073,0.026,0.045
+DH010,70.0,72.0,0.115,0.0169,0.141
+DH010,72.0,74.0,0.091,0.0143,0.068
+DH010,74.0,76.0,0.143,0.0207,0.098
+DH010,76.0,78.0,0.046,0.0088,0.03
+DH010,78.0,80.0,0.216,0.0203,0.24
+DH010,80.0,82.0,2.916,0.2138,5.801
+DH010,82.0,84.0,4.609,0.0205,12.478
+DH010,84.0,86.0,0.668,0.0715,1.285
+DH010,86.0,88.0,3.644,0.06,7.933
+DH010,88.0,90.0,5.562,0.2317,16.115
+DH010,90.0,92.0,0.687,0.507,1.382
+DH010,92.0,94.0,7.983,0.1955,19.787
+DH010,94.0,96.0,0.287,0.1984,0.73
+DH010,96.0,98.0,0.448,0.3325,0.935
+DH010,98.0,100.0,1.028,0.4421,3.069
+DH010,100.0,102.0,3.374,0.8151,6.941
+DH010,102.0,104.0,3.553,0.1753,8.142
+DH010,104.0,106.0,1.547,0.3447,2.781
+DH010,106.0,108.0,5.523,1.2294,10.459
+DH010,108.0,110.0,0.443,0.0761,1.224
+DH010,110.0,112.0,2.072,0.45,4.617
+DH010,112.0,114.0,6.03,0.1966,16.174
+DH010,114.0,116.0,1.375,0.0856,4.105
+DH010,116.0,118.0,1.982,0.3737,3.411
+DH010,118.0,120.0,0.63,0.1851,1.219
+DH010,120.0,122.0,1.191,0.1112,1.845
+DH010,122.0,124.0,4.05,0.8305,7.02
+DH010,124.0,126.0,4.82,0.3967,8.644
+DH010,126.0,128.0,0.7,0.0938,1.278
+DH010,128.0,130.0,5.781,0.2814,13.091
+DH010,130.0,132.0,0.099,1.1553,0.195
+DH010,132.0,134.0,26.106,0.07,74.714
+DH010,134.0,136.0,0.158,0.2981,0.291
+DH010,136.0,138.0,0.614,0.0744,1.309
+DH010,138.0,140.0,5.227,0.9509,12.277
+DH010,140.0,142.0,2.894,0.0795,4.502
+DH010,142.0,144.0,1.194,0.3235,1.954
+DH010,144.0,146.0,7.31,0.1137,17.723
+DH010,146.0,148.0,2.111,0.1721,3.815
+DH010,148.0,150.0,1.137,0.8993,3.261
+DH010,150.0,152.0,2.744,0.1809,4.572
+DH010,152.0,154.0,10.655,0.1253,30.125
+DH010,154.0,156.0,1.721,0.2507,4.4
+DH010,156.0,158.0,3.768,0.713,6.074
+DH010,158.0,160.0,0.575,0.1516,0.886
+DH010,160.0,162.0,24.487,0.4973,58.539
+DH010,162.0,164.0,1.621,0.1775,4.198
+DH010,164.0,166.0,5.686,0.3305,14.926
+DH010,166.0,168.0,3.64,0.1885,6.926
+DH010,168.0,170.0,2.729,0.4554,7.527
+DH010,170.0,172.0,5.383,0.2195,15.895
+DH010,172.0,174.0,0.182,0.2001,0.471
+DH010,174.0,176.0,16.604,0.2965,49.587
+DH010,176.0,178.0,2.114,0.4784,5.721
+DH010,178.0,180.0,1.2,0.1298,3.538
+DH010,180.0,182.0,10.428,0.1335,26.944
+DH010,182.0,184.0,0.54,0.1895,1.498
+DH010,184.0,186.0,27.455,0.0591,47.638
+DH010,186.0,188.0,0.643,0.492,1.112
+DH010,188.0,190.0,1.037,0.2365,2.382
+DH010,190.0,192.0,15.442,0.3456,37.069
+DH010,192.0,194.0,0.091,0.2115,0.254
+DH010,194.0,196.0,10.928,0.0509,19.413
+DH010,196.0,198.0,0.526,0.8771,1.108
+DH010,198.0,200.0,0.886,0.2293,1.952
+DH010,200.0,202.0,0.605,0.2297,1.296
+DH010,202.0,204.0,0.217,0.1645,0.557
+DH010,204.0,206.0,0.39,0.268,1.1
+DH010,206.0,208.0,17.414,0.1856,42.783
+DH010,208.0,210.0,6.209,0.0772,13.922
+DH010,210.0,212.0,4.216,0.187,12.136
+DH010,212.0,214.0,1.884,0.4399,3.599
+DH010,214.0,216.0,0.906,0.2489,2.001
+DH010,216.0,218.0,0.821,0.2506,1.871
+DH010,218.0,220.0,2.063,0.0605,4.206
+DH010,220.0,222.0,0.879,0.5071,2.048
+DH010,222.0,224.0,1.051,0.5889,2.685
+DH010,224.0,226.0,2.859,0.4102,5.558
+DH010,226.0,228.0,2.203,0.1314,4.835
+DH010,228.0,230.0,0.968,0.7321,2.409
+DH010,230.0,232.0,2.281,0.4094,6.424
+DH010,232.0,234.0,1.557,0.2178,4.614
+DH010,234.0,236.0,1.005,0.2017,2.45
+DH010,236.0,238.0,6.281,0.206,15.085
+DH010,238.0,240.0,1.844,0.1845,3.197
+DH010,240.0,242.0,0.458,0.0974,0.798
+DH010,242.0,244.0,8.697,0.2173,19.89
+DH010,244.0,246.0,9.697,0.7718,28.542
+DH010,246.0,248.0,0.8,0.1501,1.453
+DH010,248.0,250.0,2.972,0.1801,6.394
+DH010,250.0,252.0,0.15,0.0138,0.099
+DH010,252.0,254.0,0.143,0.0103,0.197
+DH010,254.0,256.0,0.042,0.0112,0.043
+DH010,256.0,258.0,0.109,0.0156,0.063
+DH010,258.0,260.0,0.085,0.0103,0.076
+DH010,260.0,262.0,0.162,0.0176,0.147
+DH010,262.0,264.0,0.103,0.0066,0.145
+DH010,264.0,266.0,0.528,0.0172,0.532
+DH010,266.0,268.0,0.128,0.0417,0.138
+DH010,268.0,270.0,0.023,0.0243,0.03
+DH010,270.0,272.0,0.119,0.0103,0.078
+DH010,272.0,274.0,0.038,0.0339,0.045
+DH010,274.0,276.0,0.086,0.0119,0.067
+DH010,276.0,278.0,0.2,0.0193,0.234
+DH010,278.0,280.0,0.041,0.0072,0.051
+DH010,280.0,282.0,0.088,0.0299,0.064
+DH010,282.0,284.0,0.211,0.0128,0.161
+DH010,284.0,286.0,0.043,0.0301,0.032
+DH010,286.0,288.0,0.031,0.0523,0.042
+DH010,288.0,290.0,0.067,0.0345,0.099
+DH010,290.0,292.0,0.115,0.0337,0.063
+DH010,292.0,294.0,0.098,0.0241,0.073
+DH010,294.0,296.0,0.264,0.0178,0.255
+DH010,296.0,298.0,0.047,0.0299,0.07
+DH010,298.0,300.0,0.071,0.0193,0.082
+DH010,300.0,302.0,0.097,0.066,0.074
+DH010,302.0,304.0,0.063,0.0304,0.042
+DH010,304.0,306.0,0.195,0.0199,0.183
+DH010,306.0,308.0,0.028,0.0081,0.031
+DH010,308.0,310.0,0.103,0.0093,0.111
+DH010,310.0,312.0,0.084,0.0162,0.045
+DH010,312.0,314.0,0.119,0.0122,0.13
+DH010,314.0,316.0,0.167,0.0219,0.109
+DH010,316.0,318.0,0.121,0.0184,0.078
+DH010,318.0,320.0,0.05,0.0516,0.058
+DH010,320.0,322.0,0.209,0.0167,0.307
+DH010,322.0,324.0,0.128,0.0325,0.092
+DH010,324.0,326.0,0.157,0.0461,0.082
+DH010,326.0,328.0,0.084,0.0141,0.065
+DH010,328.0,330.0,0.229,0.0111,0.126
+DH010,330.0,332.0,0.216,0.025,0.134
+DH010,332.0,334.0,0.063,0.0195,0.078
+DH010,334.0,336.0,0.089,0.0075,0.127
+DH010,336.0,338.0,0.1,0.0178,0.134
+DH010,338.0,340.0,0.048,0.0264,0.059
+DH010,340.0,342.0,0.112,0.0517,0.083
+DH010,342.0,344.0,0.033,0.014,0.022
+DH010,344.0,346.0,0.079,0.0091,0.051
+DH010,346.0,348.0,0.082,0.0477,0.078
+DH010,348.0,350.0,0.165,0.0097,0.239
+DH010,350.0,352.0,0.127,0.0315,0.136
+DH010,352.0,354.0,0.083,0.0092,0.116
+DH010,354.0,356.0,0.136,0.0147,0.155
+DH010,356.0,358.0,0.042,0.0132,0.047
+DH010,358.0,360.0,0.141,0.019,0.207
+DH010,360.0,362.0,0.068,0.0082,0.075
+DH010,362.0,364.0,0.186,0.0171,0.182
+DH010,364.0,366.0,0.078,0.018,0.114
+DH010,366.0,368.0,0.017,0.0203,0.012
+DH010,368.0,370.0,0.2,0.0297,0.261
+DH010,370.0,372.0,0.173,0.0161,0.103
+DH010,372.0,374.0,0.092,0.0165,0.057
+DH010,374.0,376.0,0.101,0.0203,0.124
+DH010,376.0,378.0,0.158,0.0271,0.114
+DH010,378.0,380.0,0.118,0.0199,0.144
+DH010,380.0,381.0,0.078,0.0186,0.048
+DH011,0.0,2.0,0.217,0.0182,0.198
+DH011,2.0,4.0,0.197,0.0273,0.151
+DH011,4.0,6.0,0.068,0.0216,0.034
+DH011,6.0,8.0,0.055,0.0195,0.078
+DH011,8.0,10.0,0.066,0.0288,0.046
+DH011,10.0,12.0,0.147,0.016,0.082
+DH011,12.0,14.0,0.086,0.0099,0.111
+DH011,14.0,16.0,0.09,0.067,0.108
+DH011,16.0,18.0,0.126,0.0207,0.066
+DH011,18.0,20.0,0.045,0.0077,0.038
+DH011,20.0,22.0,0.08,0.0064,0.046
+DH011,22.0,24.0,0.071,0.0164,0.057
+DH011,24.0,26.0,0.067,0.0434,0.078
+DH011,26.0,28.0,0.059,0.0177,0.051
+DH011,28.0,30.0,0.052,0.0125,0.067
+DH011,30.0,32.0,0.064,0.0106,0.088
+DH011,32.0,34.0,0.088,0.0068,0.067
+DH011,34.0,36.0,0.138,0.023,0.135
+DH011,36.0,38.0,0.174,0.0378,0.151
+DH011,38.0,40.0,0.129,0.0199,0.121
+DH011,40.0,42.0,0.059,0.0193,0.055
+DH011,42.0,44.0,0.104,0.0132,0.1
+DH011,44.0,46.0,0.105,0.0171,0.115
+DH011,46.0,48.0,0.034,0.0103,0.029
+DH011,48.0,50.0,0.105,0.0204,0.111
+DH011,50.0,52.0,0.129,0.0313,0.072
+DH011,52.0,54.0,0.093,0.0317,0.089
+DH011,54.0,56.0,0.103,0.0346,0.064
+DH011,56.0,58.0,0.069,0.0157,0.051
+DH011,58.0,60.0,0.211,0.0089,0.131
+DH011,60.0,62.0,0.041,0.0104,0.027
+DH011,62.0,64.0,0.068,0.0084,0.045
+DH011,64.0,66.0,0.123,0.031,0.1
+DH011,66.0,68.0,0.08,0.018,0.107
+DH011,68.0,70.0,0.015,0.0114,0.017
+DH011,70.0,72.0,0.043,0.0161,0.038
+DH011,72.0,74.0,0.055,0.0189,0.051
+DH011,74.0,76.0,0.071,0.0146,0.055
+DH011,76.0,78.0,0.082,0.0077,0.107
+DH011,78.0,80.0,0.063,0.0344,0.081
+DH011,80.0,82.0,9.062,0.0994,13.793
+DH011,82.0,84.0,0.501,0.1269,1.001
+DH011,84.0,86.0,13.263,0.0891,21.101
+DH011,86.0,88.0,2.031,0.3565,3.346
+DH011,88.0,90.0,0.325,0.3301,0.71
+DH011,90.0,92.0,1.302,0.254,2.482
+DH011,92.0,94.0,1.877,0.1665,4.051
+DH011,94.0,96.0,3.134,0.133,8.862
+DH011,96.0,98.0,3.525,0.8821,5.52
+DH011,98.0,100.0,9.559,0.1369,24.058
+DH011,100.0,102.0,1.678,0.1989,4.611
+DH011,102.0,104.0,10.167,0.4523,21.227
+DH011,104.0,106.0,4.807,0.2667,10.561
+DH011,106.0,108.0,0.443,0.1986,0.921
+DH011,108.0,110.0,4.704,0.135,9.56
+DH011,110.0,112.0,0.608,0.2125,1.262
+DH011,112.0,114.0,16.785,0.3557,41.678
+DH011,114.0,116.0,2.141,0.5397,5.521
+DH011,116.0,118.0,1.881,0.0933,3.878
+DH011,118.0,120.0,40.135,0.3054,95.228
+DH011,120.0,122.0,1.94,0.3355,5.158
+DH011,122.0,124.0,1.172,0.1322,2.036
+DH011,124.0,126.0,1.448,0.1552,3.243
+DH011,126.0,128.0,2.443,0.193,6.496
+DH011,128.0,130.0,2.825,0.4059,6.036
+DH011,130.0,132.0,4.32,0.1841,8.332
+DH011,132.0,134.0,0.636,0.1388,1.433
+DH011,134.0,136.0,0.866,0.241,1.546
+DH011,136.0,138.0,0.303,0.4298,0.754
+DH011,138.0,140.0,0.815,0.093,1.263
+DH011,140.0,142.0,11.587,0.1616,17.641
+DH011,142.0,144.0,8.052,0.0524,21.073
+DH011,144.0,146.0,41.801,0.0256,78.845
+DH011,146.0,148.0,0.939,0.1805,1.637
+DH011,148.0,150.0,5.895,0.2039,17.538
+DH011,150.0,152.0,1.81,0.3368,5.405
+DH011,152.0,154.0,0.309,1.0988,0.741
+DH011,154.0,156.0,1.887,0.1623,3.402
+DH011,156.0,158.0,18.678,0.3549,38.41
+DH011,158.0,160.0,0.423,0.1622,0.723
+DH011,160.0,162.0,0.282,0.4298,0.562
+DH011,162.0,164.0,13.356,0.9574,24.39
+DH011,164.0,166.0,3.769,0.0833,7.489
+DH011,166.0,168.0,1.224,0.0935,2.786
+DH011,168.0,170.0,1.273,0.172,2.985
+DH011,170.0,172.0,0.867,0.8941,1.871
+DH011,172.0,174.0,15.464,0.0989,34.796
+DH011,174.0,176.0,1.236,0.1695,3.11
+DH011,176.0,178.0,13.461,0.5783,33.36
+DH011,178.0,180.0,2.776,0.1194,8.068
+DH011,180.0,182.0,0.562,0.1572,1.067
+DH012,0.0,2.0,0.026,0.0179,0.029
+DH012,2.0,4.0,0.161,0.0137,0.114
+DH012,4.0,6.0,0.108,0.0057,0.154
+DH012,6.0,8.0,0.072,0.0458,0.105
+DH012,8.0,10.0,0.142,0.0174,0.17
+DH012,10.0,12.0,0.036,0.0247,0.048
+DH012,12.0,14.0,0.24,0.0303,0.356
+DH012,14.0,16.0,0.045,0.0092,0.05
+DH012,16.0,18.0,0.051,0.0384,0.064
+DH012,18.0,20.0,0.076,0.0238,0.088
+DH012,20.0,22.0,0.068,0.0255,0.085
+DH012,22.0,24.0,0.066,0.0259,0.066
+DH012,24.0,26.0,0.051,0.0247,0.039
+DH012,26.0,28.0,0.11,0.0146,0.162
+DH012,28.0,30.0,0.232,0.0397,0.25
+DH012,30.0,32.0,0.065,0.0158,0.078
+DH012,32.0,34.0,0.066,0.0133,0.038
+DH012,34.0,36.0,0.08,0.0443,0.079
+DH012,36.0,38.0,0.112,0.0516,0.099
+DH012,38.0,40.0,0.07,0.0102,0.085
+DH012,40.0,42.0,0.052,0.0175,0.057
+DH012,42.0,44.0,0.209,0.0326,0.236
+DH012,44.0,46.0,0.041,0.0395,0.032
+DH012,46.0,48.0,0.042,0.0076,0.06
+DH012,48.0,50.0,0.034,0.0134,0.037
+DH012,50.0,52.0,0.066,0.0219,0.07
+DH012,52.0,54.0,0.085,0.0479,0.091
+DH012,54.0,56.0,0.103,0.0084,0.077
+DH012,56.0,58.0,0.062,0.031,0.032
+DH012,58.0,60.0,0.118,0.0256,0.152
+DH012,60.0,62.0,0.158,0.0125,0.232
+DH012,62.0,64.0,0.065,0.0218,0.053
+DH012,64.0,66.0,0.085,0.0107,0.047
+DH012,66.0,68.0,0.084,0.014,0.053
+DH012,68.0,70.0,0.089,0.0135,0.091
+DH012,70.0,72.0,0.045,0.0592,0.055
+DH012,72.0,74.0,0.097,0.0329,0.12
+DH012,74.0,76.0,0.018,0.015,0.019
+DH012,76.0,78.0,0.071,0.0203,0.068
+DH012,78.0,80.0,0.041,0.0224,0.021
+DH012,80.0,82.0,3.377,0.1472,10.012
+DH012,82.0,84.0,1.966,0.9225,3.666
+DH012,84.0,86.0,5.427,0.2127,8.363
+DH012,86.0,88.0,4.753,0.1756,14.164
+DH012,88.0,90.0,0.056,0.6175,0.125
+DH012,90.0,92.0,21.43,0.22,51.822
+DH012,92.0,94.0,1.345,0.2252,2.48
+DH012,94.0,96.0,16.091,1.3386,28.146
+DH012,96.0,98.0,2.197,0.0792,5.729
+DH012,98.0,100.0,2.439,0.177,6.074
+DH012,100.0,102.0,1.102,0.251,3.243
+DH012,102.0,104.0,8.203,0.2052,16.313
+DH012,104.0,106.0,1.748,0.2001,5.192
+DH012,106.0,108.0,5.538,0.1107,11.875
+DH012,108.0,110.0,2.228,0.2459,6.206
+DH012,110.0,112.0,1.687,0.4216,3.56
+DH012,112.0,114.0,1.699,0.2541,3.246
+DH012,114.0,116.0,0.646,0.2167,1.755
+DH012,116.0,118.0,0.63,0.1654,1.349
+DH012,118.0,120.0,6.887,0.2072,12.573
+DH012,120.0,122.0,2.486,0.0852,5.451
+DH012,122.0,124.0,0.386,0.095,0.646
+DH012,124.0,126.0,0.923,0.324,2.547
+DH012,126.0,128.0,5.537,0.0982,13.559
+DH012,128.0,130.0,2.371,1.4365,4.523
+DH012,130.0,132.0,1.093,0.386,2.425
+DH012,132.0,134.0,0.315,0.1137,0.836
+DH012,134.0,136.0,1.349,0.171,2.993
+DH012,136.0,138.0,11.998,0.0715,18.182
+DH012,138.0,140.0,7.807,0.2178,18.407
+DH012,140.0,142.0,0.441,0.1856,0.691
+DH012,142.0,144.0,2.847,0.0727,5.712
+DH012,144.0,146.0,2.557,0.2597,6.076
+DH012,146.0,148.0,1.316,0.1248,3.566
+DH012,148.0,150.0,1.766,0.2075,4.478
+DH012,150.0,152.0,0.196,0.1425,0.412
+DH012,152.0,154.0,2.621,0.5825,7.345
+DH012,154.0,156.0,5.536,0.6744,10.937
+DH012,156.0,158.0,17.32,0.9809,33.894
+DH012,158.0,160.0,5.195,0.1893,8.809
+DH012,160.0,162.0,1.484,0.3668,3.732
+DH012,162.0,164.0,1.769,0.0339,4.542
+DH012,164.0,166.0,1.708,0.3212,4.389
+DH012,166.0,168.0,3.191,0.7086,8.865
+DH012,168.0,170.0,39.522,0.5324,104.563
+DH012,170.0,172.0,12.306,0.0876,28.768
+DH012,172.0,174.0,12.592,0.0501,29.817
+DH012,174.0,176.0,4.215,1.0783,11.733
+DH012,176.0,178.0,15.357,0.1426,26.847
+DH012,178.0,180.0,0.514,0.0935,1.21
+DH012,180.0,182.0,0.586,0.4034,1.245
+DH012,182.0,184.0,0.519,0.1463,1.195
+DH012,184.0,186.0,1.595,0.2293,3.698
+DH012,186.0,188.0,8.157,0.1741,16.621
+DH012,188.0,190.0,2.438,0.3251,7.216
+DH012,190.0,192.0,0.764,0.1255,1.443
+DH012,192.0,194.0,0.893,0.3928,1.817
+DH012,194.0,196.0,0.334,0.1708,0.632
+DH012,196.0,198.0,0.388,0.1373,0.967
+DH012,198.0,200.0,1.388,0.252,3.236
+DH012,200.0,202.0,13.11,0.3297,38.466
+DH012,202.0,204.0,2.493,0.2464,6.375
+DH012,204.0,206.0,1.083,0.4122,1.633
+DH012,206.0,208.0,13.328,0.6267,28.036
+DH012,208.0,210.0,1.625,0.3346,2.86
+DH012,210.0,212.0,16.716,0.2376,44.809
+DH012,212.0,214.0,1.282,0.0845,3.491
+DH012,214.0,216.0,0.832,0.5371,2.141
+DH012,216.0,218.0,2.593,0.56,4.721
+DH012,218.0,220.0,25.076,0.1588,42.716
+DH012,220.0,222.0,4.418,0.3989,6.806
+DH012,222.0,224.0,7.366,0.338,21.972
+DH012,224.0,226.0,4.165,1.0743,7.477
+DH012,226.0,228.0,0.255,1.802,0.681
+DH012,228.0,230.0,13.392,0.228,29.771
+DH012,230.0,232.0,0.974,0.3681,1.885
+DH012,232.0,234.0,14.803,0.3169,32.539
+DH012,234.0,236.0,0.166,0.2084,0.298
+DH012,236.0,238.0,2.911,0.4814,6.701
+DH012,238.0,240.0,2.36,0.5741,5.702
+DH012,240.0,242.0,4.514,0.1708,9.807
+DH012,242.0,244.0,3.333,0.5957,5.254
+DH012,244.0,246.0,1.892,0.4496,4.39
+DH012,246.0,248.0,2.004,0.1282,3.17
+DH012,248.0,250.0,6.083,0.2157,17.453
+DH012,250.0,252.0,0.03,0.0278,0.042
+DH012,252.0,254.0,0.1,0.034,0.121
+DH012,254.0,256.0,0.08,0.0168,0.092
+DH012,256.0,258.0,0.173,0.0094,0.21
+DH012,258.0,260.0,0.152,0.0167,0.096
+DH012,260.0,262.0,0.106,0.0218,0.137
+DH012,262.0,264.0,0.115,0.0112,0.079
+DH012,264.0,266.0,0.165,0.0201,0.22
+DH012,266.0,268.0,0.077,0.0202,0.114
+DH012,268.0,270.0,0.066,0.0091,0.093
+DH012,270.0,272.0,0.091,0.008,0.105
+DH012,272.0,274.0,0.079,0.0237,0.082
+DH012,274.0,276.0,0.051,0.0125,0.065
+DH012,276.0,278.0,0.083,0.0197,0.074
+DH012,278.0,280.0,0.064,0.0154,0.071
+DH012,280.0,282.0,0.052,0.0139,0.071
+DH012,282.0,284.0,0.106,0.0092,0.087
+DH012,284.0,286.0,0.048,0.0289,0.042
+DH012,286.0,288.0,0.063,0.0409,0.054
+DH012,288.0,290.0,0.147,0.0228,0.114
+DH012,290.0,292.0,0.118,0.0335,0.164
+DH012,292.0,294.0,0.242,0.028,0.215
+DH012,294.0,296.0,0.095,0.0196,0.094
+DH012,296.0,298.0,0.078,0.0205,0.081
+DH012,298.0,300.0,0.101,0.0185,0.056
+DH012,300.0,302.0,0.122,0.0199,0.103
+DH012,302.0,304.0,0.24,0.0171,0.151
+DH012,304.0,306.0,0.067,0.0143,0.097
+DH012,306.0,308.0,0.189,0.0229,0.167
+DH012,308.0,310.0,0.119,0.019,0.092
+DH012,310.0,312.0,0.101,0.0147,0.128
+DH012,312.0,314.0,0.093,0.0248,0.063
+DH012,314.0,316.0,0.126,0.0116,0.161
+DH012,316.0,318.0,0.06,0.0107,0.048
+DH012,318.0,320.0,0.046,0.0129,0.061
+DH012,320.0,322.0,0.058,0.0167,0.034
+DH012,322.0,324.0,0.135,0.028,0.115
+DH012,324.0,326.0,0.113,0.019,0.164
+DH012,326.0,328.0,0.05,0.0349,0.065
+DH012,328.0,330.0,0.054,0.0187,0.029
+DH012,330.0,332.0,0.042,0.02,0.021
+DH012,332.0,334.0,0.046,0.0087,0.063
+DH012,334.0,336.0,0.066,0.0176,0.054
+DH012,336.0,338.0,0.121,0.0177,0.1
+DH012,338.0,340.0,0.074,0.0124,0.038
+DH012,340.0,342.0,0.038,0.024,0.042
+DH012,342.0,344.0,0.142,0.0155,0.176
+DH012,344.0,346.0,0.042,0.0131,0.048
+DH012,346.0,348.0,0.166,0.0421,0.228
+DH012,348.0,350.0,0.247,0.0158,0.15
+DH012,350.0,352.0,0.047,0.0226,0.046
+DH012,352.0,354.0,0.042,0.0231,0.063
+DH012,354.0,356.0,0.106,0.0288,0.152
+DH012,356.0,358.0,0.046,0.0144,0.056
+DH012,358.0,360.0,0.077,0.0193,0.072
+DH012,360.0,362.0,0.224,0.0128,0.162
+DH012,362.0,364.0,0.044,0.019,0.058
+DH012,364.0,366.0,0.162,0.0148,0.089
+DH012,366.0,368.0,0.106,0.014,0.092
+DH012,368.0,370.0,0.057,0.0249,0.042
+DH012,370.0,372.0,0.109,0.0243,0.12
+DH012,372.0,374.0,0.034,0.0231,0.042
+DH012,374.0,376.0,0.058,0.054,0.066
+DH012,376.0,378.0,0.053,0.0326,0.028
+DH012,378.0,380.0,0.063,0.0342,0.032
+DH012,380.0,382.0,0.032,0.024,0.041
+DH012,382.0,384.0,0.207,0.0135,0.272
+DH012,384.0,386.0,0.238,0.012,0.211
+DH012,386.0,388.0,0.104,0.0119,0.08
+DH012,388.0,390.0,0.072,0.0162,0.072
+DH012,390.0,392.0,0.086,0.0199,0.068
+DH012,392.0,394.0,0.059,0.0173,0.031
+DH012,394.0,396.0,0.063,0.0215,0.091
+DH012,396.0,398.0,0.053,0.0159,0.066
+DH012,398.0,400.0,0.218,0.0185,0.253
+DH012,400.0,402.0,0.061,0.0182,0.076
+DH012,402.0,404.0,0.074,0.0115,0.077
+DH012,404.0,406.0,0.018,0.0104,0.024
+DH012,406.0,408.0,0.135,0.0354,0.149
+DH012,408.0,410.0,0.123,0.0146,0.147
+DH012,410.0,412.0,0.163,0.0189,0.224
+DH012,412.0,414.0,0.066,0.0491,0.034
+DH012,414.0,416.0,0.183,0.0428,0.176
+DH012,416.0,418.0,0.061,0.0109,0.045
+DH012,418.0,420.0,0.122,0.0166,0.108
+DH012,420.0,422.0,0.115,0.0072,0.067
+DH012,422.0,424.0,0.067,0.0239,0.055
+DH012,424.0,425.0,0.187,0.0174,0.247
+DH013,0.0,2.0,0.085,0.0202,0.123
+DH013,2.0,4.0,0.09,0.0153,0.132
+DH013,4.0,6.0,0.123,0.0138,0.127
+DH013,6.0,8.0,0.062,0.034,0.032
+DH013,8.0,10.0,0.086,0.0147,0.069
+DH013,10.0,12.0,0.184,0.0253,0.262
+DH013,12.0,14.0,0.118,0.0092,0.16
+DH013,14.0,16.0,0.073,0.0127,0.058
+DH013,16.0,18.0,0.027,0.0093,0.021
+DH013,18.0,20.0,0.079,0.0123,0.089
+DH013,20.0,22.0,0.063,0.0316,0.073
+DH013,22.0,24.0,0.125,0.0203,0.107
+DH013,24.0,26.0,0.078,0.0099,0.109
+DH013,26.0,28.0,0.052,0.0222,0.046
+DH013,28.0,30.0,0.083,0.0244,0.107
+DH013,30.0,32.0,0.052,0.0185,0.034
+DH013,32.0,34.0,0.208,0.0087,0.195
+DH013,34.0,36.0,0.442,0.016,0.583
+DH013,36.0,38.0,0.058,0.0046,0.08
+DH013,38.0,40.0,0.133,0.0116,0.121
+DH013,40.0,42.0,0.143,0.0076,0.212
+DH013,42.0,44.0,0.072,0.0126,0.1
+DH013,44.0,46.0,0.038,0.0204,0.022
+DH013,46.0,48.0,0.114,0.0202,0.145
+DH013,48.0,50.0,0.034,0.0234,0.032
+DH013,50.0,52.0,0.074,0.0309,0.059
+DH013,52.0,54.0,0.185,0.0377,0.248
+DH013,54.0,56.0,0.046,0.0061,0.028
+DH013,56.0,58.0,0.088,0.0126,0.049
+DH013,58.0,60.0,0.049,0.0148,0.027
+DH013,60.0,62.0,0.042,0.0173,0.051
+DH013,62.0,64.0,0.093,0.0342,0.057
+DH013,64.0,66.0,0.082,0.0057,0.12
+DH013,66.0,68.0,0.13,0.0084,0.069
+DH013,68.0,70.0,0.101,0.0382,0.121
+DH013,70.0,72.0,0.056,0.0178,0.031
+DH013,72.0,74.0,0.075,0.031,0.09
+DH013,74.0,76.0,0.088,0.0229,0.048
+DH013,76.0,78.0,0.136,0.0197,0.176
+DH013,78.0,80.0,0.092,0.0221,0.097
+DH013,80.0,82.0,1.044,0.5942,2.59
+DH013,82.0,84.0,0.652,0.2579,1.419
+DH013,84.0,86.0,1.118,0.4813,2.737
+DH013,86.0,88.0,2.564,0.02,4.514
+DH013,88.0,90.0,3.34,0.3238,7.354
+DH013,90.0,92.0,1.729,0.1954,5.093
+DH013,92.0,94.0,1.741,0.0813,5.216
+DH013,94.0,96.0,0.605,0.746,1.68
+DH013,96.0,98.0,2.898,0.148,6.508
+DH013,98.0,100.0,6.844,0.0393,14.05
+DH013,100.0,102.0,2.084,0.2683,3.829
+DH013,102.0,104.0,0.245,0.1176,0.485
+DH013,104.0,106.0,0.88,0.4848,2.083
+DH013,106.0,108.0,3.194,0.2533,7.438
+DH013,108.0,110.0,1.897,0.4202,4.295
+DH013,110.0,112.0,3.748,0.067,7.72
+DH013,112.0,114.0,3.501,0.315,9.344
+DH013,114.0,116.0,1.185,0.7348,2.265
+DH013,116.0,118.0,3.688,0.3591,10.128
+DH013,118.0,120.0,1.521,0.1323,2.729
+DH013,120.0,122.0,14.337,0.3126,30.091
+DH013,122.0,124.0,93.695,0.2894,157.109
+DH013,124.0,126.0,1.759,0.1023,3.04
+DH013,126.0,128.0,1.373,0.1395,2.748
+DH013,128.0,130.0,15.044,0.2834,31.518
+DH013,130.0,132.0,5.524,0.3253,9.048
+DH013,132.0,134.0,5.063,0.2484,11.072
+DH013,134.0,136.0,5.494,0.2542,14.726
+DH013,136.0,138.0,13.964,0.1522,34.448
+DH013,138.0,140.0,3.657,0.137,10.186
+DH013,140.0,142.0,1.456,0.1505,4.036
+DH013,142.0,144.0,1.018,0.2761,1.712
+DH013,144.0,146.0,4.329,0.0279,10.164
+DH013,146.0,148.0,1.139,0.3206,2.144
+DH013,148.0,150.0,1.766,0.2056,2.659
+DH013,150.0,152.0,11.171,0.2196,33.139
+DH013,152.0,154.0,6.875,0.3805,11.268
+DH013,154.0,156.0,8.499,0.1547,21.469
+DH013,156.0,158.0,0.693,0.0865,1.947
+DH013,158.0,160.0,0.706,0.5582,1.867
+DH013,160.0,162.0,1.344,0.2153,2.466
+DH013,162.0,164.0,2.189,0.0938,5.56
+DH013,164.0,166.0,6.756,0.2734,12.556
+DH013,166.0,168.0,6.183,0.2219,10.914
+DH013,168.0,170.0,5.452,0.1952,14.192
+DH013,170.0,172.0,20.438,0.2201,42.292
+DH013,172.0,174.0,1.369,0.5735,3.704
+DH013,174.0,176.0,0.349,0.1296,0.639
+DH013,176.0,178.0,6.041,0.182,12.137
+DH013,178.0,180.0,5.46,0.1803,9.28
+DH013,180.0,182.0,3.304,0.1147,6.199
+DH013,182.0,184.0,3.223,0.0579,7.513
+DH013,184.0,186.0,1.547,0.5079,3.378
+DH013,186.0,188.0,1.408,0.1518,2.783
+DH013,188.0,190.0,2.112,0.9388,3.824
+DH013,190.0,192.0,1.36,0.2703,3.682
+DH013,192.0,194.0,6.242,0.0769,15.786
+DH013,194.0,196.0,3.845,0.5949,9.249
+DH013,196.0,198.0,11.581,0.1995,29.857
+DH013,198.0,200.0,0.061,0.0656,0.171
+DH013,200.0,202.0,2.056,0.3703,4.935
+DH013,202.0,204.0,0.589,0.1603,1.331
+DH013,204.0,206.0,2.936,0.1187,7.5
+DH013,206.0,208.0,1.056,0.1113,2.504
+DH013,208.0,210.0,8.083,0.2006,21.729
+DH013,210.0,212.0,6.762,1.2389,18.679
+DH013,212.0,214.0,9.783,0.5111,15.245
+DH013,214.0,216.0,2.298,0.08,3.506
+DH013,216.0,218.0,1.05,0.1617,2.668
+DH013,218.0,219.0,1.577,0.3416,2.984
+DH014,0.0,2.0,0.027,0.0126,0.017
+DH014,2.0,4.0,0.095,0.0236,0.14
+DH014,4.0,6.0,0.051,0.0207,0.027
+DH014,6.0,8.0,0.041,0.0265,0.023
+DH014,8.0,10.0,0.145,0.0135,0.104
+DH014,10.0,12.0,0.061,0.0254,0.063
+DH014,12.0,14.0,0.072,0.0055,0.047
+DH014,14.0,16.0,0.087,0.0149,0.094
+DH014,16.0,18.0,0.041,0.0138,0.033
+DH014,18.0,20.0,0.059,0.0307,0.085
+DH014,20.0,22.0,0.054,0.0128,0.037
+DH014,22.0,24.0,0.18,0.0321,0.181
+DH014,24.0,26.0,0.036,0.0095,0.023
+DH014,26.0,28.0,0.114,0.0065,0.16
+DH014,28.0,30.0,0.217,0.0164,0.119
+DH014,30.0,32.0,0.121,0.0107,0.14
+DH014,32.0,34.0,0.076,0.0114,0.082
+DH014,34.0,36.0,0.203,0.0112,0.139
+DH014,36.0,38.0,0.063,0.0181,0.075
+DH014,38.0,40.0,0.057,0.0243,0.033
+DH014,40.0,42.0,0.107,0.0053,0.086
+DH014,42.0,44.0,0.137,0.025,0.098
+DH014,44.0,46.0,0.041,0.013,0.035
+DH014,46.0,48.0,0.179,0.0201,0.197
+DH014,48.0,50.0,0.081,0.0214,0.074
+DH014,50.0,52.0,0.112,0.0205,0.13
+DH014,52.0,54.0,0.026,0.0196,0.014
+DH014,54.0,56.0,0.058,0.0233,0.05
+DH014,56.0,58.0,0.08,0.0242,0.116
+DH014,58.0,60.0,0.095,0.0178,0.113
+DH014,60.0,62.0,0.059,0.0162,0.078
+DH014,62.0,64.0,0.078,0.0105,0.046
+DH014,64.0,66.0,0.043,0.0177,0.028
+DH014,66.0,68.0,0.096,0.0167,0.123
+DH014,68.0,70.0,0.071,0.0105,0.104
+DH014,70.0,72.0,0.072,0.0247,0.065
+DH014,72.0,74.0,0.066,0.0146,0.098
+DH014,74.0,76.0,0.075,0.0149,0.108
+DH014,76.0,78.0,0.04,0.0137,0.054
+DH014,78.0,80.0,0.119,0.0117,0.071
+DH014,80.0,82.0,0.784,0.3499,1.575
+DH014,82.0,84.0,1.868,0.0742,3.452
+DH014,84.0,86.0,6.245,0.0814,17.776
+DH014,86.0,88.0,2.553,0.3017,6.8
+DH014,88.0,90.0,0.726,0.1022,1.977
+DH014,90.0,92.0,1.046,0.0247,3.084
+DH014,92.0,94.0,0.642,0.3242,1.311
+DH014,94.0,96.0,2.271,0.4949,6.008
+DH014,96.0,98.0,14.953,0.0954,36.461
+DH014,98.0,100.0,4.992,0.1916,14.582
+DH014,100.0,102.0,1.325,1.1682,2.956
+DH014,102.0,104.0,3.122,0.3472,9.189
+DH014,104.0,106.0,0.535,0.0781,1.096
+DH014,106.0,108.0,3.092,0.1861,4.643
+DH014,108.0,110.0,0.127,0.1916,0.284
+DH014,110.0,112.0,6.697,0.4946,11.757
+DH014,112.0,114.0,3.577,0.0673,7.822
+DH014,114.0,116.0,4.736,0.6042,12.186
+DH014,116.0,118.0,0.292,0.1635,0.741
+DH014,118.0,120.0,2.737,0.2255,7.838
+DH014,120.0,122.0,7.638,0.0924,18.201
+DH014,122.0,124.0,0.651,0.1673,1.67
+DH014,124.0,126.0,2.1,0.1955,3.883
+DH014,126.0,128.0,6.35,0.2128,18.474
+DH014,128.0,130.0,1.761,0.2189,3.733
+DH014,130.0,132.0,2.207,0.3945,4.715
+DH014,132.0,134.0,4.146,0.1165,9.012
+DH014,134.0,136.0,1.11,0.441,1.679
+DH014,136.0,138.0,13.807,0.0886,41.193
+DH014,138.0,140.0,1.062,0.0737,1.716
+DH014,140.0,142.0,4.692,0.2224,12.8
+DH014,142.0,144.0,1.399,0.1384,3.069
+DH014,144.0,146.0,0.921,0.0775,1.471
+DH014,146.0,148.0,1.718,1.14,2.692
+DH014,148.0,150.0,6.142,0.5303,14.087
+DH014,150.0,152.0,0.913,0.4038,1.641
+DH014,152.0,154.0,0.41,0.0905,1.06
+DH014,154.0,156.0,4.547,0.181,8.594
+DH014,156.0,158.0,0.292,0.0927,0.703
+DH014,158.0,160.0,0.993,0.2452,2.9
+DH014,160.0,161.0,33.904,0.2196,98.544
+DH015,0.0,2.0,0.05,0.0079,0.045
+DH015,2.0,4.0,0.031,0.0185,0.034
+DH015,4.0,6.0,0.025,0.0436,0.037
+DH015,6.0,8.0,0.031,0.0287,0.037
+DH015,8.0,10.0,0.158,0.0127,0.182
+DH015,10.0,12.0,0.101,0.0246,0.134
+DH015,12.0,14.0,0.078,0.0239,0.082
+DH015,14.0,16.0,0.093,0.0171,0.076
+DH015,16.0,18.0,0.118,0.0187,0.092
+DH015,18.0,20.0,0.177,0.009,0.191
+DH015,20.0,22.0,0.081,0.0215,0.107
+DH015,22.0,24.0,0.03,0.0171,0.031
+DH015,24.0,26.0,0.123,0.0166,0.138
+DH015,26.0,28.0,0.033,0.0511,0.023
+DH015,28.0,30.0,0.193,0.0115,0.172
+DH015,30.0,32.0,0.119,0.0122,0.086
+DH015,32.0,34.0,0.086,0.0231,0.102
+DH015,34.0,36.0,0.122,0.0403,0.109
+DH015,36.0,38.0,0.232,0.0135,0.253
+DH015,38.0,40.0,0.11,0.0107,0.153
+DH015,40.0,42.0,0.082,0.012,0.086
+DH015,42.0,44.0,0.09,0.0177,0.112
+DH015,44.0,46.0,0.078,0.0152,0.07
+DH015,46.0,48.0,0.056,0.0691,0.063
+DH015,48.0,50.0,0.058,0.0142,0.078
+DH015,50.0,52.0,0.037,0.0227,0.052
+DH015,52.0,54.0,0.1,0.034,0.095
+DH015,54.0,56.0,0.063,0.0202,0.093
+DH015,56.0,58.0,0.087,0.0123,0.07
+DH015,58.0,60.0,0.03,0.0224,0.025
+DH015,60.0,62.0,0.09,0.0099,0.083
+DH015,62.0,64.0,0.164,0.0246,0.182
+DH015,64.0,66.0,0.209,0.0124,0.283
+DH015,66.0,68.0,0.034,0.0266,0.045
+DH015,68.0,70.0,0.047,0.0249,0.039
+DH015,70.0,72.0,0.142,0.0204,0.091
+DH015,72.0,74.0,0.113,0.0213,0.163
+DH015,74.0,76.0,0.093,0.0279,0.066
+DH015,76.0,78.0,0.076,0.0092,0.106
+DH015,78.0,80.0,0.22,0.0145,0.224
+DH015,80.0,82.0,5.517,0.0427,8.764
+DH015,82.0,84.0,3.447,0.022,7.055
+DH015,84.0,86.0,8.34,0.4978,14.445
+DH015,86.0,88.0,6.415,0.265,10.126
+DH015,88.0,90.0,1.524,0.2448,3.956
+DH015,90.0,92.0,10.137,0.7537,18.254
+DH015,92.0,94.0,1.364,0.104,2.796
+DH015,94.0,96.0,4.275,0.2902,12.437
+DH015,96.0,98.0,3.709,0.0936,10.761
+DH015,98.0,100.0,11.643,0.8227,23.564
+DH015,100.0,102.0,0.424,0.2613,1.255
+DH015,102.0,104.0,0.785,0.2128,1.614
+DH015,104.0,106.0,4.667,1.6228,13.481
+DH015,106.0,108.0,0.679,0.5941,1.622
+DH015,108.0,110.0,1.757,0.2117,2.915
+DH015,110.0,112.0,4.651,0.3216,13.36
+DH015,112.0,114.0,9.564,5.5882,20.933
+DH015,114.0,116.0,2.508,0.079,5.324
+DH015,116.0,118.0,1.722,0.1455,2.589
+DH015,118.0,120.0,18.796,0.6052,39.276
+DH015,120.0,122.0,0.522,0.6504,1.372
+DH015,122.0,124.0,0.28,0.3945,0.701
+DH015,124.0,126.0,0.121,0.1154,0.344
+DH015,126.0,128.0,5.373,0.1477,10.545
+DH015,128.0,130.0,5.326,0.1534,15.329
+DH015,130.0,132.0,0.586,0.0756,1.257
+DH015,132.0,134.0,3.013,0.4667,4.806
+DH015,134.0,136.0,0.857,0.6627,1.561
+DH015,136.0,138.0,9.992,0.6417,26.998
+DH015,138.0,140.0,0.975,0.1161,2.398
+DH015,140.0,142.0,0.47,0.1034,0.856
+DH015,142.0,144.0,4.851,0.0964,8.074
+DH015,144.0,146.0,3.839,0.7467,6.701
+DH015,146.0,148.0,7.927,0.3268,16.11
+DH015,148.0,150.0,0.475,0.2024,1.159
+DH015,150.0,152.0,1.661,0.3183,2.618
+DH015,152.0,154.0,3.563,0.1937,9.662
+DH015,154.0,156.0,8.303,0.2952,22.37
+DH015,156.0,158.0,1.764,0.0553,5.016
+DH015,158.0,160.0,4.09,0.1904,11.663
+DH015,160.0,162.0,14.902,0.0885,34.73
+DH015,162.0,164.0,30.693,0.5282,80.89
+DH015,164.0,166.0,0.571,0.075,1.217
+DH015,166.0,168.0,0.976,0.1255,2.057
+DH015,168.0,170.0,1.969,0.329,5.088
+DH015,170.0,172.0,0.981,0.1964,2.095
+DH015,172.0,174.0,20.16,0.2687,33.516
+DH015,174.0,176.0,3.676,0.3453,7.642
+DH015,176.0,178.0,0.519,0.9107,1.113
+DH015,178.0,180.0,4.918,0.2619,10.586
+DH015,180.0,182.0,17.257,0.3497,27.461
+DH015,182.0,184.0,8.391,0.1347,22.112
+DH015,184.0,186.0,0.472,0.0976,1.064
+DH015,186.0,188.0,3.462,0.0572,9.524
+DH015,188.0,190.0,0.833,0.6211,1.485
+DH015,190.0,192.0,0.578,0.2371,1.457
+DH015,192.0,194.0,10.204,0.2232,25.054
+DH015,194.0,196.0,4.527,0.0999,12.412
+DH015,196.0,198.0,3.633,0.0926,7.269
+DH015,198.0,200.0,6.075,0.3396,16.792
+DH015,200.0,202.0,1.059,0.1083,2.132
+DH015,202.0,204.0,6.601,0.1593,12.218
+DH015,204.0,206.0,0.437,0.1303,0.661
+DH015,206.0,208.0,3.829,0.2064,9.45
+DH015,208.0,210.0,2.445,0.1958,5.209
+DH015,210.0,212.0,1.334,0.2686,2.346
+DH015,212.0,214.0,2.824,0.0869,5.597
+DH015,214.0,216.0,3.592,0.7242,5.507
+DH015,216.0,218.0,1.358,0.267,2.262
+DH015,218.0,220.0,0.717,0.0899,1.174
+DH015,220.0,222.0,2.784,0.1306,5.002
+DH015,222.0,224.0,1.182,0.6372,3.357
+DH015,224.0,226.0,2.682,0.3531,7.72
+DH015,226.0,228.0,2.808,0.2779,7.765
+DH015,228.0,230.0,3.014,0.2151,6.283
+DH015,230.0,232.0,2.323,0.2745,4.741
+DH015,232.0,234.0,0.54,0.1697,1.148
+DH015,234.0,236.0,3.963,0.3222,7.323
+DH015,236.0,238.0,4.65,0.5514,8.931
+DH015,238.0,240.0,0.676,0.1735,1.191
+DH015,240.0,242.0,3.626,0.3081,9.647
+DH015,242.0,244.0,1.421,0.1932,2.267
+DH015,244.0,246.0,6.104,0.0998,11.051
+DH015,246.0,248.0,1.019,0.3247,2.886
+DH015,248.0,250.0,14.57,0.1597,25.341
+DH015,250.0,252.0,0.118,0.0118,0.06
+DH015,252.0,254.0,0.07,0.0142,0.046
+DH015,254.0,256.0,0.16,0.0136,0.125
+DH015,256.0,258.0,0.099,0.0091,0.143
+DH015,258.0,260.0,0.035,0.0251,0.036
+DH015,260.0,262.0,0.082,0.0096,0.074
+DH015,262.0,264.0,0.143,0.0122,0.095
+DH015,264.0,266.0,0.108,0.0233,0.12
+DH015,266.0,268.0,0.275,0.0239,0.252
+DH015,268.0,270.0,0.075,0.0072,0.099
+DH015,270.0,272.0,0.058,0.024,0.067
+DH015,272.0,274.0,0.095,0.0124,0.136
+DH015,274.0,276.0,0.04,0.0563,0.025
+DH015,276.0,278.0,0.219,0.0347,0.166
+DH015,278.0,280.0,0.165,0.0175,0.135
+DH015,280.0,282.0,0.202,0.0322,0.203
+DH015,282.0,284.0,0.039,0.0137,0.049
+DH015,284.0,286.0,0.145,0.0082,0.166
+DH015,286.0,288.0,0.049,0.009,0.064
+DH015,288.0,290.0,0.067,0.0279,0.083
+DH015,290.0,292.0,0.052,0.0056,0.039
+DH015,292.0,294.0,0.241,0.0519,0.221
+DH015,294.0,296.0,0.05,0.0158,0.048
+DH015,296.0,298.0,0.06,0.0206,0.068
+DH015,298.0,300.0,0.058,0.0141,0.053
+DH015,300.0,302.0,0.046,0.023,0.024
+DH015,302.0,304.0,0.089,0.0366,0.058
+DH015,304.0,306.0,0.143,0.0075,0.147
+DH015,306.0,308.0,0.083,0.0479,0.072
+DH015,308.0,310.0,0.077,0.0379,0.076
+DH015,310.0,312.0,0.072,0.0216,0.039
+DH015,312.0,314.0,0.21,0.0229,0.121
+DH015,314.0,316.0,0.066,0.0126,0.076
+DH016,0.0,2.0,0.041,0.0233,0.042
+DH016,2.0,4.0,0.055,0.0235,0.082
+DH016,4.0,6.0,0.13,0.0144,0.094
+DH016,6.0,8.0,0.065,0.0251,0.042
+DH016,8.0,10.0,0.128,0.0194,0.073
+DH016,10.0,12.0,0.15,0.0175,0.161
+DH016,12.0,14.0,0.124,0.0124,0.152
+DH016,14.0,16.0,0.122,0.0157,0.085
+DH016,16.0,18.0,0.074,0.0306,0.041
+DH016,18.0,20.0,0.098,0.0152,0.089
+DH016,20.0,22.0,0.168,0.0178,0.171
+DH016,22.0,24.0,0.084,0.0195,0.051
+DH016,24.0,26.0,0.169,0.0191,0.151
+DH016,26.0,28.0,0.054,0.0168,0.042
+DH016,28.0,30.0,0.137,0.0266,0.112
+DH016,30.0,32.0,0.148,0.0175,0.175
+DH016,32.0,34.0,0.183,0.0381,0.21
+DH016,34.0,36.0,0.126,0.0269,0.186
+DH016,36.0,38.0,0.127,0.0094,0.09
+DH016,38.0,40.0,0.156,0.0142,0.166
+DH016,40.0,42.0,0.111,0.0159,0.087
+DH016,42.0,44.0,0.128,0.0138,0.074
+DH016,44.0,46.0,0.103,0.014,0.123
+DH016,46.0,48.0,0.037,0.0161,0.021
+DH016,48.0,50.0,0.118,0.0123,0.081
+DH016,50.0,52.0,0.083,0.0242,0.106
+DH016,52.0,54.0,0.06,0.0213,0.072
+DH016,54.0,56.0,0.093,0.0081,0.119
+DH016,56.0,58.0,0.28,0.0096,0.176
+DH016,58.0,60.0,0.072,0.0192,0.038
+DH016,60.0,62.0,0.163,0.0191,0.134
+DH016,62.0,64.0,0.076,0.0154,0.099
+DH016,64.0,66.0,0.028,0.021,0.024
+DH016,66.0,68.0,0.108,0.0258,0.084
+DH016,68.0,70.0,0.071,0.03,0.06
+DH016,70.0,72.0,0.2,0.0274,0.126
+DH016,72.0,74.0,0.093,0.0126,0.079
+DH016,74.0,76.0,0.042,0.0188,0.054
+DH016,76.0,78.0,0.034,0.018,0.018
+DH016,78.0,80.0,0.041,0.0152,0.042
+DH016,80.0,82.0,1.062,0.4683,2.378
+DH016,82.0,84.0,0.205,0.2237,0.464
+DH016,84.0,86.0,3.615,0.145,7.37
+DH016,86.0,88.0,2.206,0.1567,4.048
+DH016,88.0,90.0,1.508,0.2138,3.349
+DH016,90.0,92.0,1.762,0.3482,4.063
+DH016,92.0,94.0,5.353,0.2813,13.165
+DH016,94.0,96.0,2.51,0.1407,4.406
+DH016,96.0,98.0,25.39,0.5877,53.377
+DH016,98.0,100.0,6.215,0.1113,16.583
+DH016,100.0,102.0,6.941,0.7333,14.721
+DH016,102.0,104.0,1.246,1.2777,2.125
+DH016,104.0,106.0,19.847,0.2633,34.714
+DH016,106.0,108.0,1.543,0.4743,3.692
+DH016,108.0,110.0,0.643,0.1683,1.606
+DH016,110.0,112.0,1.905,0.1504,5.138
+DH016,112.0,114.0,8.366,0.1557,13.541
+DH016,114.0,116.0,0.522,0.109,1.315
+DH016,116.0,118.0,2.311,0.103,4.089
+DH016,118.0,120.0,0.62,0.3211,1.736
+DH016,120.0,122.0,0.661,0.0503,1.147
+DH016,122.0,124.0,0.256,0.2289,0.663
+DH016,124.0,126.0,16.579,0.0526,41.263
+DH016,126.0,128.0,0.679,0.0859,1.921
+DH016,128.0,130.0,9.718,0.3605,25.426
+DH016,130.0,132.0,5.186,0.0371,11.494
+DH016,132.0,134.0,0.828,0.2376,1.75
+DH016,134.0,136.0,1.878,0.194,3.177
+DH016,136.0,138.0,4.255,0.2514,9.892
+DH016,138.0,140.0,3.604,0.4321,10.323
+DH016,140.0,142.0,2.072,0.5653,6.193
+DH016,142.0,144.0,19.407,0.0764,56.732
+DH016,144.0,146.0,0.712,1.2845,1.913
+DH016,146.0,148.0,1.22,0.1659,2.533
+DH016,148.0,150.0,1.501,0.2006,3.912
+DH016,150.0,152.0,2.384,0.2263,6.154
+DH016,152.0,154.0,10.707,0.192,31.323
+DH016,154.0,156.0,0.593,0.4122,0.97
+DH016,156.0,158.0,0.537,0.1923,0.871
+DH016,158.0,160.0,2.765,0.7387,4.871
+DH016,160.0,162.0,7.826,0.1324,13.351
+DH016,162.0,164.0,2.886,0.3788,7.702
+DH016,164.0,166.0,0.917,0.4512,2.188
+DH016,166.0,168.0,1.105,0.0514,2.305
+DH016,168.0,170.0,1.496,0.2009,3.584
+DH016,170.0,172.0,1.287,0.1799,3.633
+DH016,172.0,174.0,12.984,0.2286,23.505
+DH016,174.0,176.0,0.53,0.2494,1.473
+DH016,176.0,178.0,0.341,0.371,0.754
+DH016,178.0,180.0,1.431,0.2822,3.012
+DH016,180.0,182.0,4.586,0.362,12.895
+DH016,182.0,184.0,1.987,0.1841,3.048
+DH016,184.0,186.0,1.36,0.2297,3.448
+DH016,186.0,188.0,2.453,0.7455,7.127
+DH016,188.0,190.0,1.93,0.1904,4.343
+DH016,190.0,192.0,4.84,0.1718,11.605
+DH016,192.0,194.0,2.902,0.2522,7.765
+DH016,194.0,196.0,11.894,0.2185,22.207
+DH016,196.0,198.0,2.942,0.0782,5.466
+DH016,198.0,200.0,1.423,0.3583,2.508
+DH016,200.0,202.0,1.556,0.1962,4.165
+DH016,202.0,204.0,5.893,0.3727,10.951
+DH016,204.0,206.0,1.496,0.5839,3.238
+DH016,206.0,208.0,0.421,0.0845,0.947
+DH016,208.0,210.0,9.42,0.1378,20.225
+DH016,210.0,212.0,1.717,0.3528,3.141
+DH016,212.0,214.0,1.173,0.0761,2.482
+DH016,214.0,216.0,9.143,0.24,18.438
+DH016,216.0,218.0,9.81,0.1397,25.732
+DH016,218.0,220.0,11.993,0.2334,24.297
+DH016,220.0,222.0,34.723,0.3042,59.447
+DH016,222.0,224.0,7.01,0.3913,20.594
+DH016,224.0,226.0,1.005,0.2879,2.167
+DH016,226.0,228.0,4.951,0.2191,7.939
+DH016,228.0,230.0,1.867,0.1825,4.748
+DH016,230.0,232.0,5.746,0.7347,12.486
+DH016,232.0,234.0,4.324,0.3153,9.737
+DH016,234.0,236.0,0.356,0.0788,0.788
+DH016,236.0,238.0,0.171,0.6883,0.423
+DH016,238.0,240.0,2.147,0.0387,4.005
+DH016,240.0,242.0,2.219,1.0794,5.184
+DH016,242.0,244.0,6.275,0.152,14.17
+DH016,244.0,246.0,9.56,0.1692,22.003
+DH016,246.0,248.0,12.203,0.2314,33.45
+DH016,248.0,250.0,0.978,0.6875,1.582
+DH016,250.0,252.0,0.107,0.0196,0.13
+DH016,252.0,254.0,0.082,0.0147,0.088
+DH016,254.0,256.0,0.073,0.0087,0.08
+DH016,256.0,258.0,0.029,0.0249,0.043
+DH016,258.0,260.0,0.098,0.0196,0.136
+DH016,260.0,261.0,0.107,0.0198,0.092
+DH017,0.0,2.0,0.068,0.0227,0.09
+DH017,2.0,4.0,0.226,0.0093,0.258
+DH017,4.0,6.0,0.032,0.0392,0.032
+DH017,6.0,8.0,0.101,0.0199,0.122
+DH017,8.0,10.0,0.17,0.0327,0.203
+DH017,10.0,12.0,0.067,0.0269,0.079
+DH017,12.0,14.0,0.073,0.0154,0.108
+DH017,14.0,16.0,0.223,0.0126,0.199
+DH017,16.0,18.0,0.101,0.0234,0.081
+DH017,18.0,20.0,0.254,0.0226,0.25
+DH017,20.0,22.0,0.236,0.0146,0.297
+DH017,22.0,24.0,0.039,0.0168,0.022
+DH017,24.0,26.0,0.129,0.0226,0.115
+DH017,26.0,28.0,0.077,0.0268,0.061
+DH017,28.0,30.0,0.093,0.026,0.08
+DH017,30.0,32.0,0.124,0.0079,0.079
+DH017,32.0,34.0,0.041,0.0375,0.033
+DH017,34.0,36.0,0.03,0.0196,0.028
+DH017,36.0,38.0,0.033,0.0238,0.02
+DH017,38.0,40.0,0.044,0.0137,0.057
+DH017,40.0,42.0,0.179,0.0318,0.203
+DH017,42.0,44.0,0.019,0.0223,0.026
+DH017,44.0,46.0,0.172,0.0231,0.168
+DH017,46.0,48.0,0.06,0.0482,0.066
+DH017,48.0,50.0,0.041,0.0293,0.048
+DH017,50.0,52.0,0.04,0.0393,0.033
+DH017,52.0,54.0,0.065,0.0103,0.081
+DH017,54.0,56.0,0.081,0.0368,0.096
+DH017,56.0,58.0,0.06,0.0142,0.058
+DH017,58.0,60.0,0.197,0.0072,0.14
+DH017,60.0,62.0,0.076,0.0109,0.058
+DH017,62.0,64.0,0.037,0.0145,0.034
+DH017,64.0,66.0,0.061,0.0177,0.044
+DH017,66.0,68.0,0.211,0.0234,0.203
+DH017,68.0,70.0,0.075,0.0139,0.11
+DH017,70.0,72.0,0.058,0.0168,0.057
+DH017,72.0,74.0,0.039,0.0261,0.048
+DH017,74.0,76.0,0.176,0.0286,0.231
+DH017,76.0,78.0,0.077,0.0119,0.066
+DH017,78.0,80.0,0.033,0.009,0.031
+DH017,80.0,82.0,15.642,0.2597,36.783
+DH017,82.0,84.0,0.203,0.1496,0.49
+DH017,84.0,86.0,5.677,0.0647,11.486
+DH017,86.0,88.0,4.124,0.5218,7.777
+DH017,88.0,90.0,4.411,0.3431,10.916
+DH017,90.0,92.0,0.598,0.3506,1.274
+DH017,92.0,94.0,6.507,0.2864,16.548
+DH017,94.0,96.0,5.096,0.2229,10.056
+DH017,96.0,98.0,1.563,0.1285,4.557
+DH017,98.0,100.0,0.406,0.1008,0.639
+DH017,100.0,102.0,15.433,0.5186,33.602
+DH017,102.0,104.0,11.264,0.6567,22.735
+DH017,104.0,106.0,0.108,0.2106,0.319
+DH017,106.0,108.0,15.022,0.1112,32.933
+DH017,108.0,110.0,0.154,0.1662,0.324
+DH017,110.0,112.0,8.871,0.6304,22.337
+DH017,112.0,114.0,0.44,0.4449,0.922
+DH017,114.0,116.0,0.3,0.0427,0.586
+DH017,116.0,118.0,1.793,0.0798,2.756
+DH017,118.0,120.0,3.445,0.2088,10.322
+DH017,120.0,122.0,21.385,0.4983,56.885
+DH017,122.0,124.0,1.562,0.2975,2.577
+DH017,124.0,126.0,3.278,0.077,8.622
+DH017,126.0,128.0,0.548,0.0912,1.321
+DH017,128.0,130.0,2.389,0.2634,5.248
+DH017,130.0,132.0,1.087,0.3227,2.052
+DH017,132.0,134.0,0.168,0.2633,0.394
+DH017,134.0,136.0,10.387,0.1321,23.355
+DH017,136.0,138.0,0.673,0.0928,1.461
+DH017,138.0,140.0,0.085,0.1559,0.236
+DH017,140.0,142.0,2.245,0.4571,4.194
+DH017,142.0,144.0,0.326,0.7045,0.674
+DH017,144.0,146.0,2.519,0.0912,3.803
+DH017,146.0,148.0,0.563,0.5767,1.682
+DH017,148.0,150.0,3.978,0.1343,11.8
+DH017,150.0,152.0,0.295,0.7741,0.746
+DH017,152.0,154.0,1.426,0.3769,4.273
+DH017,154.0,156.0,1.752,0.1614,3.653
+DH017,156.0,158.0,1.048,0.141,2.511
+DH017,158.0,160.0,2.78,1.2279,5.442
+DH017,160.0,162.0,8.858,0.0947,23.755
+DH017,162.0,164.0,0.935,0.3062,2.094
+DH017,164.0,166.0,2.363,1.5309,5.649
+DH017,166.0,168.0,9.14,0.4112,22.267
+DH017,168.0,170.0,0.397,0.6678,0.799
+DH017,170.0,172.0,1.131,0.3496,3.096
+DH017,172.0,174.0,0.558,0.1481,1.589
+DH017,174.0,176.0,1.78,0.4419,5.298
+DH017,176.0,178.0,3.681,0.1239,10.216
+DH017,178.0,180.0,1.506,0.1052,3.321
+DH017,180.0,182.0,3.828,0.154,10.753
+DH017,182.0,184.0,0.921,0.2028,2.654
+DH017,184.0,186.0,6.491,0.6201,10.175
+DH017,186.0,188.0,7.855,0.1311,15.476
+DH017,188.0,190.0,6.591,0.7485,19.692
+DH017,190.0,192.0,0.749,0.4311,1.672
+DH017,192.0,194.0,4.016,0.5209,9.402
+DH017,194.0,196.0,1.328,0.0945,2.8
+DH017,196.0,198.0,1.232,0.1292,2.001
+DH017,198.0,200.0,1.608,0.1779,2.656
+DH017,200.0,202.0,1.387,0.2939,2.277
+DH017,202.0,204.0,1.097,0.0571,2.048
+DH017,204.0,206.0,0.523,0.2585,1.149
+DH017,206.0,208.0,0.261,0.1438,0.525
+DH017,208.0,210.0,1.621,0.5276,3.793
+DH017,210.0,212.0,2.102,0.7148,3.695
+DH017,212.0,214.0,0.894,0.2534,1.793
+DH017,214.0,216.0,3.686,0.337,9.623
+DH017,216.0,218.0,2.746,0.2031,6.913
+DH017,218.0,220.0,6.035,0.3269,13.765
+DH017,220.0,222.0,6.821,0.111,16.382
+DH017,222.0,224.0,0.048,0.211,0.116
+DH017,224.0,226.0,3.587,0.0461,7.644
+DH017,226.0,228.0,3.913,0.0979,7.701
+DH017,228.0,230.0,1.141,0.2173,3.141
+DH017,230.0,232.0,6.982,0.2403,16.517
+DH017,232.0,234.0,1.284,0.3714,3.272
+DH017,234.0,236.0,1.797,0.1639,4.063
+DH017,236.0,238.0,0.663,0.0507,1.677
+DH017,238.0,240.0,7.078,0.0532,17.504
+DH017,240.0,242.0,8.165,0.3594,15.668
+DH017,242.0,244.0,0.717,0.2381,1.628
+DH017,244.0,246.0,2.497,0.1932,6.375
+DH017,246.0,248.0,3.696,0.3252,9.817
+DH017,248.0,250.0,2.543,0.855,6.473
+DH017,250.0,252.0,0.177,0.0127,0.127
+DH017,252.0,254.0,0.172,0.0158,0.144
+DH017,254.0,256.0,0.109,0.0118,0.1
+DH017,256.0,258.0,0.162,0.0291,0.158
+DH017,258.0,260.0,0.076,0.0203,0.099
+DH017,260.0,262.0,0.338,0.0206,0.382
+DH017,262.0,264.0,0.168,0.0153,0.119
+DH017,264.0,266.0,0.03,0.0146,0.032
+DH017,266.0,268.0,0.211,0.0124,0.246
+DH017,268.0,270.0,0.115,0.0134,0.118
+DH017,270.0,272.0,0.139,0.014,0.154
+DH017,272.0,274.0,0.038,0.0184,0.045
+DH017,274.0,276.0,0.069,0.0091,0.059
+DH017,276.0,278.0,0.301,0.0108,0.271
+DH017,278.0,280.0,0.046,0.0157,0.068
+DH017,280.0,282.0,0.062,0.0159,0.066
+DH017,282.0,284.0,0.163,0.0036,0.209
+DH017,284.0,286.0,0.08,0.0132,0.095
+DH017,286.0,288.0,0.169,0.009,0.119
+DH017,288.0,290.0,0.035,0.0349,0.044
+DH017,290.0,292.0,0.061,0.0149,0.076
+DH017,292.0,294.0,0.093,0.0116,0.099
+DH017,294.0,296.0,0.052,0.01,0.041
+DH017,296.0,298.0,0.041,0.0148,0.043
+DH017,298.0,300.0,0.088,0.0492,0.075
+DH017,300.0,302.0,0.109,0.0184,0.142
+DH017,302.0,304.0,0.126,0.0169,0.08
+DH017,304.0,306.0,0.053,0.0249,0.057
+DH017,306.0,308.0,0.131,0.0181,0.069
+DH017,308.0,310.0,0.071,0.0169,0.105
+DH017,310.0,312.0,0.571,0.0337,0.64
+DH017,312.0,314.0,0.12,0.0256,0.14
+DH017,314.0,316.0,0.039,0.0177,0.022
+DH017,316.0,318.0,0.031,0.0128,0.033
+DH017,318.0,320.0,0.084,0.0372,0.103
+DH017,320.0,322.0,0.337,0.0085,0.505
+DH017,322.0,324.0,0.079,0.0104,0.06
+DH017,324.0,326.0,0.079,0.0166,0.114
+DH017,326.0,328.0,0.106,0.0156,0.154
+DH017,328.0,330.0,0.074,0.0113,0.043
+DH017,330.0,332.0,0.074,0.0097,0.045
+DH017,332.0,334.0,0.113,0.0075,0.134
+DH017,334.0,336.0,0.09,0.0179,0.064
+DH017,336.0,338.0,0.13,0.0183,0.139
+DH017,338.0,340.0,0.093,0.0079,0.053
+DH017,340.0,342.0,0.042,0.0218,0.031
+DH017,342.0,344.0,0.154,0.0116,0.221
+DH017,344.0,346.0,0.077,0.0114,0.062
+DH017,346.0,348.0,0.079,0.0134,0.089
+DH017,348.0,350.0,0.076,0.017,0.044
+DH017,350.0,352.0,0.038,0.019,0.022
+DH017,352.0,354.0,0.045,0.0162,0.046
+DH017,354.0,356.0,0.092,0.014,0.091
+DH017,356.0,358.0,0.12,0.0055,0.163
+DH017,358.0,360.0,0.027,0.009,0.016
+DH017,360.0,362.0,0.302,0.0424,0.284
+DH017,362.0,364.0,0.102,0.0072,0.079
+DH017,364.0,366.0,0.059,0.0122,0.061
+DH017,366.0,368.0,0.062,0.0283,0.038
+DH017,368.0,370.0,0.086,0.0118,0.055
+DH017,370.0,372.0,0.099,0.0105,0.112
+DH017,372.0,374.0,0.072,0.0132,0.085
+DH017,374.0,376.0,0.075,0.0125,0.084
+DH017,376.0,378.0,0.069,0.0135,0.052
+DH017,378.0,380.0,0.105,0.0151,0.119
+DH017,380.0,382.0,0.044,0.0147,0.041
+DH017,382.0,384.0,0.039,0.0222,0.041
+DH017,384.0,386.0,0.066,0.0138,0.041
+DH017,386.0,388.0,0.055,0.0065,0.031
+DH017,388.0,390.0,0.129,0.0357,0.17
+DH017,390.0,392.0,0.177,0.0265,0.182
+DH017,392.0,394.0,0.07,0.02,0.086
+DH017,394.0,396.0,0.104,0.0131,0.118
+DH017,396.0,398.0,0.269,0.0208,0.228
+DH017,398.0,399.0,0.113,0.021,0.117
+DH018,0.0,2.0,0.141,0.0262,0.125
+DH018,2.0,4.0,0.054,0.0222,0.055
+DH018,4.0,6.0,0.068,0.0699,0.059
+DH018,6.0,8.0,0.146,0.0119,0.165
+DH018,8.0,10.0,0.383,0.0113,0.359
+DH018,10.0,12.0,0.081,0.012,0.099
+DH018,12.0,14.0,0.06,0.0254,0.086
+DH018,14.0,16.0,0.028,0.0163,0.033
+DH018,16.0,18.0,0.204,0.0085,0.296
+DH018,18.0,20.0,0.105,0.0137,0.155
+DH018,20.0,22.0,0.279,0.0111,0.32
+DH018,22.0,24.0,0.072,0.0261,0.058
+DH018,24.0,26.0,0.05,0.0156,0.07
+DH018,26.0,28.0,0.129,0.0102,0.128
+DH018,28.0,30.0,0.052,0.0182,0.036
+DH018,30.0,32.0,0.038,0.0118,0.049
+DH018,32.0,34.0,0.064,0.0112,0.059
+DH018,34.0,36.0,0.051,0.0117,0.046
+DH018,36.0,38.0,0.149,0.0204,0.114
+DH018,38.0,40.0,0.035,0.0103,0.043
+DH018,40.0,42.0,0.18,0.0239,0.246
+DH018,42.0,44.0,0.059,0.0121,0.084
+DH018,44.0,46.0,0.108,0.0159,0.066
+DH018,46.0,48.0,0.174,0.0353,0.157
+DH018,48.0,50.0,0.064,0.0247,0.034
+DH018,50.0,52.0,0.218,0.0224,0.14
+DH018,52.0,54.0,0.089,0.0437,0.121
+DH018,54.0,56.0,0.247,0.0167,0.234
+DH018,56.0,58.0,0.052,0.008,0.029
+DH018,58.0,60.0,0.044,0.0199,0.042
+DH018,60.0,62.0,0.055,0.016,0.04
+DH018,62.0,64.0,0.065,0.0663,0.096
+DH018,64.0,66.0,0.07,0.0135,0.044
+DH018,66.0,68.0,0.089,0.0149,0.114
+DH018,68.0,70.0,0.046,0.0113,0.042
+DH018,70.0,72.0,0.041,0.0264,0.02
+DH018,72.0,74.0,0.027,0.0193,0.016
+DH018,74.0,76.0,0.124,0.0162,0.153
+DH018,76.0,78.0,0.156,0.0108,0.136
+DH018,78.0,80.0,0.052,0.0099,0.039
+DH018,80.0,82.0,2.198,0.4708,6.396
+DH018,82.0,84.0,1.794,0.2174,5.364
+DH018,84.0,86.0,3.235,0.0958,7.714
+DH018,86.0,88.0,1.566,0.155,3.811
+DH018,88.0,90.0,4.765,0.2419,9.89
+DH018,90.0,92.0,1.372,0.1408,3.713
+DH018,92.0,94.0,3.88,0.3721,11.024
+DH018,94.0,96.0,6.95,0.2095,20.398
+DH018,96.0,98.0,2.824,0.0752,4.321
+DH018,98.0,100.0,0.35,0.0981,0.918
+DH018,100.0,102.0,1.709,0.194,3.191
+DH018,102.0,104.0,1.934,0.3734,5.038
+DH018,104.0,106.0,3.614,0.121,8.3
+DH018,106.0,108.0,2.227,0.1345,5.658
+DH018,108.0,110.0,7.259,0.5071,18.995
+DH018,110.0,112.0,0.834,0.1539,2.223
+DH018,112.0,114.0,8.773,1.9378,21.812
+DH018,114.0,116.0,1.351,0.3573,2.394
+DH018,116.0,118.0,1.879,0.1601,3.449
+DH018,118.0,120.0,2.58,0.1928,4.7
+DH018,120.0,122.0,2.24,0.0818,6.395
+DH018,122.0,124.0,0.181,0.0847,0.281
+DH018,124.0,126.0,1.654,0.4667,3.99
+DH018,126.0,128.0,1.664,0.1525,2.641
+DH018,128.0,130.0,4.989,0.373,12.031
+DH018,130.0,132.0,1.431,0.6493,2.628
+DH018,132.0,134.0,0.608,0.4075,0.964
+DH018,134.0,136.0,4.425,0.242,8.701
+DH018,136.0,138.0,2.072,0.2334,3.281
+DH018,138.0,140.0,1.005,0.1268,1.547
+DH018,140.0,142.0,2.149,0.1611,6.073
+DH018,142.0,144.0,15.082,0.1565,34.698
+DH018,144.0,146.0,0.287,0.2157,0.45
+DH018,146.0,148.0,6.07,0.2433,16.337
+DH018,148.0,150.0,5.352,0.5435,13.734
+DH018,150.0,152.0,14.643,0.1948,25.707
+DH018,152.0,154.0,4.936,0.4166,14.548
+DH018,154.0,156.0,10.356,1.058,18.401
+DH018,156.0,158.0,2.929,0.0737,6.823
+DH018,158.0,160.0,1.147,0.2643,2.371
+DH018,160.0,162.0,3.92,0.2064,9.985
+DH018,162.0,164.0,0.085,0.2598,0.141
+DH018,164.0,166.0,20.99,0.4007,50.774
+DH018,166.0,168.0,2.726,0.2236,4.715
+DH018,168.0,170.0,2.217,0.1193,6.405
+DH018,170.0,172.0,0.586,0.3405,0.879
+DH018,172.0,174.0,1.444,0.1418,3.945
+DH018,174.0,176.0,5.678,0.0903,11.563
+DH018,176.0,178.0,6.997,0.0743,12.334
+DH018,178.0,180.0,15.491,0.815,26.087
+DH018,180.0,182.0,2.994,0.4026,5.504
+DH018,182.0,184.0,33.191,0.0345,88.31
+DH018,184.0,186.0,6.161,0.1704,14.552
+DH018,186.0,188.0,2.123,0.2479,6.043
+DH018,188.0,190.0,1.189,0.144,2.952
+DH018,190.0,192.0,0.879,0.4783,2.532
+DH018,192.0,194.0,8.325,0.0904,21.386
+DH018,194.0,196.0,2.214,2.2683,5.675
+DH018,196.0,198.0,1.144,0.3134,2.263
+DH018,198.0,200.0,0.431,0.6674,1.056
+DH018,200.0,202.0,1.996,0.2274,3.973
+DH018,202.0,204.0,0.899,0.057,1.906
+DH018,204.0,206.0,0.192,0.1754,0.346
+DH018,206.0,208.0,4.459,0.5137,6.961
+DH018,208.0,210.0,40.141,0.1394,100.223
+DH018,210.0,212.0,1.316,0.4797,2.977
+DH018,212.0,214.0,17.507,0.1459,39.374
+DH018,214.0,216.0,4.535,0.2174,8.784
+DH018,216.0,218.0,3.045,0.2966,8.073
+DH018,218.0,220.0,0.959,0.1707,1.768
+DH018,220.0,222.0,6.113,0.0831,11.999
+DH018,222.0,224.0,4.844,0.4367,9.017
+DH018,224.0,226.0,1.993,0.3223,3.003
+DH018,226.0,228.0,11.166,0.1156,24.897
+DH018,228.0,230.0,5.885,0.1452,15.4
+DH018,230.0,232.0,1.84,0.5972,3.686
+DH018,232.0,234.0,36.715,0.1141,62.954
+DH018,234.0,236.0,0.515,0.2307,0.781
+DH018,236.0,238.0,0.373,2.1397,0.659
+DH018,238.0,240.0,1.23,0.4844,2.018
+DH018,240.0,242.0,8.6,0.0854,21.186
+DH018,242.0,244.0,0.233,0.459,0.643
+DH018,244.0,246.0,0.849,0.2226,1.631
+DH018,246.0,248.0,1.627,0.7522,3.901
+DH018,248.0,250.0,4.824,0.0834,13.257
+DH018,250.0,252.0,0.051,0.0437,0.042
+DH018,252.0,254.0,0.112,0.0307,0.097
+DH018,254.0,256.0,0.073,0.0318,0.069
+DH018,256.0,258.0,0.039,0.0158,0.034
+DH018,258.0,260.0,0.105,0.0071,0.127
+DH018,260.0,262.0,0.167,0.0144,0.134
+DH018,262.0,264.0,0.072,0.0207,0.107
+DH018,264.0,266.0,0.119,0.0081,0.146
+DH018,266.0,268.0,0.076,0.0165,0.05
+DH018,268.0,270.0,0.056,0.047,0.063
+DH018,270.0,272.0,0.094,0.0202,0.116
+DH018,272.0,274.0,0.116,0.0228,0.094
+DH018,274.0,276.0,0.027,0.0075,0.017
+DH018,276.0,278.0,0.073,0.0245,0.101
+DH018,278.0,280.0,0.116,0.0098,0.146
+DH018,280.0,282.0,0.037,0.0222,0.055
+DH018,282.0,284.0,0.14,0.0218,0.157
+DH018,284.0,286.0,0.065,0.0287,0.034
+DH018,286.0,288.0,0.031,0.0131,0.025
+DH018,288.0,290.0,0.03,0.0194,0.028
+DH018,290.0,292.0,0.107,0.0248,0.054
+DH018,292.0,294.0,0.07,0.0107,0.064
+DH018,294.0,296.0,0.037,0.012,0.019
+DH018,296.0,298.0,0.076,0.0848,0.113
+DH018,298.0,300.0,0.076,0.009,0.1
+DH018,300.0,302.0,0.067,0.0279,0.095
+DH018,302.0,304.0,0.073,0.0148,0.053
+DH018,304.0,306.0,0.056,0.0151,0.078
+DH018,306.0,308.0,0.115,0.0163,0.077
+DH018,308.0,310.0,0.029,0.024,0.02
+DH018,310.0,312.0,0.129,0.0354,0.13
+DH018,312.0,314.0,0.044,0.0182,0.065
+DH018,314.0,316.0,0.068,0.0138,0.081
+DH018,316.0,318.0,0.111,0.0154,0.11
+DH018,318.0,320.0,0.108,0.0125,0.07
+DH018,320.0,322.0,0.09,0.0071,0.104
+DH018,322.0,324.0,0.112,0.0252,0.071
+DH018,324.0,326.0,0.025,0.0347,0.032
+DH018,326.0,328.0,0.04,0.0124,0.046
+DH018,328.0,330.0,0.123,0.0144,0.179
+DH018,330.0,332.0,0.028,0.0109,0.024
+DH018,332.0,334.0,0.048,0.0389,0.065
+DH018,334.0,336.0,0.094,0.0133,0.136
+DH018,336.0,338.0,0.109,0.0084,0.089
+DH018,338.0,340.0,0.194,0.0109,0.115
+DH018,340.0,342.0,0.083,0.0211,0.066
+DH018,342.0,344.0,0.086,0.0248,0.054
+DH018,344.0,346.0,0.076,0.0179,0.046
+DH018,346.0,348.0,0.059,0.0094,0.062
+DH018,348.0,350.0,0.157,0.0219,0.185
+DH018,350.0,352.0,0.432,0.0089,0.219
+DH018,352.0,354.0,0.172,0.0099,0.11
+DH018,354.0,356.0,0.065,0.0129,0.033
+DH018,356.0,358.0,0.107,0.0227,0.126
+DH018,358.0,360.0,0.031,0.0209,0.017
+DH018,360.0,362.0,0.247,0.047,0.208
+DH018,362.0,364.0,0.047,0.0243,0.038
+DH018,364.0,366.0,0.129,0.0153,0.137
+DH018,366.0,368.0,0.082,0.0195,0.05
+DH018,368.0,370.0,0.121,0.0161,0.16
+DH018,370.0,372.0,0.095,0.02,0.095
+DH018,372.0,374.0,0.132,0.0166,0.091
+DH018,374.0,376.0,0.115,0.0122,0.068
+DH018,376.0,378.0,0.044,0.0211,0.052
+DH018,378.0,380.0,0.023,0.0151,0.016
+DH018,380.0,382.0,0.063,0.0169,0.037
+DH018,382.0,384.0,0.132,0.0305,0.098
+DH018,384.0,386.0,0.232,0.0252,0.144
+DH018,386.0,388.0,0.051,0.0076,0.026
+DH018,388.0,390.0,0.07,0.0254,0.082
+DH018,390.0,392.0,0.078,0.0162,0.09
+DH019,0.0,2.0,0.07,0.0155,0.07
+DH019,2.0,4.0,0.175,0.0315,0.177
+DH019,4.0,6.0,0.023,0.017,0.02
+DH019,6.0,8.0,0.076,0.0131,0.038
+DH019,8.0,10.0,0.044,0.0097,0.047
+DH019,10.0,12.0,0.046,0.0183,0.026
+DH019,12.0,14.0,0.142,0.0273,0.173
+DH019,14.0,16.0,0.127,0.0364,0.157
+DH019,16.0,18.0,0.027,0.0141,0.016
+DH019,18.0,20.0,0.056,0.0412,0.058
+DH019,20.0,22.0,0.086,0.0321,0.067
+DH019,22.0,24.0,0.091,0.0287,0.078
+DH019,24.0,26.0,0.069,0.0277,0.035
+DH019,26.0,28.0,0.198,0.0083,0.161
+DH019,28.0,30.0,0.13,0.0282,0.116
+DH019,30.0,32.0,0.104,0.0266,0.135
+DH019,32.0,34.0,0.054,0.0201,0.044
+DH019,34.0,36.0,0.041,0.0166,0.057
+DH019,36.0,38.0,0.105,0.0182,0.149
+DH019,38.0,40.0,0.174,0.014,0.098
+DH019,40.0,42.0,0.032,0.0128,0.029
+DH019,42.0,44.0,0.099,0.0247,0.128
+DH019,44.0,46.0,0.287,0.0126,0.388
+DH019,46.0,48.0,0.044,0.0129,0.03
+DH019,48.0,50.0,0.087,0.0343,0.084
+DH019,50.0,52.0,0.111,0.0534,0.13
+DH019,52.0,54.0,0.031,0.031,0.045
+DH019,54.0,56.0,0.052,0.0238,0.073
+DH019,56.0,58.0,0.073,0.0101,0.046
+DH019,58.0,60.0,0.15,0.0185,0.202
+DH019,60.0,62.0,0.039,0.0122,0.045
+DH019,62.0,64.0,0.101,0.0123,0.15
+DH019,64.0,66.0,0.106,0.0117,0.111
+DH019,66.0,68.0,0.052,0.0112,0.053
+DH019,68.0,70.0,0.338,0.0266,0.214
+DH019,70.0,72.0,0.102,0.0076,0.109
+DH019,72.0,74.0,0.018,0.0435,0.025
+DH019,74.0,76.0,0.104,0.0196,0.153
+DH019,76.0,78.0,0.072,0.0449,0.074
+DH019,78.0,80.0,0.058,0.0076,0.042
+DH019,80.0,82.0,2.046,0.0547,3.662
+DH019,82.0,84.0,0.48,0.2008,1.0
+DH019,84.0,86.0,1.217,0.4155,1.839
+DH019,86.0,88.0,7.963,0.1677,19.16
+DH019,88.0,90.0,1.13,0.1083,2.911
+DH019,90.0,92.0,1.728,0.0564,2.639
+DH019,92.0,94.0,0.226,0.2539,0.624
+DH019,94.0,96.0,1.408,0.3619,2.872
+DH019,96.0,98.0,0.61,0.1978,1.366
+DH019,98.0,100.0,0.784,0.1259,1.73
+DH019,100.0,102.0,1.239,1.3491,3.084
+DH019,102.0,104.0,0.662,0.1664,1.185
+DH019,104.0,106.0,5.813,0.0601,10.629
+DH019,106.0,108.0,1.094,0.3853,2.459
+DH019,108.0,110.0,11.666,0.3409,17.841
+DH019,110.0,112.0,5.775,0.0893,14.951
+DH019,112.0,114.0,3.758,0.0998,7.075
+DH019,114.0,116.0,2.569,0.2721,6.481
+DH019,116.0,118.0,6.041,0.2608,16.464
+DH019,118.0,120.0,2.533,0.1385,6.213
+DH019,120.0,122.0,51.512,0.2581,92.2
+DH019,122.0,124.0,0.954,0.5046,2.257
+DH019,124.0,126.0,5.589,0.265,12.077
+DH019,126.0,128.0,10.237,0.2798,29.18
+DH019,128.0,130.0,6.511,0.1083,11.259
+DH019,130.0,132.0,2.088,0.0554,3.789
+DH019,132.0,134.0,0.701,0.153,1.332
+DH019,134.0,136.0,2.333,0.1695,3.954
+DH019,136.0,138.0,2.072,0.156,6.109
+DH019,138.0,140.0,8.148,0.0414,12.44
+DH019,140.0,142.0,1.268,0.3119,2.259
+DH019,142.0,144.0,1.222,0.2056,2.963
+DH019,144.0,146.0,3.316,0.0866,8.876
+DH019,146.0,148.0,6.445,0.0854,9.705
+DH019,148.0,150.0,2.201,0.1639,4.934
+DH019,150.0,152.0,1.356,0.3198,3.891
+DH019,152.0,154.0,4.193,0.4478,8.201
+DH019,154.0,156.0,2.084,0.109,5.061
+DH019,156.0,158.0,7.723,0.1432,21.405
+DH019,158.0,160.0,18.512,0.1175,35.401
+DH019,160.0,162.0,15.944,0.1992,42.812
+DH019,162.0,164.0,0.51,0.0603,1.361
+DH019,164.0,166.0,3.44,0.2849,7.203
+DH019,166.0,168.0,2.28,0.0513,5.684
+DH019,168.0,170.0,2.701,1.0821,5.068
+DH019,170.0,172.0,0.718,0.2143,1.292
+DH019,172.0,174.0,3.75,0.228,6.951
+DH019,174.0,176.0,0.313,0.2754,0.86
+DH019,176.0,178.0,2.448,0.4277,5.449
+DH019,178.0,180.0,3.065,0.1163,8.718
+DH019,180.0,182.0,9.473,0.3409,25.518
+DH019,182.0,184.0,1.278,0.1898,3.133
+DH019,184.0,186.0,2.093,0.568,6.257
+DH019,186.0,188.0,2.309,0.2094,5.021
+DH019,188.0,190.0,4.983,0.125,14.206
+DH019,190.0,192.0,20.461,0.5006,52.054
+DH019,192.0,194.0,3.515,0.1956,7.201
+DH019,194.0,196.0,5.828,0.1225,14.131
+DH019,196.0,198.0,4.394,0.2134,10.438
+DH019,198.0,200.0,3.722,0.1799,9.95
+DH019,200.0,202.0,3.781,0.1372,6.595
+DH019,202.0,204.0,1.224,0.1578,2.152
+DH019,204.0,206.0,8.647,0.1783,20.681
+DH019,206.0,208.0,18.919,0.1236,49.647
+DH019,208.0,210.0,1.672,0.5146,4.755
+DH019,210.0,212.0,0.787,0.1393,1.951
+DH019,212.0,214.0,10.555,0.2536,26.847
+DH019,214.0,216.0,4.027,0.1742,10.372
+DH019,216.0,218.0,4.366,0.4301,11.068
+DH019,218.0,220.0,1.626,0.2567,4.773
+DH019,220.0,222.0,1.404,0.09,2.443
+DH019,222.0,224.0,1.667,0.379,4.607
+DH019,224.0,226.0,0.437,0.1384,1.021
+DH019,226.0,228.0,5.776,0.1462,10.521
+DH019,228.0,230.0,0.409,0.3285,1.085
+DH019,230.0,232.0,1.015,0.1813,1.634
+DH019,232.0,234.0,0.666,0.1138,1.336
+DH019,234.0,236.0,2.437,0.3813,4.358
+DH019,236.0,238.0,2.133,0.1689,3.758
+DH019,238.0,240.0,8.978,0.5312,26.052
+DH019,240.0,242.0,10.654,0.1676,22.745
+DH019,242.0,244.0,1.816,0.4338,4.57
+DH019,244.0,245.0,1.638,0.4361,3.1
+DH020,0.0,2.0,0.058,0.0129,0.053
+DH020,2.0,4.0,0.078,0.0092,0.073
+DH020,4.0,6.0,0.062,0.0406,0.091
+DH020,6.0,8.0,0.074,0.0129,0.041
+DH020,8.0,10.0,0.061,0.0444,0.057
+DH020,10.0,12.0,0.051,0.0073,0.037
+DH020,12.0,14.0,0.059,0.0133,0.083
+DH020,14.0,16.0,0.021,0.0175,0.029
+DH020,16.0,18.0,0.064,0.0306,0.04
+DH020,18.0,20.0,0.026,0.0123,0.038
+DH020,20.0,22.0,0.09,0.01,0.062
+DH020,22.0,24.0,0.084,0.0172,0.091
+DH020,24.0,26.0,0.081,0.0224,0.096
+DH020,26.0,28.0,0.036,0.0135,0.036
+DH020,28.0,30.0,0.12,0.021,0.129
+DH020,30.0,32.0,0.142,0.0093,0.105
+DH020,32.0,34.0,0.059,0.0487,0.065
+DH020,34.0,36.0,0.063,0.0131,0.093
+DH020,36.0,38.0,0.086,0.0199,0.049
+DH020,38.0,40.0,0.142,0.0166,0.149
+DH020,40.0,42.0,0.054,0.024,0.072
+DH020,42.0,44.0,0.108,0.0221,0.123
+DH020,44.0,46.0,0.132,0.0084,0.174
+DH020,46.0,48.0,0.07,0.0089,0.086
+DH020,48.0,50.0,0.066,0.0353,0.042
+DH020,50.0,52.0,0.152,0.0213,0.182
+DH020,52.0,54.0,0.089,0.0264,0.087
+DH020,54.0,56.0,0.076,0.008,0.113
+DH020,56.0,58.0,0.067,0.0057,0.076
+DH020,58.0,60.0,0.117,0.0133,0.08
+DH020,60.0,62.0,0.152,0.0105,0.197
+DH020,62.0,64.0,0.052,0.0194,0.075
+DH020,64.0,66.0,0.168,0.0309,0.21
+DH020,66.0,68.0,0.151,0.0131,0.151
+DH020,68.0,70.0,0.055,0.0122,0.074
+DH020,70.0,72.0,0.046,0.0145,0.061
+DH020,72.0,74.0,0.23,0.0077,0.341
+DH020,74.0,76.0,0.051,0.0269,0.065
+DH020,76.0,78.0,0.053,0.0262,0.059
+DH020,78.0,80.0,0.081,0.0122,0.103
+DH020,80.0,82.0,1.682,0.184,4.213
+DH020,82.0,84.0,6.753,0.2725,20.063
+DH020,84.0,86.0,11.063,0.3221,27.838
+DH020,86.0,88.0,7.755,0.3239,17.421
+DH020,88.0,90.0,3.229,0.3899,6.276
+DH020,90.0,92.0,1.976,0.1814,3.016
+DH020,92.0,94.0,4.16,0.5619,7.983
+DH020,94.0,96.0,1.277,0.1718,3.805
+DH020,96.0,98.0,16.337,0.1447,39.5
+DH020,98.0,100.0,3.101,0.2845,7.068
+DH020,100.0,102.0,0.865,0.1028,2.574
+DH020,102.0,104.0,2.552,0.5489,5.21
+DH020,104.0,106.0,1.359,0.3131,2.811
+DH020,106.0,108.0,0.555,0.1924,0.856
+DH020,108.0,110.0,1.223,0.1721,2.782
+DH020,110.0,112.0,28.046,0.0514,59.939
+DH020,112.0,114.0,1.642,0.1337,3.116
+DH020,114.0,116.0,4.957,0.3984,12.23
+DH020,116.0,118.0,8.259,0.6157,18.397
+DH020,118.0,120.0,1.156,0.3314,2.054
+DH020,120.0,122.0,0.836,0.0636,2.287
+DH020,122.0,124.0,2.42,0.2832,4.535
+DH020,124.0,126.0,7.809,0.252,21.039
+DH020,126.0,128.0,3.472,0.0951,7.41
+DH020,128.0,130.0,4.974,0.144,9.962
+DH020,130.0,132.0,2.51,0.1002,6.567
+DH020,132.0,134.0,1.365,0.8866,3.322
+DH020,134.0,136.0,2.616,0.7001,6.82
+DH020,136.0,138.0,1.839,0.1616,3.242
+DH020,138.0,140.0,2.985,0.0792,6.819
+DH020,140.0,142.0,4.134,0.1879,9.668
+DH020,142.0,144.0,7.662,0.4002,22.297
+DH020,144.0,146.0,0.471,0.1042,0.883
+DH020,146.0,148.0,0.453,0.3451,1.054
+DH020,148.0,150.0,5.744,0.1719,11.141
+DH020,150.0,152.0,6.703,0.1433,13.965
+DH020,152.0,154.0,0.346,0.1414,0.885
+DH020,154.0,156.0,0.942,0.4281,2.465
+DH020,156.0,158.0,1.137,0.1945,2.312
+DH020,158.0,160.0,0.547,0.3817,0.971
+DH020,160.0,162.0,0.936,0.1655,2.316
+DH020,162.0,164.0,0.376,0.155,0.909
+DH020,164.0,166.0,4.167,0.1968,6.514
+DH020,166.0,168.0,4.469,0.4139,8.913
+DH020,168.0,170.0,14.037,0.6396,36.035
+DH020,170.0,172.0,0.809,0.0986,2.155
+DH020,172.0,174.0,2.394,0.0542,6.483
+DH020,174.0,176.0,10.433,0.3539,26.708
+DH020,176.0,178.0,0.858,0.2836,1.939
+DH020,178.0,180.0,3.787,0.3611,9.127
+DH020,180.0,182.0,0.572,0.2664,1.092
+DH020,182.0,184.0,1.977,0.4455,4.967
+DH020,184.0,186.0,11.919,0.3136,31.509
+DH020,186.0,188.0,1.643,0.0557,3.81
+DH020,188.0,190.0,1.512,0.3344,2.386
+DH020,190.0,192.0,0.499,0.1066,1.09
+DH020,192.0,194.0,3.154,0.1402,5.967
+DH020,194.0,196.0,8.195,0.4712,15.152
+DH020,196.0,198.0,15.818,0.4833,42.221
+DH020,198.0,200.0,0.533,0.5185,1.514
+DH020,200.0,202.0,0.387,0.1853,1.074
+DH020,202.0,204.0,2.27,0.1232,4.398
+DH020,204.0,206.0,18.663,0.4396,40.979
+DH020,206.0,208.0,2.998,0.6085,5.842
+DH020,208.0,210.0,2.705,0.2807,4.48
+DH020,210.0,212.0,3.263,0.1353,6.867
+DH020,212.0,214.0,0.298,0.0348,0.476
+DH020,214.0,216.0,1.42,0.181,3.853
+DH020,216.0,218.0,11.899,0.3422,28.484
+DH020,218.0,220.0,4.068,0.2842,11.788
+DH020,220.0,222.0,0.476,0.4794,1.154
+DH020,222.0,224.0,1.101,0.2273,2.523
+DH020,224.0,226.0,1.294,0.9719,2.657
+DH020,226.0,228.0,0.977,0.1533,2.284
+DH020,228.0,230.0,5.186,0.1827,10.579
+DH020,230.0,232.0,2.512,0.317,6.499
+DH020,232.0,234.0,2.038,0.1656,3.435
+DH020,234.0,236.0,1.409,1.0931,2.911
+DH020,236.0,238.0,5.278,0.1449,15.273
+DH020,238.0,240.0,0.388,0.1542,1.127
+DH020,240.0,242.0,1.077,0.6068,2.938
+DH020,242.0,244.0,5.269,0.7511,10.935
+DH020,244.0,246.0,7.334,0.3413,19.326
+DH020,246.0,248.0,5.476,0.9723,15.998
+DH020,248.0,250.0,0.704,0.0988,2.099
+DH020,250.0,252.0,0.162,0.014,0.237
+DH020,252.0,254.0,0.055,0.0241,0.035
+DH020,254.0,256.0,0.091,0.0141,0.101
+DH020,256.0,258.0,0.101,0.0246,0.14
+DH020,258.0,260.0,0.112,0.023,0.125
+DH020,260.0,262.0,0.103,0.0272,0.074
+DH020,262.0,264.0,0.105,0.0113,0.088
+DH020,264.0,266.0,0.063,0.0201,0.04
+DH020,266.0,268.0,0.042,0.0104,0.026
+DH020,268.0,270.0,0.013,0.0171,0.014
+DH020,270.0,272.0,0.241,0.0112,0.164
+DH020,272.0,274.0,0.034,0.0095,0.029
+DH020,274.0,276.0,0.072,0.0167,0.101
+DH020,276.0,278.0,0.122,0.0155,0.169
+DH020,278.0,280.0,0.043,0.0094,0.026
+DH020,280.0,282.0,0.121,0.0155,0.102
+DH020,282.0,284.0,0.079,0.0098,0.107
+DH020,284.0,286.0,0.058,0.0258,0.086
+DH020,286.0,288.0,0.046,0.019,0.042
+DH020,288.0,290.0,0.088,0.0219,0.082
+DH020,290.0,292.0,0.114,0.0144,0.145
+DH020,292.0,294.0,0.143,0.0256,0.074
+DH020,294.0,296.0,0.121,0.0258,0.173
+DH020,296.0,298.0,0.08,0.0199,0.12
+DH020,298.0,300.0,0.061,0.0094,0.086
+DH020,300.0,302.0,0.073,0.01,0.076
+DH020,302.0,304.0,0.194,0.0081,0.16
+DH020,304.0,306.0,0.018,0.015,0.02
+DH020,306.0,308.0,0.067,0.0192,0.064
+DH020,308.0,310.0,0.029,0.019,0.019
+DH020,310.0,312.0,0.251,0.0099,0.231
+DH020,312.0,314.0,0.047,0.0109,0.034
+DH020,314.0,316.0,0.083,0.0139,0.049
+DH020,316.0,318.0,0.059,0.0145,0.043
+DH020,318.0,320.0,0.07,0.0153,0.059
+DH020,320.0,322.0,0.09,0.0206,0.083
+DH020,322.0,324.0,0.075,0.0539,0.046
+DH020,324.0,326.0,0.044,0.0116,0.064
+DH020,326.0,328.0,0.155,0.015,0.158
+DH020,328.0,330.0,0.272,0.0182,0.315
+DH020,330.0,332.0,0.112,0.0136,0.136
+DH020,332.0,334.0,0.049,0.0358,0.061
+DH020,334.0,336.0,0.062,0.0106,0.067
+DH020,336.0,338.0,0.064,0.0054,0.075
+DH020,338.0,340.0,0.061,0.0272,0.033
+DH020,340.0,342.0,0.054,0.0146,0.05
+DH020,342.0,344.0,0.2,0.0121,0.234
+DH020,344.0,346.0,0.042,0.0087,0.028
+DH020,346.0,348.0,0.093,0.0348,0.086
+DH020,348.0,350.0,0.346,0.0177,0.353
+DH020,350.0,352.0,0.038,0.0259,0.043
+DH020,352.0,354.0,0.121,0.0104,0.114
+DH020,354.0,356.0,0.093,0.0196,0.098
+DH020,356.0,358.0,0.168,0.0511,0.244
+DH020,358.0,360.0,0.126,0.0043,0.091
+DH020,360.0,362.0,0.027,0.0141,0.02
+DH020,362.0,364.0,0.072,0.0279,0.106
+DH020,364.0,366.0,0.066,0.0142,0.09
+DH020,366.0,368.0,0.106,0.0102,0.071
+DH020,368.0,370.0,0.209,0.0262,0.254
+DH020,370.0,372.0,0.07,0.0163,0.083
+DH020,372.0,374.0,0.029,0.0131,0.018
+DH020,374.0,376.0,0.065,0.0174,0.042
+DH020,376.0,378.0,0.311,0.0184,0.218
+DH020,378.0,380.0,0.057,0.0161,0.079
+DH020,380.0,382.0,0.052,0.0165,0.036
+DH020,382.0,384.0,0.051,0.0183,0.073
+DH020,384.0,386.0,0.05,0.0317,0.025
+DH020,386.0,388.0,0.074,0.0067,0.096
+DH020,388.0,390.0,0.103,0.0438,0.134
+DH020,390.0,392.0,0.161,0.01,0.163
+DH020,392.0,394.0,0.171,0.0118,0.243
+DH020,394.0,396.0,0.127,0.021,0.066
+DH020,396.0,398.0,0.045,0.0445,0.026
+DH020,398.0,400.0,0.101,0.0149,0.101
+DH020,400.0,402.0,0.091,0.0224,0.056
+DH020,402.0,404.0,0.051,0.0088,0.059
+DH020,404.0,406.0,0.029,0.0156,0.019
+DH020,406.0,408.0,0.11,0.0494,0.136
+DH020,408.0,410.0,0.321,0.0163,0.218
+DH020,410.0,412.0,0.035,0.0302,0.035
+DH020,412.0,414.0,0.079,0.007,0.05
+DH020,414.0,416.0,0.136,0.0163,0.111
+DH020,416.0,418.0,0.162,0.0133,0.096
+DH020,418.0,420.0,0.084,0.0188,0.086
+DH020,420.0,422.0,0.086,0.0049,0.098
+DH020,422.0,424.0,0.036,0.0413,0.022
+DH020,424.0,426.0,0.137,0.0163,0.167
+DH020,426.0,428.0,0.055,0.0484,0.031
+DH020,428.0,430.0,0.02,0.0307,0.026
+DH020,430.0,432.0,0.222,0.0308,0.209
+DH020,432.0,434.0,0.085,0.0065,0.054
+DH020,434.0,436.0,0.119,0.0171,0.136
+DH021,0.0,2.0,0.046,0.0111,0.034
+DH021,2.0,4.0,0.253,0.0183,0.26
+DH021,4.0,6.0,0.046,0.0253,0.034
+DH021,6.0,8.0,0.033,0.0231,0.018
+DH021,8.0,10.0,0.113,0.0416,0.111
+DH021,10.0,12.0,0.071,0.0256,0.098
+DH021,12.0,14.0,0.056,0.021,0.032
+DH021,14.0,16.0,0.093,0.0118,0.111
+DH021,16.0,18.0,0.062,0.012,0.051
+DH021,18.0,20.0,0.105,0.0299,0.074
+DH021,20.0,22.0,0.058,0.0398,0.037
+DH021,22.0,24.0,0.084,0.0168,0.067
+DH021,24.0,26.0,0.166,0.032,0.166
+DH021,26.0,28.0,0.049,0.048,0.038
+DH021,28.0,30.0,0.062,0.0373,0.058
+DH021,30.0,32.0,0.191,0.0384,0.165
+DH021,32.0,34.0,0.116,0.0271,0.115
+DH021,34.0,36.0,0.053,0.0375,0.072
+DH021,36.0,38.0,0.039,0.0172,0.039
+DH021,38.0,40.0,0.043,0.0214,0.059
+DH021,40.0,42.0,0.095,0.014,0.072
+DH021,42.0,44.0,0.082,0.0204,0.06
+DH021,44.0,46.0,0.097,0.0091,0.103
+DH021,46.0,48.0,0.091,0.0321,0.066
+DH021,48.0,50.0,0.238,0.0196,0.284
+DH021,50.0,52.0,0.034,0.0227,0.029
+DH021,52.0,54.0,0.079,0.0833,0.051
+DH021,54.0,56.0,0.049,0.0225,0.027
+DH021,56.0,58.0,0.046,0.0524,0.051
+DH021,58.0,60.0,0.101,0.0151,0.092
+DH021,60.0,62.0,0.207,0.0213,0.154
+DH021,62.0,64.0,0.351,0.0201,0.252
+DH021,64.0,66.0,0.158,0.0231,0.13
+DH021,66.0,68.0,0.064,0.0099,0.065
+DH021,68.0,70.0,0.194,0.0132,0.179
+DH021,70.0,72.0,0.171,0.0146,0.157
+DH021,72.0,74.0,0.066,0.0177,0.063
+DH021,74.0,76.0,0.059,0.0206,0.084
+DH021,76.0,78.0,0.164,0.0459,0.218
+DH021,78.0,80.0,0.142,0.017,0.115
+DH021,80.0,82.0,2.274,0.3565,3.996
+DH021,82.0,84.0,4.701,0.2025,12.783
+DH021,84.0,86.0,10.105,0.4512,17.111
+DH021,86.0,88.0,0.818,0.1124,1.308
+DH021,88.0,90.0,3.03,0.3382,7.258
+DH021,90.0,92.0,1.216,0.2711,2.174
+DH021,92.0,94.0,3.746,0.1745,7.494
+DH021,94.0,96.0,2.372,0.3054,6.071
+DH021,96.0,98.0,1.663,0.3244,3.336
+DH021,98.0,100.0,0.304,0.0653,0.652
+DH021,100.0,102.0,0.457,0.1689,1.262
+DH021,102.0,104.0,0.426,0.178,1.263
+DH021,104.0,106.0,3.632,0.1663,6.348
+DH021,106.0,108.0,3.726,0.8664,7.914
+DH021,108.0,110.0,0.897,0.074,2.035
+DH021,110.0,112.0,0.412,0.154,0.665
+DH021,112.0,114.0,8.076,0.1486,23.589
+DH021,114.0,116.0,0.325,0.2479,0.884
+DH021,116.0,118.0,1.335,1.3086,2.215
+DH021,118.0,120.0,1.908,2.8839,3.083
+DH021,120.0,122.0,9.009,0.0655,15.661
+DH021,122.0,124.0,0.442,0.2741,0.75
+DH021,124.0,126.0,1.538,0.5345,4.264
+DH021,126.0,128.0,3.294,0.4302,6.606
+DH021,128.0,130.0,0.907,0.233,2.515
+DH021,130.0,132.0,12.25,0.1877,23.295
+DH021,132.0,134.0,0.781,0.2905,1.202
+DH021,134.0,136.0,1.602,0.207,4.061
+DH021,136.0,138.0,1.131,0.1203,3.327
+DH021,138.0,140.0,0.059,0.1377,0.155
+DH021,140.0,142.0,1.662,0.5843,2.626
+DH021,142.0,144.0,1.136,0.2146,2.543
+DH021,144.0,146.0,1.373,0.2412,2.656
+DH021,146.0,148.0,1.33,0.0994,3.622
+DH021,148.0,150.0,2.394,0.2852,4.816
+DH021,150.0,152.0,5.54,0.4112,8.757
+DH021,152.0,154.0,3.19,0.3715,8.885
+DH021,154.0,156.0,1.55,0.0967,3.775
+DH021,156.0,158.0,18.298,0.9185,46.632
+DH021,158.0,160.0,0.93,0.1722,2.726
+DH021,160.0,162.0,0.475,0.0463,1.237
+DH021,162.0,164.0,3.238,0.321,4.993
+DH021,164.0,166.0,3.892,0.0664,7.959
+DH021,166.0,168.0,2.525,0.0363,5.807
+DH021,168.0,170.0,1.438,0.1751,3.278
+DH021,170.0,172.0,0.674,0.0519,1.905
+DH021,172.0,174.0,1.552,0.0743,2.337
+DH021,174.0,176.0,1.562,0.1543,4.681
+DH021,176.0,178.0,5.05,0.0832,9.586
+DH021,178.0,180.0,0.844,0.1635,1.811
+DH021,180.0,182.0,4.212,0.551,8.875
+DH021,182.0,184.0,3.58,0.0537,5.454
+DH021,184.0,186.0,1.699,0.5939,2.742
+DH021,186.0,188.0,3.058,0.2673,7.35
+DH021,188.0,190.0,1.896,0.4327,4.911
+DH021,190.0,192.0,0.321,0.0359,0.721
+DH021,192.0,194.0,1.348,0.3825,3.654
+DH021,194.0,196.0,0.987,0.1422,2.114
+DH021,196.0,198.0,12.584,0.8651,32.011
+DH021,198.0,200.0,3.311,0.6494,6.339
+DH021,200.0,202.0,1.392,0.2012,3.884
+DH021,202.0,204.0,1.804,0.0913,4.61
+DH021,204.0,206.0,4.273,0.7002,12.571
+DH021,206.0,208.0,21.803,0.0634,60.466
+DH021,208.0,210.0,1.057,0.6352,1.885
+DH021,210.0,212.0,1.661,0.1184,3.628
+DH021,212.0,214.0,8.664,0.4227,20.704
+DH021,214.0,216.0,3.583,0.027,7.108
+DH021,216.0,218.0,3.888,0.166,6.228
+DH021,218.0,220.0,0.592,0.4762,1.479
+DH021,220.0,222.0,4.061,0.1344,10.743
+DH021,222.0,224.0,0.447,0.2011,1.251
+DH021,224.0,226.0,0.339,0.1724,0.619
+DH021,226.0,228.0,0.256,0.0825,0.547
+DH021,228.0,230.0,18.603,0.2623,46.62
+DH021,230.0,232.0,1.484,0.1483,3.074
+DH021,232.0,234.0,1.01,0.3983,1.651
+DH021,234.0,236.0,6.475,0.2303,12.262
+DH021,236.0,237.0,0.31,0.1019,0.512
+DH022,0.0,2.0,0.072,0.0211,0.043
+DH022,2.0,4.0,0.081,0.0092,0.083
+DH022,4.0,6.0,0.103,0.0215,0.139
+DH022,6.0,8.0,0.067,0.024,0.043
+DH022,8.0,10.0,0.069,0.0474,0.089
+DH022,10.0,12.0,0.157,0.0103,0.184
+DH022,12.0,14.0,0.126,0.0142,0.089
+DH022,14.0,16.0,0.025,0.0135,0.029
+DH022,16.0,18.0,0.043,0.0192,0.031
+DH022,18.0,20.0,0.071,0.0103,0.072
+DH022,20.0,22.0,0.061,0.0101,0.086
+DH022,22.0,24.0,0.047,0.0095,0.027
+DH022,24.0,26.0,0.066,0.0061,0.072
+DH022,26.0,28.0,0.142,0.0125,0.121
+DH022,28.0,30.0,0.049,0.0236,0.045
+DH022,30.0,32.0,0.108,0.0092,0.114
+DH022,32.0,34.0,0.166,0.0122,0.138
+DH022,34.0,36.0,0.063,0.0197,0.095
+DH022,36.0,38.0,0.057,0.0118,0.046
+DH022,38.0,40.0,0.087,0.0231,0.1
+DH022,40.0,42.0,0.047,0.0201,0.045
+DH022,42.0,44.0,0.157,0.0173,0.153
+DH022,44.0,46.0,0.108,0.0176,0.078
+DH022,46.0,48.0,0.043,0.0311,0.044
+DH022,48.0,50.0,0.03,0.0218,0.028
+DH022,50.0,52.0,0.049,0.0103,0.065
+DH022,52.0,54.0,0.025,0.012,0.019
+DH022,54.0,56.0,0.212,0.0242,0.149
+DH022,56.0,58.0,0.205,0.0093,0.157
+DH022,58.0,60.0,0.11,0.0118,0.136
+DH022,60.0,62.0,0.06,0.0259,0.079
+DH022,62.0,64.0,0.1,0.0149,0.071
+DH022,64.0,66.0,0.08,0.0342,0.074
+DH022,66.0,68.0,0.076,0.0272,0.073
+DH022,68.0,70.0,0.109,0.0058,0.06
+DH022,70.0,72.0,0.188,0.0098,0.253
+DH022,72.0,74.0,0.125,0.0127,0.153
+DH022,74.0,76.0,0.058,0.0518,0.035
+DH022,76.0,78.0,0.051,0.0111,0.041
+DH022,78.0,80.0,0.071,0.0134,0.068
+DH022,80.0,82.0,4.461,0.1069,7.903
+DH022,82.0,84.0,8.933,0.2261,26.323
+DH022,84.0,86.0,0.262,0.0914,0.711
+DH022,86.0,88.0,0.191,0.0926,0.453
+DH022,88.0,90.0,1.277,0.8644,2.473
+DH022,90.0,92.0,1.82,0.3353,3.519
+DH022,92.0,94.0,3.597,0.2793,9.493
+DH022,94.0,96.0,61.544,0.4625,149.711
+DH022,96.0,98.0,3.47,0.1184,8.699
+DH022,98.0,100.0,0.427,0.092,0.833
+DH022,100.0,102.0,7.368,0.3336,16.289
+DH022,102.0,104.0,3.485,0.2561,10.118
+DH022,104.0,106.0,5.904,0.5066,15.538
+DH022,106.0,108.0,1.934,0.797,3.995
+DH022,108.0,110.0,2.437,0.3287,6.028
+DH022,110.0,112.0,0.832,0.3019,1.249
+DH022,112.0,114.0,20.302,0.4193,59.34
+DH022,114.0,116.0,5.338,0.2854,12.634
+DH022,116.0,118.0,1.186,0.2595,1.794
+DH022,118.0,120.0,2.387,0.1099,6.349
+DH022,120.0,122.0,3.675,0.6239,8.961
+DH022,122.0,124.0,1.358,0.4196,3.399
+DH022,124.0,126.0,8.182,0.5306,16.451
+DH022,126.0,128.0,3.497,0.1512,9.253
+DH022,128.0,130.0,3.512,0.1425,9.166
+DH022,130.0,132.0,4.464,0.1093,10.787
+DH022,132.0,134.0,2.501,0.093,6.914
+DH022,134.0,136.0,13.268,0.9608,38.475
+DH022,136.0,138.0,10.839,0.5905,28.036
+DH022,138.0,140.0,3.303,0.3437,5.188
+DH022,140.0,142.0,0.914,0.4007,1.817
+DH022,142.0,144.0,1.737,0.1737,4.419
+DH022,144.0,146.0,1.021,0.0778,1.809
+DH022,146.0,148.0,1.295,0.2264,2.352
+DH022,148.0,150.0,10.3,0.4416,19.573
+DH022,150.0,152.0,0.54,0.1691,1.558
+DH022,152.0,154.0,2.791,0.2435,8.01
+DH022,154.0,156.0,5.532,0.2158,12.736
+DH022,156.0,158.0,0.681,1.7213,1.807
+DH022,158.0,160.0,2.841,0.351,4.51
+DH022,160.0,162.0,2.247,0.2224,4.609
+DH022,162.0,164.0,3.767,0.0596,7.457
+DH022,164.0,166.0,5.764,0.3721,13.98
+DH022,166.0,168.0,0.86,0.6781,2.573
+DH022,168.0,170.0,5.443,0.5129,11.153
+DH022,170.0,172.0,7.724,0.3396,20.674
+DH022,172.0,174.0,7.346,0.0925,11.446
+DH022,174.0,176.0,0.483,0.487,0.727
+DH022,176.0,178.0,2.512,0.2204,6.753
+DH022,178.0,180.0,0.995,0.1358,2.418
+DH022,180.0,182.0,1.215,0.0939,2.902
+DH022,182.0,184.0,4.919,0.0793,10.315
+DH022,184.0,186.0,20.641,0.1018,55.603
+DH022,186.0,188.0,2.526,0.5349,4.37
+DH022,188.0,190.0,1.326,0.2354,2.498
+DH022,190.0,192.0,1.994,0.0777,3.293
+DH022,192.0,194.0,8.002,0.0968,15.368
+DH022,194.0,196.0,1.699,0.0885,4.122
+DH022,196.0,198.0,0.995,0.1678,2.399
+DH022,198.0,200.0,2.752,0.5657,7.926
+DH022,200.0,202.0,1.912,0.0512,5.209
+DH022,202.0,204.0,2.653,0.3133,7.892
+DH022,204.0,206.0,0.827,0.0224,2.108
+DH022,206.0,208.0,3.988,0.228,7.123
+DH022,208.0,210.0,0.405,0.168,1.062
+DH022,210.0,212.0,4.157,0.1606,11.152
+DH022,212.0,214.0,0.896,0.2754,2.198
+DH022,214.0,216.0,2.836,0.2577,8.064
+DH022,216.0,218.0,0.644,0.1244,1.406
+DH022,218.0,220.0,26.529,0.0758,47.154
+DH022,220.0,222.0,2.504,0.1751,5.376
+DH022,222.0,224.0,1.537,0.185,4.276
+DH022,224.0,226.0,19.548,0.688,58.414
+DH022,226.0,228.0,1.639,0.2,4.317
+DH022,228.0,230.0,2.354,0.251,4.264
+DH022,230.0,232.0,6.848,0.2632,18.014
+DH022,232.0,234.0,0.484,0.2345,0.806
+DH022,234.0,236.0,1.107,0.1422,2.522
+DH022,236.0,238.0,21.239,0.3526,39.073
+DH022,238.0,240.0,4.827,0.5488,7.993
+DH022,240.0,242.0,0.925,0.1179,2.037
+DH022,242.0,244.0,2.216,0.2661,5.042
+DH022,244.0,246.0,1.088,0.816,1.952
+DH022,246.0,248.0,5.072,0.3394,8.431
+DH022,248.0,250.0,0.821,0.1313,2.053
+DH022,250.0,252.0,0.066,0.0175,0.089
+DH022,252.0,254.0,0.331,0.019,0.432
+DH022,254.0,256.0,0.059,0.0132,0.078
+DH022,256.0,258.0,0.026,0.0211,0.022
+DH022,258.0,260.0,0.064,0.0133,0.043
+DH022,260.0,262.0,0.084,0.0051,0.118
+DH022,262.0,264.0,0.078,0.0093,0.113
+DH022,264.0,266.0,0.057,0.0163,0.032
+DH022,266.0,268.0,0.078,0.0352,0.117
+DH022,268.0,270.0,0.128,0.0316,0.092
+DH022,270.0,272.0,0.095,0.0402,0.078
+DH022,272.0,274.0,0.089,0.0218,0.1
+DH022,274.0,276.0,0.098,0.0085,0.083
+DH022,276.0,278.0,0.092,0.0105,0.104
+DH022,278.0,280.0,0.089,0.0201,0.073
+DH022,280.0,282.0,0.141,0.0175,0.145
+DH022,282.0,284.0,0.04,0.0168,0.023
+DH022,284.0,286.0,0.147,0.0123,0.081
+DH022,286.0,288.0,0.045,0.0132,0.05
+DH022,288.0,290.0,0.076,0.0251,0.091
+DH022,290.0,292.0,0.078,0.0164,0.046
+DH022,292.0,294.0,0.057,0.0137,0.06
+DH022,294.0,296.0,0.041,0.0239,0.037
+DH022,296.0,298.0,0.085,0.0346,0.105
+DH022,298.0,300.0,0.031,0.0253,0.025
+DH022,300.0,302.0,0.062,0.0216,0.091
+DH022,302.0,304.0,0.197,0.0237,0.238
+DH022,304.0,305.0,0.058,0.0078,0.031
+DH023,0.0,2.0,0.061,0.0094,0.057
+DH023,2.0,4.0,0.177,0.0181,0.158
+DH023,4.0,6.0,0.107,0.0181,0.088
+DH023,6.0,8.0,0.055,0.0158,0.07
+DH023,8.0,10.0,0.083,0.0203,0.047
+DH023,10.0,12.0,0.122,0.0183,0.09
+DH023,12.0,14.0,0.065,0.0215,0.065
+DH023,14.0,16.0,0.092,0.0177,0.057
+DH023,16.0,18.0,0.205,0.0103,0.133
+DH023,18.0,20.0,0.062,0.0167,0.068
+DH023,20.0,22.0,0.184,0.0159,0.22
+DH023,22.0,24.0,0.174,0.0142,0.09
+DH023,24.0,26.0,0.136,0.0232,0.168
+DH023,26.0,28.0,0.125,0.0174,0.101
+DH023,28.0,30.0,0.077,0.0082,0.044
+DH023,30.0,32.0,0.036,0.0159,0.044
+DH023,32.0,34.0,0.132,0.0313,0.198
+DH023,34.0,36.0,0.196,0.0294,0.228
+DH023,36.0,38.0,0.042,0.0089,0.043
+DH023,38.0,40.0,0.053,0.0334,0.069
+DH023,40.0,42.0,0.048,0.0206,0.047
+DH023,42.0,44.0,0.083,0.03,0.104
+DH023,44.0,46.0,0.088,0.0203,0.12
+DH023,46.0,48.0,0.104,0.0198,0.058
+DH023,48.0,50.0,0.118,0.0166,0.082
+DH023,50.0,52.0,0.069,0.0207,0.096
+DH023,52.0,54.0,0.108,0.0152,0.131
+DH023,54.0,56.0,0.275,0.0284,0.335
+DH023,56.0,58.0,0.033,0.009,0.017
+DH023,58.0,60.0,0.084,0.0166,0.103
+DH023,60.0,62.0,0.164,0.0538,0.158
+DH023,62.0,64.0,0.157,0.0205,0.175
+DH023,64.0,66.0,0.086,0.0525,0.068
+DH023,66.0,68.0,0.062,0.0319,0.052
+DH023,68.0,70.0,0.049,0.0161,0.041
+DH023,70.0,72.0,0.086,0.0318,0.112
+DH023,72.0,74.0,0.158,0.0193,0.177
+DH023,74.0,76.0,0.099,0.0174,0.067
+DH023,76.0,78.0,0.067,0.0075,0.077
+DH023,78.0,80.0,0.07,0.0083,0.062
+DH023,80.0,82.0,0.186,0.169,0.32
+DH023,82.0,84.0,2.5,0.1606,6.594
+DH023,84.0,86.0,0.869,0.2251,2.121
+DH023,86.0,88.0,0.756,0.2764,1.851
+DH023,88.0,90.0,1.823,1.5478,3.642
+DH023,90.0,92.0,1.6,0.1785,2.533
+DH023,92.0,94.0,0.694,0.3862,1.559
+DH023,94.0,96.0,1.126,0.1451,2.268
+DH023,96.0,98.0,0.272,0.1541,0.703
+DH023,98.0,100.0,2.819,0.7776,7.284
+DH023,100.0,102.0,4.174,1.0061,6.341
+DH023,102.0,104.0,2.401,0.2211,5.796
+DH023,104.0,106.0,2.232,0.1328,3.925
+DH023,106.0,108.0,0.836,0.3419,2.385
+DH023,108.0,110.0,1.773,0.3509,5.239
+DH023,110.0,112.0,2.706,0.1541,4.964
+DH023,112.0,114.0,2.683,0.1385,7.487
+DH023,114.0,116.0,10.66,0.1686,27.146
+DH023,116.0,118.0,3.332,0.3752,5.425
+DH023,118.0,120.0,2.279,0.2534,3.503
+DH023,120.0,122.0,3.332,0.3135,8.517
+DH023,122.0,124.0,2.381,0.1161,6.299
+DH023,124.0,126.0,5.499,0.0534,12.033
+DH023,126.0,128.0,6.699,0.7528,11.083
+DH023,128.0,130.0,2.511,0.1621,3.941
+DH023,130.0,132.0,3.211,0.0793,5.665
+DH023,132.0,134.0,1.55,0.1986,4.036
+DH023,134.0,136.0,5.741,0.1598,14.332
+DH023,136.0,138.0,3.124,0.2013,4.876
+DH023,138.0,140.0,0.726,0.073,1.39
+DH023,140.0,142.0,2.392,0.0827,5.553
+DH023,142.0,144.0,2.77,0.1217,5.564
+DH023,144.0,146.0,7.088,0.1346,12.983
+DH023,146.0,148.0,2.303,0.2825,6.094
+DH023,148.0,150.0,0.092,0.0899,0.158
+DH023,150.0,152.0,3.448,0.0533,9.715
+DH023,152.0,154.0,0.579,0.2692,1.195
+DH023,154.0,156.0,5.431,0.5239,13.488
+DH023,156.0,158.0,6.249,0.1686,14.047
+DH023,158.0,160.0,4.252,0.0842,10.682
+DH023,160.0,162.0,6.564,0.4075,15.096
+DH023,162.0,164.0,5.005,0.0421,10.982
+DH023,164.0,166.0,1.743,0.6045,3.561
+DH023,166.0,168.0,3.028,0.1422,7.212
+DH023,168.0,170.0,3.256,0.299,7.624
+DH023,170.0,172.0,2.078,0.1932,5.271
+DH023,172.0,174.0,7.295,0.2517,11.959
+DH023,174.0,176.0,2.532,1.8019,6.155
+DH023,176.0,178.0,0.063,0.2347,0.169
+DH023,178.0,180.0,1.788,0.1544,3.1
+DH023,180.0,182.0,4.317,0.089,12.137
+DH023,182.0,184.0,2.081,0.1056,5.055
+DH023,184.0,186.0,0.348,0.1431,1.013
+DH023,186.0,188.0,29.158,0.129,87.221
+DH023,188.0,190.0,1.107,0.3212,1.946
+DH023,190.0,192.0,34.187,0.6876,97.273
+DH023,192.0,194.0,0.764,0.8181,1.767
+DH023,194.0,196.0,1.01,0.1598,1.805
+DH023,196.0,198.0,1.274,0.1852,2.258
+DH023,198.0,200.0,1.397,0.0809,3.914
+DH023,200.0,202.0,2.862,0.2365,7.655
+DH023,202.0,204.0,1.27,0.3045,2.52
+DH023,204.0,206.0,0.873,0.2396,1.555
+DH023,206.0,208.0,0.877,0.2204,2.306
+DH023,208.0,210.0,0.461,0.2553,1.221
+DH023,210.0,212.0,4.332,0.0863,8.943
+DH023,212.0,214.0,11.682,1.1759,27.898
+DH023,214.0,216.0,0.542,0.3201,1.342
+DH023,216.0,218.0,3.129,0.1203,8.102
+DH023,218.0,220.0,1.472,0.3978,3.641
+DH023,220.0,222.0,3.609,0.2653,9.643
+DH023,222.0,224.0,4.201,0.1791,10.274
+DH023,224.0,226.0,18.028,0.25,27.112
+DH023,226.0,227.0,2.518,0.1874,4.892
+DH024,0.0,2.0,0.093,0.0142,0.048
+DH024,2.0,4.0,0.051,0.0193,0.059
+DH024,4.0,6.0,0.072,0.0067,0.069
+DH024,6.0,8.0,0.088,0.0111,0.054
+DH024,8.0,10.0,0.035,0.0309,0.036
+DH024,10.0,12.0,0.021,0.02,0.022
+DH024,12.0,14.0,0.059,0.0127,0.067
+DH024,14.0,16.0,0.061,0.0072,0.06
+DH024,16.0,18.0,0.071,0.0127,0.078
+DH024,18.0,20.0,0.13,0.0096,0.101
+DH024,20.0,22.0,0.058,0.0141,0.07
+DH024,22.0,24.0,0.057,0.0184,0.041
+DH024,24.0,26.0,0.113,0.0124,0.072
+DH024,26.0,28.0,0.14,0.008,0.087
+DH024,28.0,30.0,0.046,0.0108,0.059
+DH024,30.0,32.0,0.059,0.01,0.044
+DH024,32.0,34.0,0.143,0.007,0.102
+DH024,34.0,36.0,0.117,0.0159,0.129
+DH024,36.0,38.0,0.119,0.0213,0.127
+DH024,38.0,40.0,0.11,0.0097,0.15
+DH024,40.0,42.0,0.106,0.0121,0.139
+DH024,42.0,44.0,0.315,0.0164,0.214
+DH024,44.0,46.0,0.063,0.0191,0.045
+DH024,46.0,48.0,0.082,0.0187,0.081
+DH024,48.0,50.0,0.028,0.0159,0.04
+DH024,50.0,52.0,0.071,0.0168,0.052
+DH024,52.0,54.0,0.047,0.0074,0.027
+DH024,54.0,56.0,0.045,0.0194,0.049
+DH024,56.0,58.0,0.062,0.0146,0.062
+DH024,58.0,60.0,0.06,0.0108,0.03
+DH024,60.0,62.0,0.156,0.0195,0.187
+DH024,62.0,64.0,0.076,0.0066,0.077
+DH024,64.0,66.0,0.065,0.0115,0.045
+DH024,66.0,68.0,0.064,0.0301,0.092
+DH024,68.0,70.0,0.047,0.0141,0.031
+DH024,70.0,72.0,0.133,0.0197,0.154
+DH024,72.0,74.0,0.113,0.0136,0.12
+DH024,74.0,76.0,0.082,0.0119,0.066
+DH024,76.0,78.0,0.172,0.0148,0.179
+DH024,78.0,80.0,0.056,0.0125,0.046
+DH024,80.0,82.0,0.78,0.4309,1.808
+DH024,82.0,84.0,0.78,0.2107,2.162
+DH024,84.0,86.0,3.383,1.0103,7.056
+DH024,86.0,88.0,4.223,0.2275,10.316
+DH024,88.0,90.0,1.825,0.1124,3.859
+DH024,90.0,92.0,1.574,0.1082,3.791
+DH024,92.0,94.0,2.506,0.1859,5.036
+DH024,94.0,96.0,0.246,0.6177,0.498
+DH024,96.0,98.0,2.869,0.1394,5.817
+DH024,98.0,100.0,10.769,0.9851,27.126
+DH024,100.0,102.0,3.329,0.2335,6.238
+DH024,102.0,104.0,0.176,0.3017,0.376
+DH024,104.0,106.0,0.132,0.1672,0.29
+DH024,106.0,108.0,1.013,0.42,2.436
+DH024,108.0,110.0,2.192,0.2457,4.37
+DH024,110.0,112.0,0.942,0.461,2.126
+DH024,112.0,114.0,3.458,0.2482,9.707
+DH024,114.0,116.0,1.328,0.806,3.25
+DH024,116.0,118.0,16.997,0.0837,36.264
+DH024,118.0,120.0,1.388,0.2495,3.617
+DH024,120.0,122.0,3.506,0.5923,6.086
+DH024,122.0,124.0,0.829,0.226,2.028
+DH024,124.0,126.0,1.781,0.1036,4.936
+DH024,126.0,128.0,1.44,0.6983,2.433
+DH024,128.0,130.0,4.846,0.3486,13.042
+DH024,130.0,132.0,3.458,1.0436,6.616
+DH024,132.0,134.0,6.564,0.3885,17.506
+DH024,134.0,136.0,2.784,0.3457,8.099
+DH024,136.0,138.0,0.439,0.2719,0.839
+DH024,138.0,140.0,1.391,0.6292,2.785
+DH024,140.0,142.0,0.417,0.4217,0.901
+DH024,142.0,144.0,0.22,0.4614,0.333
+DH024,144.0,146.0,3.925,0.1566,8.77
+DH024,146.0,148.0,0.536,0.1795,1.065
+DH024,148.0,150.0,3.217,0.1541,9.144
+DH024,150.0,152.0,2.681,0.3041,4.795
+DH024,152.0,154.0,1.473,0.2585,3.891
+DH024,154.0,156.0,0.121,0.3743,0.229
+DH024,156.0,158.0,4.379,0.0797,11.365
+DH024,158.0,160.0,0.601,0.4048,1.76
+DH024,160.0,162.0,0.73,0.3421,1.864
+DH024,162.0,164.0,0.73,0.4609,1.17
+DH024,164.0,166.0,5.294,0.44,15.02
+DH024,166.0,168.0,1.741,0.1329,2.98
+DH024,168.0,170.0,1.181,0.1578,2.094
+DH024,170.0,172.0,9.221,0.3069,17.056
+DH024,172.0,174.0,0.954,0.0513,1.884
+DH024,174.0,176.0,0.881,0.1793,1.48
+DH024,176.0,178.0,0.757,0.0671,1.471
+DH024,178.0,180.0,1.386,0.2398,2.705
+DH024,180.0,182.0,5.014,0.0609,9.713
+DH024,182.0,184.0,2.545,0.2063,6.686
+DH024,184.0,186.0,2.845,0.1283,6.554
+DH024,186.0,188.0,9.214,0.1271,23.082
+DH024,188.0,190.0,2.067,0.0903,3.832
+DH024,190.0,192.0,1.472,0.711,2.769
+DH024,192.0,194.0,2.757,0.0406,6.851
+DH024,194.0,196.0,2.489,0.1311,4.699
+DH024,196.0,198.0,2.73,0.0956,5.725
+DH024,198.0,200.0,9.361,0.1859,15.377
+DH024,200.0,202.0,1.798,0.4421,2.958
+DH024,202.0,204.0,4.456,0.1297,11.022
+DH024,204.0,206.0,1.131,0.1418,2.109
+DH024,206.0,208.0,0.41,0.329,1.227
+DH024,208.0,210.0,5.066,0.0769,10.211
+DH024,210.0,212.0,0.903,0.2532,1.586
+DH024,212.0,214.0,0.484,0.111,1.338
+DH024,214.0,216.0,1.792,1.0917,3.609
+DH024,216.0,218.0,0.689,0.0901,1.976
+DH024,218.0,220.0,2.118,0.1089,3.647
+DH024,220.0,222.0,0.861,0.2827,1.593
+DH024,222.0,224.0,4.31,0.2071,9.087
+DH024,224.0,226.0,0.444,0.4013,0.951
+DH024,226.0,228.0,1.272,0.589,2.153
+DH024,228.0,230.0,5.639,0.2828,13.558
+DH024,230.0,232.0,1.843,0.1039,3.509
+DH024,232.0,234.0,6.113,0.1486,13.471
+DH024,234.0,236.0,0.607,0.4165,0.925
+DH024,236.0,238.0,0.526,0.1865,0.868
+DH024,238.0,240.0,0.491,0.0947,1.109
+DH024,240.0,242.0,28.789,0.1303,73.859
+DH024,242.0,244.0,3.041,0.1392,5.791
+DH024,244.0,246.0,1.3,0.1676,2.917
+DH024,246.0,248.0,2.161,0.4581,5.29
+DH024,248.0,250.0,8.237,0.355,20.223
+DH024,250.0,252.0,0.056,0.0144,0.034
+DH024,252.0,254.0,0.07,0.0197,0.05
+DH024,254.0,256.0,0.113,0.0119,0.163
+DH024,256.0,258.0,0.073,0.0275,0.084
+DH024,258.0,260.0,0.114,0.0167,0.08
+DH024,260.0,262.0,0.031,0.0408,0.042
+DH024,262.0,264.0,0.132,0.016,0.091
+DH024,264.0,266.0,0.06,0.0162,0.068
+DH024,266.0,268.0,0.108,0.0311,0.148
+DH024,268.0,270.0,0.1,0.0431,0.064
+DH024,270.0,272.0,0.157,0.0227,0.086
+DH024,272.0,274.0,0.092,0.0236,0.057
+DH024,274.0,276.0,0.105,0.0282,0.105
+DH024,276.0,278.0,0.014,0.0424,0.013
+DH024,278.0,280.0,0.05,0.0104,0.034
+DH024,280.0,282.0,0.059,0.0127,0.076
+DH024,282.0,284.0,0.113,0.0505,0.137
+DH024,284.0,286.0,0.161,0.0152,0.12
+DH024,286.0,288.0,0.076,0.0193,0.041
+DH024,288.0,290.0,0.055,0.0148,0.059
+DH024,290.0,292.0,0.158,0.0189,0.117
+DH024,292.0,294.0,0.069,0.0089,0.095
+DH024,294.0,296.0,0.096,0.016,0.062
+DH024,296.0,298.0,0.105,0.0208,0.065
+DH024,298.0,300.0,0.071,0.0225,0.061
+DH024,300.0,302.0,0.07,0.0241,0.047
+DH024,302.0,304.0,0.073,0.0325,0.044
+DH024,304.0,306.0,0.188,0.023,0.257
+DH024,306.0,308.0,0.057,0.053,0.047
+DH024,308.0,310.0,0.183,0.0156,0.175
+DH024,310.0,312.0,0.193,0.0106,0.15
+DH024,312.0,314.0,0.023,0.0168,0.025
+DH024,314.0,316.0,0.072,0.079,0.053
+DH024,316.0,318.0,0.035,0.0242,0.05
+DH024,318.0,320.0,0.067,0.02,0.085
+DH024,320.0,322.0,0.037,0.0109,0.019
+DH024,322.0,324.0,0.087,0.0129,0.069
+DH024,324.0,326.0,0.078,0.0285,0.078
+DH024,326.0,328.0,0.217,0.0129,0.246
+DH024,328.0,330.0,0.066,0.0246,0.045
+DH024,330.0,332.0,0.261,0.0079,0.156
+DH024,332.0,334.0,0.087,0.0241,0.05
+DH024,334.0,336.0,0.137,0.0127,0.147
+DH024,336.0,338.0,0.252,0.0118,0.376
+DH024,338.0,340.0,0.103,0.0147,0.085
+DH024,340.0,342.0,0.072,0.0069,0.084
+DH024,342.0,344.0,0.07,0.0107,0.093
+DH024,344.0,346.0,0.072,0.0133,0.055
+DH024,346.0,348.0,0.102,0.019,0.136
+DH024,348.0,350.0,0.089,0.0179,0.065
+DH024,350.0,352.0,0.069,0.0245,0.055
+DH024,352.0,354.0,0.072,0.0257,0.105
+DH024,354.0,356.0,0.046,0.0162,0.052
+DH024,356.0,358.0,0.091,0.016,0.09
+DH024,358.0,360.0,0.069,0.056,0.038
+DH024,360.0,362.0,0.045,0.0169,0.04
+DH024,362.0,364.0,0.051,0.0673,0.027
+DH024,364.0,366.0,0.108,0.0145,0.108
+DH024,366.0,368.0,0.073,0.0137,0.052
+DH024,368.0,370.0,0.03,0.0103,0.027
+DH024,370.0,372.0,0.185,0.0152,0.099
+DH024,372.0,374.0,0.083,0.035,0.081
+DH024,374.0,376.0,0.128,0.0166,0.088
+DH024,376.0,378.0,0.05,0.0185,0.07
+DH024,378.0,380.0,0.045,0.0097,0.047
+DH024,380.0,382.0,0.089,0.0125,0.114
+DH024,382.0,384.0,0.026,0.0152,0.029
+DH024,384.0,386.0,0.125,0.0175,0.113
+DH024,386.0,388.0,0.05,0.0413,0.074
+DH024,388.0,390.0,0.091,0.0669,0.061
+DH024,390.0,392.0,0.039,0.0128,0.034
+DH024,392.0,394.0,0.329,0.0159,0.31
+DH024,394.0,396.0,0.048,0.0324,0.029
+DH024,396.0,398.0,0.061,0.0072,0.06
+DH024,398.0,400.0,0.231,0.0258,0.117
+DH024,400.0,402.0,0.252,0.0488,0.158
+DH024,402.0,404.0,0.081,0.0137,0.116
+DH024,404.0,406.0,0.034,0.0087,0.05
+DH024,406.0,408.0,0.157,0.0084,0.096
+DH024,408.0,410.0,0.053,0.0437,0.068
+DH024,410.0,412.0,0.032,0.0348,0.047
+DH024,412.0,414.0,0.048,0.0155,0.063
+DH024,414.0,416.0,0.076,0.0193,0.06
+DH024,416.0,418.0,0.028,0.0137,0.029
+DH024,418.0,420.0,0.072,0.0155,0.058
+DH024,420.0,422.0,0.057,0.037,0.083
+DH024,422.0,424.0,0.127,0.0188,0.162
+DH024,424.0,426.0,0.053,0.0154,0.06
+DH024,426.0,428.0,0.06,0.0216,0.063
+DH024,428.0,430.0,0.302,0.021,0.413
+DH024,430.0,431.0,0.165,0.0165,0.202
+DH025,0.0,2.0,0.198,0.0142,0.184
+DH025,2.0,4.0,0.057,0.0183,0.057
+DH025,4.0,6.0,0.16,0.0287,0.101
+DH025,6.0,8.0,0.364,0.0153,0.31
+DH025,8.0,10.0,0.035,0.0383,0.044
+DH025,10.0,12.0,0.09,0.014,0.05
+DH025,12.0,14.0,0.051,0.0232,0.045
+DH025,14.0,16.0,0.107,0.0217,0.097
+DH025,16.0,18.0,0.034,0.0085,0.043
+DH025,18.0,20.0,0.199,0.0358,0.259
+DH025,20.0,22.0,0.083,0.0122,0.049
+DH025,22.0,24.0,0.058,0.0355,0.035
+DH025,24.0,26.0,0.046,0.0156,0.066
+DH025,26.0,28.0,0.058,0.0191,0.04
+DH025,28.0,30.0,0.104,0.0208,0.149
+DH025,30.0,32.0,0.059,0.0104,0.066
+DH025,32.0,34.0,0.077,0.0275,0.048
+DH025,34.0,36.0,0.097,0.0271,0.082
+DH025,36.0,38.0,0.07,0.0417,0.1
+DH025,38.0,40.0,0.027,0.0255,0.021
+DH025,40.0,42.0,0.124,0.013,0.063
+DH025,42.0,44.0,0.059,0.0183,0.054
+DH025,44.0,46.0,0.072,0.0102,0.047
+DH025,46.0,48.0,0.091,0.0082,0.113
+DH025,48.0,50.0,0.074,0.0199,0.086
+DH025,50.0,52.0,0.1,0.0328,0.091
+DH025,52.0,54.0,0.153,0.0195,0.082
+DH025,54.0,56.0,0.105,0.0341,0.139
+DH025,56.0,58.0,0.063,0.0133,0.071
+DH025,58.0,60.0,0.052,0.0108,0.05
+DH025,60.0,62.0,0.032,0.0494,0.021
+DH025,62.0,64.0,0.257,0.0224,0.162
+DH025,64.0,66.0,0.033,0.0184,0.028
+DH025,66.0,68.0,0.209,0.021,0.201
+DH025,68.0,70.0,0.046,0.012,0.032
+DH025,70.0,72.0,0.219,0.0202,0.15
+DH025,72.0,74.0,0.208,0.0112,0.261
+DH025,74.0,76.0,0.108,0.0119,0.074
+DH025,76.0,78.0,0.053,0.0372,0.071
+DH025,78.0,80.0,0.088,0.016,0.117
+DH025,80.0,82.0,2.23,0.1437,4.213
+DH025,82.0,84.0,3.654,0.1613,7.629
+DH025,84.0,86.0,1.781,0.1731,5.087
+DH025,86.0,88.0,5.555,0.0541,12.444
+DH025,88.0,90.0,2.619,0.3635,4.665
+DH025,90.0,92.0,0.952,0.1074,2.3
+DH025,92.0,94.0,1.655,0.3904,4.139
+DH025,94.0,96.0,4.616,0.0336,10.957
+DH025,96.0,98.0,9.03,0.1946,20.966
+DH025,98.0,100.0,1.012,0.0198,2.211
+DH025,100.0,102.0,7.914,0.14,19.622
+DH025,102.0,104.0,0.136,0.0605,0.226
+DH025,104.0,106.0,4.668,0.079,7.805
+DH025,106.0,108.0,2.149,0.0857,6.42
+DH025,108.0,110.0,1.838,0.3528,5.297
+DH025,110.0,112.0,6.362,0.0644,17.944
+DH025,112.0,114.0,1.613,0.2081,2.45
+DH025,114.0,116.0,1.007,0.02,2.575
+DH025,116.0,118.0,3.307,0.0681,8.416
+DH025,118.0,120.0,1.301,0.1596,2.657
+DH025,120.0,122.0,4.239,0.1177,8.513
+DH025,122.0,124.0,8.655,0.1934,21.199
+DH025,124.0,126.0,5.109,0.1308,13.653
+DH025,126.0,128.0,3.212,0.065,9.12
+DH025,128.0,130.0,0.899,0.4424,2.626
+DH025,130.0,132.0,3.66,0.0617,7.192
+DH025,132.0,134.0,7.059,0.087,10.627
+DH025,134.0,136.0,0.138,0.065,0.409
+DH025,136.0,138.0,3.466,0.1681,10.226
+DH025,138.0,140.0,0.606,0.2619,1.504
+DH025,140.0,142.0,14.239,0.1925,26.843
+DH025,142.0,144.0,0.421,0.1672,0.955
+DH025,144.0,146.0,1.423,0.1513,4.042
+DH025,146.0,148.0,13.705,0.2506,33.308
+DH025,148.0,150.0,4.692,0.5313,8.269
+DH025,150.0,152.0,1.736,0.1897,4.098
+DH025,152.0,154.0,5.76,0.2466,15.361
+DH025,154.0,156.0,1.132,0.4531,2.245
+DH025,156.0,158.0,5.018,0.2484,7.835
+DH025,158.0,160.0,0.761,0.2615,2.031
+DH025,160.0,162.0,0.451,0.3262,1.077
+DH025,162.0,164.0,1.332,0.2303,2.13
+DH025,164.0,166.0,2.457,0.2353,5.349
+DH025,166.0,168.0,4.4,0.1211,9.809
+DH025,168.0,170.0,1.952,0.0874,3.048
+DH025,170.0,172.0,8.821,0.1608,14.048
+DH025,172.0,174.0,6.199,0.16,17.184
+DH025,174.0,176.0,6.839,0.2779,16.565
+DH025,176.0,178.0,0.281,0.116,0.796
+DH025,178.0,180.0,33.562,0.9403,90.824
+DH025,180.0,182.0,0.858,0.1298,1.396
+DH025,182.0,184.0,0.869,0.7365,1.525
+DH025,184.0,186.0,1.947,0.4146,5.753
+DH025,186.0,188.0,2.371,0.0928,4.991
+DH025,188.0,190.0,1.101,0.1339,2.7
+DH025,190.0,192.0,2.902,0.1871,4.511
+DH025,192.0,194.0,0.785,0.3849,2.245
+DH025,194.0,196.0,1.246,0.1181,3.35
+DH025,196.0,198.0,21.005,0.2121,45.712
+DH025,198.0,199.0,6.703,0.153,16.681
+DH026,0.0,2.0,0.057,0.0347,0.077
+DH026,2.0,4.0,0.19,0.0108,0.246
+DH026,4.0,6.0,0.19,0.0199,0.115
+DH026,6.0,8.0,0.07,0.0208,0.078
+DH026,8.0,10.0,0.033,0.0081,0.039
+DH026,10.0,12.0,0.134,0.0082,0.09
+DH026,12.0,14.0,0.113,0.0501,0.079
+DH026,14.0,16.0,0.102,0.0361,0.126
+DH026,16.0,18.0,0.062,0.0103,0.05
+DH026,18.0,20.0,0.08,0.02,0.06
+DH026,20.0,22.0,0.072,0.0186,0.093
+DH026,22.0,24.0,0.218,0.0201,0.207
+DH026,24.0,26.0,0.028,0.0258,0.027
+DH026,26.0,28.0,0.138,0.0368,0.202
+DH026,28.0,30.0,0.114,0.035,0.135
+DH026,30.0,32.0,0.023,0.012,0.019
+DH026,32.0,34.0,0.112,0.0225,0.069
+DH026,34.0,36.0,0.069,0.0273,0.062
+DH026,36.0,38.0,0.09,0.0153,0.13
+DH026,38.0,40.0,0.081,0.0188,0.046
+DH026,40.0,42.0,0.125,0.0191,0.108
+DH026,42.0,44.0,0.066,0.0089,0.07
+DH026,44.0,46.0,0.089,0.0235,0.096
+DH026,46.0,48.0,0.24,0.0261,0.24
+DH026,48.0,50.0,0.148,0.0159,0.174
+DH026,50.0,52.0,0.157,0.0106,0.194
+DH026,52.0,54.0,0.057,0.0433,0.065
+DH026,54.0,56.0,0.212,0.0127,0.133
+DH026,56.0,58.0,0.133,0.0255,0.127
+DH026,58.0,60.0,0.061,0.0191,0.089
+DH026,60.0,62.0,0.054,0.0244,0.041
+DH026,62.0,64.0,0.093,0.0191,0.127
+DH026,64.0,66.0,0.07,0.0197,0.072
+DH026,66.0,68.0,0.211,0.0303,0.27
+DH026,68.0,70.0,0.052,0.0121,0.058
+DH026,70.0,72.0,0.045,0.0194,0.041
+DH026,72.0,74.0,0.068,0.0111,0.091
+DH026,74.0,76.0,0.059,0.0128,0.043
+DH026,76.0,78.0,0.082,0.0141,0.052
+DH026,78.0,80.0,0.123,0.0154,0.162
+DH026,80.0,82.0,0.484,0.5695,1.271
+DH026,82.0,84.0,2.101,0.1282,5.831
+DH026,84.0,86.0,0.301,0.1212,0.64
+DH026,86.0,88.0,0.702,0.0647,1.933
+DH026,88.0,90.0,1.402,0.1692,2.654
+DH026,90.0,92.0,7.684,0.6062,12.747
+DH026,92.0,94.0,0.317,0.1125,0.848
+DH026,94.0,96.0,1.291,0.4442,3.697
+DH026,96.0,98.0,14.806,0.5138,38.815
+DH026,98.0,100.0,1.358,0.2064,3.872
+DH026,100.0,102.0,0.365,0.7243,0.638
+DH026,102.0,104.0,1.471,0.6336,3.98
+DH026,104.0,106.0,0.245,0.4995,0.488
+DH026,106.0,108.0,1.76,0.2631,4.718
+DH026,108.0,110.0,6.16,0.3551,17.808
+DH026,110.0,112.0,0.862,0.2824,2.576
+DH026,112.0,114.0,14.506,0.0727,22.248
+DH026,114.0,116.0,0.457,0.1244,0.944
+DH026,116.0,118.0,1.18,0.5573,2.517
+DH026,118.0,120.0,1.277,0.2005,3.584
+DH026,120.0,122.0,6.624,0.0897,19.465
+DH026,122.0,124.0,3.934,0.296,10.795
+DH026,124.0,126.0,5.468,0.1094,15.236
+DH026,126.0,128.0,4.201,0.0902,8.039
+DH026,128.0,130.0,1.155,0.2536,2.638
+DH026,130.0,132.0,0.563,0.0731,1.506
+DH026,132.0,134.0,3.138,0.2428,4.905
+DH026,134.0,136.0,1.059,0.2585,1.787
+DH026,136.0,138.0,1.625,1.7003,3.228
+DH026,138.0,140.0,1.574,0.1468,3.83
+DH026,140.0,142.0,8.024,0.4187,17.125
+DH026,142.0,144.0,0.399,0.0885,0.991
+DH026,144.0,146.0,1.999,0.388,4.185
+DH026,146.0,148.0,7.1,0.2999,15.833
+DH026,148.0,150.0,0.181,0.0831,0.509
+DH026,150.0,152.0,2.197,0.5292,6.569
+DH026,152.0,154.0,1.827,0.1368,4.416
+DH026,154.0,156.0,6.273,0.1437,18.749
+DH026,156.0,158.0,0.916,1.2023,2.36
+DH026,158.0,160.0,0.648,0.2687,1.416
+DH026,160.0,162.0,1.698,0.4362,4.95
+DH026,162.0,163.0,4.552,0.2202,8.296
+DH027,0.0,2.0,0.078,0.02,0.106
+DH027,2.0,4.0,0.091,0.0175,0.113
+DH027,4.0,6.0,0.067,0.0157,0.049
+DH027,6.0,8.0,0.094,0.0307,0.118
+DH027,8.0,10.0,0.027,0.0256,0.035
+DH027,10.0,12.0,0.067,0.0108,0.059
+DH027,12.0,14.0,0.156,0.0292,0.226
+DH027,14.0,16.0,0.231,0.0066,0.144
+DH027,16.0,18.0,0.028,0.0251,0.04
+DH027,18.0,20.0,0.061,0.0164,0.049
+DH027,20.0,22.0,0.034,0.0098,0.038
+DH027,22.0,24.0,0.169,0.0181,0.24
+DH027,24.0,26.0,0.023,0.0295,0.024
+DH027,26.0,28.0,0.041,0.0078,0.034
+DH027,28.0,30.0,0.046,0.0163,0.031
+DH027,30.0,32.0,0.092,0.0162,0.112
+DH027,32.0,34.0,0.03,0.0199,0.03
+DH027,34.0,36.0,0.044,0.0192,0.036
+DH027,36.0,38.0,0.087,0.0366,0.053
+DH027,38.0,40.0,0.05,0.0383,0.041
+DH027,40.0,42.0,0.114,0.0339,0.084
+DH027,42.0,44.0,0.132,0.0312,0.107
+DH027,44.0,46.0,0.398,0.0202,0.248
+DH027,46.0,48.0,0.103,0.0128,0.1
+DH027,48.0,50.0,0.114,0.0136,0.08
+DH027,50.0,52.0,0.144,0.0121,0.128
+DH027,52.0,54.0,0.112,0.0153,0.128
+DH027,54.0,56.0,0.084,0.0107,0.049
+DH027,56.0,58.0,0.095,0.0068,0.112
+DH027,58.0,60.0,0.028,0.008,0.033
+DH027,60.0,62.0,0.072,0.0161,0.08
+DH027,62.0,64.0,0.055,0.0221,0.07
+DH027,64.0,66.0,0.134,0.0297,0.136
+DH027,66.0,68.0,0.027,0.0125,0.031
+DH027,68.0,70.0,0.052,0.0108,0.058
+DH027,70.0,72.0,0.353,0.0143,0.485
+DH027,72.0,74.0,0.037,0.0341,0.025
+DH027,74.0,76.0,0.133,0.0361,0.136
+DH027,76.0,78.0,0.068,0.0431,0.054
+DH027,78.0,80.0,0.022,0.023,0.02
+DH027,80.0,82.0,6.539,0.3093,14.283
+DH027,82.0,84.0,3.073,0.2641,6.05
+DH027,84.0,86.0,4.44,0.7384,11.069
+DH027,86.0,88.0,2.288,0.559,4.638
+DH027,88.0,90.0,6.673,0.2631,16.077
+DH027,90.0,92.0,3.026,0.2265,6.214
+DH027,92.0,94.0,0.906,0.5621,1.578
+DH027,94.0,96.0,0.377,0.1919,1.122
+DH027,96.0,98.0,4.451,0.24,12.281
+DH027,98.0,100.0,13.003,0.5337,24.111
+DH027,100.0,102.0,2.958,0.2168,6.388
+DH027,102.0,104.0,1.113,0.2476,2.734
+DH027,104.0,106.0,0.385,0.2471,0.606
+DH027,106.0,108.0,1.664,0.2985,4.007
+DH027,108.0,110.0,0.804,0.1705,1.344
+DH027,110.0,112.0,0.822,0.1387,1.26
+DH027,112.0,114.0,4.495,0.2883,10.85
+DH027,114.0,116.0,10.517,0.475,26.868
+DH027,116.0,118.0,9.669,0.2898,21.99
+DH027,118.0,120.0,3.42,0.2186,9.431
+DH027,120.0,122.0,2.786,0.1703,8.345
+DH027,122.0,124.0,4.19,0.1655,11.602
+DH027,124.0,126.0,3.967,0.169,7.986
+DH027,126.0,128.0,2.846,0.2543,4.307
+DH027,128.0,130.0,16.781,0.1261,35.927
+DH027,130.0,132.0,0.504,0.3991,1.353
+DH027,132.0,134.0,1.266,0.1476,2.865
+DH027,134.0,136.0,0.496,0.0371,1.28
+DH027,136.0,138.0,0.176,0.4419,0.296
+DH027,138.0,140.0,1.827,0.631,5.145
+DH027,140.0,142.0,15.167,0.1549,33.835
+DH027,142.0,144.0,2.022,0.8749,3.596
+DH027,144.0,146.0,1.199,0.2903,2.368
+DH027,146.0,148.0,2.008,1.8241,4.375
+DH027,148.0,150.0,7.411,0.4105,16.011
+DH027,150.0,152.0,1.337,0.5038,2.278
+DH027,152.0,154.0,3.339,0.0603,7.139
+DH027,154.0,156.0,3.142,0.212,7.186
+DH027,156.0,158.0,1.362,0.139,2.598
+DH027,158.0,160.0,1.275,1.2769,3.241
+DH027,160.0,162.0,0.696,1.1377,1.412
+DH027,162.0,164.0,2.306,0.4575,6.885
+DH027,164.0,166.0,1.675,0.141,2.898
+DH027,166.0,168.0,3.47,0.2098,9.819
+DH027,168.0,170.0,7.99,0.284,21.026
+DH027,170.0,172.0,2.658,0.9692,5.544
+DH027,172.0,174.0,1.2,0.0485,3.043
+DH027,174.0,176.0,1.271,0.2046,2.009
+DH027,176.0,178.0,3.392,0.1416,7.374
+DH027,178.0,180.0,4.642,0.6673,11.66
+DH027,180.0,182.0,2.982,0.0486,4.931
+DH027,182.0,184.0,1.098,0.5532,2.193
+DH027,184.0,186.0,0.836,0.2297,1.889
+DH027,186.0,188.0,0.867,1.0931,2.17
+DH027,188.0,190.0,2.551,0.1618,5.068
+DH027,190.0,192.0,9.796,0.8445,27.157
+DH027,192.0,194.0,8.339,0.3464,18.48
+DH027,194.0,196.0,1.993,0.1921,5.537
+DH027,196.0,198.0,6.998,0.7808,19.871
+DH027,198.0,200.0,1.958,0.0312,5.01
+DH027,200.0,202.0,1.387,0.0925,3.726
+DH027,202.0,204.0,0.462,0.1494,1.35
+DH027,204.0,206.0,9.447,0.1372,25.339
+DH027,206.0,208.0,2.815,0.4596,8.334
+DH027,208.0,210.0,2.138,0.0574,4.456
+DH027,210.0,212.0,2.173,0.2805,6.29
+DH027,212.0,214.0,8.75,0.2256,19.474
+DH027,214.0,216.0,1.284,1.0438,2.739
+DH027,216.0,218.0,7.831,0.097,21.154
+DH027,218.0,220.0,0.982,0.2586,1.509
+DH027,220.0,222.0,1.237,0.1668,3.374
+DH027,222.0,224.0,1.794,0.5437,5.305
+DH027,224.0,226.0,3.373,0.6731,6.412
+DH027,226.0,228.0,1.18,0.4674,3.499
+DH027,228.0,230.0,2.166,0.0971,6.492
+DH027,230.0,232.0,1.855,0.0812,2.784
+DH027,232.0,234.0,8.483,0.9835,17.576
+DH027,234.0,236.0,7.561,0.307,16.499
+DH027,236.0,238.0,0.221,0.8197,0.523
+DH027,238.0,240.0,11.697,0.3428,21.791
+DH027,240.0,242.0,3.236,1.2292,9.089
+DH027,242.0,244.0,1.203,0.1262,2.948
+DH027,244.0,246.0,1.825,0.5826,4.892
+DH027,246.0,248.0,0.292,0.322,0.62
+DH027,248.0,250.0,2.327,0.2723,4.771
+DH027,250.0,252.0,0.148,0.0126,0.111
+DH027,252.0,254.0,0.105,0.0178,0.111
+DH027,254.0,256.0,0.03,0.0173,0.037
+DH027,256.0,258.0,0.029,0.0181,0.026
+DH027,258.0,260.0,0.098,0.0113,0.095
+DH027,260.0,262.0,0.036,0.0356,0.051
+DH027,262.0,264.0,0.061,0.0525,0.049
+DH027,264.0,266.0,0.101,0.0312,0.123
+DH027,266.0,268.0,0.037,0.0128,0.029
+DH027,268.0,270.0,0.261,0.0125,0.243
+DH027,270.0,272.0,0.106,0.025,0.141
+DH027,272.0,274.0,0.049,0.014,0.044
+DH027,274.0,276.0,0.175,0.0163,0.153
+DH027,276.0,278.0,0.044,0.0465,0.029
+DH027,278.0,280.0,0.157,0.0186,0.138
+DH027,280.0,281.0,0.033,0.0062,0.049
+DH028,0.0,2.0,0.086,0.0203,0.107
+DH028,2.0,4.0,0.048,0.0312,0.048
+DH028,4.0,6.0,0.057,0.0256,0.051
+DH028,6.0,8.0,0.076,0.0462,0.071
+DH028,8.0,10.0,0.173,0.0222,0.151
+DH028,10.0,12.0,0.187,0.0212,0.095
+DH028,12.0,14.0,0.188,0.0342,0.129
+DH028,14.0,16.0,0.008,0.0228,0.004
+DH028,16.0,18.0,0.08,0.0248,0.061
+DH028,18.0,20.0,0.123,0.016,0.073
+DH028,20.0,22.0,0.131,0.024,0.195
+DH028,22.0,24.0,0.164,0.0305,0.209
+DH028,24.0,26.0,0.149,0.02,0.178
+DH028,26.0,28.0,0.159,0.0134,0.158
+DH028,28.0,30.0,0.023,0.0252,0.013
+DH028,30.0,32.0,0.254,0.0208,0.301
+DH028,32.0,34.0,0.07,0.0128,0.055
+DH028,34.0,36.0,0.067,0.0126,0.077
+DH028,36.0,38.0,0.104,0.0111,0.113
+DH028,38.0,40.0,0.099,0.0239,0.135
+DH028,40.0,42.0,0.114,0.0402,0.122
+DH028,42.0,44.0,0.41,0.0863,0.45
+DH028,44.0,46.0,0.022,0.0182,0.028
+DH028,46.0,48.0,0.078,0.026,0.09
+DH028,48.0,50.0,0.054,0.014,0.072
+DH028,50.0,52.0,0.136,0.0144,0.156
+DH028,52.0,54.0,0.116,0.0166,0.109
+DH028,54.0,56.0,0.047,0.0104,0.043
+DH028,56.0,58.0,0.105,0.0119,0.141
+DH028,58.0,60.0,0.261,0.0134,0.26
+DH028,60.0,62.0,0.02,0.0314,0.012
+DH028,62.0,64.0,0.147,0.0113,0.185
+DH028,64.0,66.0,0.05,0.0165,0.068
+DH028,66.0,68.0,0.077,0.0526,0.081
+DH028,68.0,70.0,0.201,0.0081,0.211
+DH028,70.0,72.0,0.06,0.0395,0.035
+DH028,72.0,74.0,0.023,0.0095,0.025
+DH028,74.0,76.0,0.144,0.0274,0.094
+DH028,76.0,78.0,0.059,0.0262,0.073
+DH028,78.0,80.0,0.051,0.0104,0.066
+DH028,80.0,82.0,3.48,0.1791,9.92
+DH028,82.0,84.0,2.516,0.3322,4.958
+DH028,84.0,86.0,4.652,0.5073,10.739
+DH028,86.0,88.0,4.579,0.2043,7.65
+DH028,88.0,90.0,2.407,0.0891,3.787
+DH028,90.0,92.0,0.313,0.2798,0.714
+DH028,92.0,94.0,1.3,0.256,2.582
+DH028,94.0,96.0,4.115,0.2335,10.259
+DH028,96.0,98.0,11.087,0.2628,23.741
+DH028,98.0,100.0,12.181,0.684,35.701
+DH028,100.0,102.0,1.548,0.0711,2.355
+DH028,102.0,104.0,8.277,0.2963,16.887
+DH028,104.0,106.0,6.322,0.4701,17.029
+DH028,106.0,108.0,7.287,0.3688,15.802
+DH028,108.0,110.0,10.232,0.0809,25.096
+DH028,110.0,112.0,1.843,0.1153,2.95
+DH028,112.0,114.0,10.724,0.6054,21.375
+DH028,114.0,116.0,0.291,0.0766,0.615
+DH028,116.0,118.0,2.136,0.1498,5.571
+DH028,118.0,120.0,12.795,1.0246,19.483
+DH028,120.0,122.0,4.267,0.4918,6.416
+DH028,122.0,124.0,49.863,0.1052,137.762
+DH028,124.0,126.0,0.718,0.7789,1.295
+DH028,126.0,128.0,1.158,0.1118,2.816
+DH028,128.0,130.0,3.435,0.6896,8.404
+DH028,130.0,132.0,4.112,0.2837,11.109
+DH028,132.0,134.0,1.872,0.0865,3.941
+DH028,134.0,136.0,5.548,0.4927,9.772
+DH028,136.0,138.0,1.908,0.7723,4.152
+DH028,138.0,140.0,11.778,0.7125,29.998
+DH028,140.0,142.0,3.401,0.3043,7.941
+DH028,142.0,144.0,0.56,0.0906,1.154
+DH028,144.0,146.0,1.955,0.1709,4.687
+DH028,146.0,148.0,2.662,0.2067,5.451
+DH028,148.0,150.0,24.918,0.3215,73.156
+DH028,150.0,152.0,4.836,0.2248,9.272
+DH028,152.0,154.0,0.791,0.1539,1.504
+DH028,154.0,156.0,5.841,0.3358,12.017
+DH028,156.0,158.0,4.999,0.3133,13.566
+DH028,158.0,160.0,0.641,0.1414,1.042
+DH028,160.0,162.0,0.103,0.0996,0.25
+DH028,162.0,164.0,3.464,0.1651,8.778
+DH028,164.0,166.0,0.214,0.2796,0.467
+DH028,166.0,168.0,1.924,0.0541,3.403
+DH028,168.0,170.0,10.331,0.2744,19.102
+DH028,170.0,172.0,38.136,0.0818,59.151
+DH028,172.0,174.0,0.641,0.0974,1.374
+DH028,174.0,176.0,4.775,0.6265,10.225
+DH028,176.0,178.0,0.662,0.3272,1.423
+DH028,178.0,180.0,2.97,0.2782,6.185
+DH028,180.0,182.0,2.504,0.193,7.426
+DH028,182.0,184.0,32.27,0.2576,84.753
+DH028,184.0,186.0,3.025,0.1318,8.771
+DH028,186.0,188.0,3.779,0.1594,11.133
+DH028,188.0,190.0,2.277,0.1027,3.958
+DH028,190.0,192.0,2.958,0.4811,6.975
+DH028,192.0,194.0,1.952,0.1529,5.491
+DH028,194.0,196.0,3.442,0.3286,9.838
+DH028,196.0,198.0,1.996,0.4953,5.765
+DH028,198.0,200.0,43.61,0.4108,93.794
+DH028,200.0,202.0,2.78,0.414,7.944
+DH028,202.0,204.0,0.37,0.0972,0.79
+DH028,204.0,206.0,0.271,0.07,0.426
+DH028,206.0,208.0,1.704,0.1279,3.597
+DH028,208.0,210.0,0.381,0.3288,0.96
+DH028,210.0,212.0,1.17,0.2945,3.323
+DH028,212.0,214.0,0.955,0.0454,2.375
+DH028,214.0,216.0,2.447,0.1475,6.291
+DH028,216.0,218.0,2.26,0.3277,6.434
+DH028,218.0,220.0,15.89,0.3921,44.853
+DH028,220.0,222.0,5.397,0.232,11.162
+DH028,222.0,224.0,10.545,0.1088,15.838
+DH028,224.0,226.0,9.278,0.2857,15.086
+DH028,226.0,228.0,0.287,0.0363,0.75
+DH028,228.0,230.0,3.223,0.1398,9.294
+DH028,230.0,232.0,0.714,0.1712,2.079
+DH028,232.0,234.0,0.408,0.0414,0.679
+DH028,234.0,236.0,7.58,0.1013,19.211
+DH028,236.0,238.0,7.014,0.2261,10.992
+DH028,238.0,240.0,2.611,0.1599,6.651
+DH028,240.0,242.0,21.154,0.7117,38.516
+DH028,242.0,244.0,1.317,0.2239,2.311
+DH028,244.0,246.0,0.28,0.0553,0.716
+DH028,246.0,248.0,1.138,0.0679,2.953
+DH028,248.0,250.0,3.556,0.1156,5.763
+DH028,250.0,252.0,0.046,0.0077,0.033
+DH028,252.0,254.0,0.104,0.0155,0.112
+DH028,254.0,256.0,0.198,0.0246,0.219
+DH028,256.0,258.0,0.058,0.0188,0.073
+DH028,258.0,260.0,0.059,0.0175,0.041
+DH028,260.0,262.0,0.104,0.0095,0.086
+DH028,262.0,264.0,0.099,0.0165,0.053
+DH028,264.0,266.0,0.066,0.0131,0.063
+DH028,266.0,268.0,0.117,0.0142,0.113
+DH028,268.0,270.0,0.074,0.0139,0.1
+DH028,270.0,272.0,0.099,0.0184,0.117
+DH028,272.0,274.0,0.128,0.0135,0.104
+DH028,274.0,276.0,0.13,0.0222,0.157
+DH028,276.0,278.0,0.075,0.0195,0.058
+DH028,278.0,280.0,0.09,0.0074,0.067
+DH028,280.0,282.0,0.046,0.0211,0.028
+DH028,282.0,284.0,0.049,0.007,0.069
+DH028,284.0,286.0,0.266,0.0164,0.338
+DH028,286.0,288.0,0.136,0.0185,0.193
+DH028,288.0,290.0,0.143,0.0232,0.164
+DH028,290.0,292.0,0.076,0.0154,0.084
+DH028,292.0,294.0,0.067,0.0339,0.075
+DH028,294.0,296.0,0.194,0.0232,0.135
+DH028,296.0,298.0,0.111,0.0132,0.126
+DH028,298.0,300.0,0.061,0.0171,0.044
+DH028,300.0,302.0,0.112,0.0104,0.067
+DH028,302.0,304.0,0.097,0.0217,0.136
+DH028,304.0,306.0,0.213,0.0275,0.317
+DH028,306.0,308.0,0.053,0.0163,0.069
+DH028,308.0,310.0,0.174,0.03,0.241
+DH028,310.0,312.0,0.123,0.0276,0.124
+DH028,312.0,314.0,0.105,0.0247,0.055
+DH028,314.0,316.0,0.051,0.0131,0.047
+DH028,316.0,318.0,0.054,0.0088,0.063
+DH028,318.0,320.0,0.101,0.0094,0.065
+DH028,320.0,322.0,0.073,0.0201,0.105
+DH028,322.0,324.0,0.036,0.0238,0.045
+DH028,324.0,326.0,0.071,0.0156,0.046
+DH028,326.0,328.0,0.096,0.0407,0.141
+DH028,328.0,330.0,0.139,0.0052,0.101
+DH028,330.0,332.0,0.024,0.0619,0.028
+DH028,332.0,334.0,0.178,0.0315,0.138
+DH028,334.0,336.0,0.066,0.0121,0.064
+DH028,336.0,338.0,0.064,0.0122,0.051
+DH028,338.0,340.0,0.048,0.0155,0.055
+DH028,340.0,342.0,0.056,0.0143,0.083
+DH028,342.0,344.0,0.073,0.0153,0.046
+DH028,344.0,346.0,0.108,0.0109,0.084
+DH028,346.0,348.0,0.096,0.0075,0.117
+DH028,348.0,350.0,0.197,0.0123,0.281
+DH028,350.0,352.0,0.094,0.009,0.069
+DH028,352.0,354.0,0.062,0.0412,0.091
+DH028,354.0,356.0,0.077,0.0345,0.065
+DH028,356.0,358.0,0.097,0.0316,0.053
+DH028,358.0,360.0,0.039,0.0088,0.035
+DH028,360.0,362.0,0.104,0.0311,0.106
+DH028,362.0,364.0,0.035,0.0056,0.052
+DH028,364.0,366.0,0.113,0.0196,0.118
+DH028,366.0,368.0,0.035,0.0123,0.025
+DH028,368.0,370.0,0.122,0.0125,0.16
+DH028,370.0,372.0,0.06,0.0156,0.075
+DH028,372.0,374.0,0.073,0.0101,0.101
+DH028,374.0,376.0,0.096,0.0097,0.111
+DH028,376.0,378.0,0.17,0.0196,0.241
+DH028,378.0,380.0,0.06,0.008,0.083
+DH028,380.0,382.0,0.099,0.0117,0.06
+DH028,382.0,384.0,0.132,0.0075,0.077
+DH028,384.0,386.0,0.045,0.0402,0.038
+DH028,386.0,388.0,0.217,0.0184,0.249
+DH028,388.0,390.0,0.039,0.0218,0.039
+DH028,390.0,392.0,0.071,0.0411,0.04
+DH028,392.0,394.0,0.182,0.0083,0.131
+DH028,394.0,396.0,0.066,0.0261,0.068
+DH028,396.0,398.0,0.061,0.0276,0.036
+DH028,398.0,400.0,0.054,0.0129,0.034
+DH028,400.0,402.0,0.077,0.0368,0.093
+DH028,402.0,404.0,0.079,0.0248,0.057
+DH028,404.0,406.0,0.057,0.0212,0.078
+DH028,406.0,408.0,0.093,0.038,0.113
+DH028,408.0,410.0,0.061,0.0171,0.074
+DH028,410.0,412.0,0.063,0.0394,0.06
+DH028,412.0,414.0,0.099,0.0265,0.115
+DH028,414.0,416.0,0.059,0.0176,0.042
+DH028,416.0,418.0,0.061,0.0107,0.051
+DH028,418.0,420.0,0.104,0.0303,0.071
+DH028,420.0,422.0,0.304,0.032,0.208
+DH028,422.0,424.0,0.109,0.0139,0.112
+DH028,424.0,426.0,0.035,0.0159,0.029
+DH028,426.0,428.0,0.079,0.0106,0.096
+DH028,428.0,430.0,0.291,0.0215,0.362
+DH028,430.0,432.0,0.108,0.0547,0.157
+DH028,432.0,434.0,0.015,0.069,0.011
+DH028,434.0,436.0,0.073,0.0104,0.085
+DH028,436.0,438.0,0.097,0.0065,0.098
+DH028,438.0,440.0,0.163,0.012,0.182
+DH028,440.0,442.0,0.076,0.0155,0.079
+DH028,442.0,444.0,0.04,0.0237,0.035
+DH028,444.0,446.0,0.043,0.0115,0.06
+DH028,446.0,448.0,0.046,0.02,0.04
+DH029,0.0,2.0,0.079,0.01,0.103
+DH029,2.0,4.0,0.074,0.017,0.039
+DH029,4.0,6.0,0.124,0.0186,0.129
+DH029,6.0,8.0,0.099,0.0514,0.07
+DH029,8.0,10.0,0.135,0.0196,0.094
+DH029,10.0,12.0,0.161,0.0197,0.195
+DH029,12.0,14.0,0.071,0.0113,0.094
+DH029,14.0,16.0,0.124,0.0201,0.093
+DH029,16.0,18.0,0.046,0.0179,0.049
+DH029,18.0,20.0,0.023,0.009,0.03
+DH029,20.0,22.0,0.048,0.0212,0.066
+DH029,22.0,24.0,0.076,0.037,0.08
+DH029,24.0,26.0,0.076,0.0179,0.102
+DH029,26.0,28.0,0.087,0.0196,0.086
+DH029,28.0,30.0,0.048,0.0317,0.053
+DH029,30.0,32.0,0.184,0.0235,0.144
+DH029,32.0,34.0,0.05,0.0473,0.061
+DH029,34.0,36.0,0.076,0.0196,0.082
+DH029,36.0,38.0,0.089,0.0131,0.068
+DH029,38.0,40.0,0.243,0.0175,0.145
+DH029,40.0,42.0,0.036,0.0195,0.052
+DH029,42.0,44.0,0.095,0.0081,0.052
+DH029,44.0,46.0,0.043,0.0187,0.061
+DH029,46.0,48.0,0.23,0.02,0.31
+DH029,48.0,50.0,0.115,0.0374,0.16
+DH029,50.0,52.0,0.101,0.0337,0.139
+DH029,52.0,54.0,0.113,0.0155,0.101
+DH029,54.0,56.0,0.162,0.0359,0.167
+DH029,56.0,58.0,0.053,0.0117,0.048
+DH029,58.0,60.0,0.047,0.0276,0.025
+DH029,60.0,62.0,0.059,0.04,0.056
+DH029,62.0,64.0,0.222,0.0215,0.244
+DH029,64.0,66.0,0.213,0.0298,0.166
+DH029,66.0,68.0,0.046,0.0084,0.051
+DH029,68.0,70.0,0.047,0.0097,0.046
+DH029,70.0,72.0,0.031,0.0112,0.025
+DH029,72.0,74.0,0.108,0.0151,0.068
+DH029,74.0,76.0,0.063,0.0178,0.066
+DH029,76.0,78.0,0.058,0.0135,0.083
+DH029,78.0,80.0,0.154,0.0269,0.141
+DH029,80.0,82.0,0.531,0.1968,1.186
+DH029,82.0,84.0,0.648,0.1961,0.983
+DH029,84.0,86.0,1.954,0.1547,3.243
+DH029,86.0,88.0,3.84,0.439,8.995
+DH029,88.0,90.0,6.506,0.7926,14.224
+DH029,90.0,92.0,36.226,0.5909,63.658
+DH029,92.0,94.0,6.152,0.3939,17.298
+DH029,94.0,96.0,1.259,0.1029,1.964
+DH029,96.0,98.0,0.983,0.3362,2.068
+DH029,98.0,100.0,3.957,0.0722,8.0
+DH029,100.0,102.0,2.85,0.252,4.715
+DH029,102.0,104.0,1.406,0.2934,2.656
+DH029,104.0,106.0,2.823,1.3198,5.94
+DH029,106.0,108.0,1.127,0.9967,3.002
+DH029,108.0,110.0,0.324,0.1234,0.713
+DH029,110.0,112.0,0.257,0.1669,0.533
+DH029,112.0,114.0,9.176,0.3692,23.013
+DH029,114.0,116.0,0.762,0.4529,1.666
+DH029,116.0,118.0,3.573,0.3129,6.429
+DH029,118.0,120.0,7.888,0.9274,22.506
+DH029,120.0,122.0,1.091,0.196,1.731
+DH029,122.0,124.0,1.444,0.3747,3.392
+DH029,124.0,126.0,7.424,0.3002,13.122
+DH029,126.0,128.0,1.22,0.1422,1.855
+DH029,128.0,130.0,19.176,1.066,41.131
+DH029,130.0,132.0,2.566,0.0751,5.609
+DH029,132.0,134.0,0.862,0.8224,1.771
+DH029,134.0,136.0,3.53,0.1109,9.939
+DH029,136.0,138.0,4.949,0.5054,8.415
+DH029,138.0,140.0,5.548,0.1313,12.789
+DH029,140.0,142.0,7.409,0.291,15.028
+DH029,142.0,144.0,1.592,0.5028,4.16
+DH029,144.0,146.0,0.717,0.3611,1.979
+DH029,146.0,148.0,0.389,0.6575,0.914
+DH029,148.0,150.0,1.752,0.1359,2.695
+DH029,150.0,152.0,0.77,0.3951,1.896
+DH029,152.0,154.0,7.246,0.1371,20.229
+DH029,154.0,156.0,0.226,0.0628,0.628
+DH029,156.0,158.0,3.931,0.2932,6.967
+DH029,158.0,160.0,4.417,0.2836,12.423
+DH029,160.0,162.0,4.578,0.103,8.954
+DH029,162.0,164.0,4.918,0.6996,8.135
+DH029,164.0,166.0,3.309,0.0836,7.412
+DH029,166.0,168.0,0.656,0.2924,1.922
+DH029,168.0,170.0,1.327,0.4112,2.296
+DH029,170.0,172.0,4.12,0.1162,11.039
+DH029,172.0,174.0,0.884,0.1903,1.83
+DH029,174.0,176.0,20.352,0.1813,41.128
+DH029,176.0,178.0,11.871,0.3196,31.276
+DH029,178.0,180.0,1.317,0.1046,3.373
+DH029,180.0,182.0,2.368,0.0556,5.9
+DH029,182.0,184.0,9.463,0.2529,20.921
+DH029,184.0,186.0,0.678,0.1071,1.876
+DH029,186.0,188.0,2.042,0.0583,3.234
+DH029,188.0,190.0,2.636,0.1558,5.566
+DH029,190.0,192.0,0.621,0.5322,1.408
+DH029,192.0,194.0,3.953,0.2714,6.484
+DH029,194.0,196.0,1.269,0.1893,3.768
+DH029,196.0,198.0,12.152,0.0839,27.656
+DH029,198.0,200.0,6.093,1.0057,17.087
+DH029,200.0,202.0,0.856,0.6188,2.415
+DH029,202.0,204.0,7.794,0.4192,23.101
+DH029,204.0,206.0,4.306,0.4989,9.708
+DH029,206.0,208.0,1.656,0.0635,4.502
+DH029,208.0,210.0,2.859,0.1067,4.377
+DH029,210.0,212.0,2.679,0.1427,6.529
+DH029,212.0,214.0,6.188,0.2236,14.51
+DH029,214.0,216.0,11.238,0.226,18.379
+DH029,216.0,218.0,0.116,0.5083,0.231
+DH029,218.0,220.0,2.866,0.4453,7.861
+DH029,220.0,222.0,2.81,0.1821,4.989
+DH029,222.0,224.0,3.688,0.6822,9.058
+DH029,224.0,226.0,13.089,0.3007,30.895
+DH029,226.0,228.0,39.89,0.8371,96.179
+DH029,228.0,230.0,0.855,1.2888,2.093
+DH029,230.0,232.0,1.694,0.0397,2.603
+DH029,232.0,234.0,0.607,0.3093,1.329
+DH029,234.0,236.0,19.245,0.3469,53.397
+DH029,236.0,238.0,0.652,0.7705,1.947
+DH029,238.0,240.0,2.857,0.1346,6.558
+DH029,240.0,242.0,1.197,0.1073,2.589
+DH029,242.0,244.0,1.309,0.2448,3.08
+DH029,244.0,246.0,3.172,0.5674,7.096
+DH029,246.0,248.0,1.324,0.3941,2.353
+DH029,248.0,250.0,0.792,0.4711,2.121
+DH029,250.0,252.0,0.051,0.0234,0.052
+DH029,252.0,254.0,0.06,0.0139,0.033
+DH029,254.0,256.0,0.065,0.0317,0.094
+DH029,256.0,258.0,0.146,0.0237,0.126
+DH029,258.0,260.0,0.031,0.0115,0.045
+DH029,260.0,262.0,0.052,0.0299,0.028
+DH029,262.0,264.0,0.309,0.0125,0.221
+DH029,264.0,266.0,0.213,0.0163,0.175
+DH029,266.0,268.0,0.173,0.0178,0.112
+DH029,268.0,270.0,0.056,0.0056,0.057
+DH029,270.0,272.0,0.054,0.0107,0.062
+DH029,272.0,274.0,0.034,0.0274,0.031
+DH029,274.0,276.0,0.065,0.0177,0.087
+DH029,276.0,278.0,0.129,0.0201,0.099
+DH029,278.0,280.0,0.111,0.0133,0.08
+DH029,280.0,282.0,0.146,0.0258,0.188
+DH029,282.0,284.0,0.105,0.0344,0.101
+DH029,284.0,286.0,0.058,0.0087,0.042
+DH029,286.0,288.0,0.068,0.0381,0.056
+DH029,288.0,290.0,0.057,0.0135,0.063
+DH029,290.0,292.0,0.082,0.0097,0.048
+DH029,292.0,294.0,0.075,0.0633,0.045
+DH029,294.0,296.0,0.213,0.0367,0.249
+DH029,296.0,298.0,0.065,0.0116,0.053
+DH029,298.0,300.0,0.082,0.0185,0.061
+DH029,300.0,302.0,0.325,0.0161,0.252
+DH029,302.0,304.0,0.056,0.016,0.072
+DH029,304.0,306.0,0.082,0.0182,0.056
+DH029,306.0,308.0,0.094,0.026,0.094
+DH029,308.0,310.0,0.094,0.0162,0.077
+DH029,310.0,312.0,0.1,0.0169,0.115
+DH029,312.0,314.0,0.077,0.0186,0.077
+DH029,314.0,316.0,0.059,0.0268,0.069
+DH029,316.0,318.0,0.239,0.0135,0.188
+DH029,318.0,320.0,0.026,0.0277,0.015
+DH029,320.0,322.0,0.045,0.0216,0.067
+DH029,322.0,324.0,0.052,0.0144,0.056
+DH029,324.0,326.0,0.047,0.0178,0.031
+DH029,326.0,328.0,0.134,0.028,0.163
+DH029,328.0,330.0,0.154,0.0135,0.103
+DH029,330.0,332.0,0.047,0.0221,0.046
+DH029,332.0,334.0,0.089,0.0146,0.046
+DH029,334.0,336.0,0.034,0.0378,0.018
+DH029,336.0,338.0,0.044,0.011,0.055
+DH029,338.0,340.0,0.144,0.0103,0.161
+DH029,340.0,342.0,0.078,0.0115,0.101
+DH029,342.0,344.0,0.234,0.0091,0.307
+DH029,344.0,346.0,0.145,0.0204,0.191
+DH029,346.0,348.0,0.146,0.0304,0.21
+DH029,348.0,350.0,0.057,0.0146,0.051
+DH029,350.0,352.0,0.037,0.0356,0.046
+DH029,352.0,354.0,0.071,0.0219,0.049
+DH029,354.0,356.0,0.265,0.0399,0.154
+DH029,356.0,358.0,0.068,0.0235,0.089
+DH029,358.0,360.0,0.239,0.0414,0.28
+DH029,360.0,362.0,0.074,0.0126,0.085
+DH029,362.0,364.0,0.072,0.0295,0.098
+DH029,364.0,366.0,0.017,0.0082,0.016
+DH029,366.0,368.0,0.055,0.0201,0.053
+DH029,368.0,370.0,0.04,0.0115,0.044
+DH029,370.0,372.0,0.059,0.0136,0.084
+DH029,372.0,374.0,0.045,0.0153,0.027
+DH029,374.0,376.0,0.133,0.017,0.179
+DH029,376.0,378.0,0.041,0.0179,0.044
+DH029,378.0,380.0,0.039,0.0177,0.044
+DH029,380.0,382.0,0.049,0.0172,0.053
+DH029,382.0,384.0,0.034,0.0124,0.036
+DH029,384.0,386.0,0.064,0.0164,0.094
+DH029,386.0,388.0,0.056,0.0235,0.054
+DH029,388.0,390.0,0.066,0.0212,0.072
+DH029,390.0,392.0,0.101,0.0086,0.06
+DH029,392.0,394.0,0.102,0.0188,0.083
+DH029,394.0,396.0,0.067,0.0134,0.09
+DH029,396.0,398.0,0.248,0.0129,0.343
+DH029,398.0,400.0,0.154,0.0176,0.201
+DH029,400.0,402.0,0.131,0.0138,0.105
+DH029,402.0,404.0,0.082,0.01,0.118
+DH029,404.0,406.0,0.055,0.0291,0.046
+DH029,406.0,408.0,0.129,0.0228,0.11
+DH029,408.0,410.0,0.249,0.0225,0.193
+DH029,410.0,412.0,0.105,0.0232,0.064
+DH029,412.0,414.0,0.051,0.0109,0.037
+DH029,414.0,416.0,0.221,0.0062,0.215
+DH029,416.0,418.0,0.086,0.0304,0.091
+DH030,0.0,2.0,0.195,0.0203,0.258
+DH030,2.0,4.0,0.077,0.0237,0.059
+DH030,4.0,6.0,0.122,0.0177,0.081
+DH030,6.0,8.0,0.043,0.0151,0.06
+DH030,8.0,10.0,0.025,0.0124,0.022
+DH030,10.0,12.0,0.057,0.0333,0.069
+DH030,12.0,14.0,0.125,0.0761,0.093
+DH030,14.0,16.0,0.089,0.0281,0.118
+DH030,16.0,18.0,0.032,0.0186,0.037
+DH030,18.0,20.0,0.158,0.0138,0.081
+DH030,20.0,22.0,0.09,0.0172,0.125
+DH030,22.0,24.0,0.049,0.0211,0.063
+DH030,24.0,26.0,0.063,0.0256,0.09
+DH030,26.0,28.0,0.123,0.0109,0.109
+DH030,28.0,30.0,0.048,0.0192,0.069
+DH030,30.0,32.0,0.177,0.0271,0.255
+DH030,32.0,34.0,0.154,0.016,0.217
+DH030,34.0,36.0,0.233,0.0169,0.229
+DH030,36.0,38.0,0.15,0.0197,0.125
+DH030,38.0,40.0,0.095,0.0181,0.067
+DH030,40.0,42.0,0.033,0.0137,0.028
+DH030,42.0,44.0,0.022,0.0283,0.026
+DH030,44.0,46.0,0.141,0.0222,0.078
+DH030,46.0,48.0,0.062,0.0125,0.086
+DH030,48.0,50.0,0.142,0.0179,0.097
+DH030,50.0,52.0,0.04,0.0203,0.046
+DH030,52.0,54.0,0.079,0.0163,0.081
+DH030,54.0,56.0,0.098,0.0242,0.06
+DH030,56.0,58.0,0.129,0.0406,0.092
+DH030,58.0,60.0,0.031,0.0182,0.019
+DH030,60.0,62.0,0.125,0.0336,0.139
+DH030,62.0,64.0,0.174,0.0217,0.21
+DH030,64.0,66.0,0.127,0.0199,0.116
+DH030,66.0,68.0,0.149,0.0227,0.182
+DH030,68.0,70.0,0.075,0.0082,0.049
+DH030,70.0,72.0,0.19,0.0098,0.174
+DH030,72.0,74.0,0.048,0.0146,0.063
+DH030,74.0,76.0,0.063,0.0254,0.038
+DH030,76.0,78.0,0.159,0.0105,0.175
+DH030,78.0,80.0,0.198,0.0398,0.152
+DH030,80.0,82.0,0.903,0.1015,1.665
+DH030,82.0,84.0,2.257,0.4397,5.495
+DH030,84.0,86.0,1.243,0.2163,3.047
+DH030,86.0,88.0,1.038,0.402,2.801
+DH030,88.0,90.0,2.638,0.2972,7.732
+DH030,90.0,92.0,4.602,0.1141,13.434
+DH030,92.0,94.0,3.024,0.1576,6.891
+DH030,94.0,96.0,3.365,0.5302,9.757
+DH030,96.0,98.0,10.913,0.2273,20.095
+DH030,98.0,100.0,1.169,0.1001,2.13
+DH030,100.0,102.0,5.017,1.0884,13.154
+DH030,102.0,104.0,0.711,0.4071,1.47
+DH030,104.0,106.0,6.058,0.2057,15.272
+DH030,106.0,108.0,1.697,0.0332,3.179
+DH030,108.0,110.0,6.944,0.579,11.049
+DH030,110.0,112.0,3.777,0.0367,10.872
+DH030,112.0,114.0,10.909,0.8175,28.166
+DH030,114.0,116.0,1.676,0.0785,2.521
+DH030,116.0,118.0,2.265,0.7807,4.334
+DH030,118.0,120.0,2.271,0.2366,4.457
+DH030,120.0,122.0,4.72,0.125,11.2
+DH030,122.0,124.0,11.527,0.06,20.992
+DH030,124.0,126.0,0.225,0.1398,0.607
+DH030,126.0,128.0,2.226,0.0778,4.298
+DH030,128.0,130.0,2.412,0.1877,5.546
+DH030,130.0,132.0,2.135,0.1401,4.749
+DH030,132.0,134.0,1.669,0.1655,2.592
+DH030,134.0,136.0,18.772,0.0601,46.926
+DH030,136.0,138.0,1.67,0.0715,4.216
+DH030,138.0,140.0,3.255,0.1117,6.954
+DH030,140.0,142.0,17.725,0.2558,32.362
+DH030,142.0,144.0,0.806,0.1776,1.699
+DH030,144.0,146.0,2.671,0.2865,6.453
+DH030,146.0,148.0,2.216,0.0888,3.999
+DH030,148.0,150.0,10.131,0.2687,28.734
+DH030,150.0,152.0,4.698,0.1885,12.269
+DH030,152.0,154.0,4.376,0.4556,9.519
+DH030,154.0,156.0,0.926,0.2674,2.117
+DH030,156.0,158.0,2.466,0.2446,6.489
+DH030,158.0,160.0,2.869,0.4035,5.358
+DH030,160.0,162.0,0.898,0.1944,1.395
+DH030,162.0,164.0,1.129,0.0612,1.7
+DH030,164.0,166.0,3.956,0.1971,8.906
+DH030,166.0,168.0,3.677,0.69,6.45
+DH030,168.0,170.0,0.546,0.2076,1.518
+DH030,170.0,172.0,0.553,0.3754,1.333
+DH030,172.0,174.0,0.13,0.3098,0.328
+DH030,174.0,176.0,1.615,0.133,3.838
+DH030,176.0,178.0,1.5,0.1752,2.66
+DH030,178.0,180.0,1.472,0.5785,4.367
+DH030,180.0,182.0,0.273,0.5859,0.745
+DH030,182.0,184.0,1.397,0.2041,3.217
+DH030,184.0,186.0,1.187,0.3345,3.222
+DH030,186.0,188.0,1.549,0.0379,4.027
+DH030,188.0,190.0,1.802,0.3814,2.779
+DH030,190.0,192.0,4.305,0.2217,8.271
+DH030,192.0,194.0,0.702,0.0874,1.322
+DH030,194.0,196.0,0.984,0.6979,1.714
+DH030,196.0,198.0,0.942,0.1796,2.663
+DH030,198.0,200.0,2.051,0.2773,3.129
+DH030,200.0,202.0,0.419,0.0399,1.202
+DH030,202.0,204.0,4.361,0.167,11.955
+DH030,204.0,206.0,2.104,0.6608,5.058
+DH030,206.0,208.0,7.858,0.0852,11.801
+DH030,208.0,210.0,9.654,0.2774,20.72
+DH030,210.0,212.0,0.421,1.0357,0.822
+DH030,212.0,214.0,0.203,0.1685,0.452
+DH030,214.0,216.0,0.605,1.7277,0.924
+DH030,216.0,218.0,0.401,0.2277,1.172
+DH030,218.0,220.0,6.28,0.1095,15.652
+DH030,220.0,222.0,0.562,1.7847,1.194
+DH030,222.0,224.0,1.869,0.1765,4.749
+DH030,224.0,226.0,0.893,0.1188,1.803
+DH030,226.0,228.0,1.147,0.0406,2.57
+DH030,228.0,230.0,6.775,0.1823,17.865
+DH030,230.0,232.0,9.059,0.1198,16.033
+DH030,232.0,234.0,0.999,0.3537,2.268
+DH030,234.0,236.0,1.666,0.43,3.74
+DH030,236.0,238.0,2.668,0.4059,5.065
+DH030,238.0,240.0,1.264,0.802,3.237
+DH030,240.0,242.0,1.392,0.1323,4.162
+DH030,242.0,244.0,2.556,0.1958,5.316
+DH030,244.0,246.0,3.338,0.2132,9.287
+DH030,246.0,248.0,10.087,0.3415,29.634
+DH030,248.0,250.0,2.248,0.3876,3.773
+DH030,250.0,252.0,0.151,0.029,0.086
+DH030,252.0,254.0,0.266,0.014,0.238
+DH030,254.0,256.0,0.072,0.0152,0.072
+DH030,256.0,258.0,0.187,0.011,0.096
+DH030,258.0,260.0,0.035,0.025,0.045
+DH030,260.0,262.0,0.042,0.0202,0.06
+DH030,262.0,264.0,0.058,0.02,0.069
+DH030,264.0,266.0,0.05,0.0112,0.025
+DH030,266.0,268.0,0.113,0.0381,0.121
+DH030,268.0,270.0,0.068,0.033,0.084
+DH030,270.0,272.0,0.045,0.0127,0.024
+DH030,272.0,274.0,0.058,0.0125,0.067
+DH030,274.0,276.0,0.208,0.0095,0.306
+DH030,276.0,278.0,0.058,0.0218,0.057
+DH030,278.0,280.0,0.1,0.0158,0.123
+DH030,280.0,282.0,0.074,0.0238,0.075
+DH030,282.0,284.0,0.138,0.0091,0.154
+DH030,284.0,286.0,0.035,0.0178,0.043
+DH030,286.0,288.0,0.054,0.0105,0.045
+DH030,288.0,290.0,0.045,0.0096,0.024
+DH030,290.0,292.0,0.226,0.0173,0.311
+DH030,292.0,294.0,0.178,0.0284,0.184
+DH030,294.0,296.0,0.058,0.023,0.034
+DH030,296.0,298.0,0.056,0.0375,0.046
+DH030,298.0,300.0,0.107,0.007,0.154
+DH030,300.0,302.0,0.055,0.0168,0.071
+DH030,302.0,304.0,0.071,0.0443,0.099
+DH030,304.0,306.0,0.094,0.011,0.113
+DH030,306.0,308.0,0.039,0.0079,0.054
+DH030,308.0,310.0,0.103,0.0113,0.119
+DH030,310.0,312.0,0.198,0.0487,0.109
+DH030,312.0,314.0,0.074,0.0265,0.054
+DH030,314.0,316.0,0.025,0.0384,0.029
+DH030,316.0,318.0,0.06,0.0153,0.083
+DH030,318.0,320.0,0.042,0.0159,0.054
+DH030,320.0,322.0,0.094,0.0222,0.074
+DH030,322.0,324.0,0.124,0.0311,0.139
+DH030,324.0,326.0,0.106,0.0293,0.154
+DH030,326.0,328.0,0.409,0.0337,0.462
+DH030,328.0,330.0,0.048,0.0161,0.061
+DH030,330.0,332.0,0.112,0.0129,0.076
+DH030,332.0,334.0,0.036,0.0081,0.023
+DH030,334.0,336.0,0.05,0.0098,0.072
+DH030,336.0,338.0,0.052,0.0184,0.056
+DH030,338.0,340.0,0.059,0.0183,0.055
+DH030,340.0,342.0,0.198,0.0197,0.152
+DH030,342.0,344.0,0.074,0.0233,0.041
+DH030,344.0,346.0,0.182,0.0071,0.119
+DH030,346.0,348.0,0.101,0.0181,0.125
+DH030,348.0,350.0,0.038,0.0274,0.042
+DH030,350.0,352.0,0.029,0.0281,0.034
+DH030,352.0,354.0,0.077,0.0116,0.087
+DH030,354.0,356.0,0.17,0.0082,0.248
+DH030,356.0,358.0,0.056,0.0181,0.079
+DH030,358.0,360.0,0.121,0.0316,0.079
+DH030,360.0,362.0,0.115,0.021,0.086
+DH030,362.0,364.0,0.038,0.011,0.027
+DH030,364.0,366.0,0.075,0.0206,0.056
+DH030,366.0,368.0,0.086,0.0118,0.058
+DH030,368.0,370.0,0.056,0.0105,0.052
+DH030,370.0,372.0,0.074,0.0275,0.085
+DH030,372.0,374.0,0.064,0.0467,0.072
+DH030,374.0,375.0,0.177,0.0419,0.231
+DH031,0.0,2.0,0.067,0.0374,0.037
+DH031,2.0,4.0,0.054,0.0151,0.064
+DH031,4.0,6.0,0.047,0.0319,0.048
+DH031,6.0,8.0,0.081,0.0089,0.111
+DH031,8.0,10.0,0.041,0.0102,0.022
+DH031,10.0,12.0,0.155,0.0228,0.091
+DH031,12.0,14.0,0.076,0.0155,0.093
+DH031,14.0,16.0,0.059,0.0278,0.056
+DH031,16.0,18.0,0.05,0.0129,0.03
+DH031,18.0,20.0,0.034,0.0145,0.037
+DH031,20.0,22.0,0.044,0.0355,0.055
+DH031,22.0,24.0,0.054,0.0147,0.047
+DH031,24.0,26.0,0.055,0.017,0.08
+DH031,26.0,28.0,0.054,0.0358,0.056
+DH031,28.0,30.0,0.152,0.0095,0.143
+DH031,30.0,32.0,0.046,0.0094,0.047
+DH031,32.0,34.0,0.094,0.0188,0.112
+DH031,34.0,36.0,0.139,0.0382,0.094
+DH031,36.0,38.0,0.202,0.0469,0.231
+DH031,38.0,40.0,0.03,0.0092,0.039
+DH031,40.0,42.0,0.275,0.0185,0.274
+DH031,42.0,44.0,0.061,0.013,0.037
+DH031,44.0,46.0,0.139,0.0175,0.188
+DH031,46.0,48.0,0.12,0.0277,0.122
+DH031,48.0,50.0,0.043,0.0118,0.042
+DH031,50.0,52.0,0.142,0.0151,0.184
+DH031,52.0,54.0,0.089,0.0158,0.074
+DH031,54.0,56.0,0.098,0.0164,0.12
+DH031,56.0,58.0,0.053,0.0249,0.065
+DH031,58.0,60.0,0.097,0.0271,0.135
+DH031,60.0,62.0,0.256,0.0221,0.237
+DH031,62.0,64.0,0.08,0.0124,0.088
+DH031,64.0,66.0,0.176,0.0111,0.254
+DH031,66.0,68.0,0.105,0.029,0.082
+DH031,68.0,70.0,0.051,0.0221,0.047
+DH031,70.0,72.0,0.039,0.0483,0.046
+DH031,72.0,74.0,0.045,0.0162,0.038
+DH031,74.0,76.0,0.022,0.0329,0.016
+DH031,76.0,78.0,0.096,0.0131,0.131
+DH031,78.0,80.0,0.088,0.0129,0.072
+DH031,80.0,82.0,2.478,0.2572,4.794
+DH031,82.0,84.0,2.222,0.0741,3.913
+DH031,84.0,86.0,4.609,0.1306,9.029
+DH031,86.0,88.0,2.312,0.1875,6.839
+DH031,88.0,90.0,0.276,0.13,0.542
+DH031,90.0,92.0,20.007,1.3893,37.646
+DH031,92.0,94.0,3.855,0.4291,10.811
+DH031,94.0,96.0,3.24,0.4681,7.44
+DH031,96.0,98.0,4.165,0.107,6.393
+DH031,98.0,100.0,1.188,0.0862,3.56
+DH031,100.0,102.0,1.339,0.1807,2.602
+DH031,102.0,104.0,4.336,0.2594,7.726
+DH031,104.0,106.0,0.742,0.4501,2.097
+DH031,106.0,108.0,1.322,0.1922,2.886
+DH031,108.0,110.0,1.177,0.1423,2.363
+DH031,110.0,112.0,4.889,0.309,12.543
+DH031,112.0,114.0,9.526,1.0673,16.756
+DH031,114.0,116.0,4.27,0.1511,8.749
+DH031,116.0,118.0,1.013,0.0688,2.612
+DH031,118.0,120.0,0.497,0.317,0.894
+DH031,120.0,122.0,8.602,0.6128,15.866
+DH031,122.0,124.0,9.931,0.2244,22.139
+DH031,124.0,126.0,5.449,0.1086,10.249
+DH031,126.0,128.0,1.853,0.1826,5.448
+DH031,128.0,130.0,3.54,0.0736,8.624
+DH031,130.0,132.0,1.473,0.1219,2.372
+DH031,132.0,134.0,0.054,0.113,0.101
+DH031,134.0,136.0,1.04,0.3042,1.68
+DH031,136.0,138.0,4.136,0.5072,11.881
+DH031,138.0,140.0,0.655,0.317,1.654
+DH031,140.0,142.0,1.319,0.1185,3.804
+DH031,142.0,144.0,0.376,0.0934,0.591
+DH031,144.0,146.0,3.821,0.2658,9.147
+DH031,146.0,148.0,0.736,0.1022,1.298
+DH031,148.0,150.0,0.854,0.1377,2.547
+DH031,150.0,152.0,3.155,0.7657,7.457
+DH031,152.0,154.0,7.584,0.2128,13.485
+DH031,154.0,156.0,0.761,0.1038,1.777
+DH031,156.0,158.0,3.682,0.9794,8.659
+DH031,158.0,160.0,1.244,0.109,2.467
+DH031,160.0,162.0,2.496,0.2234,6.502
+DH031,162.0,164.0,2.275,0.0851,3.417
+DH031,164.0,166.0,10.21,0.3232,25.506
+DH031,166.0,168.0,1.18,0.2354,2.781
+DH031,168.0,170.0,3.885,0.2061,8.825
+DH031,170.0,172.0,0.458,0.124,0.988
+DH031,172.0,174.0,6.113,0.2405,11.391
+DH031,174.0,176.0,4.094,0.1852,11.383
+DH031,176.0,178.0,12.509,0.4132,37.226
+DH031,178.0,180.0,29.971,0.0797,67.197
+DH031,180.0,182.0,0.072,0.4652,0.167
+DH031,182.0,184.0,2.503,0.0837,3.809
+DH031,184.0,186.0,2.778,0.4174,6.395
+DH031,186.0,188.0,4.936,0.202,13.436
+DH031,188.0,190.0,4.75,0.0863,10.404
+DH031,190.0,192.0,9.686,0.3238,16.578
+DH031,192.0,194.0,16.286,0.0604,44.536
+DH031,194.0,196.0,1.257,0.5359,3.56
+DH031,196.0,198.0,0.501,0.15,1.465
+DH031,198.0,200.0,1.729,0.1357,3.048
+DH031,200.0,202.0,4.81,0.9053,14.274
+DH031,202.0,204.0,64.124,0.2626,159.473
+DH031,204.0,206.0,1.318,0.2225,2.272
+DH031,206.0,208.0,0.632,0.1171,0.996
+DH031,208.0,210.0,0.345,0.3175,0.678
+DH031,210.0,212.0,0.703,1.0806,1.767
+DH031,212.0,214.0,0.573,0.1921,0.897
+DH031,214.0,216.0,2.243,0.2527,4.271
+DH031,216.0,218.0,1.918,0.1272,4.102
+DH031,218.0,220.0,1.946,0.1501,3.573
+DH031,220.0,222.0,1.924,0.5345,4.915
+DH031,222.0,224.0,10.435,0.3879,29.351
+DH031,224.0,226.0,2.061,0.1835,4.54
+DH031,226.0,228.0,5.273,0.2713,13.483
+DH031,228.0,230.0,1.934,0.3798,5.699
+DH031,230.0,232.0,0.547,0.0308,1.398
+DH031,232.0,234.0,15.172,0.1203,30.413
+DH031,234.0,236.0,3.325,0.1588,5.989
+DH031,236.0,238.0,47.168,0.2166,105.907
+DH031,238.0,240.0,0.996,0.1943,1.711
+DH031,240.0,242.0,10.618,0.2094,25.596
+DH031,242.0,244.0,1.325,0.3138,3.468
+DH031,244.0,246.0,9.339,0.6373,26.503
+DH031,246.0,248.0,2.211,0.0307,5.091
+DH031,248.0,250.0,8.244,0.4572,12.481
+DH031,250.0,252.0,0.228,0.0151,0.212
+DH031,252.0,254.0,0.062,0.0104,0.054
+DH031,254.0,256.0,0.098,0.0248,0.076
+DH031,256.0,258.0,0.079,0.0062,0.072
+DH031,258.0,260.0,0.087,0.0106,0.089
+DH031,260.0,262.0,0.07,0.0443,0.057
+DH031,262.0,264.0,0.1,0.0106,0.082
+DH031,264.0,266.0,0.097,0.0165,0.097
+DH031,266.0,268.0,0.1,0.0143,0.087
+DH031,268.0,270.0,0.068,0.0174,0.079
+DH031,270.0,272.0,0.094,0.0253,0.063
+DH031,272.0,274.0,0.109,0.0156,0.092
+DH031,274.0,276.0,0.035,0.0079,0.047
+DH031,276.0,278.0,0.022,0.0333,0.019
+DH031,278.0,280.0,0.167,0.0061,0.193
+DH031,280.0,282.0,0.196,0.0262,0.276
+DH031,282.0,284.0,0.026,0.0095,0.015
+DH031,284.0,286.0,0.067,0.0177,0.07
+DH031,286.0,288.0,0.038,0.0225,0.029
+DH031,288.0,290.0,0.098,0.0137,0.097
+DH031,290.0,292.0,0.064,0.0252,0.056
+DH031,292.0,294.0,0.084,0.0287,0.055
+DH031,294.0,296.0,0.085,0.0144,0.123
+DH031,296.0,298.0,0.098,0.0139,0.096
+DH031,298.0,300.0,0.159,0.0126,0.102
+DH031,300.0,302.0,0.337,0.0273,0.373
+DH031,302.0,304.0,0.059,0.0313,0.037
+DH031,304.0,306.0,0.102,0.0503,0.053
+DH031,306.0,308.0,0.083,0.0117,0.111
+DH031,308.0,310.0,0.059,0.0305,0.071
+DH031,310.0,312.0,0.114,0.0133,0.112
+DH031,312.0,314.0,0.081,0.014,0.114
+DH031,314.0,316.0,0.049,0.0278,0.034
+DH031,316.0,318.0,0.07,0.0218,0.042
+DH031,318.0,320.0,0.082,0.0162,0.103
+DH031,320.0,322.0,0.024,0.0101,0.023
+DH031,322.0,324.0,0.054,0.0082,0.069
+DH031,324.0,326.0,0.096,0.0196,0.08
+DH031,326.0,328.0,0.086,0.0237,0.056
+DH031,328.0,330.0,0.107,0.0123,0.135
+DH031,330.0,332.0,0.163,0.0339,0.14
+DH031,332.0,334.0,0.097,0.0186,0.125
+DH031,334.0,336.0,0.028,0.0093,0.028
+DH031,336.0,338.0,0.077,0.0371,0.075
+DH031,338.0,340.0,0.054,0.0276,0.071
+DH031,340.0,342.0,0.124,0.0274,0.089
+DH031,342.0,344.0,0.061,0.0304,0.068
+DH031,344.0,346.0,0.179,0.0181,0.156
+DH031,346.0,348.0,0.024,0.0151,0.025
+DH031,348.0,350.0,0.064,0.0262,0.048
+DH031,350.0,352.0,0.155,0.0202,0.231
+DH031,352.0,354.0,0.085,0.0408,0.057
+DH031,354.0,356.0,0.077,0.0566,0.072
+DH031,356.0,358.0,0.134,0.0215,0.096
+DH031,358.0,360.0,0.13,0.0061,0.101
+DH031,360.0,362.0,0.075,0.0143,0.094
+DH031,362.0,364.0,0.032,0.0074,0.035
+DH031,364.0,366.0,0.108,0.0055,0.126
+DH031,366.0,368.0,0.139,0.0159,0.183
+DH031,368.0,370.0,0.154,0.0093,0.156
+DH031,370.0,372.0,0.063,0.0091,0.036
+DH031,372.0,374.0,0.051,0.0133,0.033
+DH031,374.0,376.0,0.154,0.0237,0.122
+DH031,376.0,378.0,0.07,0.0248,0.097
+DH031,378.0,380.0,0.063,0.0473,0.094
+DH031,380.0,382.0,0.027,0.0222,0.038
+DH031,382.0,384.0,0.035,0.0108,0.034
+DH031,384.0,386.0,0.14,0.0336,0.102
+DH031,386.0,388.0,0.032,0.0092,0.019
+DH031,388.0,390.0,0.178,0.0226,0.135
+DH031,390.0,392.0,0.094,0.0178,0.081
+DH031,392.0,394.0,0.112,0.0167,0.165
+DH031,394.0,396.0,0.116,0.0148,0.118
+DH031,396.0,398.0,0.076,0.0286,0.087
+DH031,398.0,400.0,0.048,0.0215,0.031
+DH031,400.0,402.0,0.112,0.0307,0.062
+DH031,402.0,404.0,0.123,0.0077,0.066
+DH031,404.0,406.0,0.07,0.0378,0.036
+DH031,406.0,408.0,0.118,0.0076,0.063
+DH031,408.0,410.0,0.049,0.0631,0.064
+DH031,410.0,412.0,0.086,0.0195,0.104
+DH031,412.0,414.0,0.06,0.0224,0.061
+DH031,414.0,416.0,0.021,0.0138,0.014
+DH031,416.0,417.0,0.117,0.0337,0.097
+DH032,0.0,2.0,0.177,0.0179,0.108
+DH032,2.0,4.0,0.082,0.0066,0.12
+DH032,4.0,6.0,0.063,0.0152,0.085
+DH032,6.0,8.0,0.217,0.0141,0.134
+DH032,8.0,10.0,0.063,0.0115,0.084
+DH032,10.0,12.0,0.079,0.0177,0.088
+DH032,12.0,14.0,0.062,0.0227,0.06
+DH032,14.0,16.0,0.059,0.0148,0.03
+DH032,16.0,18.0,0.199,0.0158,0.208
+DH032,18.0,20.0,0.426,0.0147,0.22
+DH032,20.0,22.0,0.066,0.0159,0.042
+DH032,22.0,24.0,0.143,0.0224,0.211
+DH032,24.0,26.0,0.154,0.0203,0.141
+DH032,26.0,28.0,0.16,0.0105,0.159
+DH032,28.0,30.0,0.06,0.0154,0.052
+DH032,30.0,32.0,0.04,0.0298,0.054
+DH032,32.0,34.0,0.058,0.0218,0.075
+DH032,34.0,36.0,0.15,0.0555,0.088
+DH032,36.0,38.0,0.071,0.0239,0.05
+DH032,38.0,40.0,0.081,0.0106,0.048
+DH032,40.0,42.0,0.163,0.0342,0.165
+DH032,42.0,44.0,0.096,0.0333,0.119
+DH032,44.0,46.0,0.063,0.0502,0.065
+DH032,46.0,48.0,0.042,0.0194,0.026
+DH032,48.0,50.0,0.018,0.02,0.025
+DH032,50.0,52.0,0.031,0.0191,0.042
+DH032,52.0,54.0,0.081,0.0154,0.09
+DH032,54.0,56.0,0.034,0.013,0.05
+DH032,56.0,58.0,0.094,0.0177,0.116
+DH032,58.0,60.0,0.066,0.0265,0.071
+DH032,60.0,62.0,0.062,0.005,0.057
+DH032,62.0,64.0,0.061,0.0116,0.079
+DH032,64.0,66.0,0.134,0.018,0.078
+DH032,66.0,68.0,0.033,0.0157,0.029
+DH032,68.0,70.0,0.064,0.0109,0.061
+DH032,70.0,72.0,0.105,0.0304,0.07
+DH032,72.0,74.0,0.045,0.0108,0.047
+DH032,74.0,76.0,0.243,0.0225,0.251
+DH032,76.0,78.0,0.073,0.018,0.064
+DH032,78.0,80.0,0.172,0.0209,0.154
+DH032,80.0,82.0,3.187,0.3314,6.846
+DH032,82.0,84.0,0.808,0.5096,2.275
+DH032,84.0,86.0,6.948,0.8327,15.963
+DH032,86.0,88.0,3.422,2.8869,7.136
+DH032,88.0,90.0,0.601,0.1782,1.773
+DH032,90.0,92.0,0.471,0.1222,1.219
+DH032,92.0,94.0,1.606,0.2043,3.888
+DH032,94.0,96.0,0.942,0.0689,1.558
+DH032,96.0,98.0,4.473,0.2745,10.438
+DH032,98.0,100.0,0.554,0.1797,1.116
+DH032,100.0,102.0,0.816,0.1313,1.836
+DH032,102.0,104.0,2.346,0.1663,5.143
+DH032,104.0,106.0,28.168,0.2656,74.333
+DH032,106.0,108.0,6.268,0.3894,18.103
+DH032,108.0,110.0,35.25,0.2188,89.128
+DH032,110.0,112.0,4.313,0.2943,12.927
+DH032,112.0,114.0,1.096,0.4176,1.881
+DH032,114.0,116.0,7.237,0.1879,18.186
+DH032,116.0,118.0,5.357,0.2971,8.346
+DH032,118.0,120.0,11.187,0.4009,16.827
+DH032,120.0,122.0,1.269,0.2986,2.971
+DH032,122.0,124.0,0.329,0.3014,0.859
+DH032,124.0,126.0,0.132,0.261,0.309
+DH032,126.0,128.0,4.469,0.424,11.361
+DH032,128.0,130.0,0.639,0.0529,1.376
+DH032,130.0,132.0,5.174,0.5682,11.27
+DH032,132.0,134.0,5.839,0.0671,15.108
+DH032,134.0,136.0,2.589,0.3793,6.309
+DH032,136.0,138.0,4.561,0.1841,9.315
+DH032,138.0,140.0,0.74,0.1287,2.05
+DH032,140.0,142.0,5.519,0.5434,13.659
+DH032,142.0,144.0,2.221,0.3904,6.344
+DH032,144.0,146.0,1.569,0.1301,4.702
+DH032,146.0,148.0,0.83,0.156,1.252
+DH032,148.0,150.0,0.83,0.2805,1.262
+DH032,150.0,152.0,1.795,0.1151,3.432
+DH032,152.0,154.0,1.214,0.2316,3.322
+DH032,154.0,156.0,0.495,1.2697,1.119
+DH032,156.0,158.0,3.648,0.1222,10.249
+DH032,158.0,160.0,1.914,0.1628,3.732
+DH032,160.0,162.0,1.613,0.3118,2.816
+DH032,162.0,164.0,2.122,0.1263,3.692
+DH032,164.0,166.0,1.28,0.3225,2.96
+DH032,166.0,168.0,5.792,0.2229,15.597
+DH032,168.0,170.0,1.818,0.0554,4.811
+DH032,170.0,172.0,1.419,0.0972,3.839
+DH032,172.0,174.0,2.617,0.0901,4.349
+DH032,174.0,176.0,14.26,0.0619,29.783
+DH032,176.0,178.0,0.549,0.1223,1.354
+DH032,178.0,180.0,0.68,0.3532,1.495
+DH032,180.0,182.0,6.111,0.5065,9.688
+DH032,182.0,184.0,1.662,0.3243,3.26
+DH032,184.0,186.0,18.247,0.5248,28.416
+DH032,186.0,188.0,52.474,0.241,120.661
+DH032,188.0,190.0,2.753,0.1073,7.829
+DH032,190.0,192.0,0.28,0.1461,0.486
+DH032,192.0,194.0,6.956,0.5427,12.586
+DH032,194.0,196.0,26.876,0.2513,72.309
+DH032,196.0,198.0,0.319,0.1359,0.687
+DH032,198.0,200.0,2.728,0.2432,6.268
+DH032,200.0,202.0,0.394,0.2065,0.708
+DH032,202.0,204.0,8.199,0.2019,17.854
+DH032,204.0,206.0,0.491,0.1026,1.012
+DH032,206.0,208.0,4.453,0.1771,11.718
+DH032,208.0,210.0,0.845,0.2784,1.445
+DH032,210.0,212.0,2.279,0.0882,3.982
+DH032,212.0,214.0,1.179,0.1014,3.072
+DH032,214.0,216.0,30.074,1.0556,88.535
+DH032,216.0,218.0,1.618,0.2109,2.799
+DH032,218.0,220.0,1.344,0.6409,2.702
+DH032,220.0,222.0,1.561,0.4235,3.736
+DH032,222.0,224.0,1.668,0.3588,4.632
+DH032,224.0,226.0,0.471,0.0747,1.124
+DH032,226.0,228.0,0.352,0.069,1.023
+DH032,228.0,230.0,9.779,0.1738,20.273
+DH032,230.0,232.0,0.707,0.3704,1.987
+DH032,232.0,234.0,0.767,0.8867,2.127
+DH032,234.0,236.0,2.271,0.3073,3.968
+DH032,236.0,238.0,20.667,0.3383,36.372
+DH032,238.0,240.0,1.342,0.4366,2.642
+DH032,240.0,242.0,2.537,2.2403,6.594
+DH032,242.0,244.0,2.944,0.2773,4.472
+DH032,244.0,246.0,1.741,0.2401,5.142
+DH032,246.0,248.0,2.905,0.1511,8.63
+DH032,248.0,250.0,1.645,0.3519,4.315
+DH032,250.0,252.0,0.066,0.0131,0.088
+DH032,252.0,254.0,0.127,0.0226,0.071
+DH032,254.0,256.0,0.052,0.0426,0.032
+DH032,256.0,258.0,0.121,0.0114,0.147
+DH032,258.0,260.0,0.054,0.0113,0.063
+DH032,260.0,262.0,0.059,0.0224,0.031
+DH032,262.0,264.0,0.043,0.0181,0.03
+DH032,264.0,266.0,0.121,0.0277,0.076
+DH032,266.0,268.0,0.097,0.044,0.097
+DH032,268.0,270.0,0.047,0.0245,0.045
+DH032,270.0,272.0,0.072,0.0136,0.04
+DH032,272.0,274.0,0.071,0.0287,0.079
+DH032,274.0,276.0,0.143,0.0217,0.181
+DH032,276.0,278.0,0.02,0.022,0.017
+DH032,278.0,280.0,0.026,0.0169,0.014
+DH032,280.0,282.0,0.063,0.0395,0.088
+DH032,282.0,284.0,0.071,0.0366,0.095
+DH032,284.0,286.0,0.112,0.0124,0.116
+DH032,286.0,288.0,0.034,0.0179,0.05
+DH032,288.0,290.0,0.067,0.0209,0.083
+DH032,290.0,292.0,0.038,0.0142,0.025
+DH032,292.0,294.0,0.061,0.016,0.091
+DH032,294.0,296.0,0.034,0.014,0.03
+DH032,296.0,298.0,0.068,0.0194,0.053
+DH032,298.0,300.0,0.124,0.0133,0.121
+DH032,300.0,302.0,0.176,0.0222,0.251
+DH032,302.0,304.0,0.097,0.0312,0.144
+DH032,304.0,306.0,0.095,0.0311,0.102
+DH032,306.0,308.0,0.08,0.0155,0.064
+DH032,308.0,310.0,0.216,0.0208,0.145
+DH032,310.0,312.0,0.038,0.0417,0.02
+DH032,312.0,314.0,0.107,0.0154,0.113
+DH032,314.0,316.0,0.045,0.0222,0.06
+DH032,316.0,318.0,0.066,0.0133,0.057
+DH032,318.0,320.0,0.067,0.0117,0.093
+DH032,320.0,322.0,0.082,0.0443,0.065
+DH032,322.0,324.0,0.1,0.0235,0.059
+DH032,324.0,326.0,0.108,0.0211,0.064
+DH032,326.0,328.0,0.019,0.0521,0.016
+DH032,328.0,330.0,0.094,0.009,0.137
+DH032,330.0,332.0,0.054,0.0239,0.074
+DH032,332.0,334.0,0.312,0.0089,0.313
+DH032,334.0,336.0,0.023,0.0179,0.022
+DH032,336.0,338.0,0.162,0.0148,0.2
+DH032,338.0,340.0,0.044,0.0159,0.035
+DH032,340.0,342.0,0.111,0.022,0.06
+DH032,342.0,344.0,0.096,0.0255,0.082
+DH032,344.0,346.0,0.104,0.0409,0.154
+DH032,346.0,348.0,0.11,0.0257,0.091
+DH032,348.0,350.0,0.127,0.0193,0.074
+DH032,350.0,352.0,0.053,0.0151,0.076
+DH032,352.0,354.0,0.2,0.0229,0.285
+DH032,354.0,356.0,0.097,0.0327,0.105
+DH032,356.0,358.0,0.047,0.0038,0.048
+DH032,358.0,360.0,0.048,0.025,0.069
+DH032,360.0,362.0,0.16,0.0438,0.118
+DH032,362.0,364.0,0.235,0.0365,0.136
+DH032,364.0,366.0,0.08,0.0096,0.12
+DH032,366.0,368.0,0.085,0.0339,0.121
+DH032,368.0,370.0,0.146,0.0054,0.19
+DH032,370.0,372.0,0.077,0.0231,0.043
+DH032,372.0,374.0,0.043,0.0255,0.026
+DH032,374.0,376.0,0.335,0.0261,0.218
+DH032,376.0,378.0,0.038,0.0457,0.033
+DH032,378.0,380.0,0.081,0.0081,0.07
+DH032,380.0,382.0,0.12,0.0219,0.147
+DH032,382.0,384.0,0.12,0.0084,0.069
+DH032,384.0,386.0,0.093,0.0145,0.077
+DH032,386.0,388.0,0.101,0.0355,0.065
+DH032,388.0,390.0,0.089,0.0159,0.068
+DH032,390.0,392.0,0.227,0.0142,0.311
+DH032,392.0,394.0,0.048,0.0065,0.043
+DH032,394.0,396.0,0.103,0.0173,0.058
+DH032,396.0,398.0,0.099,0.0209,0.07
+DH032,398.0,400.0,0.036,0.0161,0.021
+DH032,400.0,402.0,0.105,0.0118,0.106
+DH032,402.0,404.0,0.14,0.0102,0.14
+DH032,404.0,406.0,0.183,0.0097,0.107
+DH032,406.0,408.0,0.217,0.0164,0.176
+DH032,408.0,410.0,0.153,0.0167,0.185
+DH032,410.0,412.0,0.077,0.0232,0.081
+DH032,412.0,414.0,0.048,0.016,0.033
+DH032,414.0,416.0,0.079,0.0085,0.099
+DH032,416.0,418.0,0.072,0.0316,0.087
+DH033,0.0,2.0,0.076,0.0236,0.039
+DH033,2.0,4.0,0.04,0.0056,0.025
+DH033,4.0,6.0,0.095,0.0328,0.078
+DH033,6.0,8.0,0.117,0.0156,0.101
+DH033,8.0,10.0,0.194,0.0191,0.265
+DH033,10.0,12.0,0.033,0.0082,0.04
+DH033,12.0,14.0,0.05,0.0509,0.041
+DH033,14.0,16.0,0.213,0.0285,0.238
+DH033,16.0,18.0,0.03,0.0387,0.033
+DH033,18.0,20.0,0.212,0.0256,0.107
+DH033,20.0,22.0,0.107,0.0231,0.133
+DH033,22.0,24.0,0.076,0.0374,0.071
+DH033,24.0,26.0,0.09,0.0136,0.079
+DH033,26.0,28.0,0.024,0.0229,0.014
+DH033,28.0,30.0,0.05,0.0298,0.025
+DH033,30.0,32.0,0.059,0.0296,0.063
+DH033,32.0,34.0,0.138,0.0068,0.142
+DH033,34.0,36.0,0.084,0.014,0.126
+DH033,36.0,38.0,0.045,0.0176,0.065
+DH033,38.0,40.0,0.115,0.023,0.089
+DH033,40.0,42.0,0.062,0.0158,0.055
+DH033,42.0,44.0,0.074,0.0319,0.102
+DH033,44.0,46.0,0.103,0.0091,0.15
+DH033,46.0,48.0,0.058,0.0109,0.07
+DH033,48.0,50.0,0.125,0.0299,0.176
+DH033,50.0,52.0,0.078,0.0159,0.095
+DH033,52.0,54.0,0.162,0.0177,0.238
+DH033,54.0,56.0,0.073,0.0091,0.108
+DH033,56.0,58.0,0.03,0.0149,0.031
+DH033,58.0,60.0,0.124,0.0181,0.069
+DH033,60.0,62.0,0.084,0.0184,0.069
+DH033,62.0,64.0,0.193,0.0085,0.102
+DH033,64.0,66.0,0.074,0.0271,0.083
+DH033,66.0,68.0,0.083,0.016,0.088
+DH033,68.0,70.0,0.082,0.049,0.089
+DH033,70.0,72.0,0.083,0.017,0.096
+DH033,72.0,74.0,0.058,0.0197,0.029
+DH033,74.0,76.0,0.1,0.0218,0.103
+DH033,76.0,78.0,0.087,0.0401,0.089
+DH033,78.0,80.0,0.392,0.0188,0.567
+DH033,80.0,82.0,0.931,0.6843,1.559
+DH033,82.0,84.0,3.846,0.1806,10.977
+DH033,84.0,86.0,1.679,0.1187,3.213
+DH033,86.0,88.0,14.153,0.3243,37.127
+DH033,88.0,90.0,8.285,0.1093,21.503
+DH033,90.0,92.0,4.322,0.3653,11.26
+DH033,92.0,94.0,0.823,0.3637,1.836
+DH033,94.0,96.0,1.028,0.1229,1.774
+DH033,96.0,98.0,3.286,0.0722,8.31
+DH033,98.0,100.0,0.411,0.6279,0.952
+DH033,100.0,102.0,22.104,0.381,34.098
+DH033,102.0,104.0,0.853,0.2701,1.286
+DH033,104.0,106.0,9.238,0.1062,15.328
+DH033,106.0,108.0,10.275,0.1896,22.981
+DH033,108.0,110.0,0.87,0.263,2.103
+DH033,110.0,112.0,20.407,0.0597,59.104
+DH033,112.0,114.0,1.039,0.6427,3.049
+DH033,114.0,116.0,2.577,0.5042,6.408
+DH033,116.0,118.0,3.695,0.8364,9.872
+DH033,118.0,120.0,0.887,0.3251,2.079
+DH033,120.0,122.0,2.541,0.4979,3.901
+DH033,122.0,124.0,2.594,0.3011,5.766
+DH033,124.0,126.0,1.574,0.8111,3.108
+DH033,126.0,128.0,1.545,0.3404,2.734
+DH033,128.0,130.0,5.635,0.3965,15.524
+DH033,130.0,132.0,0.112,0.6189,0.192
+DH033,132.0,134.0,2.169,0.3889,4.032
+DH033,134.0,136.0,12.137,0.4818,32.79
+DH033,136.0,138.0,0.897,0.0331,1.735
+DH033,138.0,140.0,8.418,0.5782,16.77
+DH033,140.0,142.0,1.85,0.1421,2.943
+DH033,142.0,144.0,1.829,0.1021,4.762
+DH033,144.0,146.0,0.466,0.1906,0.767
+DH033,146.0,148.0,3.177,0.2227,9.322
+DH033,148.0,150.0,0.727,0.2236,1.684
+DH033,150.0,152.0,1.888,1.0682,5.046
+DH033,152.0,154.0,4.218,0.1539,8.197
+DH033,154.0,156.0,2.165,1.6539,4.776
+DH033,156.0,158.0,3.434,0.115,8.339
+DH033,158.0,160.0,0.863,1.4987,1.814
+DH033,160.0,162.0,15.944,0.1689,38.427
+DH033,162.0,164.0,0.588,0.3065,1.363
+DH033,164.0,166.0,2.198,0.146,5.768
+DH033,166.0,168.0,0.187,0.4732,0.498
+DH033,168.0,170.0,3.22,0.2609,6.094
+DH033,170.0,172.0,0.773,0.1585,1.284
+DH033,172.0,174.0,8.457,0.5048,24.899
+DH033,174.0,176.0,0.396,0.5364,0.798
+DH033,176.0,178.0,2.624,0.1659,4.883
+DH033,178.0,180.0,6.302,0.5763,17.187
+DH033,180.0,182.0,0.891,0.6022,1.801
+DH033,182.0,184.0,18.819,0.2045,44.29
+DH033,184.0,186.0,2.349,0.1638,5.283
+DH033,186.0,188.0,0.282,0.4532,0.791
+DH033,188.0,190.0,2.777,0.1549,7.819
+DH033,190.0,192.0,1.335,0.7213,3.358
+DH033,192.0,194.0,1.994,0.1063,3.712
+DH033,194.0,196.0,2.622,0.2011,6.743
+DH033,196.0,198.0,1.207,0.1729,3.194
+DH033,198.0,200.0,0.458,0.2872,0.897
+DH033,200.0,202.0,1.122,0.127,2.997
+DH033,202.0,204.0,0.813,0.2719,1.694
+DH033,204.0,206.0,2.358,1.4667,4.951
+DH033,206.0,208.0,4.599,0.3965,12.982
+DH033,208.0,210.0,3.091,0.2269,7.61
+DH033,210.0,212.0,1.101,0.1503,3.104
+DH033,212.0,214.0,0.209,0.7385,0.43
+DH033,214.0,216.0,2.73,0.38,6.021
+DH033,216.0,218.0,0.454,0.4689,1.223
+DH033,218.0,220.0,34.774,0.1919,96.379
+DH033,220.0,222.0,1.797,1.2935,3.799
+DH033,222.0,224.0,9.008,0.3684,18.968
+DH033,224.0,226.0,2.929,0.1309,8.778
+DH033,226.0,228.0,8.079,0.1509,18.975
+DH033,228.0,230.0,3.394,0.5829,7.556
+DH033,230.0,232.0,0.116,0.3649,0.331
+DH033,232.0,234.0,9.007,0.3581,26.281
+DH033,234.0,236.0,1.605,0.1075,3.719
+DH033,236.0,238.0,0.257,0.1391,0.429
+DH033,238.0,240.0,0.396,0.2449,1.095
+DH033,240.0,242.0,2.142,0.1497,4.539
+DH033,242.0,244.0,1.521,0.1156,2.856
+DH033,244.0,246.0,0.358,0.391,0.896
+DH033,246.0,248.0,3.496,0.4537,10.171
+DH033,248.0,250.0,5.806,0.0427,10.388
+DH033,250.0,252.0,0.159,0.0236,0.234
+DH033,252.0,254.0,0.228,0.0213,0.318
+DH033,254.0,256.0,0.046,0.0144,0.049
+DH033,256.0,258.0,0.058,0.0116,0.081
+DH033,258.0,260.0,0.227,0.0292,0.146
+DH033,260.0,262.0,0.151,0.0218,0.151
+DH033,262.0,264.0,0.077,0.0166,0.053
+DH033,264.0,266.0,0.089,0.0127,0.083
+DH033,266.0,268.0,0.099,0.0227,0.12
+DH033,268.0,270.0,0.042,0.0342,0.029
+DH033,270.0,272.0,0.025,0.0358,0.022
+DH033,272.0,274.0,0.092,0.0324,0.079
+DH033,274.0,276.0,0.15,0.0207,0.186
+DH033,276.0,278.0,0.024,0.0284,0.02
+DH033,278.0,280.0,0.05,0.016,0.059
+DH033,280.0,282.0,0.058,0.0314,0.052
+DH033,282.0,284.0,0.072,0.0692,0.058
+DH033,284.0,286.0,0.114,0.0108,0.129
+DH033,286.0,288.0,0.09,0.0279,0.083
+DH033,288.0,290.0,0.066,0.0159,0.073
+DH033,290.0,292.0,0.12,0.0211,0.089
+DH033,292.0,294.0,0.051,0.0228,0.026
+DH033,294.0,296.0,0.073,0.033,0.077
+DH033,296.0,298.0,0.192,0.0221,0.234
+DH033,298.0,300.0,0.064,0.0166,0.094
+DH033,300.0,302.0,0.136,0.0158,0.18
+DH033,302.0,304.0,0.073,0.013,0.052
+DH033,304.0,306.0,0.13,0.0125,0.188
+DH034,0.0,2.0,0.051,0.0139,0.052
+DH034,2.0,4.0,0.16,0.0113,0.159
+DH034,4.0,6.0,0.047,0.0091,0.04
+DH034,6.0,8.0,0.181,0.0167,0.218
+DH034,8.0,10.0,0.105,0.0196,0.125
+DH034,10.0,12.0,0.019,0.012,0.028
+DH034,12.0,14.0,0.25,0.0161,0.145
+DH034,14.0,16.0,0.097,0.0228,0.139
+DH034,16.0,18.0,0.018,0.0888,0.017
+DH034,18.0,20.0,0.073,0.0128,0.089
+DH034,20.0,22.0,0.11,0.0192,0.105
+DH034,22.0,24.0,0.077,0.0224,0.095
+DH034,24.0,26.0,0.101,0.0212,0.097
+DH034,26.0,28.0,0.031,0.0123,0.024
+DH034,28.0,30.0,0.053,0.015,0.046
+DH034,30.0,32.0,0.075,0.0073,0.04
+DH034,32.0,34.0,0.085,0.0187,0.122
+DH034,34.0,36.0,0.109,0.0171,0.091
+DH034,36.0,38.0,0.063,0.0134,0.049
+DH034,38.0,40.0,0.124,0.0224,0.115
+DH034,40.0,42.0,0.065,0.0389,0.085
+DH034,42.0,44.0,0.088,0.0248,0.07
+DH034,44.0,46.0,0.023,0.0135,0.016
+DH034,46.0,48.0,0.086,0.0171,0.127
+DH034,48.0,50.0,0.025,0.0373,0.023
+DH034,50.0,52.0,0.063,0.0131,0.039
+DH034,52.0,54.0,0.139,0.0113,0.111
+DH034,54.0,56.0,0.075,0.0135,0.076
+DH034,56.0,58.0,0.051,0.0095,0.028
+DH034,58.0,60.0,0.072,0.0249,0.095
+DH034,60.0,62.0,0.114,0.0066,0.077
+DH034,62.0,64.0,0.116,0.0097,0.148
+DH034,64.0,66.0,0.036,0.0185,0.035
+DH034,66.0,68.0,0.131,0.0073,0.141
+DH034,68.0,70.0,0.245,0.0742,0.232
+DH034,70.0,72.0,0.036,0.0228,0.025
+DH034,72.0,74.0,0.073,0.0309,0.077
+DH034,74.0,76.0,0.103,0.0053,0.096
+DH034,76.0,78.0,0.082,0.0153,0.097
+DH034,78.0,80.0,0.061,0.0216,0.039
+DH034,80.0,82.0,2.394,0.4007,3.663
+DH034,82.0,84.0,11.37,0.1011,29.34
+DH034,84.0,86.0,8.463,0.1678,22.664
+DH034,86.0,88.0,2.852,0.3602,4.609
+DH034,88.0,90.0,0.445,0.3166,0.983
+DH034,90.0,92.0,1.799,0.714,3.308
+DH034,92.0,94.0,0.327,0.2662,0.846
+DH034,94.0,96.0,3.289,0.0486,8.441
+DH034,96.0,98.0,2.503,0.0869,3.787
+DH034,98.0,100.0,2.816,0.1508,6.752
+DH034,100.0,102.0,4.52,0.5882,11.425
+DH034,102.0,104.0,1.859,0.191,5.313
+DH034,104.0,106.0,5.04,0.1326,8.327
+DH034,106.0,108.0,0.909,0.2649,2.629
+DH034,108.0,110.0,1.296,1.2686,2.785
+DH034,110.0,112.0,1.544,0.1312,2.322
+DH034,112.0,114.0,1.971,0.0911,5.331
+DH034,114.0,116.0,4.626,0.5074,9.549
+DH034,116.0,118.0,2.389,0.1672,7.034
+DH034,118.0,120.0,0.738,0.0642,2.153
+DH034,120.0,122.0,6.585,0.1589,17.479
+DH034,122.0,124.0,1.435,0.604,3.227
+DH034,124.0,126.0,3.641,0.1062,9.683
+DH034,126.0,128.0,2.05,0.2356,5.082
+DH034,128.0,130.0,2.384,0.4208,6.271
+DH034,130.0,132.0,18.052,0.2312,53.962
+DH034,132.0,134.0,4.787,0.3053,10.785
+DH034,134.0,136.0,1.63,0.0411,3.3
+DH034,136.0,138.0,16.071,0.1397,46.474
+DH034,138.0,140.0,0.325,0.0966,0.69
+DH034,140.0,142.0,1.968,0.3431,4.82
+DH034,142.0,144.0,2.659,0.189,5.612
+DH034,144.0,146.0,0.531,0.6853,0.978
+DH034,146.0,148.0,0.64,0.0922,1.581
+DH034,148.0,150.0,3.349,0.1929,7.677
+DH034,150.0,152.0,2.098,0.2036,3.815
+DH034,152.0,154.0,1.185,0.8286,2.384
+DH034,154.0,156.0,4.075,0.0478,11.495
+DH034,156.0,158.0,1.2,0.2267,1.96
+DH034,158.0,160.0,5.515,0.4907,10.17
+DH034,160.0,162.0,1.407,0.0956,3.742
+DH034,162.0,164.0,18.307,0.2359,52.967
+DH034,164.0,166.0,1.679,0.1492,3.604
+DH034,166.0,168.0,1.96,0.3081,4.558
+DH034,168.0,170.0,3.377,0.3486,9.165
+DH034,170.0,172.0,0.743,0.2157,2.093
+DH034,172.0,174.0,1.189,0.2706,2.857
+DH034,174.0,176.0,9.254,0.6906,27.499
+DH034,176.0,178.0,0.551,0.177,1.456
+DH034,178.0,180.0,1.672,0.1434,2.575
+DH034,180.0,182.0,3.975,0.077,11.108
+DH034,182.0,184.0,2.282,0.5172,5.728
+DH034,184.0,186.0,4.434,0.2417,7.195
+DH034,186.0,188.0,1.754,0.772,4.889
+DH034,188.0,190.0,6.954,0.2454,18.766
+DH034,190.0,192.0,23.161,0.9792,64.806
+DH034,192.0,194.0,2.751,0.3924,5.879
+DH034,194.0,196.0,13.717,0.6352,36.279
+DH034,196.0,198.0,34.21,0.4721,54.372
+DH034,198.0,200.0,1.147,0.6033,3.301
+DH034,200.0,202.0,1.361,0.1842,3.148
+DH034,202.0,204.0,1.764,0.0778,3.174
+DH034,204.0,206.0,1.37,1.1229,3.966
+DH034,206.0,208.0,10.182,0.3696,23.8
+DH034,208.0,210.0,4.412,0.2693,13.058
+DH034,210.0,212.0,43.955,0.1798,93.966
+DH034,212.0,214.0,2.212,0.3345,5.402
+DH034,214.0,216.0,0.167,0.1901,0.274
+DH034,216.0,218.0,0.888,0.4662,1.695
+DH034,218.0,220.0,1.769,0.4605,2.912
+DH034,220.0,222.0,3.686,0.5029,6.983
+DH034,222.0,224.0,0.309,0.1649,0.519
+DH034,224.0,226.0,4.898,0.457,10.567
+DH034,226.0,228.0,4.002,0.484,10.475
+DH034,228.0,230.0,1.956,0.0719,4.097
+DH034,230.0,232.0,15.479,0.535,27.341
+DH034,232.0,234.0,1.79,0.1008,3.391
+DH034,234.0,236.0,8.439,0.3097,17.223
+DH034,236.0,238.0,2.523,0.0483,6.847
+DH034,238.0,240.0,0.969,0.0839,1.776
+DH034,240.0,242.0,4.355,0.2687,10.453
+DH034,242.0,244.0,4.768,0.1332,14.013
+DH034,244.0,245.0,1.579,0.6147,4.465
+DH035,0.0,2.0,0.103,0.0089,0.129
+DH035,2.0,4.0,0.079,0.011,0.071
+DH035,4.0,6.0,0.107,0.0183,0.078
+DH035,6.0,8.0,0.07,0.0145,0.064
+DH035,8.0,10.0,0.086,0.0149,0.057
+DH035,10.0,12.0,0.085,0.0296,0.098
+DH035,12.0,14.0,0.193,0.0323,0.211
+DH035,14.0,16.0,0.187,0.04,0.269
+DH035,16.0,18.0,0.121,0.0337,0.089
+DH035,18.0,20.0,0.052,0.0254,0.033
+DH035,20.0,22.0,0.249,0.0092,0.296
+DH035,22.0,24.0,0.028,0.0197,0.02
+DH035,24.0,26.0,0.08,0.0193,0.064
+DH035,26.0,28.0,0.077,0.022,0.079
+DH035,28.0,30.0,0.049,0.0175,0.034
+DH035,30.0,32.0,0.143,0.0351,0.097
+DH035,32.0,34.0,0.102,0.0267,0.1
+DH035,34.0,36.0,0.056,0.0172,0.056
+DH035,36.0,38.0,0.105,0.0309,0.135
+DH035,38.0,40.0,0.107,0.0134,0.144
+DH035,40.0,42.0,0.282,0.0111,0.343
+DH035,42.0,44.0,0.093,0.0209,0.079
+DH035,44.0,46.0,0.273,0.0124,0.339
+DH035,46.0,48.0,0.216,0.0293,0.194
+DH035,48.0,50.0,0.058,0.0322,0.086
+DH035,50.0,52.0,0.092,0.0137,0.047
+DH035,52.0,54.0,0.221,0.0106,0.29
+DH035,54.0,56.0,0.056,0.0149,0.07
+DH035,56.0,58.0,0.146,0.0231,0.128
+DH035,58.0,60.0,0.097,0.025,0.092
+DH035,60.0,62.0,0.156,0.0121,0.141
+DH035,62.0,64.0,0.101,0.0176,0.134
+DH035,64.0,66.0,0.089,0.0158,0.077
+DH035,66.0,68.0,0.126,0.0213,0.167
+DH035,68.0,70.0,0.054,0.0543,0.039
+DH035,70.0,72.0,0.088,0.0159,0.08
+DH035,72.0,74.0,0.063,0.0125,0.084
+DH035,74.0,76.0,0.04,0.03,0.032
+DH035,76.0,78.0,0.065,0.0239,0.034
+DH035,78.0,80.0,0.042,0.0106,0.06
+DH035,80.0,82.0,4.592,0.2708,7.982
+DH035,82.0,84.0,1.771,0.172,3.269
+DH035,84.0,86.0,2.395,0.3389,4.962
+DH035,86.0,88.0,18.597,0.0999,49.651
+DH035,88.0,90.0,2.611,0.2712,5.729
+DH035,90.0,92.0,4.587,0.2722,9.362
+DH035,92.0,94.0,1.935,0.1169,3.133
+DH035,94.0,96.0,0.447,0.3113,1.172
+DH035,96.0,98.0,3.059,0.0397,7.576
+DH035,98.0,100.0,1.762,0.0925,2.717
+DH035,100.0,102.0,6.396,0.1307,14.093
+DH035,102.0,104.0,0.199,0.131,0.533
+DH035,104.0,106.0,1.198,0.1292,3.461
+DH035,106.0,108.0,3.878,0.2618,6.885
+DH035,108.0,110.0,1.013,0.093,2.838
+DH035,110.0,112.0,1.095,0.0432,2.511
+DH035,112.0,114.0,8.38,0.4235,21.269
+DH035,114.0,116.0,2.606,0.7111,5.709
+DH035,116.0,118.0,0.699,0.5485,1.444
+DH035,118.0,120.0,0.995,0.347,2.506
+DH035,120.0,122.0,0.815,0.1117,1.398
+DH035,122.0,124.0,2.849,0.7508,5.516
+DH035,124.0,126.0,1.539,0.7059,2.717
+DH035,126.0,128.0,2.648,0.064,5.289
+DH035,128.0,130.0,0.628,0.2297,1.675
+DH035,130.0,132.0,15.233,0.0635,41.678
+DH035,132.0,134.0,2.985,0.3386,6.65
+DH035,134.0,136.0,0.277,0.1807,0.557
+DH035,136.0,138.0,21.441,0.1602,40.779
+DH035,138.0,140.0,0.815,0.3703,1.462
+DH035,140.0,142.0,10.047,0.218,18.168
+DH035,142.0,144.0,2.248,0.6734,5.864
+DH035,144.0,146.0,0.252,0.1673,0.535
+DH035,146.0,148.0,0.25,0.2686,0.497
+DH035,148.0,150.0,20.736,0.0768,32.428
+DH035,150.0,152.0,7.101,0.3381,20.991
+DH035,152.0,154.0,0.62,0.2412,1.753
+DH035,154.0,156.0,1.137,0.6271,2.448
+DH035,156.0,158.0,0.229,0.1865,0.484
+DH035,158.0,160.0,3.355,0.2915,6.706
+DH035,160.0,162.0,0.584,0.159,1.182
+DH035,162.0,164.0,0.21,0.2137,0.465
+DH035,164.0,166.0,9.553,0.3784,25.912
+DH035,166.0,168.0,0.638,0.6693,1.67
+DH035,168.0,170.0,0.566,0.3043,1.473
+DH035,170.0,172.0,2.852,0.3149,7.423
+DH035,172.0,174.0,3.745,0.136,8.806
+DH035,174.0,176.0,0.82,0.4633,1.235
+DH035,176.0,178.0,3.599,0.0537,6.028
+DH035,178.0,180.0,0.367,0.9018,0.884
+DH035,180.0,182.0,5.359,0.1335,9.211
+DH035,182.0,184.0,2.109,0.8311,4.815
+DH035,184.0,186.0,3.533,0.6296,8.854
+DH035,186.0,188.0,8.021,0.4589,17.148
+DH035,188.0,190.0,1.848,0.1573,4.646
+DH035,190.0,192.0,0.845,0.1071,2.41
+DH035,192.0,194.0,1.692,0.3151,3.331
+DH035,194.0,196.0,0.624,0.0933,1.19
+DH035,196.0,198.0,0.878,0.1103,2.376
+DH035,198.0,200.0,0.353,1.1258,0.653
+DH035,200.0,202.0,5.156,0.4911,10.45
+DH035,202.0,204.0,4.666,0.8432,10.2
+DH035,204.0,206.0,1.845,0.1128,4.828
+DH035,206.0,208.0,1.007,0.998,1.59
+DH035,208.0,210.0,24.052,1.1837,49.559
+DH035,210.0,212.0,1.239,1.0247,3.015
+DH035,212.0,214.0,3.288,0.2678,5.009
+DH035,214.0,216.0,2.226,0.2515,5.631
+DH035,216.0,218.0,1.273,0.0741,3.66
+DH035,218.0,220.0,0.969,0.1393,2.013
+DH035,220.0,222.0,1.424,0.5423,4.137
+DH035,222.0,224.0,8.958,0.2631,20.284
+DH035,224.0,226.0,2.691,0.0794,6.23
+DH035,226.0,228.0,6.166,0.493,14.9
+DH035,228.0,230.0,0.36,0.1452,0.656
+DH035,230.0,232.0,2.901,0.1201,5.281
+DH035,232.0,234.0,0.979,0.1223,2.684
+DH035,234.0,236.0,7.501,0.0963,12.022
+DH035,236.0,238.0,4.859,0.0868,8.289
+DH035,238.0,240.0,3.35,0.2543,9.262
+DH035,240.0,242.0,2.605,0.3712,6.831
+DH035,242.0,244.0,0.997,0.1442,2.274
+DH035,244.0,246.0,3.156,0.2411,6.161
+DH035,246.0,248.0,0.577,0.3065,1.285
+DH035,248.0,250.0,1.874,0.8749,5.216
+DH035,250.0,252.0,0.069,0.0097,0.088
+DH035,252.0,254.0,0.154,0.0199,0.174
+DH035,254.0,256.0,0.182,0.0216,0.195
+DH035,256.0,258.0,0.126,0.0043,0.143
+DH035,258.0,260.0,0.043,0.0121,0.051
+DH035,260.0,262.0,0.066,0.0472,0.09
+DH035,262.0,264.0,0.043,0.0268,0.028
+DH035,264.0,266.0,0.099,0.0173,0.05
+DH035,266.0,268.0,0.068,0.02,0.082
+DH035,268.0,270.0,0.216,0.0166,0.305
+DH035,270.0,272.0,0.06,0.0382,0.078
+DH035,272.0,274.0,0.026,0.0069,0.031
+DH035,274.0,276.0,0.094,0.018,0.077
+DH035,276.0,278.0,0.074,0.0368,0.079
+DH035,278.0,280.0,0.086,0.0325,0.063
+DH035,280.0,282.0,0.078,0.0196,0.095
+DH035,282.0,284.0,0.029,0.0161,0.024
+DH035,284.0,286.0,0.109,0.0331,0.156
+DH035,286.0,288.0,0.079,0.0257,0.071
+DH035,288.0,290.0,0.09,0.0273,0.102
+DH035,290.0,292.0,0.102,0.0296,0.144
+DH035,292.0,294.0,0.172,0.0587,0.143
+DH035,294.0,296.0,0.062,0.0237,0.081
+DH035,296.0,298.0,0.119,0.0387,0.145
+DH035,298.0,300.0,0.204,0.0462,0.212
+DH035,300.0,302.0,0.117,0.0162,0.073
+DH035,302.0,304.0,0.125,0.0251,0.15
+DH035,304.0,306.0,0.12,0.0287,0.079
+DH035,306.0,308.0,0.044,0.0278,0.059
+DH035,308.0,310.0,0.081,0.0388,0.066
+DH035,310.0,312.0,0.081,0.0133,0.099
+DH035,312.0,314.0,0.22,0.0174,0.242
+DH035,314.0,316.0,0.221,0.018,0.17
+DH035,316.0,318.0,0.127,0.012,0.161
+DH035,318.0,320.0,0.297,0.0143,0.35
+DH035,320.0,322.0,0.112,0.0169,0.129
+DH035,322.0,324.0,0.235,0.0242,0.196
+DH035,324.0,326.0,0.214,0.0158,0.157
+DH035,326.0,328.0,0.237,0.0196,0.189
+DH035,328.0,330.0,0.052,0.0222,0.031
+DH035,330.0,332.0,0.085,0.0132,0.069
+DH035,332.0,334.0,0.068,0.0058,0.039
+DH035,334.0,336.0,0.131,0.0218,0.107
+DH035,336.0,338.0,0.114,0.0118,0.162
+DH035,338.0,340.0,0.077,0.0156,0.089
+DH035,340.0,342.0,0.381,0.0125,0.491
+DH035,342.0,344.0,0.131,0.0113,0.189
+DH035,344.0,346.0,0.057,0.0268,0.052
+DH035,346.0,348.0,0.071,0.0289,0.059
+DH035,348.0,350.0,0.078,0.0086,0.08
+DH035,350.0,352.0,0.094,0.0273,0.124
+DH035,352.0,354.0,0.073,0.0097,0.066
+DH035,354.0,356.0,0.2,0.0156,0.145
+DH035,356.0,358.0,0.055,0.0082,0.04
+DH035,358.0,360.0,0.123,0.0089,0.065
+DH035,360.0,362.0,0.083,0.014,0.108
+DH035,362.0,364.0,0.047,0.0279,0.07
+DH035,364.0,366.0,0.065,0.0142,0.078
+DH035,366.0,368.0,0.114,0.0049,0.101
+DH035,368.0,370.0,0.029,0.0154,0.019
+DH035,370.0,372.0,0.066,0.0235,0.085
+DH035,372.0,374.0,0.052,0.0122,0.071
+DH035,374.0,376.0,0.033,0.0144,0.018
+DH035,376.0,378.0,0.033,0.0155,0.036
+DH035,378.0,380.0,0.273,0.014,0.319
+DH035,380.0,382.0,0.044,0.0184,0.035
+DH036,0.0,2.0,0.048,0.03,0.051
+DH036,2.0,4.0,0.137,0.0155,0.107
+DH036,4.0,6.0,0.072,0.038,0.038
+DH036,6.0,8.0,0.083,0.0146,0.109
+DH036,8.0,10.0,0.095,0.0276,0.111
+DH036,10.0,12.0,0.089,0.0201,0.124
+DH036,12.0,14.0,0.029,0.0115,0.036
+DH036,14.0,16.0,0.084,0.0117,0.065
+DH036,16.0,18.0,0.04,0.015,0.039
+DH036,18.0,20.0,0.129,0.0233,0.101
+DH036,20.0,22.0,0.068,0.0066,0.063
+DH036,22.0,24.0,0.052,0.0207,0.075
+DH036,24.0,26.0,0.1,0.0344,0.093
+DH036,26.0,28.0,0.057,0.0308,0.079
+DH036,28.0,30.0,0.071,0.0461,0.067
+DH036,30.0,32.0,0.073,0.013,0.08
+DH036,32.0,34.0,0.093,0.0185,0.061
+DH036,34.0,36.0,0.139,0.0241,0.2
+DH036,36.0,38.0,0.108,0.0242,0.144
+DH036,38.0,40.0,0.243,0.0099,0.293
+DH036,40.0,42.0,0.037,0.0174,0.022
+DH036,42.0,44.0,0.089,0.0217,0.127
+DH036,44.0,46.0,0.081,0.0368,0.096
+DH036,46.0,48.0,0.049,0.0282,0.062
+DH036,48.0,50.0,0.09,0.0305,0.13
+DH036,50.0,52.0,0.06,0.0133,0.055
+DH036,52.0,54.0,0.183,0.0078,0.157
+DH036,54.0,56.0,0.036,0.0369,0.051
+DH036,56.0,58.0,0.067,0.0082,0.077
+DH036,58.0,60.0,0.138,0.0208,0.105
+DH036,60.0,62.0,0.032,0.0155,0.017
+DH036,62.0,64.0,0.045,0.0254,0.042
+DH036,64.0,66.0,0.06,0.0263,0.083
+DH036,66.0,68.0,0.163,0.0506,0.159
+DH036,68.0,70.0,0.13,0.0352,0.136
+DH036,70.0,72.0,0.058,0.0137,0.038
+DH036,72.0,74.0,0.066,0.0166,0.054
+DH036,74.0,76.0,0.026,0.0113,0.018
+DH036,76.0,78.0,0.114,0.0108,0.075
+DH036,78.0,80.0,0.182,0.0179,0.269
+DH036,80.0,82.0,6.359,0.8855,18.324
+DH036,82.0,84.0,2.333,0.5337,4.473
+DH036,84.0,86.0,0.273,0.3181,0.555
+DH036,86.0,88.0,0.484,0.056,0.879
+DH036,88.0,90.0,0.817,0.2913,1.662
+DH036,90.0,92.0,2.703,0.2829,7.352
+DH036,92.0,94.0,2.627,0.1215,6.214
+DH036,94.0,96.0,1.962,0.2017,5.601
+DH036,96.0,98.0,8.348,0.2938,23.904
+DH036,98.0,100.0,0.162,0.1206,0.393
+DH036,100.0,102.0,0.926,0.2709,2.269
+DH036,102.0,104.0,20.693,0.3284,37.068
+DH036,104.0,106.0,5.25,0.5318,11.047
+DH036,106.0,108.0,0.613,0.1558,1.726
+DH036,108.0,110.0,1.047,0.1002,2.397
+DH036,110.0,112.0,0.666,0.0654,1.068
+DH036,112.0,114.0,1.68,0.101,3.852
+DH036,114.0,116.0,4.575,0.3533,9.723
+DH036,116.0,118.0,0.465,0.1408,1.008
+DH036,118.0,120.0,6.469,0.2959,18.957
+DH036,120.0,122.0,17.726,0.1516,38.898
+DH036,122.0,124.0,1.628,0.5045,4.361
+DH036,124.0,126.0,0.208,0.103,0.61
+DH036,126.0,128.0,0.262,0.4509,0.673
+DH036,128.0,130.0,1.634,0.4419,4.546
+DH036,130.0,132.0,2.858,0.2187,4.885
+DH036,132.0,134.0,4.242,0.4492,7.084
+DH036,134.0,136.0,3.717,0.2142,9.599
+DH036,136.0,138.0,6.536,0.0798,15.132
+DH036,138.0,140.0,5.512,0.0896,12.281
+DH036,140.0,142.0,28.382,0.2094,67.563
+DH036,142.0,144.0,5.819,0.1203,13.784
+DH036,144.0,146.0,4.153,0.1072,11.112
+DH036,146.0,148.0,0.839,0.3929,2.254
+DH036,148.0,150.0,0.1,0.3029,0.211
+DH036,150.0,152.0,12.183,0.3061,36.36
+DH036,152.0,154.0,0.949,0.1186,1.781
+DH036,154.0,156.0,1.444,0.6508,3.028
+DH036,156.0,158.0,0.512,0.1151,0.935
+DH036,158.0,160.0,1.821,0.187,2.951
+DH036,160.0,162.0,0.743,0.0373,1.998
+DH036,162.0,164.0,2.976,0.1828,6.091
+DH036,164.0,166.0,7.533,0.2543,16.203
+DH036,166.0,168.0,3.682,0.079,10.529
+DH036,168.0,170.0,6.612,0.5556,11.857
+DH036,170.0,172.0,4.12,0.0556,10.819
+DH036,172.0,174.0,0.706,0.6223,1.676
+DH036,174.0,176.0,0.711,0.2151,1.892
+DH036,176.0,178.0,6.56,0.0584,18.368
+DH036,178.0,180.0,2.33,0.0294,4.842
+DH036,180.0,182.0,4.53,0.5998,10.691
+DH036,182.0,184.0,2.7,0.3758,6.814
+DH036,184.0,186.0,6.675,0.2779,17.899
+DH036,186.0,188.0,2.637,0.1996,7.612
+DH036,188.0,190.0,1.444,0.2676,3.86
+DH036,190.0,192.0,0.722,0.2559,1.828
+DH036,192.0,194.0,5.816,0.3584,10.095
+DH036,194.0,196.0,2.876,0.1205,6.403
+DH036,196.0,198.0,1.087,0.2143,2.522
+DH036,198.0,200.0,2.663,0.4612,5.777
+DH036,200.0,202.0,1.416,0.8315,2.356
+DH036,202.0,204.0,1.294,0.0947,2.231
+DH036,204.0,206.0,1.321,0.3612,2.809
+DH036,206.0,208.0,0.465,0.1394,0.697
+DH036,208.0,210.0,5.405,1.5626,8.685
+DH036,210.0,212.0,0.66,0.207,1.125
+DH036,212.0,214.0,1.193,0.325,2.869
+DH036,214.0,216.0,4.322,0.1524,12.244
+DH036,216.0,218.0,12.921,0.0813,32.09
+DH036,218.0,220.0,5.77,0.2557,17.159
+DH036,220.0,222.0,11.251,0.1884,26.304
+DH036,222.0,224.0,1.533,0.1644,3.647
+DH036,224.0,226.0,2.713,0.1384,4.448
+DH036,226.0,228.0,4.142,0.8192,10.193
+DH036,228.0,230.0,0.849,0.0689,2.06
+DH036,230.0,232.0,4.926,0.1282,9.034
+DH036,232.0,234.0,11.329,0.0757,28.228
+DH036,234.0,236.0,1.899,0.0948,4.296
+DH036,236.0,238.0,5.23,0.0744,7.949
+DH036,238.0,240.0,9.045,0.3073,23.868
+DH036,240.0,242.0,0.998,0.4337,2.975
+DH036,242.0,244.0,2.978,0.2277,4.92
+DH036,244.0,246.0,1.106,0.1498,2.853
+DH036,246.0,248.0,3.761,0.159,10.387
+DH036,248.0,250.0,0.887,0.3429,1.767
+DH036,250.0,252.0,0.045,0.0287,0.03
+DH036,252.0,254.0,0.146,0.0153,0.073
+DH036,254.0,256.0,0.09,0.0366,0.075
+DH036,256.0,258.0,0.164,0.0134,0.155
+DH036,258.0,260.0,0.13,0.0365,0.194
+DH036,260.0,262.0,0.083,0.0264,0.087
+DH036,262.0,264.0,0.09,0.0202,0.091
+DH036,264.0,266.0,0.051,0.013,0.073
+DH036,266.0,268.0,0.031,0.0197,0.016
+DH036,268.0,270.0,0.13,0.0344,0.074
+DH036,270.0,272.0,0.192,0.0125,0.137
+DH036,272.0,274.0,0.143,0.0366,0.192
+DH036,274.0,276.0,0.11,0.0067,0.115
+DH036,276.0,278.0,0.115,0.0343,0.154
+DH036,278.0,280.0,0.142,0.0137,0.172
+DH036,280.0,282.0,0.113,0.0123,0.11
+DH036,282.0,284.0,0.03,0.0243,0.023
+DH036,284.0,286.0,0.073,0.0115,0.081
+DH036,286.0,288.0,0.06,0.0142,0.037
+DH036,288.0,290.0,0.051,0.023,0.068
+DH036,290.0,292.0,0.109,0.006,0.094
+DH036,292.0,294.0,0.075,0.0045,0.045
+DH036,294.0,296.0,0.049,0.0132,0.039
+DH036,296.0,298.0,0.055,0.0122,0.045
+DH036,298.0,300.0,0.134,0.0334,0.069
+DH036,300.0,302.0,0.081,0.0104,0.052
+DH036,302.0,304.0,0.094,0.0164,0.113
+DH036,304.0,306.0,0.099,0.0108,0.123
+DH036,306.0,308.0,0.072,0.0423,0.094
+DH036,308.0,310.0,0.268,0.033,0.148
+DH036,310.0,312.0,0.053,0.0129,0.077
+DH036,312.0,314.0,0.089,0.0136,0.106
+DH036,314.0,316.0,0.084,0.0279,0.114
+DH036,316.0,318.0,0.15,0.0235,0.129
+DH036,318.0,320.0,0.148,0.0176,0.168
+DH036,320.0,322.0,0.239,0.0158,0.28
+DH036,322.0,324.0,0.065,0.0072,0.065
+DH036,324.0,326.0,0.105,0.026,0.082
+DH036,326.0,328.0,0.163,0.0223,0.16
+DH036,328.0,330.0,0.117,0.0199,0.15
+DH036,330.0,332.0,0.109,0.0191,0.088
+DH036,332.0,334.0,0.074,0.0371,0.088
+DH036,334.0,336.0,0.092,0.0188,0.066
+DH036,336.0,338.0,0.23,0.0308,0.162
+DH036,338.0,340.0,0.021,0.0187,0.025
+DH036,340.0,342.0,0.124,0.0146,0.141
+DH036,342.0,344.0,0.119,0.0124,0.122
+DH036,344.0,346.0,0.092,0.0358,0.133
+DH036,346.0,348.0,0.156,0.0189,0.173
+DH037,0.0,2.0,0.029,0.0503,0.036
+DH037,2.0,4.0,0.108,0.0278,0.122
+DH037,4.0,6.0,0.072,0.0135,0.036
+DH037,6.0,8.0,0.115,0.0226,0.167
+DH037,8.0,10.0,0.087,0.0087,0.129
+DH037,10.0,12.0,0.039,0.0138,0.056
+DH037,12.0,14.0,0.105,0.0089,0.087
+DH037,14.0,16.0,0.034,0.025,0.029
+DH037,16.0,18.0,0.039,0.0301,0.043
+DH037,18.0,20.0,0.055,0.0068,0.069
+DH037,20.0,22.0,0.057,0.0396,0.073
+DH037,22.0,24.0,0.045,0.0197,0.065
+DH037,24.0,26.0,0.112,0.0112,0.082
+DH037,26.0,28.0,0.103,0.0439,0.125
+DH037,28.0,30.0,0.044,0.0136,0.056
+DH037,30.0,32.0,0.166,0.0062,0.086
+DH037,32.0,34.0,0.061,0.007,0.037
+DH037,34.0,36.0,0.058,0.0189,0.062
+DH037,36.0,38.0,0.102,0.0294,0.051
+DH037,38.0,40.0,0.054,0.0167,0.077
+DH037,40.0,42.0,0.153,0.017,0.163
+DH037,42.0,44.0,0.1,0.0233,0.06
+DH037,44.0,46.0,0.055,0.0131,0.051
+DH037,46.0,48.0,0.064,0.0146,0.035
+DH037,48.0,50.0,0.036,0.0512,0.026
+DH037,50.0,52.0,0.138,0.0173,0.072
+DH037,52.0,54.0,0.07,0.0281,0.076
+DH037,54.0,56.0,0.058,0.0454,0.073
+DH037,56.0,58.0,0.055,0.0087,0.074
+DH037,58.0,60.0,0.059,0.0514,0.046
+DH037,60.0,62.0,0.089,0.0199,0.121
+DH037,62.0,64.0,0.022,0.0204,0.015
+DH037,64.0,66.0,0.072,0.0197,0.076
+DH037,66.0,68.0,0.092,0.0181,0.112
+DH037,68.0,70.0,0.103,0.0262,0.147
+DH037,70.0,72.0,0.252,0.0357,0.179
+DH037,72.0,74.0,0.135,0.0186,0.16
+DH037,74.0,76.0,0.211,0.0274,0.27
+DH037,76.0,78.0,0.08,0.0244,0.052
+DH037,78.0,80.0,0.078,0.0138,0.087
+DH037,80.0,82.0,0.615,0.1051,1.329
+DH037,82.0,84.0,0.717,0.6052,2.113
+DH037,84.0,86.0,2.036,0.3319,3.057
+DH037,86.0,88.0,0.532,1.3159,1.38
+DH037,88.0,90.0,3.405,0.1125,7.193
+DH037,90.0,92.0,0.97,0.2412,2.609
+DH037,92.0,94.0,1.478,0.0697,3.857
+DH037,94.0,96.0,2.96,0.3215,6.194
+DH037,96.0,98.0,0.341,0.2087,0.735
+DH037,98.0,100.0,5.214,0.4606,14.182
+DH037,100.0,102.0,7.286,0.9445,11.34
+DH037,102.0,104.0,8.323,0.3312,24.92
+DH037,104.0,106.0,1.849,0.1115,2.89
+DH037,106.0,108.0,0.861,0.3622,2.388
+DH037,108.0,110.0,9.434,0.815,17.43
+DH037,110.0,112.0,0.528,2.3216,0.986
+DH037,112.0,114.0,2.913,0.2289,7.114
+DH037,114.0,116.0,0.219,0.1203,0.576
+DH037,116.0,118.0,0.943,0.1397,2.098
+DH037,118.0,120.0,1.645,0.2787,4.043
+DH037,120.0,122.0,4.515,0.1523,12.545
+DH037,122.0,124.0,3.79,0.0797,5.912
+DH037,124.0,126.0,1.81,0.1874,3.957
+DH037,126.0,128.0,4.767,0.3373,9.32
+DH037,128.0,130.0,2.466,0.0399,5.377
+DH037,130.0,132.0,3.999,0.1015,8.517
+DH037,132.0,134.0,4.843,0.5695,10.353
+DH037,134.0,136.0,3.274,0.4759,8.679
+DH037,136.0,138.0,3.649,0.1358,10.123
+DH037,138.0,140.0,0.322,0.4289,0.787
+DH037,140.0,142.0,7.088,0.1195,11.959
+DH037,142.0,144.0,11.119,0.2398,20.979
+DH037,144.0,146.0,3.746,0.0965,7.29
+DH037,146.0,148.0,0.243,0.1308,0.68
+DH037,148.0,150.0,6.013,0.3073,17.608
+DH037,150.0,152.0,13.037,0.1733,35.203
+DH037,152.0,154.0,2.409,0.2083,7.139
+DH037,154.0,156.0,27.065,0.158,64.656
+DH037,156.0,158.0,3.264,0.2908,8.628
+DH037,158.0,160.0,1.492,0.0127,2.728
+DH037,160.0,162.0,0.967,0.1839,1.674
+DH037,162.0,164.0,0.869,0.2704,1.474
+DH037,164.0,166.0,0.942,0.2514,1.772
+DH037,166.0,168.0,6.776,0.0764,18.412
+DH037,168.0,170.0,5.314,0.1337,9.393
+DH037,170.0,172.0,1.096,0.2058,2.269
+DH037,172.0,174.0,1.73,0.098,3.376
+DH037,174.0,176.0,10.929,0.0484,23.904
+DH037,176.0,178.0,7.414,0.7834,21.876
+DH037,178.0,180.0,5.921,0.8272,14.931
+DH037,180.0,182.0,14.814,0.1935,39.489
+DH037,182.0,184.0,0.939,0.497,1.732
+DH037,184.0,186.0,17.631,0.7064,39.696
+DH037,186.0,188.0,92.764,0.6575,248.91
+DH037,188.0,190.0,0.673,0.0656,1.876
+DH037,190.0,192.0,0.726,0.6716,1.831
+DH037,192.0,194.0,1.066,0.2001,3.048
+DH037,194.0,196.0,5.813,0.1105,11.331
+DH037,196.0,198.0,3.19,0.1131,7.162
+DH037,198.0,200.0,1.561,0.1008,2.874
+DH037,200.0,202.0,2.376,0.3094,3.823
+DH037,202.0,204.0,5.9,1.2686,17.088
+DH037,204.0,206.0,3.404,0.119,8.192
+DH037,206.0,208.0,9.851,0.2796,19.699
+DH037,208.0,210.0,0.682,0.4054,1.894
+DH037,210.0,212.0,0.451,0.2247,0.681
+DH037,212.0,214.0,3.511,0.157,7.553
+DH037,214.0,216.0,0.791,0.3684,1.219
+DH037,216.0,218.0,4.576,0.5744,12.168
+DH037,218.0,220.0,1.007,0.0578,2.45
+DH037,220.0,222.0,1.802,0.2047,4.894
+DH037,222.0,224.0,0.782,0.7548,2.276
+DH037,224.0,226.0,0.49,0.1566,0.947
+DH037,226.0,228.0,1.049,0.1168,1.628
+DH037,228.0,230.0,8.238,0.5741,19.314
+DH037,230.0,232.0,3.868,0.222,9.259
+DH037,232.0,234.0,1.558,0.0812,2.531
+DH037,234.0,236.0,14.339,0.1607,33.948
+DH037,236.0,238.0,7.889,0.5903,14.594
+DH037,238.0,240.0,1.863,0.2129,5.043
+DH037,240.0,242.0,3.537,0.1275,9.458
+DH037,242.0,244.0,1.971,0.0678,3.273
+DH037,244.0,246.0,6.699,0.1234,18.745
+DH037,246.0,248.0,23.717,0.1488,66.064
+DH037,248.0,250.0,6.856,0.1332,11.43
+DH037,250.0,252.0,0.124,0.0186,0.069
+DH037,252.0,254.0,0.072,0.0103,0.065
+DH037,254.0,256.0,0.125,0.0153,0.1
+DH037,256.0,258.0,0.033,0.0192,0.024
+DH037,258.0,260.0,0.142,0.0127,0.077
+DH037,260.0,262.0,0.301,0.0157,0.237
+DH038,0.0,2.0,0.117,0.0075,0.112
+DH038,2.0,4.0,0.149,0.0238,0.146
+DH038,4.0,6.0,0.07,0.0097,0.105
+DH038,6.0,8.0,0.154,0.0222,0.165
+DH038,8.0,10.0,0.201,0.0161,0.144
+DH038,10.0,12.0,0.096,0.0236,0.127
+DH038,12.0,14.0,0.191,0.0248,0.157
+DH038,14.0,16.0,0.091,0.0179,0.083
+DH038,16.0,18.0,0.195,0.0305,0.221
+DH038,18.0,20.0,0.027,0.0275,0.016
+DH038,20.0,22.0,0.084,0.0173,0.101
+DH038,22.0,24.0,0.103,0.0538,0.132
+DH038,24.0,26.0,0.13,0.0595,0.126
+DH038,26.0,28.0,0.056,0.0206,0.074
+DH038,28.0,30.0,0.194,0.0336,0.169
+DH038,30.0,32.0,0.049,0.0177,0.046
+DH038,32.0,34.0,0.009,0.0127,0.012
+DH038,34.0,36.0,0.06,0.0111,0.03
+DH038,36.0,38.0,0.101,0.0145,0.108
+DH038,38.0,40.0,0.085,0.0118,0.102
+DH038,40.0,42.0,0.072,0.032,0.044
+DH038,42.0,44.0,0.117,0.0192,0.115
+DH038,44.0,46.0,0.104,0.0129,0.084
+DH038,46.0,48.0,0.13,0.015,0.16
+DH038,48.0,50.0,0.113,0.0189,0.092
+DH038,50.0,52.0,0.096,0.0133,0.117
+DH038,52.0,54.0,0.066,0.0348,0.072
+DH038,54.0,56.0,0.145,0.021,0.096
+DH038,56.0,58.0,0.087,0.0105,0.062
+DH038,58.0,60.0,0.057,0.0369,0.056
+DH038,60.0,62.0,0.043,0.0188,0.041
+DH038,62.0,64.0,0.075,0.014,0.09
+DH038,64.0,66.0,0.081,0.0204,0.063
+DH038,66.0,68.0,0.044,0.0193,0.025
+DH038,68.0,70.0,0.199,0.0103,0.236
+DH038,70.0,72.0,0.085,0.0319,0.076
+DH038,72.0,74.0,0.123,0.0093,0.165
+DH038,74.0,76.0,0.022,0.0171,0.024
+DH038,76.0,78.0,0.183,0.0399,0.138
+DH038,78.0,80.0,0.033,0.0221,0.048
+DH038,80.0,82.0,3.939,0.5758,10.65
+DH038,82.0,84.0,0.782,0.2108,1.452
+DH038,84.0,86.0,33.68,0.2495,66.608
+DH038,86.0,88.0,1.279,0.0649,3.102
+DH038,88.0,90.0,0.578,0.295,1.696
+DH038,90.0,92.0,2.432,0.1191,5.982
+DH038,92.0,94.0,0.712,0.4263,1.367
+DH038,94.0,96.0,2.169,0.1416,3.647
+DH038,96.0,98.0,0.467,0.0648,1.145
+DH038,98.0,100.0,1.633,0.5369,3.126
+DH038,100.0,102.0,2.306,0.333,6.014
+DH038,102.0,104.0,27.779,0.2733,58.906
+DH038,104.0,106.0,2.824,0.0275,5.312
+DH038,106.0,108.0,8.261,0.3612,21.94
+DH038,108.0,110.0,4.851,0.5393,13.52
+DH038,110.0,112.0,3.807,0.1733,7.837
+DH038,112.0,114.0,7.198,0.3369,10.922
+DH038,114.0,116.0,0.975,0.4829,2.211
+DH038,116.0,118.0,2.135,0.2134,3.72
+DH038,118.0,120.0,0.561,0.35,0.923
+DH038,120.0,122.0,0.977,0.453,2.493
+DH038,122.0,124.0,6.425,0.242,10.41
+DH038,124.0,126.0,11.443,0.286,32.684
+DH038,126.0,128.0,7.454,0.7404,12.688
+DH038,128.0,130.0,4.668,0.3003,7.549
+DH038,130.0,132.0,0.333,0.265,0.849
+DH038,132.0,134.0,4.482,0.095,8.32
+DH038,134.0,136.0,1.535,0.0419,3.727
+DH038,136.0,138.0,0.716,0.9274,1.829
+DH038,138.0,140.0,1.693,0.3222,2.855
+DH038,140.0,142.0,7.389,0.27,21.805
+DH038,142.0,144.0,2.563,0.3554,6.539
+DH038,144.0,146.0,0.298,0.1772,0.617
+DH038,146.0,148.0,3.304,0.0717,9.537
+DH038,148.0,150.0,0.822,0.3631,2.254
+DH038,150.0,152.0,1.385,0.1032,4.109
+DH038,152.0,154.0,6.344,0.252,18.437
+DH038,154.0,156.0,2.459,0.1358,6.659
+DH038,156.0,158.0,1.955,0.4137,4.33
+DH038,158.0,160.0,2.289,0.5889,4.357
+DH038,160.0,162.0,0.871,0.0785,1.999
+DH038,162.0,164.0,0.486,1.1136,1.348
+DH038,164.0,166.0,1.984,0.8848,5.114
+DH038,166.0,168.0,1.888,1.1049,3.942
+DH038,168.0,170.0,41.937,0.4183,75.485
+DH038,170.0,172.0,11.044,0.2234,31.513
+DH038,172.0,174.0,1.938,0.1013,4.381
+DH038,174.0,176.0,2.214,0.8619,6.169
+DH038,176.0,178.0,37.907,0.0397,69.027
+DH039,0.0,2.0,0.066,0.0386,0.059
+DH039,2.0,4.0,0.034,0.0162,0.025
+DH039,4.0,6.0,0.036,0.0498,0.052
+DH039,6.0,8.0,0.091,0.0175,0.104
+DH039,8.0,10.0,0.05,0.0157,0.026
+DH039,10.0,12.0,0.192,0.0294,0.115
+DH039,12.0,14.0,0.149,0.0232,0.117
+DH039,14.0,16.0,0.092,0.0244,0.115
+DH039,16.0,18.0,0.109,0.0119,0.133
+DH039,18.0,20.0,0.026,0.0245,0.026
+DH039,20.0,22.0,0.121,0.0129,0.099
+DH039,22.0,24.0,0.077,0.0101,0.055
+DH039,24.0,26.0,0.088,0.0082,0.099
+DH039,26.0,28.0,0.154,0.0457,0.129
+DH039,28.0,30.0,0.066,0.0119,0.049
+DH039,30.0,32.0,0.064,0.0443,0.085
+DH039,32.0,34.0,0.072,0.0139,0.039
+DH039,34.0,36.0,0.178,0.0085,0.244
+DH039,36.0,38.0,0.2,0.0264,0.107
+DH039,38.0,40.0,0.229,0.0093,0.242
+DH039,40.0,42.0,0.079,0.0248,0.118
+DH039,42.0,44.0,0.07,0.0265,0.045
+DH039,44.0,46.0,0.174,0.0337,0.163
+DH039,46.0,48.0,0.135,0.0111,0.119
+DH039,48.0,50.0,0.122,0.0121,0.075
+DH039,50.0,52.0,0.061,0.0137,0.07
+DH039,52.0,54.0,0.05,0.0118,0.042
+DH039,54.0,56.0,0.088,0.0089,0.094
+DH039,56.0,58.0,0.064,0.0091,0.079
+DH039,58.0,60.0,0.141,0.0119,0.101
+DH039,60.0,62.0,0.12,0.0274,0.144
+DH039,62.0,64.0,0.142,0.0512,0.207
+DH039,64.0,66.0,0.168,0.0214,0.196
+DH039,66.0,68.0,0.079,0.0228,0.057
+DH039,68.0,70.0,0.052,0.009,0.073
+DH039,70.0,72.0,0.086,0.0132,0.074
+DH039,72.0,74.0,0.044,0.013,0.053
+DH039,74.0,76.0,0.143,0.0123,0.146
+DH039,76.0,78.0,0.051,0.0166,0.059
+DH039,78.0,80.0,0.115,0.0215,0.132
+DH039,80.0,82.0,0.61,0.3044,1.405
+DH039,82.0,84.0,5.087,0.1255,9.191
+DH039,84.0,86.0,0.458,0.1581,1.05
+DH039,86.0,88.0,0.489,0.1768,0.838
+DH039,88.0,90.0,0.249,0.1627,0.465
+DH039,90.0,92.0,25.786,0.2645,63.34
+DH039,92.0,94.0,2.94,0.3619,4.723
+DH039,94.0,96.0,0.341,0.6364,0.697
+DH039,96.0,98.0,2.055,0.2029,3.774
+DH039,98.0,100.0,0.5,0.3379,1.286
+DH039,100.0,102.0,5.337,0.21,14.847
+DH039,102.0,104.0,7.435,0.1628,20.682
+DH039,104.0,106.0,0.597,0.0687,1.038
+DH039,106.0,108.0,0.896,0.1666,1.581
+DH039,108.0,110.0,2.137,0.2217,4.069
+DH039,110.0,112.0,0.139,0.0664,0.292
+DH039,112.0,114.0,0.809,0.1854,1.618
+DH039,114.0,116.0,2.035,0.0775,5.979
+DH039,116.0,118.0,17.334,0.7603,41.766
+DH039,118.0,120.0,0.341,0.2852,0.584
+DH039,120.0,122.0,2.295,0.1414,5.661
+DH039,122.0,124.0,1.033,0.0893,2.858
+DH039,124.0,126.0,6.416,0.1776,19.013
+DH039,126.0,128.0,3.552,1.454,9.709
+DH039,128.0,130.0,6.06,0.23,9.279
+DH039,130.0,132.0,11.696,0.376,29.424
+DH039,132.0,134.0,3.837,0.436,7.057
+DH039,134.0,136.0,0.736,0.2983,2.193
+DH039,136.0,138.0,0.267,0.1797,0.418
+DH039,138.0,140.0,4.243,0.7913,10.408
+DH039,140.0,142.0,1.423,0.0784,4.237
+DH039,142.0,144.0,5.202,0.4075,9.084
+DH039,144.0,146.0,4.291,0.6195,11.297
+DH039,146.0,148.0,11.482,0.1248,17.501
+DH039,148.0,150.0,1.25,0.4207,3.463
+DH039,150.0,152.0,1.513,0.0504,3.073
+DH039,152.0,154.0,9.936,0.4623,19.599
+DH039,154.0,156.0,6.094,0.3905,14.315
+DH039,156.0,158.0,5.026,0.1321,12.714
+DH039,158.0,160.0,2.421,0.1706,4.968
+DH039,160.0,162.0,0.506,0.2682,1.278
+DH039,162.0,164.0,2.251,2.0378,4.783
+DH039,164.0,166.0,3.796,0.6269,7.599
+DH039,166.0,168.0,4.885,0.5253,12.867
+DH039,168.0,170.0,16.37,0.6228,38.485
+DH039,170.0,172.0,3.274,0.0647,6.71
+DH039,172.0,174.0,2.913,0.6564,5.489
+DH039,174.0,176.0,0.24,1.8402,0.362
+DH039,176.0,178.0,0.67,0.558,1.505
+DH039,178.0,180.0,1.746,0.2061,4.106
+DH039,180.0,182.0,0.587,0.1284,1.528
+DH039,182.0,184.0,1.899,0.1142,2.986
+DH039,184.0,186.0,8.064,0.0459,16.929
+DH039,186.0,188.0,42.72,1.133,110.682
+DH039,188.0,190.0,10.802,0.6347,28.532
+DH039,190.0,192.0,6.751,0.9332,13.877
+DH039,192.0,194.0,4.446,0.298,11.716
+DH039,194.0,196.0,2.265,0.2686,3.517
+DH039,196.0,198.0,8.519,0.3267,17.703
+DH039,198.0,200.0,0.812,0.1529,2.022
+DH039,200.0,202.0,0.954,0.4755,2.737
+DH039,202.0,204.0,8.778,0.1338,17.137
+DH039,204.0,206.0,8.7,0.2476,22.833
+DH039,206.0,208.0,1.859,0.1898,3.114
+DH039,208.0,210.0,4.922,0.0817,10.915
+DH039,210.0,212.0,1.36,0.8694,2.733
+DH039,212.0,214.0,3.257,0.1923,7.734
+DH039,214.0,216.0,4.903,0.0479,10.319
+DH039,216.0,218.0,8.374,0.146,21.648
+DH039,218.0,220.0,5.815,0.1828,16.676
+DH039,220.0,222.0,10.278,0.0877,27.544
+DH039,222.0,224.0,6.295,0.0833,11.748
+DH039,224.0,226.0,1.716,0.4492,4.35
+DH039,226.0,228.0,1.854,0.1521,4.877
+DH039,228.0,230.0,5.234,0.1014,13.518
+DH039,230.0,232.0,13.211,0.1239,20.601
+DH039,232.0,234.0,1.746,0.1967,4.895
+DH039,234.0,236.0,2.009,0.1677,5.362
+DH039,236.0,238.0,1.216,0.1305,2.566
+DH039,238.0,240.0,16.377,0.3942,40.434
+DH039,240.0,242.0,7.228,0.0627,17.511
+DH039,242.0,244.0,10.53,1.3352,29.426
+DH039,244.0,246.0,3.761,0.6268,6.57
+DH039,246.0,248.0,1.385,0.212,3.587
+DH039,248.0,250.0,0.797,0.1033,1.838
+DH039,250.0,252.0,0.126,0.0129,0.124
+DH039,252.0,254.0,0.187,0.0334,0.125
+DH039,254.0,256.0,0.078,0.0436,0.097
+DH039,256.0,258.0,0.144,0.0488,0.207
+DH039,258.0,260.0,0.045,0.0099,0.035
+DH039,260.0,262.0,0.126,0.0229,0.182
+DH039,262.0,264.0,0.107,0.0155,0.061
+DH039,264.0,266.0,0.167,0.0183,0.202
+DH039,266.0,268.0,0.083,0.0111,0.106
+DH039,268.0,270.0,0.082,0.0116,0.056
+DH039,270.0,272.0,0.053,0.0128,0.029
+DH039,272.0,274.0,0.061,0.0117,0.034
+DH039,274.0,276.0,0.093,0.0333,0.123
+DH039,276.0,278.0,0.123,0.0229,0.111
+DH039,278.0,280.0,0.109,0.0188,0.095
+DH039,280.0,282.0,0.044,0.0279,0.033
+DH039,282.0,284.0,0.196,0.0289,0.294
+DH039,284.0,286.0,0.096,0.0134,0.116
+DH039,286.0,288.0,0.018,0.0481,0.021
+DH039,288.0,290.0,0.11,0.0227,0.082
+DH039,290.0,292.0,0.067,0.0063,0.036
+DH039,292.0,294.0,0.072,0.0066,0.063
+DH039,294.0,296.0,0.043,0.0253,0.06
+DH039,296.0,298.0,0.266,0.0161,0.176
+DH039,298.0,300.0,0.072,0.0081,0.092
+DH039,300.0,302.0,0.129,0.0247,0.17
+DH039,302.0,304.0,0.034,0.0253,0.044
+DH039,304.0,306.0,0.136,0.016,0.099
+DH039,306.0,308.0,0.113,0.0182,0.069
+DH039,308.0,310.0,0.084,0.0179,0.055
+DH039,310.0,312.0,0.057,0.0133,0.051
+DH039,312.0,314.0,0.047,0.0163,0.035
+DH039,314.0,316.0,0.153,0.0214,0.17
+DH039,316.0,318.0,0.05,0.0636,0.028
+DH039,318.0,320.0,0.273,0.0498,0.231
+DH039,320.0,322.0,0.198,0.0159,0.117
+DH039,322.0,324.0,0.112,0.0111,0.088
+DH039,324.0,326.0,0.047,0.02,0.038
+DH039,326.0,328.0,0.104,0.0153,0.081
+DH039,328.0,330.0,0.035,0.012,0.02
+DH039,330.0,332.0,0.132,0.0224,0.152
+DH039,332.0,334.0,0.081,0.0124,0.078
+DH039,334.0,336.0,0.054,0.0226,0.075
+DH039,336.0,338.0,0.115,0.0135,0.11
+DH039,338.0,340.0,0.188,0.0301,0.119
+DH039,340.0,342.0,0.063,0.0751,0.091
+DH039,342.0,344.0,0.139,0.0216,0.123
+DH039,344.0,346.0,0.092,0.0142,0.121
+DH039,346.0,348.0,0.099,0.0699,0.143
+DH039,348.0,350.0,0.112,0.0244,0.07
+DH039,350.0,352.0,0.103,0.0459,0.113
+DH039,352.0,354.0,0.074,0.0071,0.059
+DH039,354.0,356.0,0.137,0.0111,0.165
+DH039,356.0,358.0,0.053,0.0154,0.027
+DH039,358.0,360.0,0.214,0.0119,0.308
+DH039,360.0,362.0,0.131,0.0243,0.184
+DH039,362.0,364.0,0.13,0.0139,0.144
+DH039,364.0,366.0,0.077,0.0162,0.057
+DH039,366.0,368.0,0.056,0.0215,0.073
+DH039,368.0,370.0,0.372,0.0581,0.2
+DH039,370.0,372.0,0.112,0.0184,0.156
+DH039,372.0,374.0,0.088,0.0179,0.12
+DH040,0.0,2.0,0.096,0.0179,0.05
+DH040,2.0,4.0,0.078,0.0153,0.074
+DH040,4.0,6.0,0.113,0.0368,0.103
+DH040,6.0,8.0,0.073,0.0249,0.098
+DH040,8.0,10.0,0.29,0.021,0.282
+DH040,10.0,12.0,0.049,0.0105,0.032
+DH040,12.0,14.0,0.102,0.0217,0.129
+DH040,14.0,16.0,0.056,0.0087,0.072
+DH040,16.0,18.0,0.038,0.0092,0.035
+DH040,18.0,20.0,0.106,0.0495,0.13
+DH040,20.0,22.0,0.194,0.0254,0.107
+DH040,22.0,24.0,0.369,0.0095,0.299
+DH040,24.0,26.0,0.067,0.0286,0.084
+DH040,26.0,28.0,0.13,0.0245,0.129
+DH040,28.0,30.0,0.115,0.0275,0.095
+DH040,30.0,32.0,0.207,0.0179,0.269
+DH040,32.0,34.0,0.053,0.0113,0.037
+DH040,34.0,36.0,0.05,0.0252,0.034
+DH040,36.0,38.0,0.166,0.008,0.24
+DH040,38.0,40.0,0.079,0.0136,0.111
+DH040,40.0,42.0,0.153,0.0264,0.116
+DH040,42.0,44.0,0.041,0.0107,0.026
+DH040,44.0,46.0,0.038,0.0173,0.048
+DH040,46.0,48.0,0.108,0.0265,0.145
+DH040,48.0,50.0,0.039,0.0273,0.02
+DH040,50.0,52.0,0.166,0.0197,0.226
+DH040,52.0,54.0,0.062,0.0222,0.09
+DH040,54.0,56.0,0.162,0.024,0.231
+DH040,56.0,58.0,0.072,0.0382,0.051
+DH040,58.0,60.0,0.037,0.0153,0.05
+DH040,60.0,62.0,0.079,0.0211,0.118
+DH040,62.0,64.0,0.039,0.012,0.035
+DH040,64.0,66.0,0.18,0.0321,0.17
+DH040,66.0,68.0,0.08,0.0339,0.081
+DH040,68.0,70.0,0.123,0.0304,0.107
+DH040,70.0,72.0,0.084,0.0161,0.051
+DH040,72.0,74.0,0.199,0.0147,0.195
+DH040,74.0,76.0,0.181,0.0085,0.108
+DH040,76.0,78.0,0.074,0.0193,0.079
+DH040,78.0,80.0,0.094,0.0209,0.051
+DH040,80.0,82.0,25.538,0.3147,50.964
+DH040,82.0,84.0,0.388,0.0691,0.895
+DH040,84.0,86.0,20.611,0.0995,35.182
+DH040,86.0,88.0,0.506,0.1256,1.253
+DH040,88.0,90.0,1.232,0.0785,1.991
+DH040,90.0,92.0,0.231,0.3267,0.472
+DH040,92.0,94.0,4.532,0.1078,11.434
+DH040,94.0,96.0,5.197,0.2244,8.834
+DH040,96.0,98.0,1.021,0.2602,1.699
+DH040,98.0,100.0,8.718,0.1818,15.102
+DH040,100.0,102.0,0.594,0.4001,0.92
+DH040,102.0,104.0,5.095,2.3995,11.805
+DH040,104.0,106.0,74.245,0.3304,175.521
+DH040,106.0,108.0,0.857,1.4799,2.289
+DH040,108.0,110.0,1.128,0.1896,3.27
+DH040,110.0,112.0,2.202,0.2943,4.948
+DH040,112.0,114.0,0.575,0.3737,1.087
+DH040,114.0,116.0,1.223,0.5261,2.979
+DH040,116.0,118.0,0.13,0.267,0.249
+DH040,118.0,120.0,0.439,0.0568,0.986
+DH040,120.0,122.0,3.879,0.2267,8.7
+DH040,122.0,124.0,7.587,0.9189,18.349
+DH040,124.0,126.0,0.516,0.3656,0.795
+DH040,126.0,128.0,9.97,0.0605,26.115
+DH040,128.0,130.0,7.295,0.4719,16.795
+DH040,130.0,132.0,4.147,0.12,8.01
+DH040,132.0,134.0,0.637,0.1216,1.055
+DH040,134.0,136.0,1.063,0.1507,2.942
+DH040,136.0,138.0,0.468,1.0713,1.076
+DH040,138.0,140.0,3.307,0.0546,8.975
+DH040,140.0,142.0,2.72,0.1564,4.174
+DH040,142.0,144.0,6.317,0.021,18.395
+DH040,144.0,146.0,1.929,0.201,4.307
+DH040,146.0,148.0,1.484,0.4927,2.437
+DH040,148.0,150.0,4.977,0.1302,9.895
+DH040,150.0,152.0,5.444,0.832,15.692
+DH040,152.0,154.0,9.778,1.7746,28.814
+DH040,154.0,156.0,0.594,0.2324,1.513
+DH040,156.0,158.0,1.651,0.7442,2.504
+DH040,158.0,160.0,3.324,0.1685,9.544
+DH040,160.0,162.0,2.872,0.0616,5.602
+DH040,162.0,164.0,0.507,0.1611,0.813
+DH040,164.0,166.0,7.495,0.506,14.878
+DH040,166.0,168.0,0.486,0.2063,1.412
+DH040,168.0,170.0,1.865,0.3745,5.21
+DH040,170.0,172.0,3.925,0.6107,8.213
+DH040,172.0,174.0,1.682,0.4488,4.215
+DH040,174.0,176.0,1.186,0.3022,2.753
+DH040,176.0,178.0,0.2,0.3173,0.551
+DH040,178.0,180.0,3.3,0.0653,9.615
+DH040,180.0,182.0,1.323,0.5836,2.827
+DH040,182.0,184.0,0.613,0.2986,1.632
+DH040,184.0,186.0,5.747,0.0993,15.257
+DH040,186.0,188.0,43.098,0.1843,81.766
+DH040,188.0,190.0,0.303,0.1128,0.467
+DH040,190.0,192.0,1.498,0.3648,3.182
+DH040,192.0,194.0,0.458,0.5027,1.014
+DH040,194.0,196.0,0.889,0.2681,2.44
+DH040,196.0,198.0,0.667,0.2511,1.657
+DH040,198.0,200.0,4.898,0.5754,13.032
+DH040,200.0,202.0,7.495,0.6468,22.374
+DH040,202.0,204.0,4.065,0.2531,6.964
+DH040,204.0,206.0,0.386,0.1786,0.69
+DH040,206.0,208.0,7.919,0.2044,18.139
+DH040,208.0,210.0,0.389,0.1929,0.945
+DH040,210.0,212.0,7.35,0.3653,20.942
+DH040,212.0,214.0,1.435,0.0548,2.343
+DH040,214.0,216.0,0.118,0.172,0.221
+DH040,216.0,218.0,1.301,1.2676,3.873
+DH040,218.0,220.0,7.686,0.1064,12.521
+DH040,220.0,222.0,4.677,0.105,8.856
+DH040,222.0,224.0,7.031,0.1382,18.642
+DH040,224.0,226.0,3.254,0.0925,8.685
+DH040,226.0,228.0,0.65,0.4471,1.638
+DH040,228.0,229.0,3.159,0.0734,6.964
+DH041,0.0,2.0,0.04,0.0158,0.031
+DH041,2.0,4.0,0.102,0.0076,0.091
+DH041,4.0,6.0,0.052,0.0239,0.073
+DH041,6.0,8.0,0.078,0.0126,0.067
+DH041,8.0,10.0,0.038,0.015,0.038
+DH041,10.0,12.0,0.071,0.0125,0.106
+DH041,12.0,14.0,0.054,0.0113,0.038
+DH041,14.0,16.0,0.319,0.0179,0.468
+DH041,16.0,18.0,0.128,0.0112,0.15
+DH041,18.0,20.0,0.056,0.0143,0.046
+DH041,20.0,22.0,0.037,0.0129,0.044
+DH041,22.0,24.0,0.08,0.0195,0.05
+DH041,24.0,26.0,0.145,0.013,0.143
+DH041,26.0,28.0,0.09,0.0138,0.119
+DH041,28.0,30.0,0.303,0.0274,0.263
+DH041,30.0,32.0,0.244,0.0205,0.243
+DH041,32.0,34.0,0.062,0.0265,0.08
+DH041,34.0,36.0,0.061,0.0192,0.088
+DH041,36.0,38.0,0.1,0.0157,0.073
+DH041,38.0,40.0,0.062,0.0154,0.074
+DH041,40.0,42.0,0.097,0.0378,0.064
+DH041,42.0,44.0,0.059,0.0178,0.078
+DH041,44.0,46.0,0.11,0.0189,0.129
+DH041,46.0,48.0,0.083,0.0231,0.058
+DH041,48.0,50.0,0.099,0.0083,0.081
+DH041,50.0,52.0,0.113,0.0414,0.069
+DH041,52.0,54.0,0.162,0.0292,0.083
+DH041,54.0,56.0,0.065,0.0106,0.055
+DH041,56.0,58.0,0.052,0.0098,0.038
+DH041,58.0,60.0,0.033,0.0197,0.047
+DH041,60.0,62.0,0.102,0.0229,0.073
+DH041,62.0,64.0,0.176,0.0294,0.228
+DH041,64.0,66.0,0.087,0.0158,0.071
+DH041,66.0,68.0,0.289,0.0101,0.25
+DH041,68.0,70.0,0.115,0.0313,0.086
+DH041,70.0,72.0,0.128,0.0368,0.127
+DH041,72.0,74.0,0.198,0.0285,0.221
+DH041,74.0,76.0,0.082,0.0213,0.084
+DH041,76.0,78.0,0.08,0.0401,0.1
+DH041,78.0,80.0,0.133,0.0215,0.173
+DH041,80.0,82.0,0.611,0.0572,1.548
+DH041,82.0,84.0,2.063,0.1153,4.533
+DH041,84.0,86.0,3.741,0.1942,7.581
+DH041,86.0,88.0,0.7,0.1844,1.246
+DH041,88.0,90.0,1.498,0.0862,2.258
+DH041,90.0,92.0,7.804,0.2304,19.081
+DH041,92.0,94.0,1.506,0.1095,3.511
+DH041,94.0,96.0,0.303,0.5741,0.815
+DH041,96.0,98.0,2.457,0.2827,7.178
+DH041,98.0,100.0,0.922,0.172,1.615
+DH041,100.0,102.0,45.318,0.5047,85.764
+DH041,102.0,104.0,11.464,0.6015,33.526
+DH041,104.0,106.0,1.703,0.2202,3.952
+DH041,106.0,108.0,1.701,0.2062,2.819
+DH041,108.0,110.0,7.836,0.0703,22.524
+DH041,110.0,112.0,0.244,0.0979,0.464
+DH041,112.0,114.0,3.331,0.1737,7.253
+DH041,114.0,116.0,11.301,0.2111,25.733
+DH041,116.0,118.0,1.293,0.3684,2.158
+DH041,118.0,120.0,19.202,0.5554,46.105
+DH041,120.0,122.0,0.863,0.3125,1.38
+DH041,122.0,124.0,4.278,0.1674,9.6
+DH041,124.0,126.0,2.248,1.5472,6.056
+DH041,126.0,128.0,0.441,1.1844,0.982
+DH041,128.0,130.0,3.512,0.3743,9.189
+DH041,130.0,132.0,0.255,0.2158,0.526
+DH041,132.0,134.0,3.578,0.8758,6.588
+DH041,134.0,136.0,2.281,0.5752,4.162
+DH041,136.0,138.0,2.021,0.1881,5.492
+DH041,138.0,140.0,0.123,0.2792,0.353
+DH041,140.0,142.0,2.647,0.294,5.007
+DH041,142.0,144.0,0.203,0.8437,0.54
+DH041,144.0,146.0,1.06,0.6613,1.959
+DH041,146.0,148.0,3.088,0.4129,7.199
+DH041,148.0,150.0,2.02,0.6287,5.83
+DH041,150.0,152.0,0.672,0.2376,1.899
+DH041,152.0,154.0,4.841,0.0741,13.442
+DH041,154.0,156.0,6.723,0.0938,16.827
+DH041,156.0,158.0,0.162,0.5058,0.371
+DH041,158.0,160.0,3.229,0.2844,8.447
+DH041,160.0,162.0,0.682,0.1555,1.092
+DH041,162.0,164.0,1.607,0.2717,2.626
+DH041,164.0,166.0,0.377,0.2216,0.677
+DH041,166.0,168.0,0.734,0.1912,1.556
+DH041,168.0,170.0,2.256,0.3826,5.994
+DH041,170.0,172.0,1.531,0.0873,3.535
+DH041,172.0,174.0,2.509,0.1008,5.765
+DH041,174.0,176.0,10.191,0.1316,24.706
+DH041,176.0,178.0,0.89,0.0583,2.48
+DH041,178.0,180.0,1.299,0.1123,2.131
+DH041,180.0,182.0,1.397,0.1279,3.126
+DH041,182.0,184.0,0.497,0.0652,1.287
+DH041,184.0,186.0,1.957,0.1867,3.49
+DH041,186.0,188.0,2.622,0.2149,4.184
+DH041,188.0,190.0,0.301,0.1274,0.486
+DH041,190.0,192.0,3.074,0.0529,5.14
+DH041,192.0,194.0,1.808,0.2162,3.826
+DH041,194.0,196.0,1.504,0.1308,4.222
+DH041,196.0,198.0,1.516,0.6944,3.501
+DH041,198.0,200.0,2.183,0.1997,6.21
+DH041,200.0,202.0,1.345,0.241,3.49
+DH041,202.0,204.0,7.835,0.5192,22.946
+DH041,204.0,206.0,0.54,0.2656,1.341
+DH041,206.0,208.0,1.194,0.1277,2.141
+DH041,208.0,210.0,5.069,0.5202,7.831
+DH041,210.0,212.0,1.192,0.4767,2.665
+DH041,212.0,214.0,0.902,0.1369,2.149
+DH041,214.0,216.0,1.205,0.4494,2.642
+DH041,216.0,218.0,4.734,0.1266,12.568
+DH041,218.0,220.0,1.867,0.187,4.289
+DH041,220.0,222.0,1.306,0.1413,3.611
+DH041,222.0,224.0,2.293,0.2017,4.916
+DH041,224.0,226.0,1.364,0.1336,2.927
+DH041,226.0,228.0,0.901,0.037,2.371
+DH041,228.0,230.0,1.592,0.1396,4.588
+DH041,230.0,232.0,0.084,0.7874,0.181
+DH041,232.0,234.0,1.047,0.1556,2.209
+DH041,234.0,236.0,4.21,0.1344,6.837
+DH041,236.0,238.0,28.119,0.4795,42.571
+DH041,238.0,240.0,2.748,0.3668,7.661
+DH041,240.0,242.0,0.182,0.1685,0.32
+DH041,242.0,244.0,1.834,0.4134,5.495
+DH041,244.0,246.0,0.441,0.1293,0.915
+DH041,246.0,248.0,6.041,0.8229,10.4
+DH041,248.0,250.0,6.029,0.3938,16.685
+DH041,250.0,252.0,0.081,0.015,0.075
+DH041,252.0,254.0,0.042,0.0218,0.058
+DH041,254.0,256.0,0.064,0.0255,0.041
+DH041,256.0,258.0,0.047,0.016,0.062
+DH041,258.0,260.0,0.044,0.0203,0.057
+DH041,260.0,262.0,0.052,0.0158,0.043
+DH041,262.0,264.0,0.088,0.0093,0.085
+DH041,264.0,266.0,0.078,0.0138,0.092
+DH041,266.0,268.0,0.044,0.0126,0.032
+DH041,268.0,270.0,0.18,0.0467,0.235
+DH041,270.0,272.0,0.05,0.019,0.031
+DH041,272.0,274.0,0.081,0.0173,0.084
+DH041,274.0,276.0,0.046,0.0202,0.033
+DH041,276.0,278.0,0.064,0.0077,0.036
+DH041,278.0,280.0,0.058,0.0294,0.044
+DH041,280.0,282.0,0.088,0.0181,0.109
+DH041,282.0,284.0,0.025,0.0156,0.031
+DH041,284.0,286.0,0.071,0.0119,0.056
+DH041,286.0,288.0,0.067,0.027,0.089
+DH041,288.0,290.0,0.059,0.0179,0.045
+DH041,290.0,292.0,0.106,0.0418,0.066
+DH041,292.0,294.0,0.166,0.0103,0.15
+DH041,294.0,296.0,0.023,0.0198,0.02
+DH041,296.0,298.0,0.018,0.0201,0.026
+DH041,298.0,300.0,0.114,0.0101,0.079
+DH041,300.0,302.0,0.083,0.0246,0.104
+DH041,302.0,304.0,0.103,0.0319,0.078
+DH041,304.0,306.0,0.097,0.0342,0.098
+DH041,306.0,308.0,0.042,0.0257,0.044
+DH041,308.0,310.0,0.178,0.0262,0.264
+DH041,310.0,312.0,0.056,0.0137,0.056
+DH041,312.0,314.0,0.226,0.0107,0.225
+DH041,314.0,316.0,0.065,0.0125,0.053
+DH041,316.0,318.0,0.143,0.0253,0.119
+DH041,318.0,320.0,0.111,0.0109,0.091
+DH041,320.0,322.0,0.078,0.0122,0.045
+DH041,322.0,324.0,0.058,0.0164,0.077
+DH041,324.0,326.0,0.153,0.0131,0.224
+DH041,326.0,328.0,0.156,0.0147,0.098
+DH041,328.0,330.0,0.062,0.0241,0.047
+DH041,330.0,332.0,0.064,0.0187,0.062
+DH041,332.0,334.0,0.078,0.0253,0.089
+DH041,334.0,336.0,0.145,0.0152,0.108
+DH041,336.0,338.0,0.042,0.015,0.024
+DH041,338.0,340.0,0.097,0.0137,0.142
+DH041,340.0,342.0,0.031,0.0121,0.042
+DH041,342.0,344.0,0.064,0.0113,0.052
+DH041,344.0,346.0,0.121,0.0176,0.165
+DH041,346.0,348.0,0.068,0.0552,0.083
+DH041,348.0,350.0,0.198,0.0076,0.226
+DH041,350.0,352.0,0.056,0.024,0.052
+DH041,352.0,354.0,0.1,0.0118,0.092
+DH041,354.0,356.0,0.119,0.0263,0.153
+DH041,356.0,358.0,0.089,0.0188,0.11
+DH041,358.0,360.0,0.237,0.0262,0.343
+DH041,360.0,362.0,0.083,0.0179,0.084
+DH041,362.0,364.0,0.051,0.0123,0.04
+DH041,364.0,366.0,0.054,0.0275,0.074
+DH041,366.0,368.0,0.134,0.0252,0.133
+DH041,368.0,370.0,0.062,0.0225,0.057
+DH041,370.0,372.0,0.032,0.0429,0.035
+DH041,372.0,374.0,0.145,0.0274,0.078
+DH041,374.0,376.0,0.068,0.0173,0.081
+DH041,376.0,378.0,0.046,0.0108,0.03
+DH041,378.0,380.0,0.122,0.0119,0.139
+DH041,380.0,382.0,0.077,0.011,0.064
+DH041,382.0,384.0,0.044,0.0209,0.066
+DH041,384.0,386.0,0.11,0.0248,0.145
+DH041,386.0,388.0,0.05,0.0221,0.057
+DH041,388.0,390.0,0.141,0.0222,0.135
+DH041,390.0,392.0,0.062,0.0312,0.069
+DH041,392.0,394.0,0.085,0.0235,0.074
+DH041,394.0,396.0,0.08,0.0286,0.097
+DH041,396.0,398.0,0.061,0.0246,0.049
+DH041,398.0,400.0,0.104,0.0275,0.067
+DH041,400.0,402.0,0.076,0.0278,0.044
+DH041,402.0,404.0,0.059,0.0183,0.033
+DH041,404.0,406.0,0.117,0.0338,0.12
+DH041,406.0,408.0,0.089,0.0164,0.049
+DH041,408.0,410.0,0.094,0.0124,0.086
+DH041,410.0,412.0,0.048,0.0246,0.061
+DH041,412.0,414.0,0.063,0.0187,0.089
+DH041,414.0,416.0,0.163,0.0147,0.21
+DH041,416.0,418.0,0.054,0.0275,0.08
+DH041,418.0,420.0,0.157,0.0382,0.201
+DH041,420.0,422.0,0.173,0.0413,0.101
+DH041,422.0,424.0,0.057,0.0087,0.034
+DH041,424.0,426.0,0.033,0.0075,0.02
+DH041,426.0,428.0,0.029,0.021,0.039
+DH041,428.0,430.0,0.03,0.0179,0.023
+DH041,430.0,431.0,0.027,0.0128,0.03
+DH042,0.0,2.0,0.066,0.0155,0.082
+DH042,2.0,4.0,0.298,0.0157,0.328
+DH042,4.0,6.0,0.071,0.0202,0.045
+DH042,6.0,8.0,0.118,0.0554,0.118
+DH042,8.0,10.0,0.061,0.0396,0.074
+DH042,10.0,12.0,0.132,0.0251,0.078
+DH042,12.0,14.0,0.259,0.0216,0.223
+DH042,14.0,16.0,0.054,0.0546,0.038
+DH042,16.0,18.0,0.111,0.0052,0.151
+DH042,18.0,20.0,0.14,0.0186,0.16
+DH042,20.0,22.0,0.05,0.0067,0.055
+DH042,22.0,24.0,0.069,0.0086,0.043
+DH042,24.0,26.0,0.116,0.0166,0.088
+DH042,26.0,28.0,0.084,0.0129,0.095
+DH042,28.0,30.0,0.128,0.0307,0.086
+DH042,30.0,32.0,0.055,0.0252,0.058
+DH042,32.0,34.0,0.054,0.0145,0.036
+DH042,34.0,36.0,0.188,0.0074,0.157
+DH042,36.0,38.0,0.165,0.0202,0.126
+DH042,38.0,40.0,0.104,0.0133,0.133
+DH042,40.0,42.0,0.034,0.0077,0.029
+DH042,42.0,44.0,0.085,0.0203,0.118
+DH042,44.0,46.0,0.05,0.0157,0.069
+DH042,46.0,48.0,0.073,0.0126,0.076
+DH042,48.0,50.0,0.092,0.0223,0.072
+DH042,50.0,52.0,0.074,0.0168,0.107
+DH042,52.0,54.0,0.047,0.0072,0.06
+DH042,54.0,56.0,0.056,0.0107,0.076
+DH042,56.0,58.0,0.075,0.0097,0.113
+DH042,58.0,60.0,0.031,0.0175,0.026
+DH042,60.0,62.0,0.097,0.0133,0.081
+DH042,62.0,64.0,0.081,0.036,0.044
+DH042,64.0,66.0,0.031,0.0206,0.016
+DH042,66.0,68.0,0.028,0.0108,0.015
+DH042,68.0,70.0,0.209,0.0261,0.187
+DH042,70.0,72.0,0.109,0.0066,0.131
+DH042,72.0,74.0,0.104,0.0199,0.068
+DH042,74.0,76.0,0.08,0.0217,0.05
+DH042,76.0,78.0,0.138,0.0215,0.182
+DH042,78.0,80.0,0.229,0.0277,0.284
+DH042,80.0,82.0,0.994,0.0624,2.514
+DH042,82.0,84.0,1.698,0.7172,3.995
+DH042,84.0,86.0,2.025,0.3086,3.824
+DH042,86.0,88.0,1.812,0.2973,4.023
+DH042,88.0,90.0,14.054,0.2291,22.887
+DH042,90.0,92.0,14.033,0.0942,42.032
+DH042,92.0,94.0,11.167,0.7346,22.884
+DH042,94.0,96.0,0.176,0.0972,0.493
+DH042,96.0,98.0,3.384,0.13,7.093
+DH042,98.0,100.0,4.643,0.1948,10.277
+DH042,100.0,102.0,6.442,0.3369,13.634
+DH042,102.0,104.0,5.225,0.2408,10.69
+DH042,104.0,106.0,2.668,0.6435,5.436
+DH042,106.0,108.0,3.862,0.1623,9.221
+DH042,108.0,110.0,8.937,0.4544,19.827
+DH042,110.0,112.0,5.252,0.3589,12.132
+DH042,112.0,114.0,0.817,0.0625,1.572
+DH042,114.0,116.0,1.799,0.4221,4.442
+DH042,116.0,118.0,0.624,0.2701,1.072
+DH042,118.0,120.0,0.725,0.0626,2.089
+DH042,120.0,122.0,3.803,0.3483,10.558
+DH042,122.0,124.0,2.733,0.0743,4.57
+DH042,124.0,126.0,2.317,0.2752,5.569
+DH042,126.0,128.0,0.626,0.1666,1.054
+DH042,128.0,130.0,0.839,0.2497,1.927
+DH042,130.0,132.0,1.649,0.2765,3.923
+DH042,132.0,134.0,1.013,0.7029,2.26
+DH042,134.0,136.0,6.12,0.5381,13.559
+DH042,136.0,138.0,0.713,0.174,1.597
+DH042,138.0,140.0,1.529,0.4049,2.644
+DH042,140.0,142.0,3.412,0.219,9.352
+DH042,142.0,144.0,0.087,0.6222,0.208
+DH042,144.0,146.0,0.237,0.3168,0.423
+DH042,146.0,148.0,5.593,0.5448,10.106
+DH042,148.0,150.0,0.779,0.1729,1.681
+DH042,150.0,152.0,0.178,0.2472,0.354
+DH042,152.0,154.0,6.482,0.3933,10.711
+DH042,154.0,156.0,0.082,0.8112,0.158
+DH042,156.0,158.0,11.041,0.0872,30.683
+DH042,158.0,160.0,18.985,0.1063,50.323
+DH042,160.0,162.0,4.191,0.4141,9.243
+DH042,162.0,164.0,2.91,0.096,7.923
+DH042,164.0,166.0,5.297,0.0522,13.763
+DH042,166.0,168.0,0.113,0.5104,0.268
+DH042,168.0,170.0,5.189,0.3356,13.711
+DH042,170.0,172.0,3.824,0.2082,6.822
+DH042,172.0,174.0,30.641,0.0763,85.115
+DH042,174.0,176.0,1.351,0.1515,3.625
+DH042,176.0,178.0,0.732,0.4484,1.485
+DH042,178.0,180.0,3.823,0.3719,7.006
+DH042,180.0,182.0,3.993,0.4768,9.017
+DH042,182.0,184.0,1.468,0.3293,2.83
+DH042,184.0,186.0,6.473,0.0567,9.817
+DH042,186.0,188.0,0.62,0.3495,1.564
+DH042,188.0,190.0,1.601,0.1245,4.4
+DH042,190.0,192.0,1.897,0.6985,5.315
+DH042,192.0,194.0,7.395,0.2688,12.296
+DH042,194.0,196.0,2.971,0.1521,6.357
+DH042,196.0,198.0,0.957,0.222,2.573
+DH042,198.0,200.0,0.407,0.1558,0.929
+DH042,200.0,202.0,4.818,0.2186,10.989
+DH042,202.0,204.0,0.503,0.1076,1.429
+DH042,204.0,206.0,4.107,0.2685,11.776
+DH042,206.0,208.0,1.676,0.7479,3.7
+DH042,208.0,210.0,1.831,0.0982,5.321
+DH042,210.0,212.0,2.243,0.2782,5.962
+DH042,212.0,214.0,3.545,0.1659,7.024
+DH042,214.0,216.0,25.956,0.143,77.552
+DH042,216.0,218.0,0.311,0.1682,0.566
+DH042,218.0,220.0,1.115,0.7276,1.673
+DH042,220.0,222.0,8.427,0.1217,18.166
+DH043,0.0,2.0,0.087,0.0233,0.089
+DH043,2.0,4.0,0.098,0.0246,0.131
+DH043,4.0,6.0,0.067,0.0141,0.089
+DH043,6.0,8.0,0.105,0.0142,0.104
+DH043,8.0,10.0,0.071,0.0108,0.066
+DH043,10.0,12.0,0.133,0.0062,0.161
+DH043,12.0,14.0,0.101,0.0091,0.107
+DH043,14.0,16.0,0.154,0.0169,0.101
+DH043,16.0,18.0,0.021,0.0275,0.013
+DH043,18.0,20.0,0.241,0.0166,0.202
+DH043,20.0,22.0,0.136,0.0172,0.173
+DH043,22.0,24.0,0.098,0.0192,0.135
+DH043,24.0,26.0,0.156,0.0141,0.107
+DH043,26.0,28.0,0.018,0.0154,0.019
+DH043,28.0,30.0,0.106,0.0155,0.068
+DH043,30.0,32.0,0.134,0.0223,0.068
+DH043,32.0,34.0,0.226,0.0265,0.123
+DH043,34.0,36.0,0.066,0.0272,0.05
+DH043,36.0,38.0,0.042,0.0286,0.045
+DH043,38.0,40.0,0.167,0.0396,0.247
+DH043,40.0,42.0,0.232,0.0217,0.273
+DH043,42.0,44.0,0.027,0.0184,0.014
+DH043,44.0,46.0,0.084,0.0071,0.065
+DH043,46.0,48.0,0.121,0.011,0.078
+DH043,48.0,50.0,0.106,0.032,0.141
+DH043,50.0,52.0,0.065,0.0201,0.06
+DH043,52.0,54.0,0.121,0.024,0.166
+DH043,54.0,56.0,0.02,0.0226,0.024
+DH043,56.0,58.0,0.071,0.0059,0.089
+DH043,58.0,60.0,0.054,0.0424,0.07
+DH043,60.0,62.0,0.051,0.0066,0.066
+DH043,62.0,64.0,0.125,0.0164,0.148
+DH043,64.0,66.0,0.067,0.0312,0.082
+DH043,66.0,68.0,0.031,0.0091,0.038
+DH043,68.0,70.0,0.144,0.0097,0.102
+DH043,70.0,72.0,0.093,0.0103,0.089
+DH043,72.0,74.0,0.08,0.0175,0.105
+DH043,74.0,76.0,0.247,0.0144,0.363
+DH043,76.0,78.0,0.104,0.0414,0.148
+DH043,78.0,80.0,0.137,0.0121,0.086
+DH043,80.0,82.0,0.552,0.2251,1.584
+DH043,82.0,84.0,4.617,0.9254,7.998
+DH043,84.0,86.0,0.202,0.1898,0.309
+DH043,86.0,88.0,2.836,0.1967,6.189
+DH043,88.0,90.0,2.621,0.2052,4.133
+DH043,90.0,92.0,0.274,0.2904,0.52
+DH043,92.0,94.0,0.624,0.2153,1.189
+DH043,94.0,96.0,1.052,0.1183,2.424
+DH043,96.0,98.0,1.697,0.1391,3.116
+DH043,98.0,100.0,1.904,0.4675,3.977
+DH043,100.0,102.0,1.674,0.2856,3.13
+DH043,102.0,104.0,4.009,0.2748,6.236
+DH043,104.0,106.0,1.841,0.2585,4.296
+DH043,106.0,108.0,0.346,0.2935,0.734
+DH043,108.0,110.0,1.576,0.511,4.317
+DH043,110.0,112.0,0.266,0.1277,0.548
+DH043,112.0,114.0,3.339,0.1223,6.615
+DH043,114.0,116.0,7.075,0.1065,11.802
+DH043,116.0,118.0,4.226,0.4886,10.125
+DH043,118.0,120.0,3.121,0.0385,5.815
+DH043,120.0,122.0,8.268,2.4789,12.617
+DH043,122.0,124.0,0.498,0.148,1.217
+DH043,124.0,126.0,0.996,0.1065,1.762
+DH043,126.0,128.0,3.578,0.1948,7.18
+DH043,128.0,130.0,0.996,0.1602,2.583
+DH043,130.0,132.0,0.953,0.3734,1.466
+DH043,132.0,134.0,0.271,0.5066,0.57
+DH043,134.0,136.0,0.423,0.1666,0.685
+DH043,136.0,138.0,5.014,0.1657,8.561
+DH043,138.0,140.0,1.774,0.0683,2.82
+DH043,140.0,142.0,4.927,0.1227,7.534
+DH043,142.0,144.0,7.163,0.2333,14.361
+DH043,144.0,146.0,73.805,0.2017,157.205
+DH043,146.0,148.0,0.679,0.038,1.346
+DH043,148.0,150.0,1.456,0.4495,3.533
+DH043,150.0,152.0,0.608,0.106,1.344
+DH043,152.0,154.0,2.046,0.1316,4.535
+DH043,154.0,156.0,1.878,0.7455,3.429
+DH043,156.0,158.0,2.768,0.7952,5.135
+DH043,158.0,160.0,3.323,2.0563,5.118
+DH043,160.0,162.0,8.311,0.1629,24.395
+DH043,162.0,164.0,1.652,0.3227,3.39
+DH043,164.0,166.0,6.974,0.3268,16.08
+DH043,166.0,168.0,2.79,0.0996,7.823
+DH043,168.0,170.0,6.26,0.1933,13.984
+DH043,170.0,172.0,13.839,0.2515,30.26
+DH043,172.0,174.0,1.098,0.1795,2.182
+DH043,174.0,176.0,1.254,0.2053,3.477
+DH043,176.0,178.0,4.447,0.5055,8.341
+DH043,178.0,180.0,0.087,0.1822,0.238
+DH043,180.0,182.0,1.071,0.7129,2.003
+DH043,182.0,184.0,0.836,0.4333,2.447
+DH043,184.0,186.0,0.874,1.1342,2.327
+DH043,186.0,187.0,6.829,0.3315,14.15
+DH044,0.0,2.0,0.175,0.0475,0.171
+DH044,2.0,4.0,0.08,0.0179,0.053
+DH044,4.0,6.0,0.148,0.0208,0.092
+DH044,6.0,8.0,0.159,0.0362,0.194
+DH044,8.0,10.0,0.051,0.0128,0.056
+DH044,10.0,12.0,0.046,0.0115,0.056
+DH044,12.0,14.0,0.428,0.0171,0.393
+DH044,14.0,16.0,0.041,0.0296,0.025
+DH044,16.0,18.0,0.046,0.0127,0.053
+DH044,18.0,20.0,0.051,0.0392,0.046
+DH044,20.0,22.0,0.054,0.0302,0.043
+DH044,22.0,24.0,0.058,0.0287,0.035
+DH044,24.0,26.0,0.128,0.0128,0.182
+DH044,26.0,28.0,0.266,0.014,0.35
+DH044,28.0,30.0,0.097,0.0222,0.126
+DH044,30.0,32.0,0.068,0.0393,0.084
+DH044,32.0,34.0,0.061,0.0109,0.071
+DH044,34.0,36.0,0.148,0.033,0.212
+DH044,36.0,38.0,0.031,0.0267,0.034
+DH044,38.0,40.0,0.091,0.0493,0.054
+DH044,40.0,42.0,0.124,0.011,0.072
+DH044,42.0,44.0,0.119,0.0451,0.153
+DH044,44.0,46.0,0.064,0.0143,0.059
+DH044,46.0,48.0,0.06,0.0359,0.036
+DH044,48.0,50.0,0.033,0.0187,0.042
+DH044,50.0,52.0,0.051,0.0228,0.071
+DH044,52.0,54.0,0.14,0.0359,0.198
+DH044,54.0,56.0,0.084,0.0125,0.043
+DH044,56.0,58.0,0.1,0.0296,0.134
+DH044,58.0,60.0,0.124,0.0119,0.168
+DH044,60.0,62.0,0.112,0.0388,0.056
+DH044,62.0,64.0,0.033,0.0519,0.039
+DH044,64.0,66.0,0.091,0.0102,0.057
+DH044,66.0,68.0,0.124,0.0236,0.1
+DH044,68.0,70.0,0.079,0.0135,0.118
+DH044,70.0,72.0,0.14,0.0141,0.156
+DH044,72.0,74.0,0.097,0.0143,0.052
+DH044,74.0,76.0,0.042,0.011,0.026
+DH044,76.0,78.0,0.07,0.0638,0.102
+DH044,78.0,80.0,0.041,0.0085,0.028
+DH044,80.0,82.0,1.382,0.6474,2.66
+DH044,82.0,84.0,0.206,0.0987,0.515
+DH044,84.0,86.0,3.783,0.0961,5.723
+DH044,86.0,88.0,0.448,0.2242,1.28
+DH044,88.0,90.0,12.856,0.2716,21.068
+DH044,90.0,92.0,13.351,0.1927,38.599
+DH044,92.0,94.0,1.067,0.2399,1.794
+DH044,94.0,96.0,3.276,0.4245,8.334
+DH044,96.0,98.0,1.149,0.2968,2.119
+DH044,98.0,100.0,0.36,0.296,0.967
+DH044,100.0,102.0,1.907,0.3385,5.089
+DH044,102.0,104.0,1.835,0.0909,3.7
+DH044,104.0,106.0,4.49,0.2489,7.036
+DH044,106.0,108.0,0.868,0.3658,1.663
+DH044,108.0,110.0,5.492,0.4509,8.433
+DH044,110.0,112.0,6.956,0.2493,14.638
+DH044,112.0,114.0,0.161,0.1026,0.379
+DH044,114.0,116.0,1.518,0.2445,2.596
+DH044,116.0,118.0,3.136,0.129,6.798
+DH044,118.0,120.0,19.514,0.1682,35.773
+DH044,120.0,122.0,0.978,0.2389,1.607
+DH044,122.0,124.0,0.279,0.0696,0.709
+DH044,124.0,126.0,10.362,0.8024,25.804
+DH044,126.0,128.0,0.678,0.1572,1.895
+DH044,128.0,130.0,0.355,0.2737,0.554
+DH044,130.0,132.0,23.337,0.2088,69.023
+DH044,132.0,134.0,1.923,0.178,4.798
+DH044,134.0,136.0,3.362,0.0845,6.346
+DH044,136.0,138.0,4.864,0.6947,9.377
+DH044,138.0,140.0,7.781,0.1564,22.369
+DH044,140.0,142.0,11.217,0.0745,17.909
+DH044,142.0,144.0,8.62,0.1885,24.655
+DH044,144.0,146.0,1.619,0.2451,3.304
+DH044,146.0,148.0,6.747,0.2252,10.626
+DH044,148.0,150.0,3.354,0.4437,6.035
+DH044,150.0,152.0,17.926,0.2661,40.074
+DH044,152.0,154.0,16.304,0.224,29.887
+DH044,154.0,156.0,1.076,0.3171,1.759
+DH044,156.0,158.0,1.114,0.1434,2.991
+DH044,158.0,160.0,1.199,0.4414,3.54
+DH044,160.0,162.0,9.962,0.2772,25.131
+DH044,162.0,164.0,4.631,0.2071,12.423
+DH044,164.0,166.0,19.418,0.4686,53.377
+DH044,166.0,168.0,7.702,0.1544,18.753
+DH044,168.0,170.0,0.509,0.3713,1.351
+DH044,170.0,172.0,1.345,0.0303,3.783
+DH044,172.0,174.0,0.608,0.125,1.529
+DH044,174.0,176.0,0.647,0.1057,1.495
+DH044,176.0,178.0,6.34,0.1617,12.865
+DH044,178.0,180.0,0.48,0.0697,1.035
+DH044,180.0,182.0,0.306,0.2921,0.492
+DH044,182.0,184.0,0.41,0.3024,1.057
+DH044,184.0,186.0,7.854,0.4494,20.041
+DH044,186.0,188.0,3.1,0.332,6.23
+DH044,188.0,190.0,2.712,0.082,5.346
+DH044,190.0,192.0,3.477,0.7453,8.752
+DH044,192.0,194.0,4.919,0.2378,13.859
+DH044,194.0,196.0,0.392,0.1144,0.993
+DH044,196.0,198.0,4.436,0.4752,7.113
+DH044,198.0,200.0,9.2,0.2364,15.426
+DH044,200.0,202.0,2.096,0.1249,4.028
+DH044,202.0,204.0,1.446,0.2062,3.06
+DH044,204.0,206.0,0.915,0.4825,2.216
+DH044,206.0,208.0,3.215,0.2075,7.096
+DH044,208.0,210.0,0.428,0.0656,0.669
+DH044,210.0,212.0,1.392,0.2075,2.267
+DH044,212.0,214.0,6.655,0.2835,18.716
+DH044,214.0,216.0,1.097,0.2705,2.861
+DH044,216.0,218.0,4.063,0.1009,11.019
+DH044,218.0,220.0,0.432,0.1969,0.932
+DH044,220.0,222.0,2.921,0.1567,7.16
+DH044,222.0,224.0,2.52,0.2352,6.696
+DH044,224.0,226.0,0.639,0.243,1.408
+DH044,226.0,228.0,4.44,0.0923,12.044
+DH044,228.0,230.0,0.118,0.8518,0.31
+DH044,230.0,232.0,0.527,0.2834,0.823
+DH044,232.0,234.0,1.584,0.4557,3.378
+DH044,234.0,236.0,1.378,0.1752,3.69
+DH044,236.0,238.0,0.218,0.2188,0.618
+DH044,238.0,240.0,8.116,0.0798,17.253
+DH044,240.0,242.0,9.433,0.2821,23.861
+DH044,242.0,244.0,3.835,0.3218,7.623
+DH044,244.0,246.0,2.484,0.0994,5.27
+DH044,246.0,248.0,1.128,0.2043,2.791
+DH044,248.0,250.0,0.831,0.1483,1.525
+DH044,250.0,252.0,0.059,0.0298,0.037
+DH044,252.0,254.0,0.045,0.0475,0.039
+DH044,254.0,256.0,0.081,0.0462,0.051
+DH044,256.0,258.0,0.184,0.0254,0.138
+DH044,258.0,260.0,0.076,0.0063,0.087
+DH044,260.0,262.0,0.094,0.0206,0.129
+DH044,262.0,264.0,0.097,0.0251,0.127
+DH044,264.0,266.0,0.114,0.0175,0.119
+DH044,266.0,268.0,0.147,0.0154,0.133
+DH044,268.0,270.0,0.074,0.025,0.074
+DH044,270.0,272.0,0.09,0.0398,0.082
+DH044,272.0,274.0,0.248,0.0199,0.222
+DH044,274.0,276.0,0.088,0.0157,0.099
+DH044,276.0,278.0,0.139,0.0548,0.152
+DH044,278.0,280.0,0.114,0.0167,0.136
+DH044,280.0,282.0,0.08,0.0209,0.089
+DH044,282.0,284.0,0.06,0.022,0.056
+DH044,284.0,286.0,0.144,0.0083,0.12
+DH044,286.0,288.0,0.117,0.0126,0.069
+DH044,288.0,290.0,0.031,0.0174,0.039
+DH044,290.0,292.0,0.11,0.0109,0.136
+DH044,292.0,294.0,0.091,0.0238,0.133
+DH044,294.0,296.0,0.066,0.027,0.066
+DH044,296.0,298.0,0.181,0.0178,0.176
+DH044,298.0,300.0,0.079,0.0191,0.052
+DH044,300.0,302.0,0.033,0.0157,0.022
+DH044,302.0,304.0,0.077,0.0157,0.094
+DH044,304.0,306.0,0.043,0.0339,0.03
+DH044,306.0,308.0,0.072,0.018,0.09
+DH044,308.0,310.0,0.092,0.0136,0.086
+DH044,310.0,312.0,0.066,0.0156,0.084
+DH044,312.0,314.0,0.021,0.0192,0.027
+DH044,314.0,316.0,0.027,0.0154,0.021
+DH044,316.0,318.0,0.176,0.014,0.097
+DH044,318.0,320.0,0.188,0.0134,0.237
+DH044,320.0,322.0,0.232,0.0205,0.294
+DH044,322.0,324.0,0.064,0.0258,0.072
+DH044,324.0,326.0,0.027,0.0153,0.04
+DH044,326.0,328.0,0.088,0.0116,0.082
+DH044,328.0,330.0,0.084,0.0098,0.047
+DH044,330.0,332.0,0.119,0.0325,0.173
+DH044,332.0,334.0,0.042,0.0486,0.037
+DH044,334.0,336.0,0.087,0.0127,0.111
+DH044,336.0,338.0,0.23,0.0208,0.303
+DH044,338.0,340.0,0.084,0.011,0.047
+DH044,340.0,342.0,0.042,0.0204,0.055
+DH044,342.0,344.0,0.09,0.0157,0.12
+DH044,344.0,346.0,0.102,0.0099,0.099
+DH044,346.0,348.0,0.141,0.0159,0.161
+DH044,348.0,350.0,0.074,0.0263,0.038
+DH044,350.0,352.0,0.053,0.0129,0.06
+DH044,352.0,354.0,0.098,0.018,0.09
+DH044,354.0,356.0,0.084,0.018,0.09
+DH044,356.0,358.0,0.159,0.0144,0.161
+DH044,358.0,360.0,0.024,0.0164,0.014
+DH044,360.0,362.0,0.046,0.0615,0.058
+DH044,362.0,364.0,0.171,0.0281,0.162
+DH044,364.0,366.0,0.073,0.0409,0.078
+DH044,366.0,368.0,0.084,0.0209,0.043
+DH044,368.0,370.0,0.085,0.0179,0.078
+DH044,370.0,372.0,0.233,0.01,0.163
+DH044,372.0,374.0,0.066,0.0346,0.052
+DH044,374.0,376.0,0.105,0.0169,0.077
+DH044,376.0,378.0,0.233,0.0114,0.207
+DH044,378.0,380.0,0.044,0.0094,0.039
+DH044,380.0,382.0,0.057,0.0102,0.058
+DH044,382.0,384.0,0.034,0.0195,0.026
+DH044,384.0,386.0,0.019,0.0141,0.024
+DH044,386.0,388.0,0.043,0.0237,0.045
+DH044,388.0,390.0,0.045,0.0182,0.025
+DH044,390.0,392.0,0.049,0.0165,0.063
+DH044,392.0,394.0,0.049,0.023,0.064
+DH044,394.0,396.0,0.075,0.0229,0.102
+DH044,396.0,398.0,0.06,0.0227,0.053
+DH044,398.0,399.0,0.06,0.0105,0.055
+DH045,0.0,2.0,0.068,0.0241,0.053
+DH045,2.0,4.0,0.063,0.0313,0.058
+DH045,4.0,6.0,0.168,0.0355,0.197
+DH045,6.0,8.0,0.074,0.0655,0.047
+DH045,8.0,10.0,0.095,0.0181,0.091
+DH045,10.0,12.0,0.179,0.0138,0.221
+DH045,12.0,14.0,0.165,0.0248,0.191
+DH045,14.0,16.0,0.067,0.0048,0.067
+DH045,16.0,18.0,0.069,0.0173,0.048
+DH045,18.0,20.0,0.071,0.0136,0.064
+DH045,20.0,22.0,0.17,0.0178,0.211
+DH045,22.0,24.0,0.058,0.0204,0.045
+DH045,24.0,26.0,0.285,0.02,0.319
+DH045,26.0,28.0,0.064,0.0393,0.057
+DH045,28.0,30.0,0.136,0.01,0.156
+DH045,30.0,32.0,0.043,0.0208,0.042
+DH045,32.0,34.0,0.078,0.0317,0.052
+DH045,34.0,36.0,0.039,0.0071,0.04
+DH045,36.0,38.0,0.212,0.0113,0.158
+DH045,38.0,40.0,0.082,0.0069,0.111
+DH045,40.0,42.0,0.13,0.0195,0.191
+DH045,42.0,44.0,0.04,0.0194,0.02
+DH045,44.0,46.0,0.075,0.0151,0.077
+DH045,46.0,48.0,0.091,0.0213,0.092
+DH045,48.0,50.0,0.169,0.01,0.148
+DH045,50.0,52.0,0.151,0.0114,0.178
+DH045,52.0,54.0,0.057,0.0133,0.041
+DH045,54.0,56.0,0.058,0.0253,0.08
+DH045,56.0,58.0,0.111,0.0143,0.139
+DH045,58.0,60.0,0.06,0.0288,0.06
+DH045,60.0,62.0,0.023,0.0215,0.031
+DH045,62.0,64.0,0.059,0.0334,0.069
+DH045,64.0,66.0,0.123,0.0438,0.092
+DH045,66.0,68.0,0.072,0.0174,0.063
+DH045,68.0,70.0,0.105,0.0535,0.07
+DH045,70.0,72.0,0.055,0.0137,0.028
+DH045,72.0,74.0,0.024,0.0144,0.02
+DH045,74.0,76.0,0.095,0.0484,0.084
+DH045,76.0,78.0,0.026,0.0116,0.026
+DH045,78.0,80.0,0.087,0.0413,0.084
+DH045,80.0,82.0,6.795,0.1876,20.17
+DH045,82.0,84.0,0.759,0.4841,1.598
+DH045,84.0,86.0,0.392,0.3586,0.793
+DH045,86.0,88.0,1.366,0.779,2.766
+DH045,88.0,90.0,0.529,0.1984,1.027
+DH045,90.0,92.0,0.999,0.2483,2.505
+DH045,92.0,94.0,1.447,0.2788,4.168
+DH045,94.0,96.0,1.96,0.1331,4.329
+DH045,96.0,98.0,5.565,0.8748,10.962
+DH045,98.0,100.0,3.314,0.1336,9.756
+DH045,100.0,102.0,7.912,0.036,18.456
+DH045,102.0,104.0,5.371,0.0898,8.291
+DH045,104.0,106.0,3.499,0.0697,5.513
+DH045,106.0,108.0,3.667,0.3813,6.331
+DH045,108.0,110.0,2.428,0.2811,4.514
+DH045,110.0,112.0,2.145,0.118,5.427
+DH045,112.0,114.0,5.053,0.3846,13.241
+DH045,114.0,116.0,1.498,0.1438,3.501
+DH045,116.0,118.0,0.325,0.0659,0.703
+DH045,118.0,120.0,0.417,0.0944,0.867
+DH045,120.0,122.0,1.357,0.4532,3.575
+DH045,122.0,124.0,0.854,0.4854,2.496
+DH045,124.0,126.0,0.409,0.273,0.842
+DH045,126.0,128.0,0.914,0.9956,2.242
+DH045,128.0,130.0,1.714,0.2388,5.01
+DH045,130.0,132.0,0.959,0.1459,2.61
+DH045,132.0,134.0,0.361,0.4929,0.605
+DH045,134.0,136.0,1.657,0.0621,3.551
+DH045,136.0,138.0,10.561,0.5146,21.574
+DH045,138.0,140.0,0.391,0.0962,0.893
+DH045,140.0,142.0,5.251,0.1177,14.28
+DH045,142.0,144.0,0.573,0.8408,0.949
+DH045,144.0,146.0,2.311,0.2386,5.025
+DH045,146.0,148.0,0.71,0.5681,1.181
+DH045,148.0,150.0,9.015,0.0566,15.399
+DH045,150.0,152.0,15.651,0.3898,42.316
+DH045,152.0,154.0,0.632,0.124,1.502
+DH045,154.0,156.0,3.923,0.4548,8.135
+DH045,156.0,158.0,1.587,0.412,2.706
+DH045,158.0,160.0,1.815,0.072,2.903
+DH045,160.0,162.0,3.774,0.1374,6.214
+DH045,162.0,164.0,2.982,0.2755,5.463
+DH045,164.0,166.0,4.965,0.2822,11.307
+DH045,166.0,168.0,24.056,0.1241,61.728
+DH045,168.0,170.0,2.012,0.321,3.175
+DH045,170.0,172.0,1.531,0.3611,3.513
+DH045,172.0,174.0,1.031,0.6105,2.076
+DH045,174.0,176.0,1.321,0.5395,2.071
+DH045,176.0,178.0,2.15,0.1583,3.88
+DH045,178.0,180.0,1.252,0.4093,2.667
+DH045,180.0,182.0,1.419,0.9644,3.398
+DH045,182.0,184.0,0.41,0.4426,1.122
+DH045,184.0,186.0,13.332,0.2421,31.104
+DH045,186.0,188.0,0.713,0.0604,1.282
+DH045,188.0,190.0,0.453,0.3334,1.034
+DH045,190.0,192.0,1.258,0.3354,2.19
+DH045,192.0,194.0,8.802,0.1344,19.872
+DH045,194.0,196.0,1.038,0.2542,2.251
+DH046,0.0,2.0,0.064,0.0149,0.073
+DH046,2.0,4.0,0.082,0.0236,0.093
+DH046,4.0,6.0,0.058,0.0202,0.035
+DH046,6.0,8.0,0.115,0.0159,0.136
+DH046,8.0,10.0,0.094,0.0408,0.132
+DH046,10.0,12.0,0.086,0.013,0.059
+DH046,12.0,14.0,0.07,0.0085,0.072
+DH046,14.0,16.0,0.092,0.0122,0.047
+DH046,16.0,18.0,0.079,0.0178,0.106
+DH046,18.0,20.0,0.037,0.0506,0.052
+DH046,20.0,22.0,0.116,0.0195,0.072
+DH046,22.0,24.0,0.044,0.0141,0.057
+DH046,24.0,26.0,0.036,0.0119,0.051
+DH046,26.0,28.0,0.109,0.0229,0.144
+DH046,28.0,30.0,0.031,0.024,0.031
+DH046,30.0,32.0,0.067,0.0103,0.077
+DH046,32.0,34.0,0.104,0.0163,0.101
+DH046,34.0,36.0,0.143,0.0201,0.136
+DH046,36.0,38.0,0.054,0.0139,0.068
+DH046,38.0,40.0,0.092,0.0204,0.135
+DH046,40.0,42.0,0.133,0.0185,0.088
+DH046,42.0,44.0,0.128,0.0125,0.188
+DH046,44.0,46.0,0.075,0.039,0.071
+DH046,46.0,48.0,0.195,0.0117,0.145
+DH046,48.0,50.0,0.046,0.0311,0.065
+DH046,50.0,52.0,0.126,0.0179,0.165
+DH046,52.0,54.0,0.015,0.0642,0.019
+DH046,54.0,56.0,0.014,0.0213,0.015
+DH046,56.0,58.0,0.053,0.0129,0.034
+DH046,58.0,60.0,0.169,0.0193,0.183
+DH046,60.0,62.0,0.162,0.0163,0.113
+DH046,62.0,64.0,0.072,0.0238,0.081
+DH046,64.0,66.0,0.12,0.0282,0.103
+DH046,66.0,68.0,0.07,0.0238,0.103
+DH046,68.0,70.0,0.034,0.0234,0.033
+DH046,70.0,72.0,0.041,0.0302,0.035
+DH046,72.0,74.0,0.034,0.0262,0.019
+DH046,74.0,76.0,0.079,0.0156,0.097
+DH046,76.0,78.0,0.077,0.0145,0.095
+DH046,78.0,80.0,0.067,0.0107,0.06
+DH046,80.0,82.0,2.563,0.3084,7.075
+DH046,82.0,84.0,2.972,0.1527,6.079
+DH046,84.0,86.0,3.169,0.2031,8.366
+DH046,86.0,88.0,3.05,0.3381,6.919
+DH046,88.0,90.0,1.814,0.1175,2.941
+DH046,90.0,92.0,6.159,0.159,12.543
+DH046,92.0,94.0,8.949,0.105,15.307
+DH046,94.0,96.0,4.012,0.2237,6.766
+DH046,96.0,98.0,8.574,0.3049,25.197
+DH046,98.0,100.0,5.719,0.0408,14.814
+DH046,100.0,102.0,0.453,0.0942,0.899
+DH046,102.0,104.0,3.832,0.2379,7.409
+DH046,104.0,106.0,10.99,0.2162,27.904
+DH046,106.0,108.0,9.765,0.2659,19.787
+DH046,108.0,110.0,4.424,1.5118,7.572
+DH046,110.0,112.0,2.269,0.3969,5.024
+DH046,112.0,114.0,5.831,0.0211,12.098
+DH046,114.0,116.0,1.967,0.1996,4.234
+DH046,116.0,118.0,6.602,0.149,13.942
+DH046,118.0,120.0,2.128,0.333,5.943
+DH046,120.0,122.0,2.813,0.4374,5.314
+DH046,122.0,124.0,1.213,0.1992,2.527
+DH046,124.0,126.0,4.401,0.243,8.584
+DH046,126.0,128.0,1.705,0.0658,4.314
+DH046,128.0,130.0,2.229,0.9482,4.477
+DH046,130.0,132.0,0.643,0.2622,1.458
+DH046,132.0,134.0,1.688,0.1953,2.607
+DH046,134.0,136.0,21.057,0.1599,58.037
+DH046,136.0,138.0,0.107,0.4312,0.214
+DH046,138.0,140.0,0.63,0.1482,1.214
+DH046,140.0,142.0,2.278,0.324,5.386
+DH046,142.0,144.0,1.028,0.1773,2.08
+DH046,144.0,146.0,0.996,1.9218,1.977
+DH046,146.0,148.0,6.041,0.0971,11.045
+DH046,148.0,150.0,4.594,0.0409,10.053
+DH046,150.0,152.0,3.418,0.2006,7.852
+DH046,152.0,154.0,8.123,0.11,18.063
+DH046,154.0,156.0,1.024,0.3356,2.797
+DH046,156.0,158.0,1.225,0.0562,2.805
+DH046,158.0,160.0,5.3,0.4036,14.542
+DH046,160.0,162.0,4.221,0.1924,12.608
+DH046,162.0,164.0,1.904,0.0207,5.59
+DH046,164.0,166.0,1.283,0.1792,2.0
+DH046,166.0,168.0,0.403,0.2369,0.784
+DH046,168.0,170.0,3.445,0.1382,6.064
+DH046,170.0,172.0,0.672,0.1353,1.401
+DH046,172.0,174.0,3.173,0.1721,8.681
+DH046,174.0,176.0,3.172,0.2371,7.791
+DH046,176.0,178.0,5.363,0.2705,13.937
+DH046,178.0,180.0,8.227,0.2455,23.701
+DH046,180.0,182.0,1.367,0.0517,2.795
+DH046,182.0,184.0,0.717,0.3375,2.112
+DH046,184.0,186.0,3.197,0.0962,5.335
+DH046,186.0,188.0,11.392,0.0782,31.966
+DH046,188.0,190.0,21.142,1.2309,57.399
+DH046,190.0,192.0,1.477,0.2967,2.976
+DH046,192.0,194.0,1.019,0.0925,2.32
+DH046,194.0,196.0,0.881,0.6021,2.578
+DH046,196.0,198.0,2.496,0.4899,6.743
+DH046,198.0,200.0,2.858,0.3034,5.104
+DH046,200.0,202.0,7.596,0.6131,20.884
+DH046,202.0,204.0,18.459,0.1274,39.205
+DH047,0.0,2.0,0.086,0.0178,0.058
+DH047,2.0,4.0,0.045,0.0238,0.03
+DH047,4.0,6.0,0.037,0.0109,0.032
+DH047,6.0,8.0,0.06,0.0233,0.051
+DH047,8.0,10.0,0.147,0.0173,0.131
+DH047,10.0,12.0,0.083,0.0368,0.122
+DH047,12.0,14.0,0.222,0.0296,0.167
+DH047,14.0,16.0,0.167,0.0156,0.213
+DH047,16.0,18.0,0.059,0.0297,0.087
+DH047,18.0,20.0,0.08,0.0257,0.097
+DH047,20.0,22.0,0.05,0.0267,0.068
+DH047,22.0,24.0,0.023,0.0126,0.024
+DH047,24.0,26.0,0.081,0.014,0.082
+DH047,26.0,28.0,0.083,0.025,0.09
+DH047,28.0,30.0,0.077,0.0195,0.116
+DH047,30.0,32.0,0.036,0.0153,0.049
+DH047,32.0,34.0,0.083,0.0139,0.097
+DH047,34.0,36.0,0.065,0.0213,0.056
+DH047,36.0,38.0,0.022,0.025,0.027
+DH047,38.0,40.0,0.113,0.0331,0.062
+DH047,40.0,42.0,0.145,0.0098,0.074
+DH047,42.0,44.0,0.071,0.0187,0.104
+DH047,44.0,46.0,0.107,0.0405,0.127
+DH047,46.0,48.0,0.092,0.0281,0.047
+DH047,48.0,50.0,0.186,0.0148,0.21
+DH047,50.0,52.0,0.045,0.0195,0.04
+DH047,52.0,54.0,0.12,0.0133,0.155
+DH047,54.0,56.0,0.108,0.0368,0.144
+DH047,56.0,58.0,0.249,0.0242,0.35
+DH047,58.0,60.0,0.123,0.0385,0.122
+DH047,60.0,62.0,0.043,0.0273,0.044
+DH047,62.0,64.0,0.073,0.0075,0.062
+DH047,64.0,66.0,0.066,0.0088,0.076
+DH047,66.0,68.0,0.126,0.0137,0.064
+DH047,68.0,70.0,0.043,0.0213,0.051
+DH047,70.0,72.0,0.035,0.0126,0.047
+DH047,72.0,74.0,0.111,0.0199,0.14
+DH047,74.0,76.0,0.076,0.0215,0.079
+DH047,76.0,78.0,0.061,0.0133,0.054
+DH047,78.0,80.0,0.073,0.0513,0.102
+DH047,80.0,82.0,3.151,0.3239,6.419
+DH047,82.0,84.0,0.841,0.6516,1.751
+DH047,84.0,86.0,44.773,0.2982,123.991
+DH047,86.0,88.0,1.757,0.6499,3.669
+DH047,88.0,90.0,2.072,0.3966,3.25
+DH047,90.0,92.0,1.728,0.1048,4.482
+DH047,92.0,94.0,0.513,0.2555,1.29
+DH047,94.0,96.0,2.189,0.0818,4.097
+DH047,96.0,98.0,4.166,0.1196,6.879
+DH047,98.0,100.0,3.541,0.111,10.202
+DH047,100.0,102.0,1.747,0.1827,2.964
+DH047,102.0,104.0,0.568,0.1153,1.295
+DH047,104.0,106.0,0.564,0.395,1.076
+DH047,106.0,108.0,0.391,0.1427,0.667
+DH047,108.0,110.0,1.303,0.3072,2.779
+DH047,110.0,112.0,39.727,0.5602,101.203
+DH047,112.0,114.0,1.444,0.1803,3.88
+DH047,114.0,116.0,0.726,0.1459,1.585
+DH047,116.0,118.0,1.08,0.142,3.083
+DH047,118.0,120.0,0.536,0.4895,1.033
+DH047,120.0,122.0,0.391,0.2278,1.078
+DH047,122.0,124.0,11.142,0.8116,29.313
+DH047,124.0,126.0,0.8,0.1311,2.31
+DH047,126.0,128.0,1.958,0.6679,3.25
+DH047,128.0,130.0,7.136,0.2558,19.671
+DH047,130.0,132.0,0.883,0.2342,2.613
+DH047,132.0,134.0,3.205,0.4249,7.353
+DH047,134.0,136.0,4.081,0.0501,9.671
+DH047,136.0,138.0,0.339,0.1975,0.663
+DH047,138.0,140.0,3.422,0.0803,5.662
+DH047,140.0,142.0,3.141,0.3358,6.215
+DH047,142.0,144.0,3.565,0.0664,7.303
+DH047,144.0,146.0,0.771,0.238,1.601
+DH047,146.0,148.0,8.96,0.2708,23.397
+DH047,148.0,150.0,3.426,1.2385,9.48
+DH047,150.0,152.0,2.073,0.1145,4.529
+DH047,152.0,154.0,5.033,0.1098,7.552
+DH047,154.0,156.0,12.493,0.2517,26.891
+DH047,156.0,158.0,30.369,0.9139,70.849
+DH047,158.0,160.0,10.287,0.1802,30.551
+DH047,160.0,162.0,1.339,0.0754,3.259
+DH047,162.0,164.0,0.412,0.2831,1.171
+DH047,164.0,166.0,4.134,0.2077,11.673
+DH047,166.0,168.0,2.628,0.3276,3.942
+DH047,168.0,170.0,2.05,0.0775,6.022
+DH047,170.0,172.0,4.233,0.2637,11.438
+DH047,172.0,174.0,0.667,0.444,1.14
+DH047,174.0,176.0,4.689,0.0756,9.381
+DH047,176.0,178.0,6.564,0.2091,11.244
+DH047,178.0,180.0,5.415,0.0766,16.016
+DH047,180.0,182.0,3.975,0.127,6.323
+DH047,182.0,184.0,7.276,0.2642,19.852
+DH047,184.0,186.0,2.298,0.1,6.446
+DH047,186.0,188.0,1.756,0.2193,3.884
+DH047,188.0,190.0,6.315,0.4683,18.805
+DH047,190.0,192.0,3.531,0.2456,8.849
+DH047,192.0,194.0,1.293,0.0434,2.853
+DH047,194.0,196.0,0.487,0.4594,1.096
+DH047,196.0,198.0,2.595,0.2157,5.201
+DH047,198.0,200.0,9.5,0.218,22.308
+DH047,200.0,202.0,6.744,0.1023,12.535
+DH047,202.0,204.0,4.047,0.5914,10.057
+DH047,204.0,206.0,3.616,0.16,9.854
+DH047,206.0,208.0,8.282,0.1808,17.983
+DH047,208.0,210.0,0.387,0.4679,1.129
+DH047,210.0,212.0,3.478,0.4156,6.74
+DH047,212.0,214.0,1.823,0.4962,3.512
+DH047,214.0,216.0,0.747,0.185,2.161
+DH047,216.0,218.0,15.377,0.2062,42.578
+DH047,218.0,220.0,7.98,0.0587,15.175
+DH047,220.0,222.0,2.111,0.6282,5.512
+DH047,222.0,224.0,0.718,0.2552,1.376
+DH047,224.0,226.0,1.565,0.3656,4.432
+DH047,226.0,228.0,2.809,0.4799,5.584
+DH047,228.0,230.0,3.147,0.2452,8.108
+DH047,230.0,232.0,14.924,0.3317,28.34
+DH047,232.0,234.0,2.465,0.2978,6.299
+DH047,234.0,236.0,6.519,0.8095,10.104
+DH047,236.0,238.0,18.266,0.5201,28.012
+DH047,238.0,240.0,0.301,0.2389,0.893
+DH047,240.0,242.0,0.878,0.2383,1.328
+DH047,242.0,244.0,6.893,0.1636,16.771
+DH047,244.0,246.0,3.14,0.1113,8.077
+DH047,246.0,248.0,0.912,0.0514,2.168
+DH047,248.0,250.0,6.77,1.0067,17.099
+DH047,250.0,252.0,0.123,0.022,0.128
+DH047,252.0,254.0,0.112,0.0139,0.124
+DH047,254.0,256.0,0.067,0.0349,0.04
+DH047,256.0,258.0,0.04,0.0246,0.041
+DH047,258.0,260.0,0.11,0.03,0.073
+DH047,260.0,262.0,0.056,0.0348,0.08
+DH047,262.0,264.0,0.083,0.0181,0.097
+DH047,264.0,266.0,0.068,0.0081,0.057
+DH047,266.0,268.0,0.124,0.0058,0.114
+DH047,268.0,270.0,0.235,0.0104,0.15
+DH047,270.0,272.0,0.074,0.042,0.078
+DH047,272.0,274.0,0.048,0.0217,0.042
+DH047,274.0,276.0,0.056,0.0182,0.061
+DH047,276.0,278.0,0.057,0.0442,0.073
+DH047,278.0,280.0,0.036,0.0141,0.048
+DH047,280.0,282.0,0.051,0.0213,0.043
+DH047,282.0,284.0,0.04,0.0138,0.031
+DH047,284.0,286.0,0.125,0.014,0.175
+DH047,286.0,288.0,0.069,0.0264,0.072
+DH047,288.0,290.0,0.066,0.0233,0.067
+DH047,290.0,292.0,0.108,0.0232,0.119
+DH047,292.0,294.0,0.067,0.0171,0.038
+DH047,294.0,296.0,0.044,0.0146,0.057
+DH047,296.0,298.0,0.128,0.0212,0.152
+DH047,298.0,300.0,0.061,0.0116,0.035
+DH047,300.0,302.0,0.038,0.0361,0.051
+DH047,302.0,304.0,0.026,0.0212,0.026
+DH047,304.0,306.0,0.093,0.0136,0.054
+DH047,306.0,308.0,0.105,0.0307,0.155
+DH047,308.0,310.0,0.036,0.0228,0.034
+DH047,310.0,312.0,0.155,0.0063,0.163
+DH047,312.0,314.0,0.057,0.0155,0.074
+DH047,314.0,316.0,0.104,0.0252,0.113
+DH047,316.0,318.0,0.074,0.0526,0.098
+DH047,318.0,320.0,0.068,0.0171,0.062
+DH047,320.0,322.0,0.102,0.0113,0.07
+DH047,322.0,324.0,0.022,0.015,0.013
+DH047,324.0,326.0,0.075,0.0175,0.085
+DH047,326.0,328.0,0.045,0.0185,0.054
+DH047,328.0,330.0,0.099,0.0299,0.148
+DH048,0.0,2.0,0.122,0.0128,0.124
+DH048,2.0,4.0,0.262,0.0214,0.148
+DH048,4.0,6.0,0.049,0.0175,0.052
+DH048,6.0,8.0,0.083,0.0141,0.095
+DH048,8.0,10.0,0.168,0.0256,0.11
+DH048,10.0,12.0,0.107,0.0101,0.056
+DH048,12.0,14.0,0.156,0.0161,0.131
+DH048,14.0,16.0,0.114,0.0277,0.1
+DH048,16.0,18.0,0.14,0.0088,0.088
+DH048,18.0,20.0,0.126,0.0212,0.109
+DH048,20.0,22.0,0.075,0.0139,0.092
+DH048,22.0,24.0,0.07,0.0237,0.09
+DH048,24.0,26.0,0.035,0.033,0.03
+DH048,26.0,28.0,0.076,0.0138,0.083
+DH048,28.0,30.0,0.087,0.0257,0.076
+DH048,30.0,32.0,0.104,0.0137,0.096
+DH048,32.0,34.0,0.264,0.0254,0.276
+DH048,34.0,36.0,0.032,0.0222,0.041
+DH048,36.0,38.0,0.055,0.0181,0.069
+DH048,38.0,40.0,0.056,0.0201,0.078
+DH048,40.0,42.0,0.125,0.0205,0.067
+DH048,42.0,44.0,0.148,0.0242,0.074
+DH048,44.0,46.0,0.023,0.0237,0.022
+DH048,46.0,48.0,0.078,0.022,0.076
+DH048,48.0,50.0,0.248,0.0116,0.37
+DH048,50.0,52.0,0.1,0.0207,0.135
+DH048,52.0,54.0,0.081,0.0247,0.099
+DH048,54.0,56.0,0.045,0.0133,0.035
+DH048,56.0,58.0,0.124,0.0156,0.157
+DH048,58.0,60.0,0.316,0.0114,0.293
+DH048,60.0,62.0,0.123,0.03,0.162
+DH048,62.0,64.0,0.243,0.0215,0.15
+DH048,64.0,66.0,0.087,0.0138,0.114
+DH048,66.0,68.0,0.146,0.0083,0.126
+DH048,68.0,70.0,0.144,0.0156,0.147
+DH048,70.0,72.0,0.189,0.0068,0.176
+DH048,72.0,74.0,0.158,0.0175,0.233
+DH048,74.0,76.0,0.087,0.0124,0.054
+DH048,76.0,78.0,0.126,0.0133,0.091
+DH048,78.0,80.0,0.088,0.0142,0.065
+DH048,80.0,82.0,2.426,0.4122,5.012
+DH048,82.0,84.0,0.619,0.3281,1.827
+DH048,84.0,86.0,31.679,0.7071,58.305
+DH048,86.0,88.0,6.232,0.274,13.446
+DH048,88.0,90.0,3.129,1.0356,5.211
+DH048,90.0,92.0,0.66,0.2256,1.404
+DH048,92.0,94.0,0.279,0.0575,0.745
+DH048,94.0,96.0,2.722,0.0512,5.901
+DH048,96.0,98.0,8.202,0.1874,20.154
+DH048,98.0,100.0,4.418,0.317,9.848
+DH048,100.0,102.0,0.751,0.1626,1.968
+DH048,102.0,104.0,12.941,0.3707,35.67
+DH048,104.0,106.0,1.721,0.5512,4.03
+DH048,106.0,108.0,6.184,0.6747,16.224
+DH048,108.0,110.0,2.763,0.607,4.287
+DH048,110.0,112.0,43.95,0.2705,129.528
+DH048,112.0,114.0,1.441,0.3327,3.051
+DH048,114.0,116.0,0.73,0.1036,1.389
+DH048,116.0,118.0,8.385,0.0516,20.687
+DH048,118.0,120.0,10.717,0.0833,27.207
+DH048,120.0,122.0,0.575,0.1072,1.411
+DH048,122.0,124.0,21.076,0.1337,42.532
+DH048,124.0,126.0,0.414,0.4703,1.15
+DH048,126.0,128.0,9.259,0.2359,15.791
+DH048,128.0,130.0,3.18,0.1176,5.996
+DH048,130.0,132.0,0.532,0.6565,1.543
+DH048,132.0,134.0,3.768,0.0975,10.251
+DH048,134.0,136.0,1.421,2.4232,3.734
+DH048,136.0,138.0,0.83,0.1564,2.279
+DH048,138.0,140.0,1.831,0.9811,4.896
+DH048,140.0,142.0,6.58,0.1077,17.499
+DH048,142.0,144.0,2.842,0.1249,5.009
+DH048,144.0,146.0,4.658,0.3445,7.941
+DH048,146.0,148.0,8.241,0.1816,22.278
+DH048,148.0,150.0,12.552,0.092,37.094
+DH048,150.0,152.0,0.786,0.3042,2.346
+DH048,152.0,154.0,1.007,0.953,1.9
+DH048,154.0,156.0,1.937,0.113,3.619
+DH048,156.0,158.0,1.858,0.0769,3.794
+DH048,158.0,160.0,3.569,0.4228,8.566
+DH048,160.0,162.0,4.652,0.4867,10.509
+DH048,162.0,164.0,5.368,0.2171,12.106
+DH048,164.0,166.0,2.569,0.1624,3.973
+DH048,166.0,168.0,4.064,0.4296,7.567
+DH048,168.0,170.0,24.534,0.5179,61.98
+DH048,170.0,172.0,3.833,0.6908,6.105
+DH048,172.0,174.0,24.955,0.1201,49.319
+DH048,174.0,176.0,2.243,0.2142,6.712
+DH048,176.0,178.0,6.613,0.0796,19.662
+DH048,178.0,180.0,8.95,0.934,13.749
+DH048,180.0,182.0,7.417,0.422,11.314
+DH048,182.0,184.0,11.056,0.1958,20.217
+DH048,184.0,186.0,0.494,0.0847,1.156
+DH048,186.0,188.0,4.312,0.1991,11.237
+DH048,188.0,190.0,21.688,0.3171,39.481
+DH048,190.0,192.0,1.947,0.1146,4.797
+DH048,192.0,194.0,0.724,0.0857,1.61
+DH048,194.0,196.0,2.72,0.0355,7.757
+DH048,196.0,198.0,5.121,0.1252,10.331
+DH048,198.0,200.0,2.052,0.115,5.44
+DH048,200.0,202.0,0.644,0.2052,1.19
+DH048,202.0,204.0,2.195,0.8254,5.005
+DH048,204.0,206.0,4.077,0.1354,11.55
+DH048,206.0,208.0,1.6,0.2285,4.594
+DH048,208.0,210.0,1.221,0.1623,2.831
+DH048,210.0,212.0,1.213,0.2563,2.797
+DH048,212.0,214.0,13.431,1.9028,33.669
+DH048,214.0,216.0,3.167,0.5119,4.827
+DH048,216.0,218.0,0.675,0.8963,1.09
+DH048,218.0,220.0,3.262,0.7121,8.242
+DH048,220.0,222.0,2.101,0.1022,3.728
+DH048,222.0,224.0,9.448,0.3851,27.382
+DH048,224.0,226.0,18.539,0.1968,33.54
+DH048,226.0,228.0,2.898,1.0475,5.238
+DH048,228.0,230.0,2.352,0.1934,6.634
+DH048,230.0,232.0,0.932,0.0748,1.993
+DH048,232.0,234.0,1.173,0.1453,2.211
+DH048,234.0,236.0,2.369,0.2245,7.044
+DH048,236.0,238.0,4.928,1.2047,10.416
+DH048,238.0,240.0,5.7,0.1642,13.223
+DH048,240.0,242.0,29.214,0.1207,58.814
+DH048,242.0,244.0,0.952,0.0448,2.632
+DH048,244.0,246.0,0.794,0.2295,2.067
+DH048,246.0,248.0,9.348,0.0498,24.946
+DH048,248.0,250.0,1.508,0.4318,2.402
+DH048,250.0,252.0,0.167,0.0153,0.11
+DH048,252.0,254.0,0.105,0.0306,0.074
+DH048,254.0,256.0,0.1,0.0206,0.088
+DH048,256.0,258.0,0.105,0.0507,0.075
+DH048,258.0,260.0,0.066,0.0147,0.076
+DH048,260.0,262.0,0.023,0.0171,0.034
+DH048,262.0,264.0,0.06,0.0201,0.082
+DH048,264.0,266.0,0.1,0.006,0.145
+DH048,266.0,268.0,0.071,0.0123,0.045
+DH048,268.0,270.0,0.069,0.0328,0.058
+DH048,270.0,272.0,0.072,0.0204,0.085
+DH048,272.0,274.0,0.09,0.0055,0.046
+DH048,274.0,276.0,0.075,0.0282,0.08
+DH048,276.0,278.0,0.095,0.0214,0.138
+DH048,278.0,280.0,0.164,0.021,0.118
+DH048,280.0,282.0,0.056,0.0101,0.077
+DH048,282.0,284.0,0.066,0.0053,0.069
+DH048,284.0,286.0,0.101,0.0178,0.107
+DH048,286.0,288.0,0.084,0.0195,0.046
+DH048,288.0,290.0,0.056,0.0284,0.075
+DH048,290.0,292.0,0.061,0.0428,0.049
+DH048,292.0,294.0,0.055,0.0098,0.067
+DH048,294.0,296.0,0.089,0.0261,0.09
+DH048,296.0,298.0,0.068,0.0098,0.064
+DH048,298.0,300.0,0.032,0.0265,0.038
+DH048,300.0,302.0,0.08,0.0228,0.044
+DH048,302.0,304.0,0.087,0.0368,0.083
+DH048,304.0,306.0,0.067,0.0145,0.087
+DH048,306.0,308.0,0.035,0.0378,0.036
+DH048,308.0,310.0,0.235,0.0179,0.221
+DH048,310.0,312.0,0.122,0.0307,0.099
+DH048,312.0,314.0,0.025,0.0073,0.013
+DH048,314.0,316.0,0.207,0.0096,0.236
+DH048,316.0,318.0,0.067,0.0478,0.058
+DH048,318.0,320.0,0.106,0.0287,0.099
+DH048,320.0,322.0,0.038,0.026,0.028
+DH048,322.0,324.0,0.074,0.0324,0.074
+DH048,324.0,326.0,0.159,0.0351,0.189
+DH048,326.0,328.0,0.022,0.0327,0.016
+DH048,328.0,330.0,0.096,0.0223,0.066
+DH048,330.0,332.0,0.139,0.0157,0.113
+DH048,332.0,334.0,0.067,0.0207,0.043
+DH048,334.0,336.0,0.049,0.0126,0.035
+DH048,336.0,338.0,0.048,0.022,0.051
+DH048,338.0,340.0,0.079,0.0256,0.055
+DH048,340.0,342.0,0.049,0.024,0.028
+DH048,342.0,344.0,0.233,0.0227,0.138
+DH048,344.0,346.0,0.101,0.0115,0.141
+DH048,346.0,348.0,0.072,0.0121,0.089
+DH048,348.0,350.0,0.354,0.0192,0.407
+DH048,350.0,352.0,0.057,0.0232,0.032
+DH048,352.0,354.0,0.043,0.018,0.032
+DH048,354.0,356.0,0.064,0.0117,0.042
+DH048,356.0,358.0,0.062,0.0135,0.04
+DH048,358.0,360.0,0.312,0.0356,0.339
+DH048,360.0,362.0,0.058,0.0423,0.082
+DH048,362.0,364.0,0.148,0.023,0.192
+DH048,364.0,366.0,0.126,0.0233,0.171
+DH048,366.0,368.0,0.076,0.0283,0.042
+DH048,368.0,370.0,0.109,0.0126,0.071
+DH048,370.0,372.0,0.077,0.0165,0.051
+DH048,372.0,374.0,0.142,0.0218,0.129
+DH048,374.0,376.0,0.281,0.0232,0.414
+DH048,376.0,378.0,0.097,0.0154,0.103
+DH048,378.0,380.0,0.095,0.0048,0.108
+DH048,380.0,382.0,0.099,0.0164,0.051
+DH048,382.0,384.0,0.039,0.0366,0.025
+DH048,384.0,386.0,0.046,0.024,0.052
+DH048,386.0,388.0,0.066,0.0145,0.041
+DH048,388.0,390.0,0.184,0.0232,0.116
+DH048,390.0,392.0,0.137,0.0186,0.125
+DH048,392.0,394.0,0.09,0.0246,0.095
+DH048,394.0,396.0,0.041,0.0288,0.03
+DH048,396.0,398.0,0.043,0.02,0.023
+DH048,398.0,400.0,0.139,0.0207,0.085
+DH048,400.0,402.0,0.069,0.0395,0.065
+DH048,402.0,404.0,0.113,0.0187,0.057
+DH048,404.0,406.0,0.083,0.0323,0.122
+DH048,406.0,408.0,0.075,0.0159,0.09
+DH048,408.0,410.0,0.137,0.0312,0.11
+DH048,410.0,412.0,0.152,0.0083,0.21
+DH049,0.0,2.0,0.076,0.0191,0.097
+DH049,2.0,4.0,0.078,0.0151,0.079
+DH049,4.0,6.0,0.186,0.0137,0.205
+DH049,6.0,8.0,0.056,0.0207,0.081
+DH049,8.0,10.0,0.069,0.0366,0.054
+DH049,10.0,12.0,0.073,0.0364,0.067
+DH049,12.0,14.0,0.058,0.0243,0.058
+DH049,14.0,16.0,0.1,0.0172,0.064
+DH049,16.0,18.0,0.162,0.0207,0.16
+DH049,18.0,20.0,0.047,0.039,0.027
+DH049,20.0,22.0,0.097,0.036,0.064
+DH049,22.0,24.0,0.052,0.011,0.051
+DH049,24.0,26.0,0.044,0.0139,0.057
+DH049,26.0,28.0,0.072,0.0244,0.096
+DH049,28.0,30.0,0.072,0.0257,0.089
+DH049,30.0,32.0,0.058,0.011,0.067
+DH049,32.0,34.0,0.037,0.0348,0.044
+DH049,34.0,36.0,0.054,0.0108,0.029
+DH049,36.0,38.0,0.032,0.0235,0.018
+DH049,38.0,40.0,0.104,0.024,0.125
+DH049,40.0,42.0,0.095,0.0321,0.093
+DH049,42.0,44.0,0.096,0.0215,0.1
+DH049,44.0,46.0,0.045,0.0348,0.059
+DH049,46.0,48.0,0.124,0.0136,0.106
+DH049,48.0,50.0,0.072,0.0123,0.061
+DH049,50.0,52.0,0.211,0.0105,0.224
+DH049,52.0,54.0,0.467,0.0293,0.521
+DH049,54.0,56.0,0.043,0.0079,0.038
+DH049,56.0,58.0,0.127,0.0391,0.094
+DH049,58.0,60.0,0.037,0.0173,0.027
+DH049,60.0,62.0,0.14,0.0221,0.185
+DH049,62.0,64.0,0.023,0.0187,0.032
+DH049,64.0,66.0,0.07,0.0151,0.093
+DH049,66.0,68.0,0.046,0.0367,0.055
+DH049,68.0,70.0,0.07,0.018,0.092
+DH049,70.0,72.0,0.049,0.0299,0.057
+DH049,72.0,74.0,0.074,0.0417,0.046
+DH049,74.0,76.0,0.127,0.0303,0.18
+DH049,76.0,78.0,0.076,0.053,0.057
+DH049,78.0,80.0,0.093,0.0155,0.129
+DH049,80.0,82.0,7.078,0.179,15.909
+DH049,82.0,84.0,4.122,0.0942,7.598
+DH049,84.0,86.0,2.222,0.4745,4.368
+DH049,86.0,88.0,1.171,0.17,2.621
+DH049,88.0,90.0,8.446,0.0608,19.85
+DH049,90.0,92.0,3.703,0.1903,7.157
+DH049,92.0,94.0,3.259,0.162,5.106
+DH049,94.0,96.0,5.352,0.1048,9.215
+DH049,96.0,98.0,0.095,0.0477,0.16
+DH049,98.0,100.0,1.348,0.1127,2.537
+DH049,100.0,102.0,1.384,0.1012,3.323
+DH049,102.0,104.0,0.21,0.4029,0.329
+DH049,104.0,106.0,7.124,0.1578,12.833
+DH049,106.0,108.0,1.915,0.2312,2.899
+DH049,108.0,110.0,1.304,0.0834,2.41
+DH049,110.0,112.0,15.063,0.8415,29.549
+DH049,112.0,114.0,0.923,0.1432,2.28
+DH049,114.0,116.0,2.09,0.1004,5.402
+DH049,116.0,118.0,2.363,0.0132,3.752
+DH049,118.0,120.0,1.958,0.1048,4.399
+DH049,120.0,122.0,7.824,0.5257,22.308
+DH049,122.0,124.0,0.57,0.1163,1.421
+DH049,124.0,126.0,0.309,0.6803,0.649
+DH049,126.0,128.0,4.056,0.0537,9.504
+DH049,128.0,130.0,0.226,0.5051,0.43
+DH049,130.0,132.0,4.417,0.2347,9.447
+DH049,132.0,134.0,1.484,0.1896,3.911
+DH049,134.0,136.0,3.621,0.3153,10.759
+DH049,136.0,138.0,16.742,0.0538,41.205
+DH049,138.0,140.0,1.367,0.6213,2.873
+DH049,140.0,142.0,3.885,0.0344,9.37
+DH049,142.0,144.0,27.406,0.2323,64.676
+DH049,144.0,146.0,2.979,0.0961,4.588
+DH049,146.0,148.0,0.389,0.1187,0.89
+DH049,148.0,150.0,8.541,0.3234,13.822
+DH049,150.0,152.0,2.158,0.431,6.038
+DH049,152.0,154.0,0.924,0.3092,2.616
+DH049,154.0,156.0,2.189,0.1957,4.356
+DH049,156.0,158.0,10.662,0.1352,27.57
+DH049,158.0,160.0,0.948,0.1089,2.834
+DH049,160.0,162.0,6.717,0.0978,14.8
+DH049,162.0,164.0,0.377,0.2485,1.063
+DH049,164.0,166.0,5.737,0.3321,10.284
+DH049,166.0,168.0,0.35,0.1352,0.777
+DH049,168.0,170.0,1.166,0.0607,1.827
+DH049,170.0,172.0,1.113,0.5221,2.51
+DH049,172.0,174.0,1.596,0.664,4.427
+DH049,174.0,176.0,12.442,0.1338,23.468
+DH049,176.0,178.0,2.735,0.1585,7.063
+DH049,178.0,180.0,1.428,0.0991,3.423
+DH049,180.0,182.0,1.249,0.5639,3.251
+DH049,182.0,184.0,3.44,0.2002,9.152
+DH049,184.0,186.0,4.422,0.2418,11.384
+DH049,186.0,188.0,0.251,0.7462,0.411
+DH049,188.0,190.0,2.815,0.1849,4.855
+DH049,190.0,192.0,0.567,0.2954,0.875
+DH049,192.0,194.0,61.143,0.2476,122.98
+DH049,194.0,196.0,0.368,0.5046,1.047
+DH049,196.0,198.0,3.076,0.2799,6.685
+DH049,198.0,200.0,3.023,0.1192,8.297
+DH049,200.0,202.0,5.933,0.3192,16.529
+DH049,202.0,204.0,4.127,0.0939,11.261
+DH049,204.0,206.0,0.846,0.1781,1.618
+DH049,206.0,208.0,13.773,0.3077,25.683
+DH049,208.0,209.0,71.827,0.2316,133.552
+DH050,0.0,2.0,0.054,0.0343,0.059
+DH050,2.0,4.0,0.081,0.024,0.108
+DH050,4.0,6.0,0.038,0.0119,0.031
+DH050,6.0,8.0,0.066,0.0091,0.033
+DH050,8.0,10.0,0.076,0.02,0.079
+DH050,10.0,12.0,0.109,0.0125,0.113
+DH050,12.0,14.0,0.143,0.014,0.077
+DH050,14.0,16.0,0.033,0.0181,0.018
+DH050,16.0,18.0,0.025,0.0107,0.03
+DH050,18.0,20.0,0.132,0.007,0.182
+DH050,20.0,22.0,0.126,0.0201,0.15
+DH050,22.0,24.0,0.101,0.0308,0.053
+DH050,24.0,26.0,0.021,0.0325,0.014
+DH050,26.0,28.0,0.08,0.0068,0.083
+DH050,28.0,30.0,0.049,0.01,0.031
+DH050,30.0,32.0,0.06,0.0145,0.079
+DH050,32.0,34.0,0.096,0.0143,0.138
+DH050,34.0,36.0,0.062,0.0162,0.068
+DH050,36.0,38.0,0.044,0.038,0.037
+DH050,38.0,40.0,0.016,0.0191,0.013
+DH050,40.0,42.0,0.104,0.0149,0.13
+DH050,42.0,44.0,0.091,0.0269,0.135
+DH050,44.0,46.0,0.057,0.0416,0.064
+DH050,46.0,48.0,0.205,0.0815,0.143
+DH050,48.0,50.0,0.04,0.016,0.035
+DH050,50.0,52.0,0.173,0.057,0.087
+DH050,52.0,54.0,0.11,0.0128,0.078
+DH050,54.0,56.0,0.08,0.0103,0.113
+DH050,56.0,58.0,0.027,0.0127,0.02
+DH050,58.0,60.0,0.103,0.0179,0.101
+DH050,60.0,62.0,0.21,0.013,0.314
+DH050,62.0,64.0,0.236,0.0172,0.296
+DH050,64.0,66.0,0.08,0.0133,0.074
+DH050,66.0,68.0,0.181,0.0228,0.119
+DH050,68.0,70.0,0.047,0.0125,0.03
+DH050,70.0,72.0,0.142,0.0119,0.084
+DH050,72.0,74.0,0.092,0.0197,0.123
+DH050,74.0,76.0,0.136,0.0091,0.133
+DH050,76.0,78.0,0.072,0.0219,0.077
+DH050,78.0,80.0,0.085,0.0429,0.11
+DH050,80.0,82.0,1.168,0.1747,2.076
+DH050,82.0,84.0,8.947,0.0243,14.825
+DH050,84.0,86.0,8.827,0.1738,24.293
+DH050,86.0,88.0,31.1,0.238,74.118
+DH050,88.0,90.0,40.567,0.3078,76.73
+DH050,90.0,92.0,6.573,0.5754,13.666
+DH050,92.0,94.0,1.245,0.8815,2.159
+DH050,94.0,96.0,9.323,0.2754,17.153
+DH050,96.0,98.0,0.803,0.113,1.756
+DH050,98.0,100.0,0.573,0.245,0.935
+DH050,100.0,102.0,0.261,0.3078,0.478
+DH050,102.0,104.0,2.157,0.1063,5.748
+DH050,104.0,106.0,0.814,0.2358,1.429
+DH050,106.0,108.0,1.202,0.324,2.212
+DH050,108.0,110.0,3.298,0.6537,8.615
+DH050,110.0,112.0,1.101,0.278,2.175
+DH050,112.0,114.0,0.376,0.2966,1.091
+DH050,114.0,116.0,3.98,0.0643,7.663
+DH050,116.0,118.0,0.338,0.3825,0.92
+DH050,118.0,120.0,1.236,0.5495,2.347
+DH050,120.0,122.0,2.542,0.1903,4.004
+DH050,122.0,124.0,7.78,0.4354,16.747
+DH050,124.0,126.0,9.496,0.1072,22.275
+DH050,126.0,128.0,1.909,0.5155,3.866
+DH050,128.0,130.0,6.487,0.2136,10.229
+DH050,130.0,132.0,8.309,0.1174,23.289
+DH050,132.0,134.0,1.8,0.2515,4.249
+DH050,134.0,136.0,2.749,0.5776,8.198
+DH050,136.0,138.0,1.309,0.3065,3.632
+DH050,138.0,140.0,5.605,0.3832,14.342
+DH050,140.0,142.0,3.935,0.0402,8.822
+DH050,142.0,144.0,0.814,0.2868,1.539
+DH050,144.0,146.0,2.356,0.0921,3.825
+DH050,146.0,148.0,0.668,0.4321,1.949
+DH050,148.0,150.0,0.774,0.3117,2.124
+DH050,150.0,152.0,1.16,0.2382,2.683
+DH050,152.0,154.0,0.633,0.2498,1.285
+DH050,154.0,156.0,0.483,0.265,0.861
+DH050,156.0,158.0,2.582,0.3979,5.847
+DH050,158.0,160.0,6.66,0.4201,10.3
+DH050,160.0,162.0,3.61,0.5383,6.883
+DH050,162.0,164.0,0.301,0.1184,0.861
+DH050,164.0,166.0,2.004,0.2971,5.748
+DH050,166.0,168.0,24.79,0.2056,60.464
+DH050,168.0,170.0,0.995,0.1,2.279
+DH050,170.0,172.0,2.3,0.2081,6.898
+DH050,172.0,174.0,1.913,0.2083,5.145
+DH050,174.0,176.0,1.813,0.3435,5.364
+DH050,176.0,178.0,0.484,0.246,0.739
+DH050,178.0,180.0,0.843,0.246,1.766
+DH050,180.0,182.0,0.949,0.1473,2.335
+DH050,182.0,184.0,0.654,0.1376,1.517
+DH050,184.0,186.0,2.163,0.1523,6.016
+DH050,186.0,188.0,0.66,0.2008,1.208
+DH050,188.0,190.0,4.388,0.0768,7.763
+DH050,190.0,192.0,0.895,0.2223,2.289
+DH050,192.0,194.0,25.212,0.0901,67.647
+DH050,194.0,196.0,0.978,0.403,2.628
+DH050,196.0,198.0,10.029,0.3963,23.426
+DH050,198.0,200.0,73.659,0.348,141.882
+DH050,200.0,202.0,2.848,0.3696,4.412
+DH050,202.0,204.0,4.036,0.4834,6.51
+DH050,204.0,206.0,0.805,1.205,2.246
+DH050,206.0,208.0,5.819,0.2301,9.868
+DH050,208.0,210.0,1.509,0.191,3.084
+DH050,210.0,212.0,13.962,0.5723,23.209
+DH050,212.0,214.0,6.475,0.2218,16.052
+DH050,214.0,216.0,4.021,0.0553,9.053
+DH050,216.0,218.0,2.448,0.238,7.128
+DH050,218.0,220.0,3.805,0.5209,5.956
+DH050,220.0,222.0,1.69,1.9179,5.056
+DH050,222.0,224.0,5.63,0.2711,14.55
+DH050,224.0,226.0,3.54,0.3609,6.342
+DH050,226.0,228.0,0.625,0.1113,1.186
+DH050,228.0,230.0,7.021,0.2689,16.178
+DH050,230.0,232.0,11.549,0.0457,23.697
+DH050,232.0,234.0,0.111,0.5866,0.252
+DH050,234.0,236.0,7.096,0.2045,17.008
+DH050,236.0,238.0,1.912,0.3097,5.126
+DH050,238.0,240.0,3.338,0.8588,6.064
+DH050,240.0,242.0,2.05,0.2614,3.091
+DH050,242.0,243.0,1.381,0.1455,3.622
diff --git a/drillholes-demo/data/collar.csv b/drillholes-demo/data/collar.csv
new file mode 100644
index 0000000..b928671
--- /dev/null
+++ b/drillholes-demo/data/collar.csv
@@ -0,0 +1,51 @@
+HOLEID,EAST,NORTH,ELEV,TOTDEPTH,AZ,DIP
+DH001,350008.2,7199991.0,408.2,398.0,279.9,-70.4
+DH002,350098.2,7199985.2,404.0,419.0,349.9,-64.0
+DH003,350210.8,7200008.6,395.3,192.0,180.3,-76.4
+DH004,350305.9,7200004.9,409.4,316.0,51.8,-82.6
+DH005,350387.8,7200006.2,405.6,183.0,5.0,-82.9
+DH006,350514.3,7200008.4,404.3,352.0,82.7,-67.6
+DH007,350607.8,7199998.8,399.0,234.0,47.5,-65.5
+DH008,350008.6,7200102.1,395.4,348.0,244.0,-86.8
+DH009,350088.8,7200089.2,391.9,368.0,43.9,-88.0
+DH010,350198.5,7200088.4,408.1,381.0,182.3,-72.2
+DH011,350296.1,7200105.1,399.1,182.0,249.9,-85.6
+DH012,350412.8,7200099.1,394.0,425.0,209.2,-65.3
+DH013,350504.3,7200102.0,396.1,219.0,71.9,-80.7
+DH014,350609.7,7200107.9,401.6,161.0,289.5,-85.7
+DH015,349998.3,7200204.0,393.5,316.0,257.5,-62.4
+DH016,350091.8,7200201.6,407.1,261.0,266.0,-85.0
+DH017,350201.6,7200201.8,405.2,399.0,47.2,-81.5
+DH018,350286.9,7200194.1,404.4,392.0,44.6,-85.4
+DH019,350409.8,7200185.9,398.6,245.0,333.9,-86.5
+DH020,350503.9,7200198.1,402.5,436.0,143.1,-89.4
+DH021,350607.7,7200191.4,401.7,237.0,108.3,-88.3
+DH022,349995.6,7200297.3,403.0,305.0,175.9,-84.8
+DH023,350114.1,7200310.6,391.7,227.0,238.6,-88.4
+DH024,350211.8,7200292.0,398.3,431.0,344.0,-72.3
+DH025,350308.4,7200286.7,390.8,199.0,103.1,-69.6
+DH026,350390.8,7200293.4,399.9,163.0,332.9,-78.2
+DH027,350499.0,7200293.8,396.6,281.0,8.9,-80.5
+DH028,350586.3,7200304.9,392.9,448.0,199.9,-74.9
+DH029,349989.6,7200401.7,392.1,418.0,228.2,-63.7
+DH030,350105.5,7200408.5,401.8,375.0,38.1,-64.5
+DH031,350207.3,7200404.9,393.4,417.0,50.5,-88.7
+DH032,350314.0,7200397.2,408.5,418.0,150.9,-84.6
+DH033,350394.8,7200409.4,401.6,306.0,347.8,-82.9
+DH034,350496.1,7200390.0,396.9,245.0,214.6,-82.5
+DH035,350599.1,7200385.7,401.8,382.0,335.9,-72.9
+DH036,349990.7,7200487.7,390.5,348.0,289.6,-77.5
+DH037,350088.9,7200506.7,409.2,262.0,168.3,-88.5
+DH038,350199.3,7200498.9,399.6,178.0,282.5,-78.8
+DH039,350291.8,7200489.8,405.7,374.0,6.4,-74.3
+DH040,350405.1,7200500.0,391.7,229.0,39.3,-86.9
+DH041,350498.1,7200489.6,399.7,431.0,298.6,-65.0
+DH042,350610.0,7200505.9,399.8,222.0,286.9,-88.4
+DH043,350006.0,7200598.4,408.8,187.0,83.8,-62.3
+DH044,350094.4,7200596.4,401.4,399.0,191.1,-87.0
+DH045,350210.0,7200594.0,399.5,196.0,218.2,-64.7
+DH046,350309.1,7200603.9,395.3,204.0,312.4,-62.9
+DH047,350396.6,7200595.9,396.6,330.0,217.1,-60.6
+DH048,350493.6,7200587.6,400.4,412.0,148.5,-65.9
+DH049,350605.5,7200588.5,398.8,209.0,134.7,-66.6
+DH050,349989.2,7200713.9,390.4,243.0,153.3,-70.7
diff --git a/drillholes-demo/data/lith.csv b/drillholes-demo/data/lith.csv
new file mode 100644
index 0000000..d0f1c0d
--- /dev/null
+++ b/drillholes-demo/data/lith.csv
@@ -0,0 +1,275 @@
+HOLEID,FROM,TO,LITHOLOGY
+DH001,0.0,26.7,Alluvium
+DH001,26.7,50.1,Weathered Granite
+DH001,50.1,133.1,Granite
+DH001,133.1,170.6,Quartz Diorite
+DH001,170.6,268.2,Mineralized Porphyry
+DH001,268.2,398.0,Fresh Granite
+DH002,0.0,20.6,Alluvium
+DH002,20.6,60.2,Weathered Granite
+DH002,60.2,118.1,Granite
+DH002,118.1,194.8,Quartz Diorite
+DH002,194.8,279.6,Mineralized Porphyry
+DH002,279.6,419.0,Fresh Granite
+DH003,0.0,17.7,Alluvium
+DH003,17.7,47.0,Weathered Granite
+DH003,47.0,122.8,Granite
+DH003,122.8,171.8,Quartz Diorite
+DH003,171.8,192.0,Mineralized Porphyry
+DH004,0.0,6.5,Alluvium
+DH004,6.5,74.4,Weathered Granite
+DH004,74.4,119.1,Granite
+DH004,119.1,191.9,Quartz Diorite
+DH004,191.9,279.3,Mineralized Porphyry
+DH004,279.3,316.0,Fresh Granite
+DH005,0.0,29.7,Alluvium
+DH005,29.7,64.4,Weathered Granite
+DH005,64.4,128.5,Granite
+DH005,128.5,177.8,Quartz Diorite
+DH005,177.8,183.0,Mineralized Porphyry
+DH006,0.0,30.7,Alluvium
+DH006,30.7,63.9,Weathered Granite
+DH006,63.9,115.4,Granite
+DH006,115.4,184.9,Quartz Diorite
+DH006,184.9,285.2,Mineralized Porphyry
+DH006,285.2,352.0,Fresh Granite
+DH007,0.0,16.1,Alluvium
+DH007,16.1,57.8,Weathered Granite
+DH007,57.8,129.4,Granite
+DH007,129.4,180.2,Quartz Diorite
+DH007,180.2,234.0,Mineralized Porphyry
+DH008,0.0,18.8,Alluvium
+DH008,18.8,51.5,Weathered Granite
+DH008,51.5,127.4,Granite
+DH008,127.4,168.9,Quartz Diorite
+DH008,168.9,271.0,Mineralized Porphyry
+DH008,271.0,348.0,Fresh Granite
+DH009,0.0,27.4,Alluvium
+DH009,27.4,71.8,Weathered Granite
+DH009,71.8,113.2,Granite
+DH009,113.2,168.3,Quartz Diorite
+DH009,168.3,293.7,Mineralized Porphyry
+DH009,293.7,368.0,Fresh Granite
+DH010,0.0,10.9,Alluvium
+DH010,10.9,53.7,Weathered Granite
+DH010,53.7,120.9,Granite
+DH010,120.9,191.5,Quartz Diorite
+DH010,191.5,287.8,Mineralized Porphyry
+DH010,287.8,381.0,Fresh Granite
+DH011,0.0,10.3,Alluvium
+DH011,10.3,55.7,Weathered Granite
+DH011,55.7,119.4,Granite
+DH011,119.4,169.4,Quartz Diorite
+DH011,169.4,182.0,Mineralized Porphyry
+DH012,0.0,14.2,Alluvium
+DH012,14.2,48.8,Weathered Granite
+DH012,48.8,121.5,Granite
+DH012,121.5,186.2,Quartz Diorite
+DH012,186.2,267.1,Mineralized Porphyry
+DH012,267.1,425.0,Fresh Granite
+DH013,0.0,28.5,Alluvium
+DH013,28.5,67.4,Weathered Granite
+DH013,67.4,129.5,Granite
+DH013,129.5,178.4,Quartz Diorite
+DH013,178.4,219.0,Mineralized Porphyry
+DH014,0.0,12.2,Alluvium
+DH014,12.2,55.8,Weathered Granite
+DH014,55.8,110.3,Granite
+DH014,110.3,161.0,Quartz Diorite
+DH015,0.0,16.8,Alluvium
+DH015,16.8,52.2,Weathered Granite
+DH015,52.2,127.6,Granite
+DH015,127.6,174.4,Quartz Diorite
+DH015,174.4,273.2,Mineralized Porphyry
+DH015,273.2,316.0,Fresh Granite
+DH016,0.0,18.2,Alluvium
+DH016,18.2,54.1,Weathered Granite
+DH016,54.1,116.1,Granite
+DH016,116.1,172.1,Quartz Diorite
+DH016,172.1,261.0,Mineralized Porphyry
+DH017,0.0,32.9,Alluvium
+DH017,32.9,59.9,Weathered Granite
+DH017,59.9,124.3,Granite
+DH017,124.3,191.0,Quartz Diorite
+DH017,191.0,295.0,Mineralized Porphyry
+DH017,295.0,399.0,Fresh Granite
+DH018,0.0,31.7,Alluvium
+DH018,31.7,72.3,Weathered Granite
+DH018,72.3,128.7,Granite
+DH018,128.7,178.8,Quartz Diorite
+DH018,178.8,267.4,Mineralized Porphyry
+DH018,267.4,392.0,Fresh Granite
+DH019,0.0,19.3,Alluvium
+DH019,19.3,59.8,Weathered Granite
+DH019,59.8,117.2,Granite
+DH019,117.2,182.0,Quartz Diorite
+DH019,182.0,245.0,Mineralized Porphyry
+DH020,0.0,30.1,Alluvium
+DH020,30.1,48.3,Weathered Granite
+DH020,48.3,111.8,Granite
+DH020,111.8,188.8,Quartz Diorite
+DH020,188.8,290.4,Mineralized Porphyry
+DH020,290.4,436.0,Fresh Granite
+DH021,0.0,31.2,Alluvium
+DH021,31.2,71.7,Weathered Granite
+DH021,71.7,114.4,Granite
+DH021,114.4,177.0,Quartz Diorite
+DH021,177.0,237.0,Mineralized Porphyry
+DH022,0.0,23.2,Alluvium
+DH022,23.2,73.2,Weathered Granite
+DH022,73.2,115.3,Granite
+DH022,115.3,181.7,Quartz Diorite
+DH022,181.7,273.9,Mineralized Porphyry
+DH022,273.9,305.0,Fresh Granite
+DH023,0.0,10.9,Alluvium
+DH023,10.9,46.7,Weathered Granite
+DH023,46.7,133.5,Granite
+DH023,133.5,177.1,Quartz Diorite
+DH023,177.1,227.0,Mineralized Porphyry
+DH024,0.0,25.4,Alluvium
+DH024,25.4,50.8,Weathered Granite
+DH024,50.8,110.3,Granite
+DH024,110.3,189.4,Quartz Diorite
+DH024,189.4,272.9,Mineralized Porphyry
+DH024,272.9,431.0,Fresh Granite
+DH025,0.0,9.2,Alluvium
+DH025,9.2,65.3,Weathered Granite
+DH025,65.3,129.4,Granite
+DH025,129.4,172.1,Quartz Diorite
+DH025,172.1,199.0,Mineralized Porphyry
+DH026,0.0,33.9,Alluvium
+DH026,33.9,52.9,Weathered Granite
+DH026,52.9,117.9,Granite
+DH026,117.9,163.0,Quartz Diorite
+DH027,0.0,12.6,Alluvium
+DH027,12.6,68.3,Weathered Granite
+DH027,68.3,128.2,Granite
+DH027,128.2,176.3,Quartz Diorite
+DH027,176.3,281.0,Mineralized Porphyry
+DH028,0.0,11.4,Alluvium
+DH028,11.4,45.1,Weathered Granite
+DH028,45.1,122.1,Granite
+DH028,122.1,194.8,Quartz Diorite
+DH028,194.8,266.2,Mineralized Porphyry
+DH028,266.2,448.0,Fresh Granite
+DH029,0.0,20.6,Alluvium
+DH029,20.6,69.3,Weathered Granite
+DH029,69.3,107.7,Granite
+DH029,107.7,176.9,Quartz Diorite
+DH029,176.9,287.4,Mineralized Porphyry
+DH029,287.4,418.0,Fresh Granite
+DH030,0.0,10.7,Alluvium
+DH030,10.7,50.9,Weathered Granite
+DH030,50.9,117.3,Granite
+DH030,117.3,179.4,Quartz Diorite
+DH030,179.4,290.9,Mineralized Porphyry
+DH030,290.9,375.0,Fresh Granite
+DH031,0.0,25.7,Alluvium
+DH031,25.7,74.5,Weathered Granite
+DH031,74.5,117.4,Granite
+DH031,117.4,177.1,Quartz Diorite
+DH031,177.1,292.7,Mineralized Porphyry
+DH031,292.7,417.0,Fresh Granite
+DH032,0.0,26.9,Alluvium
+DH032,26.9,67.6,Weathered Granite
+DH032,67.6,107.9,Granite
+DH032,107.9,179.0,Quartz Diorite
+DH032,179.0,271.0,Mineralized Porphyry
+DH032,271.0,418.0,Fresh Granite
+DH033,0.0,18.9,Alluvium
+DH033,18.9,53.7,Weathered Granite
+DH033,53.7,128.9,Granite
+DH033,128.9,192.2,Quartz Diorite
+DH033,192.2,289.1,Mineralized Porphyry
+DH033,289.1,306.0,Fresh Granite
+DH034,0.0,13.2,Alluvium
+DH034,13.2,52.6,Weathered Granite
+DH034,52.6,109.1,Granite
+DH034,109.1,193.3,Quartz Diorite
+DH034,193.3,245.0,Mineralized Porphyry
+DH035,0.0,11.7,Alluvium
+DH035,11.7,70.4,Weathered Granite
+DH035,70.4,117.0,Granite
+DH035,117.0,166.1,Quartz Diorite
+DH035,166.1,269.9,Mineralized Porphyry
+DH035,269.9,382.0,Fresh Granite
+DH036,0.0,28.5,Alluvium
+DH036,28.5,51.3,Weathered Granite
+DH036,51.3,132.5,Granite
+DH036,132.5,190.5,Quartz Diorite
+DH036,190.5,290.5,Mineralized Porphyry
+DH036,290.5,348.0,Fresh Granite
+DH037,0.0,6.5,Alluvium
+DH037,6.5,71.0,Weathered Granite
+DH037,71.0,114.2,Granite
+DH037,114.2,183.6,Quartz Diorite
+DH037,183.6,262.0,Mineralized Porphyry
+DH038,0.0,8.8,Alluvium
+DH038,8.8,68.4,Weathered Granite
+DH038,68.4,133.2,Granite
+DH038,133.2,178.0,Quartz Diorite
+DH039,0.0,18.2,Alluvium
+DH039,18.2,71.3,Weathered Granite
+DH039,71.3,120.8,Granite
+DH039,120.8,187.3,Quartz Diorite
+DH039,187.3,289.6,Mineralized Porphyry
+DH039,289.6,374.0,Fresh Granite
+DH040,0.0,13.6,Alluvium
+DH040,13.6,48.5,Weathered Granite
+DH040,48.5,112.2,Granite
+DH040,112.2,180.1,Quartz Diorite
+DH040,180.1,229.0,Mineralized Porphyry
+DH041,0.0,22.5,Alluvium
+DH041,22.5,56.9,Weathered Granite
+DH041,56.9,128.6,Granite
+DH041,128.6,192.4,Quartz Diorite
+DH041,192.4,272.4,Mineralized Porphyry
+DH041,272.4,431.0,Fresh Granite
+DH042,0.0,25.3,Alluvium
+DH042,25.3,60.7,Weathered Granite
+DH042,60.7,110.7,Granite
+DH042,110.7,188.9,Quartz Diorite
+DH042,188.9,222.0,Mineralized Porphyry
+DH043,0.0,26.7,Alluvium
+DH043,26.7,72.5,Weathered Granite
+DH043,72.5,134.5,Granite
+DH043,134.5,175.6,Quartz Diorite
+DH043,175.6,187.0,Mineralized Porphyry
+DH044,0.0,19.2,Alluvium
+DH044,19.2,74.6,Weathered Granite
+DH044,74.6,107.8,Granite
+DH044,107.8,177.4,Quartz Diorite
+DH044,177.4,291.3,Mineralized Porphyry
+DH044,291.3,399.0,Fresh Granite
+DH045,0.0,28.6,Alluvium
+DH045,28.6,56.5,Weathered Granite
+DH045,56.5,134.4,Granite
+DH045,134.4,191.5,Quartz Diorite
+DH045,191.5,196.0,Mineralized Porphyry
+DH046,0.0,28.1,Alluvium
+DH046,28.1,55.1,Weathered Granite
+DH046,55.1,123.2,Granite
+DH046,123.2,184.8,Quartz Diorite
+DH046,184.8,204.0,Mineralized Porphyry
+DH047,0.0,5.7,Alluvium
+DH047,5.7,51.6,Weathered Granite
+DH047,51.6,126.4,Granite
+DH047,126.4,181.9,Quartz Diorite
+DH047,181.9,279.9,Mineralized Porphyry
+DH047,279.9,330.0,Fresh Granite
+DH048,0.0,15.4,Alluvium
+DH048,15.4,71.0,Weathered Granite
+DH048,71.0,105.9,Granite
+DH048,105.9,176.9,Quartz Diorite
+DH048,176.9,293.4,Mineralized Porphyry
+DH048,293.4,412.0,Fresh Granite
+DH049,0.0,27.5,Alluvium
+DH049,27.5,52.7,Weathered Granite
+DH049,52.7,131.0,Granite
+DH049,131.0,187.4,Quartz Diorite
+DH049,187.4,209.0,Mineralized Porphyry
+DH050,0.0,11.5,Alluvium
+DH050,11.5,60.9,Weathered Granite
+DH050,60.9,128.4,Granite
+DH050,128.4,172.4,Quartz Diorite
+DH050,172.4,243.0,Mineralized Porphyry
diff --git a/drillholes-demo/data/survey.csv b/drillholes-demo/data/survey.csv
new file mode 100644
index 0000000..a67e692
--- /dev/null
+++ b/drillholes-demo/data/survey.csv
@@ -0,0 +1,585 @@
+HOLEID,DEPTH,AZ,DIP
+DH001,0.0,282.7,-72.6
+DH001,30.0,280.3,-70.3
+DH001,60.0,283.5,-70.6
+DH001,90.0,278.8,-69.6
+DH001,120.0,277.6,-72.6
+DH001,150.0,279.7,-70.9
+DH001,180.0,277.2,-71.2
+DH001,210.0,278.6,-71.4
+DH001,240.0,278.7,-69.3
+DH001,270.0,277.9,-67.7
+DH001,300.0,284.1,-70.5
+DH001,330.0,278.2,-70.2
+DH001,360.0,283.4,-69.5
+DH001,390.0,282.9,-70.2
+DH001,398.0,281.2,-71.7
+DH002,0.0,352.2,-65.8
+DH002,30.0,351.8,-61.8
+DH002,60.0,346.2,-63.3
+DH002,90.0,345.9,-62.6
+DH002,120.0,345.7,-61.4
+DH002,150.0,346.3,-61.2
+DH002,180.0,352.9,-63.4
+DH002,210.0,352.7,-62.2
+DH002,240.0,354.4,-65.5
+DH002,270.0,350.8,-66.4
+DH002,300.0,351.1,-66.0
+DH002,330.0,350.5,-63.6
+DH002,360.0,349.6,-63.9
+DH002,390.0,352.5,-62.2
+DH002,419.0,349.8,-63.4
+DH003,0.0,184.6,-78.7
+DH003,30.0,176.5,-78.9
+DH003,60.0,181.9,-76.9
+DH003,90.0,183.0,-75.4
+DH003,120.0,178.6,-74.0
+DH003,150.0,182.9,-77.8
+DH003,180.0,178.9,-77.5
+DH003,192.0,176.9,-78.5
+DH004,0.0,56.2,-83.0
+DH004,30.0,50.6,-81.2
+DH004,60.0,52.3,-80.0
+DH004,90.0,54.6,-82.7
+DH004,120.0,50.6,-79.7
+DH004,150.0,54.0,-79.9
+DH004,180.0,48.0,-80.5
+DH004,210.0,53.2,-84.9
+DH004,240.0,52.7,-81.5
+DH004,270.0,46.9,-82.9
+DH004,300.0,55.1,-83.8
+DH004,316.0,51.4,-82.9
+DH005,0.0,3.0,-80.4
+DH005,30.0,7.8,-85.2
+DH005,60.0,10.0,-80.6
+DH005,90.0,2.8,-80.9
+DH005,120.0,1.1,-79.9
+DH005,150.0,6.7,-82.0
+DH005,180.0,0.9,-80.5
+DH005,183.0,0.3,-84.5
+DH006,0.0,79.1,-65.9
+DH006,30.0,79.7,-65.1
+DH006,60.0,84.3,-70.4
+DH006,90.0,77.8,-70.3
+DH006,120.0,83.8,-65.8
+DH006,150.0,80.1,-65.5
+DH006,180.0,78.3,-65.8
+DH006,210.0,87.0,-66.0
+DH006,240.0,84.7,-65.6
+DH006,270.0,78.1,-69.4
+DH006,300.0,78.9,-67.6
+DH006,330.0,85.2,-66.8
+DH006,352.0,86.2,-69.7
+DH007,0.0,49.8,-67.3
+DH007,30.0,45.2,-64.2
+DH007,60.0,52.3,-64.8
+DH007,90.0,43.0,-64.8
+DH007,120.0,42.9,-63.2
+DH007,150.0,49.6,-67.5
+DH007,180.0,43.4,-67.4
+DH007,210.0,52.3,-65.7
+DH007,234.0,50.3,-64.7
+DH008,0.0,244.7,-88.9
+DH008,30.0,248.5,-88.0
+DH008,60.0,244.8,-85.6
+DH008,90.0,245.5,-84.2
+DH008,120.0,240.5,-86.7
+DH008,150.0,243.0,-87.0
+DH008,180.0,240.2,-89.0
+DH008,210.0,241.8,-88.0
+DH008,240.0,243.3,-86.1
+DH008,270.0,245.3,-87.3
+DH008,300.0,243.1,-88.5
+DH008,330.0,244.9,-87.9
+DH008,348.0,239.4,-87.3
+DH009,0.0,43.6,-89.6
+DH009,30.0,44.6,-87.6
+DH009,60.0,45.9,-87.1
+DH009,90.0,45.4,-89.1
+DH009,120.0,46.8,-87.7
+DH009,150.0,43.2,-87.2
+DH009,180.0,42.5,-87.9
+DH009,210.0,46.3,-85.7
+DH009,240.0,48.1,-88.0
+DH009,270.0,44.1,-86.2
+DH009,300.0,42.0,-86.0
+DH009,330.0,43.8,-90.3
+DH009,360.0,39.6,-85.9
+DH009,368.0,39.5,-89.3
+DH010,0.0,180.6,-74.2
+DH010,30.0,180.4,-70.7
+DH010,60.0,177.4,-70.2
+DH010,90.0,185.9,-73.0
+DH010,120.0,178.8,-71.6
+DH010,150.0,178.5,-73.0
+DH010,180.0,186.9,-69.2
+DH010,210.0,185.0,-73.3
+DH010,240.0,184.2,-71.0
+DH010,270.0,181.2,-71.4
+DH010,300.0,177.4,-73.9
+DH010,330.0,182.6,-74.2
+DH010,360.0,179.0,-70.2
+DH010,381.0,187.2,-71.9
+DH011,0.0,253.3,-82.7
+DH011,30.0,246.3,-85.9
+DH011,60.0,248.8,-88.1
+DH011,90.0,252.5,-86.0
+DH011,120.0,249.6,-87.7
+DH011,150.0,246.7,-83.2
+DH011,180.0,245.3,-87.2
+DH011,182.0,247.8,-85.7
+DH012,0.0,210.1,-65.3
+DH012,30.0,205.0,-66.8
+DH012,60.0,212.6,-64.5
+DH012,90.0,210.7,-64.3
+DH012,120.0,211.8,-68.0
+DH012,150.0,207.9,-65.1
+DH012,180.0,207.6,-63.2
+DH012,210.0,209.0,-63.7
+DH012,240.0,212.7,-65.3
+DH012,270.0,213.3,-64.8
+DH012,300.0,212.7,-66.3
+DH012,330.0,209.2,-65.1
+DH012,360.0,205.2,-65.9
+DH012,390.0,213.4,-64.5
+DH012,420.0,206.0,-66.3
+DH012,425.0,206.1,-68.2
+DH013,0.0,76.2,-81.0
+DH013,30.0,70.0,-80.1
+DH013,60.0,67.0,-82.0
+DH013,90.0,73.9,-79.9
+DH013,120.0,76.7,-80.0
+DH013,150.0,71.7,-79.1
+DH013,180.0,75.9,-79.4
+DH013,210.0,76.5,-79.0
+DH013,219.0,75.6,-83.0
+DH014,0.0,291.8,-86.1
+DH014,30.0,290.0,-84.8
+DH014,60.0,294.2,-82.8
+DH014,90.0,287.4,-84.3
+DH014,120.0,292.0,-86.6
+DH014,150.0,285.7,-88.5
+DH014,161.0,292.3,-85.8
+DH015,0.0,262.4,-62.6
+DH015,30.0,262.3,-62.9
+DH015,60.0,260.4,-64.9
+DH015,90.0,258.1,-60.6
+DH015,120.0,261.7,-60.5
+DH015,150.0,252.9,-63.2
+DH015,180.0,253.0,-64.7
+DH015,210.0,259.3,-61.1
+DH015,240.0,260.2,-60.2
+DH015,270.0,259.9,-60.6
+DH015,300.0,253.0,-64.0
+DH015,316.0,258.7,-60.3
+DH016,0.0,261.0,-84.9
+DH016,30.0,267.8,-87.8
+DH016,60.0,265.0,-82.6
+DH016,90.0,267.7,-86.6
+DH016,120.0,269.5,-85.9
+DH016,150.0,269.5,-86.2
+DH016,180.0,266.9,-85.6
+DH016,210.0,263.7,-82.7
+DH016,240.0,262.9,-87.5
+DH016,261.0,264.4,-83.7
+DH017,0.0,50.3,-78.5
+DH017,30.0,45.2,-82.1
+DH017,60.0,43.6,-81.1
+DH017,90.0,52.2,-80.3
+DH017,120.0,48.2,-82.1
+DH017,150.0,51.4,-81.5
+DH017,180.0,43.5,-82.3
+DH017,210.0,42.9,-83.3
+DH017,240.0,42.4,-81.8
+DH017,270.0,48.5,-82.4
+DH017,300.0,46.4,-78.7
+DH017,330.0,49.7,-81.3
+DH017,360.0,45.0,-79.1
+DH017,390.0,44.6,-82.5
+DH017,399.0,51.3,-81.3
+DH018,0.0,47.0,-84.9
+DH018,30.0,46.1,-86.6
+DH018,60.0,42.0,-86.5
+DH018,90.0,41.2,-83.2
+DH018,120.0,42.4,-85.0
+DH018,150.0,47.5,-83.7
+DH018,180.0,44.0,-85.5
+DH018,210.0,49.5,-84.4
+DH018,240.0,47.7,-83.0
+DH018,270.0,47.5,-87.3
+DH018,300.0,45.2,-87.8
+DH018,330.0,46.1,-82.7
+DH018,360.0,44.7,-85.8
+DH018,390.0,40.0,-82.6
+DH018,392.0,40.6,-88.2
+DH019,0.0,331.4,-89.1
+DH019,30.0,333.5,-86.4
+DH019,60.0,332.0,-89.2
+DH019,90.0,330.0,-87.2
+DH019,120.0,329.5,-85.3
+DH019,150.0,331.0,-87.7
+DH019,180.0,332.8,-87.0
+DH019,210.0,328.9,-88.8
+DH019,240.0,337.5,-89.5
+DH019,245.0,334.0,-86.6
+DH020,0.0,141.4,-89.8
+DH020,30.0,145.9,-87.4
+DH020,60.0,140.7,-90.5
+DH020,90.0,140.5,-89.5
+DH020,120.0,144.9,-91.0
+DH020,150.0,141.4,-86.8
+DH020,180.0,138.6,-89.6
+DH020,210.0,145.2,-91.5
+DH020,240.0,138.6,-91.6
+DH020,270.0,147.3,-92.3
+DH020,300.0,140.0,-92.2
+DH020,330.0,139.2,-88.7
+DH020,360.0,140.5,-89.0
+DH020,390.0,144.0,-87.3
+DH020,420.0,138.1,-87.3
+DH020,436.0,144.3,-91.4
+DH021,0.0,111.0,-86.2
+DH021,30.0,105.8,-85.8
+DH021,60.0,107.8,-87.7
+DH021,90.0,113.1,-89.1
+DH021,120.0,111.4,-89.4
+DH021,150.0,111.3,-87.7
+DH021,180.0,105.5,-88.8
+DH021,210.0,106.5,-90.8
+DH021,237.0,103.6,-89.2
+DH022,0.0,171.1,-86.8
+DH022,30.0,178.2,-83.6
+DH022,60.0,178.3,-85.9
+DH022,90.0,179.8,-84.2
+DH022,120.0,172.2,-86.9
+DH022,150.0,177.8,-86.8
+DH022,180.0,176.0,-81.8
+DH022,210.0,170.9,-87.7
+DH022,240.0,180.8,-84.3
+DH022,270.0,172.2,-82.4
+DH022,300.0,179.7,-84.6
+DH022,305.0,177.1,-86.2
+DH023,0.0,234.1,-87.8
+DH023,30.0,236.5,-87.4
+DH023,60.0,242.0,-91.3
+DH023,90.0,239.6,-90.0
+DH023,120.0,242.3,-89.9
+DH023,150.0,239.7,-88.1
+DH023,180.0,237.6,-87.3
+DH023,210.0,240.9,-88.0
+DH023,227.0,241.2,-85.5
+DH024,0.0,343.2,-72.2
+DH024,30.0,339.1,-70.5
+DH024,60.0,344.2,-72.9
+DH024,90.0,339.9,-70.0
+DH024,120.0,343.0,-71.2
+DH024,150.0,340.5,-69.5
+DH024,180.0,340.8,-74.1
+DH024,210.0,347.6,-69.8
+DH024,240.0,341.1,-72.5
+DH024,270.0,346.3,-70.0
+DH024,300.0,342.8,-72.2
+DH024,330.0,346.4,-70.9
+DH024,360.0,346.8,-71.9
+DH024,390.0,340.0,-69.9
+DH024,420.0,347.7,-70.5
+DH024,431.0,340.0,-74.1
+DH025,0.0,105.5,-72.5
+DH025,30.0,107.9,-70.3
+DH025,60.0,105.3,-67.3
+DH025,90.0,102.0,-70.7
+DH025,120.0,104.2,-69.1
+DH025,150.0,102.2,-69.0
+DH025,180.0,107.5,-69.8
+DH025,199.0,100.1,-70.3
+DH026,0.0,331.8,-80.4
+DH026,30.0,329.5,-77.1
+DH026,60.0,331.3,-75.5
+DH026,90.0,330.3,-80.6
+DH026,120.0,335.4,-75.9
+DH026,150.0,330.7,-80.0
+DH026,163.0,329.8,-78.1
+DH027,0.0,8.6,-81.9
+DH027,30.0,4.4,-80.6
+DH027,60.0,13.5,-79.6
+DH027,90.0,8.9,-82.8
+DH027,120.0,6.4,-81.7
+DH027,150.0,11.5,-78.2
+DH027,180.0,12.9,-77.6
+DH027,210.0,13.7,-77.8
+DH027,240.0,4.6,-82.7
+DH027,270.0,6.9,-80.2
+DH027,281.0,4.9,-78.4
+DH028,0.0,201.1,-74.6
+DH028,30.0,196.6,-76.4
+DH028,60.0,196.5,-72.8
+DH028,90.0,200.7,-73.5
+DH028,120.0,197.9,-75.7
+DH028,150.0,198.9,-73.3
+DH028,180.0,202.6,-76.7
+DH028,210.0,204.3,-77.2
+DH028,240.0,203.9,-77.3
+DH028,270.0,197.5,-72.8
+DH028,300.0,196.7,-75.4
+DH028,330.0,199.4,-76.4
+DH028,360.0,202.0,-72.8
+DH028,390.0,203.6,-75.9
+DH028,420.0,200.2,-76.4
+DH028,448.0,197.3,-76.9
+DH029,0.0,232.6,-61.4
+DH029,30.0,231.0,-63.6
+DH029,60.0,228.1,-63.5
+DH029,90.0,228.6,-64.1
+DH029,120.0,224.5,-65.9
+DH029,150.0,232.7,-63.8
+DH029,180.0,232.7,-65.7
+DH029,210.0,228.7,-65.5
+DH029,240.0,225.7,-66.5
+DH029,270.0,224.4,-61.2
+DH029,300.0,226.4,-63.1
+DH029,330.0,227.9,-64.3
+DH029,360.0,228.5,-65.6
+DH029,390.0,233.1,-61.8
+DH029,418.0,230.6,-63.9
+DH030,0.0,34.6,-62.0
+DH030,30.0,36.5,-67.2
+DH030,60.0,36.5,-62.7
+DH030,90.0,39.3,-63.0
+DH030,120.0,41.0,-66.2
+DH030,150.0,42.3,-64.9
+DH030,180.0,39.5,-67.5
+DH030,210.0,43.0,-65.8
+DH030,240.0,33.7,-64.8
+DH030,270.0,34.4,-66.6
+DH030,300.0,39.4,-65.1
+DH030,330.0,42.3,-65.6
+DH030,360.0,40.4,-64.7
+DH030,375.0,39.7,-63.9
+DH031,0.0,50.2,-86.0
+DH031,30.0,48.9,-90.6
+DH031,60.0,52.3,-86.6
+DH031,90.0,45.9,-89.0
+DH031,120.0,54.4,-87.2
+DH031,150.0,55.4,-88.5
+DH031,180.0,52.1,-89.9
+DH031,210.0,55.0,-89.5
+DH031,240.0,52.9,-89.3
+DH031,270.0,51.1,-87.4
+DH031,300.0,50.6,-86.3
+DH031,330.0,49.7,-87.8
+DH031,360.0,48.9,-89.3
+DH031,390.0,49.9,-90.9
+DH031,417.0,46.4,-87.7
+DH032,0.0,152.5,-83.6
+DH032,30.0,146.1,-85.6
+DH032,60.0,147.9,-82.9
+DH032,90.0,154.5,-86.1
+DH032,120.0,152.6,-86.8
+DH032,150.0,148.7,-86.8
+DH032,180.0,148.7,-83.6
+DH032,210.0,155.0,-86.4
+DH032,240.0,151.3,-83.4
+DH032,270.0,155.4,-83.9
+DH032,300.0,148.5,-83.8
+DH032,330.0,149.1,-81.7
+DH032,360.0,149.9,-83.5
+DH032,390.0,146.1,-85.2
+DH032,418.0,154.7,-83.9
+DH033,0.0,347.2,-80.3
+DH033,30.0,351.3,-84.0
+DH033,60.0,348.2,-83.0
+DH033,90.0,349.1,-83.9
+DH033,120.0,345.2,-80.4
+DH033,150.0,352.0,-80.8
+DH033,180.0,352.6,-81.4
+DH033,210.0,350.4,-81.3
+DH033,240.0,347.6,-83.2
+DH033,270.0,345.2,-82.0
+DH033,300.0,345.7,-84.4
+DH033,306.0,348.7,-83.4
+DH034,0.0,211.8,-80.6
+DH034,30.0,218.2,-84.5
+DH034,60.0,209.7,-83.5
+DH034,90.0,217.6,-80.5
+DH034,120.0,211.0,-80.9
+DH034,150.0,210.8,-83.2
+DH034,180.0,219.6,-84.3
+DH034,210.0,211.1,-83.0
+DH034,240.0,215.8,-79.9
+DH034,245.0,219.4,-85.1
+DH035,0.0,332.3,-71.2
+DH035,30.0,333.6,-70.6
+DH035,60.0,337.5,-75.2
+DH035,90.0,339.2,-74.8
+DH035,120.0,335.1,-72.6
+DH035,150.0,335.9,-71.8
+DH035,180.0,337.4,-69.9
+DH035,210.0,340.9,-72.8
+DH035,240.0,331.9,-71.5
+DH035,270.0,340.7,-74.0
+DH035,300.0,335.5,-73.4
+DH035,330.0,331.4,-71.9
+DH035,360.0,334.4,-71.2
+DH035,382.0,339.2,-71.0
+DH036,0.0,288.8,-78.6
+DH036,30.0,292.1,-75.7
+DH036,60.0,289.5,-75.1
+DH036,90.0,286.0,-75.2
+DH036,120.0,285.6,-79.6
+DH036,150.0,289.9,-80.1
+DH036,180.0,285.1,-80.5
+DH036,210.0,289.0,-75.9
+DH036,240.0,284.9,-76.6
+DH036,270.0,292.8,-79.5
+DH036,300.0,286.1,-75.3
+DH036,330.0,292.8,-77.3
+DH036,348.0,292.8,-79.9
+DH037,0.0,167.2,-87.1
+DH037,30.0,165.9,-87.0
+DH037,60.0,168.3,-87.0
+DH037,90.0,167.9,-89.3
+DH037,120.0,165.5,-90.2
+DH037,150.0,170.8,-90.8
+DH037,180.0,164.2,-90.4
+DH037,210.0,165.1,-86.6
+DH037,240.0,167.3,-85.6
+DH037,262.0,164.7,-87.6
+DH038,0.0,282.0,-79.4
+DH038,30.0,286.3,-75.9
+DH038,60.0,286.2,-80.6
+DH038,90.0,279.7,-77.9
+DH038,120.0,280.4,-77.4
+DH038,150.0,283.2,-78.5
+DH038,178.0,285.8,-77.5
+DH039,0.0,1.7,-77.0
+DH039,30.0,7.4,-74.4
+DH039,60.0,4.0,-74.8
+DH039,90.0,9.0,-72.3
+DH039,120.0,7.0,-75.0
+DH039,150.0,4.1,-74.2
+DH039,180.0,4.5,-73.9
+DH039,210.0,8.2,-76.9
+DH039,240.0,1.4,-76.0
+DH039,270.0,10.3,-73.4
+DH039,300.0,3.1,-72.0
+DH039,330.0,6.1,-74.4
+DH039,360.0,10.8,-76.9
+DH039,374.0,3.6,-73.8
+DH040,0.0,36.3,-85.8
+DH040,30.0,36.4,-89.3
+DH040,60.0,36.4,-87.4
+DH040,90.0,36.1,-89.1
+DH040,120.0,42.9,-88.0
+DH040,150.0,37.9,-89.6
+DH040,180.0,37.9,-88.3
+DH040,210.0,40.4,-88.7
+DH040,229.0,43.2,-84.3
+DH041,0.0,294.6,-67.4
+DH041,30.0,294.8,-64.3
+DH041,60.0,294.8,-62.9
+DH041,90.0,301.1,-63.1
+DH041,120.0,298.9,-62.0
+DH041,150.0,294.0,-65.6
+DH041,180.0,296.8,-62.3
+DH041,210.0,299.4,-63.2
+DH041,240.0,295.3,-62.1
+DH041,270.0,298.6,-65.0
+DH041,300.0,303.3,-65.7
+DH041,330.0,297.6,-64.5
+DH041,360.0,294.9,-66.1
+DH041,390.0,295.5,-67.4
+DH041,420.0,302.3,-64.5
+DH041,431.0,297.2,-65.5
+DH042,0.0,286.2,-87.6
+DH042,30.0,291.2,-85.8
+DH042,60.0,285.8,-89.4
+DH042,90.0,286.4,-88.0
+DH042,120.0,286.5,-87.4
+DH042,150.0,287.4,-89.5
+DH042,180.0,285.4,-89.1
+DH042,210.0,282.8,-90.4
+DH042,222.0,289.1,-89.1
+DH043,0.0,80.9,-61.9
+DH043,30.0,86.4,-63.8
+DH043,60.0,87.1,-59.7
+DH043,90.0,84.8,-61.3
+DH043,120.0,79.3,-59.6
+DH043,150.0,82.7,-59.8
+DH043,180.0,84.6,-65.3
+DH043,187.0,79.2,-61.2
+DH044,0.0,191.7,-89.8
+DH044,30.0,193.5,-84.9
+DH044,60.0,191.1,-87.2
+DH044,90.0,186.2,-85.3
+DH044,120.0,189.4,-84.7
+DH044,150.0,189.8,-86.6
+DH044,180.0,188.8,-89.0
+DH044,210.0,193.8,-87.0
+DH044,240.0,191.5,-84.2
+DH044,270.0,195.7,-84.9
+DH044,300.0,188.0,-86.4
+DH044,330.0,194.9,-87.8
+DH044,360.0,187.1,-85.1
+DH044,390.0,190.9,-86.6
+DH044,399.0,195.9,-86.4
+DH045,0.0,217.4,-65.5
+DH045,30.0,217.4,-67.0
+DH045,60.0,221.1,-62.7
+DH045,90.0,216.0,-65.9
+DH045,120.0,221.9,-67.6
+DH045,150.0,218.4,-64.9
+DH045,180.0,220.1,-66.7
+DH045,196.0,219.9,-65.4
+DH046,0.0,313.6,-65.7
+DH046,30.0,312.0,-62.8
+DH046,60.0,309.5,-65.1
+DH046,90.0,309.3,-63.8
+DH046,120.0,308.4,-60.2
+DH046,150.0,311.4,-61.0
+DH046,180.0,317.1,-65.4
+DH046,204.0,313.9,-60.7
+DH047,0.0,218.4,-61.0
+DH047,30.0,216.4,-63.4
+DH047,60.0,217.4,-57.6
+DH047,90.0,221.7,-63.4
+DH047,120.0,219.2,-61.8
+DH047,150.0,221.1,-63.3
+DH047,180.0,221.5,-58.6
+DH047,210.0,213.3,-63.2
+DH047,240.0,220.4,-62.7
+DH047,270.0,217.4,-58.1
+DH047,300.0,217.8,-61.2
+DH047,330.0,216.6,-63.2
+DH048,0.0,153.2,-67.0
+DH048,30.0,145.4,-67.2
+DH048,60.0,153.1,-68.3
+DH048,90.0,152.2,-64.7
+DH048,120.0,151.8,-63.0
+DH048,150.0,151.9,-63.2
+DH048,180.0,144.8,-64.1
+DH048,210.0,149.0,-65.6
+DH048,240.0,152.5,-63.1
+DH048,270.0,150.5,-66.0
+DH048,300.0,148.1,-66.6
+DH048,330.0,147.1,-66.6
+DH048,360.0,144.4,-68.4
+DH048,390.0,151.3,-66.2
+DH048,412.0,152.8,-65.2
+DH049,0.0,130.1,-68.7
+DH049,30.0,131.8,-63.7
+DH049,60.0,131.9,-66.5
+DH049,90.0,139.1,-63.7
+DH049,120.0,132.1,-69.3
+DH049,150.0,131.2,-69.2
+DH049,180.0,131.7,-66.2
+DH049,209.0,138.8,-66.4
+DH050,0.0,154.6,-72.5
+DH050,30.0,156.3,-70.0
+DH050,60.0,156.9,-68.0
+DH050,90.0,151.8,-73.2
+DH050,120.0,150.6,-71.1
+DH050,150.0,157.8,-71.4
+DH050,180.0,156.0,-70.5
+DH050,210.0,150.1,-71.8
+DH050,240.0,154.8,-69.7
+DH050,243.0,152.6,-72.3
diff --git a/drillholes-demo/data_generator.py b/drillholes-demo/data_generator.py
new file mode 100644
index 0000000..eae323d
--- /dev/null
+++ b/drillholes-demo/data_generator.py
@@ -0,0 +1,130 @@
+"""
+Generate synthetic Western Australia mineral exploration drillhole data.
+Modeled on the Kaggle "mineral-exploration-drillholes-western-australia" structure.
+Au-Cu porphyry prospect, ~50 holes in a 7x7 grid pattern.
+Run once: python data_generator.py
+"""
+
+import numpy as np
+import pandas as pd
+import pathlib
+
+DATA_PATH = pathlib.Path(__file__).parent / "data"
+DATA_PATH.mkdir(exist_ok=True)
+
+rng = np.random.default_rng(42)
+
+EAST_ORIGIN = 350000.0
+NORTH_ORIGIN = 7200000.0
+SPACING = 100.0
+N_HOLES = 50
+
+# --- COLLAR ---
+
+hole_ids = [f"DH{i:03d}" for i in range(1, N_HOLES + 1)]
+
+cols = 7
+east_base = [EAST_ORIGIN + (i % cols) * SPACING for i in range(N_HOLES)]
+north_base = [NORTH_ORIGIN + (i // cols) * SPACING for i in range(N_HOLES)]
+
+collar = pd.DataFrame({
+ "HOLEID": hole_ids,
+ "EAST": np.round(np.array(east_base) + rng.uniform(-15, 15, N_HOLES), 1),
+ "NORTH": np.round(np.array(north_base) + rng.uniform(-15, 15, N_HOLES), 1),
+ "ELEV": np.round(400 + rng.uniform(-10, 10, N_HOLES), 1),
+ "TOTDEPTH": np.round(rng.uniform(150, 450, N_HOLES), 0),
+ "AZ": np.round(rng.uniform(0, 360, N_HOLES), 1),
+ "DIP": np.round(rng.uniform(-90, -60, N_HOLES), 1),
+})
+
+collar.to_csv(DATA_PATH / "collar.csv", index=False)
+print(f"collar.csv: {len(collar)} holes")
+
+# --- SURVEY ---
+
+survey_rows = []
+for _, hole in collar.iterrows():
+ depths = np.arange(0, hole["TOTDEPTH"] + 30, 30)
+ for d in depths:
+ d = min(d, hole["TOTDEPTH"])
+ survey_rows.append({
+ "HOLEID": hole["HOLEID"],
+ "DEPTH": round(float(d), 1),
+ "AZ": round(float(hole["AZ"]) + float(rng.uniform(-5, 5)), 1),
+ "DIP": round(float(hole["DIP"]) + float(rng.uniform(-3, 3)), 1),
+ })
+
+survey = pd.DataFrame(survey_rows).drop_duplicates(["HOLEID", "DEPTH"])
+survey.to_csv(DATA_PATH / "survey.csv", index=False)
+print(f"survey.csv: {len(survey)} stations")
+
+# --- LITHOLOGY ---
+
+LITH_SEQUENCE = [
+ ("Alluvium", 0, 20),
+ ("Weathered Granite", 20, 60),
+ ("Granite", 60, 120),
+ ("Quartz Diorite", 120, 180),
+ ("Mineralized Porphyry",180, 280),
+ ("Fresh Granite", 280, 9999),
+]
+
+lith_rows = []
+for _, hole in collar.iterrows():
+ depth = 0.0
+ for lith, base_from, base_to in LITH_SEQUENCE:
+ jitter = float(rng.uniform(-15, 15))
+ actual_from = round(depth, 1)
+ actual_to = round(min(float(hole["TOTDEPTH"]), base_to + jitter), 1)
+ if actual_from >= float(hole["TOTDEPTH"]):
+ break
+ actual_to = max(actual_to, actual_from + 2.0)
+ actual_to = min(actual_to, float(hole["TOTDEPTH"]))
+ lith_rows.append({
+ "HOLEID": hole["HOLEID"],
+ "FROM": actual_from,
+ "TO": actual_to,
+ "LITHOLOGY": lith,
+ })
+ depth = actual_to
+ if depth >= float(hole["TOTDEPTH"]):
+ break
+
+lith = pd.DataFrame(lith_rows)
+lith.to_csv(DATA_PATH / "lith.csv", index=False)
+print(f"lith.csv: {len(lith)} intervals")
+
+# --- ASSAY (2m composites) ---
+
+assay_rows = []
+for _, hole in collar.iterrows():
+ depth = 0.0
+ tot = float(hole["TOTDEPTH"])
+ while depth < tot:
+ to = min(depth + 2.0, tot)
+ mid = (depth + to) / 2.0
+ in_zone = 80 <= mid <= 250
+
+ if in_zone:
+ au = float(max(0, rng.lognormal(mean=0.8, sigma=1.2)))
+ cu = float(max(0, rng.lognormal(mean=-1.5, sigma=0.8)))
+ ag = au * float(rng.uniform(1.5, 3.0))
+ else:
+ au = float(max(0, rng.lognormal(mean=-2.5, sigma=0.6)))
+ cu = float(max(0, rng.lognormal(mean=-4.0, sigma=0.5)))
+ ag = au * float(rng.uniform(0.5, 1.5))
+
+ assay_rows.append({
+ "HOLEID": hole["HOLEID"],
+ "FROM": round(depth, 1),
+ "TO": round(to, 1),
+ "Au_ppm": round(au, 3),
+ "Cu_pct": round(cu, 4),
+ "Ag_ppm": round(ag, 3),
+ })
+ depth = to
+
+assay = pd.DataFrame(assay_rows)
+assay.to_csv(DATA_PATH / "assay.csv", index=False)
+print(f"assay.csv: {len(assay)} intervals")
+print("Done — all CSVs written to data/")
diff --git a/drillholes-demo/pages/__init__.py b/drillholes-demo/pages/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/drillholes-demo/pages/block_model.py b/drillholes-demo/pages/block_model.py
new file mode 100644
index 0000000..2b3445b
--- /dev/null
+++ b/drillholes-demo/pages/block_model.py
@@ -0,0 +1,108 @@
+from dash import dcc, html
+import dash_ag_grid as dag
+import dash_mantine_components as dmc
+from dash_iconify import DashIconify
+
+from utils import load_data
+
+COLUMN_DEFS = [
+ {
+ "field": "HOLEID",
+ "headerName": "Hole ID",
+ "pinned": "left",
+ "lockPinned": True,
+ "filter": "agTextColumnFilter",
+ "minWidth": 110,
+ },
+ {"field": "FROM", "headerName": "From (m)", "filter": "agNumberColumnFilter", "minWidth": 110},
+ {"field": "TO", "headerName": "To (m)", "filter": "agNumberColumnFilter", "minWidth": 110},
+ {
+ "field": "Au_ppm",
+ "headerName": "Au (g/t)",
+ "filter": "agNumberColumnFilter",
+ "minWidth": 110,
+ "cellStyle": {
+ "styleConditions": [
+ {"condition": "params.value >= 1.0", "style": {"backgroundColor": "#c6efce", "color": "#276221", "fontWeight": "600"}},
+ {"condition": "params.value >= 0.3 && params.value < 1.0", "style": {"backgroundColor": "#ffeb9c", "color": "#9c6500"}},
+ ],
+ "defaultStyle": {"backgroundColor": "white", "color": "#495057"},
+ },
+ },
+ {
+ "field": "Cu_pct",
+ "headerName": "Cu (%)",
+ "filter": "agNumberColumnFilter",
+ "minWidth": 110,
+ "cellStyle": {
+ "styleConditions": [
+ {"condition": "params.value >= 0.5", "style": {"backgroundColor": "#c6efce", "color": "#276221", "fontWeight": "600"}},
+ {"condition": "params.value >= 0.2 && params.value < 0.5", "style": {"backgroundColor": "#ffeb9c", "color": "#9c6500"}},
+ ],
+ "defaultStyle": {"backgroundColor": "white", "color": "#495057"},
+ },
+ },
+ {
+ "field": "Ag_ppm",
+ "headerName": "Ag (ppm)",
+ "filter": "agNumberColumnFilter",
+ "minWidth": 110,
+ "cellStyle": {
+ "styleConditions": [
+ {"condition": "params.value >= 5.0", "style": {"backgroundColor": "#c6efce", "color": "#276221", "fontWeight": "600"}},
+ {"condition": "params.value >= 1.0 && params.value < 5.0", "style": {"backgroundColor": "#ffeb9c", "color": "#9c6500"}},
+ ],
+ "defaultStyle": {"backgroundColor": "white", "color": "#495057"},
+ },
+ },
+]
+
+
+def layout():
+ _, assay, _, _ = load_data()
+
+ return dmc.Stack([
+ dmc.Group([
+ DashIconify(icon="tabler:cube", width=22, color="#868e96"),
+ dmc.Title("Block Model", order=3, c="dark"),
+ ], gap="sm"),
+
+ dmc.Group([
+ dcc.Input(
+ id="bm-quick-filter",
+ placeholder="Search all columns...",
+ debounce=True,
+ style={"width": 280, "padding": "6px 10px", "border": "1px solid #dee2e6", "borderRadius": 6, "fontSize": 13},
+ ),
+ dmc.Text(id="bm-row-count", size="sm", c="dimmed"),
+ dmc.Button(
+ "Export CSV",
+ id="bm-export-btn",
+ leftSection=DashIconify(icon="tabler:download", width=16),
+ variant="light",
+ color="gray",
+ size="sm",
+ ),
+ ], gap="sm", align="center"),
+
+ dag.AgGrid(
+ id="bm-grid",
+ columnDefs=COLUMN_DEFS,
+ rowData=assay.to_dict("records"),
+ columnSize="autoSize",
+ dashGridOptions={
+ "theme": "themeAlpine",
+ "pagination": True,
+ "paginationPageSize": 20,
+ "paginationPageSizeSelector": [20, 50, 100],
+ },
+ defaultColDef={
+ "filter": True,
+ "floatingFilter": True,
+ "sortable": True,
+ "resizable": True,
+ "minWidth": 100,
+ },
+ style={"height": "600px"},
+ ),
+ ], gap="md", p="md")
diff --git a/drillholes-demo/pages/comparison.py b/drillholes-demo/pages/comparison.py
new file mode 100644
index 0000000..a4d6ed3
--- /dev/null
+++ b/drillholes-demo/pages/comparison.py
@@ -0,0 +1,202 @@
+"""
+Comparison page — compare Au/Cu/Ag grade profiles across multiple holes
+side by side, with shared depth axis.
+"""
+
+import plotly.graph_objects as go
+from plotly.subplots import make_subplots
+from dash import html, dcc
+import dash_mantine_components as dmc
+import plotly.express as px
+
+from utils import load_data, CHART_LAYOUT, GRADE_COLORS, GRADE_LABELS
+
+
+DEFAULT_HOLES = ["DH001", "DH002", "DH003", "DH004", "DH005"]
+DEFAULT_GRADE = "Au_ppm"
+SUBPLOT_COLORS = px.colors.qualitative.Set2
+
+
+def build_comparison_figure(selected_holes, grade_col):
+ collar, assay, lith, _ = load_data()
+
+ if not selected_holes:
+ fig = go.Figure()
+ fig.update_layout(**{**CHART_LAYOUT, "height": 500,
+ "title_text": "Select at least one hole"})
+ return fig
+
+ n = len(selected_holes)
+ grade_label = GRADE_LABELS.get(grade_col, grade_col)
+
+ fig = make_subplots(
+ rows=1, cols=n,
+ shared_yaxes=True,
+ subplot_titles=selected_holes,
+ horizontal_spacing=max(0.01, 0.04 - 0.003 * n),
+ )
+ for ann in fig.layout.annotations:
+ ann.font = dict(size=10, color="#495057")
+
+ for i, hole_id in enumerate(selected_holes, start=1):
+ hole_assay = assay[assay["HOLEID"] == hole_id].sort_values("FROM")
+ if hole_assay.empty:
+ continue
+
+ mid_depths = (hole_assay["FROM"] + hole_assay["TO"]) / 2
+ widths = hole_assay["TO"] - hole_assay["FROM"]
+ color = SUBPLOT_COLORS[(i - 1) % len(SUBPLOT_COLORS)]
+
+ grade_max = float(hole_assay[grade_col].quantile(0.98)) or 1.0
+
+ fig.add_trace(go.Bar(
+ x=hole_assay[grade_col],
+ y=mid_depths,
+ orientation="h",
+ width=widths,
+ marker=dict(
+ color=hole_assay[grade_col],
+ colorscale=[
+ [0, "#f0f0f0"],
+ [0.4, color],
+ [1.0, "#212529"],
+ ],
+ cmin=0, cmax=grade_max,
+ showscale=False,
+ line_width=0,
+ ),
+ name=hole_id,
+ showlegend=False,
+ hovertemplate=f"{hole_id}
Depth: %{{y:.1f}} m
{grade_label}: %{{x:.4g}}",
+ ), row=1, col=i)
+
+ # Best intercept annotation
+ peak_idx = hole_assay[grade_col].idxmax()
+ peak_row = hole_assay.loc[peak_idx]
+ fig.add_annotation(
+ x=float(peak_row[grade_col]),
+ y=float((peak_row["FROM"] + peak_row["TO"]) / 2),
+ xref=f"x{i}" if i > 1 else "x",
+ yref="y",
+ text=f" {peak_row[grade_col]:.2g} ←peak",
+ showarrow=False,
+ font=dict(size=8, color="#d48806"),
+ xanchor="left",
+ )
+
+ fig.update_xaxes(
+ title_text=grade_label,
+ title_font=dict(color="#495057", size=10),
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d", size=8),
+ zeroline=True, zerolinecolor="#ced4da",
+ row=1, col=i,
+ )
+
+ fig.update_yaxes(
+ autorange="reversed",
+ title_text="Depth (m ↓)",
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d"),
+ title_font=dict(color="#495057"),
+ row=1, col=1,
+ )
+ fig.update_layout(**{
+ **CHART_LAYOUT,
+ "height": 650,
+ "margin": dict(l=60, r=20, t=45, b=50),
+ "bargap": 0, "bargroupgap": 0,
+ "hoverlabel": dict(bgcolor="#ffffff", font_color="#212529", bordercolor="#dee2e6"),
+ "title_text": f"{grade_label} Grade Profile Comparison",
+ "title_font": dict(color="#212529", size=13),
+ })
+ return fig
+
+
+def layout():
+ collar, assay, _, _ = load_data()
+ all_hole_ids = sorted(collar["HOLEID"].tolist())
+
+ default_total_m = int(collar.loc[collar["HOLEID"].isin(DEFAULT_HOLES), "TOTDEPTH"].sum())
+
+ badge_strip = dmc.Group(gap="sm", id="comparison-badges", children=[
+ dmc.Badge(f"Holes selected: {len(DEFAULT_HOLES)}", color="orange", variant="light",
+ id="badge-hole-count", size="lg"),
+ dmc.Badge(f"Combined meters: {default_total_m:,} m", color="gray", variant="light",
+ id="badge-total-meters", size="lg"),
+ dmc.Badge(f"Grade: {GRADE_LABELS[DEFAULT_GRADE]}", color="orange", variant="filled",
+ id="badge-grade", size="lg"),
+ ])
+
+ return dmc.Stack([
+ # Header + badge strip
+ dmc.Group([
+ html.Div([
+ html.P("Grade Profile Comparison", className="section-title"),
+ html.P(
+ "Side-by-side grade profiles across selected holes on a shared depth axis.",
+ className="section-description",
+ ),
+ ], style={"flex": 1}),
+ badge_strip,
+ ], justify="space-between", align="center", wrap="nowrap"),
+
+ dmc.Grid(gutter="md", children=[
+ # Controls panel
+ dmc.GridCol(
+ dmc.Paper([
+ html.P("Grade Type", className="section-title"),
+ html.P(
+ "Au = gold (g/t). Cu = copper (%). Ag = silver (ppm).",
+ className="section-description",
+ ),
+ dmc.SegmentedControl(
+ id="grade-selector",
+ data=[
+ {"value": "Au_ppm", "label": "Au (g/t)"},
+ {"value": "Cu_pct", "label": "Cu (%)"},
+ {"value": "Ag_ppm", "label": "Ag (ppm)"},
+ ],
+ value=DEFAULT_GRADE,
+ color="orange",
+ size="xs",
+ fullWidth=True,
+ mb="md",
+ ),
+ html.P("Select Holes (up to 10)", className="section-title"),
+ dmc.CheckboxGroup(
+ id="hole-checklist",
+ value=DEFAULT_HOLES,
+ children=dmc.Stack([
+ dmc.Checkbox(
+ label=h, value=h,
+ styles={"label": {"color": "#495057", "fontSize": "0.8rem"}},
+ )
+ for h in all_hole_ids[:20]
+ ], gap=6),
+ ),
+ ], p="md", radius="md", withBorder=True, className="chart-paper",
+ style={"maxHeight": "700px", "overflowY": "auto"}),
+ span={"base": 12, "md": 3},
+ ),
+
+ # Comparison chart
+ dmc.GridCol(
+ dmc.Paper([
+ html.P("Grade Profiles", className="section-title"),
+ html.P(
+ "Each panel is one hole's grade profile vs. downhole depth on a shared Y-axis. "
+ "Peak-grade interval is annotated.",
+ className="section-description",
+ ),
+ dcc.Graph(
+ id="comparison-chart",
+ figure=build_comparison_figure(DEFAULT_HOLES, DEFAULT_GRADE),
+ config={"displayModeBar": True, "scrollZoom": True},
+ style={"height": "650px"},
+ ),
+ ], p="md", radius="md", withBorder=True, className="chart-paper"),
+ span={"base": 12, "md": 9},
+ ),
+ ]),
+ ], gap="md")
diff --git a/drillholes-demo/pages/cross_section.py b/drillholes-demo/pages/cross_section.py
new file mode 100644
index 0000000..4b6ef5a
--- /dev/null
+++ b/drillholes-demo/pages/cross_section.py
@@ -0,0 +1,543 @@
+"""
+Cross-Section page — showcases Plotly.js multi-axis shapes.
+
+Each geological formation contact is a line shape whose left endpoint
+anchors to one subplot x-axis and the right endpoint anchors to a DIFFERENT
+subplot x-axis, via the new xref array syntax: xref=["x", "x2"].
+When the user pans or zooms col 1, only the left endpoint pixel moves;
+the right endpoint stays locked to col 2's coordinate system — correct
+geological cross-section behaviour.
+"""
+
+import plotly.graph_objects as go
+from plotly.subplots import make_subplots
+from dash import html, dcc
+import dash_mantine_components as dmc
+from dash_iconify import DashIconify
+import dash_tour_component as dtc
+import numpy as np
+
+from utils import load_data, CHART_LAYOUT, LITH_COLORS, compute_trace_easting_elevation, kpi_card
+from components.overview_widgets import collar_map, summary_table, depth_histogram
+
+# Formation contacts: approximate elevations (m RL) at deposit centre
+FORMATION_CONTACTS = [
+ {"name": "Alluvium / Weathered Granite", "elev": 382, "color": "#8B6914", "dip_m_per_m": 0.04},
+ {"name": "Weathered Granite / Granite", "elev": 350, "color": "#7B5C2A", "dip_m_per_m": 0.06},
+ {"name": "Granite / Quartz Diorite", "elev": 290, "color": "#6B4E2A", "dip_m_per_m": 0.08},
+ {"name": "Porphyry Top (mineralised)", "elev": 220, "color": "#A0522D", "dip_m_per_m": 0.10},
+]
+
+AXIS_STYLE = dict(
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d"),
+ title_font=dict(color="#495057"),
+ zeroline=False,
+)
+
+CS_TOUR_STEPS = [
+ {
+ "selector": "#cs-chart-paper",
+ "content": "Welcome to Cross-Section View! Step through to discover all the interactive features on this page.",
+ "position": "bottom",
+ },
+ {
+ "selector": "#cross-section-chart",
+ "content": "Hover anywhere on the chart — a gold cursor line tracks your elevation across all three panels simultaneously. Click once to pin a start elevation, then click again to measure the vertical distance between any two contacts.",
+ "position": "right",
+ },
+ {
+ "selector": "#cross-section-chart",
+ "content": "Drag the Elevation (Y) axis — hover the tick labels on the left edge, then drag up or down to pan the elevation range. Scroll over the axis to zoom into any elevation band. Double-click anywhere to reset.",
+ "position": "right",
+ },
+ {
+ "selector": "#cross-section-chart",
+ "content": "Each of the three panels has its own independent X-axis. Scroll or drag within Section A to zoom its grade range — Sections B and C stay exactly where they are.",
+ "position": "top",
+ },
+ {
+ "selector": "#cs-formation-legend",
+ "content": "These dotted formation contact lines span all three panels simultaneously. Each endpoint is anchored to its own panel axis — zoom Section A and only its segment moves, keeping the geology correct.",
+ "position": "bottom",
+ },
+]
+
+
+def _build_figure(collar, survey, orientation="EW"):
+ """
+ Build the cross-section figure with multi-axis formation shapes.
+ orientation: "EW" groups holes by northing thirds; "NS" by easting thirds.
+ """
+ if orientation == "EW":
+ sort_col, split_col = "NORTH", "EAST"
+ x_title = "Easting (m)"
+ else:
+ sort_col, split_col = "EAST", "NORTH"
+ x_title = "Northing (m)"
+
+ sorted_collar = collar.sort_values(sort_col).reset_index(drop=True)
+ n = len(sorted_collar)
+ thirds = [
+ sorted_collar.iloc[: n // 3],
+ sorted_collar.iloc[n // 3: 2 * n // 3],
+ sorted_collar.iloc[2 * n // 3:],
+ ]
+ section_labels = ["Section A (South)" if orientation == "EW" else "Section A (West)",
+ "Section B (Central)",
+ "Section C (North)" if orientation == "EW" else "Section C (East)"]
+
+ fig = make_subplots(
+ rows=1, cols=3,
+ shared_yaxes=False,
+ column_widths=[0.33, 0.34, 0.33],
+ subplot_titles=section_labels,
+ horizontal_spacing=0.04,
+ )
+
+ for ann in fig.layout.annotations:
+ ann.font = dict(size=11, color="#495057")
+
+ colors = ["#1971c2", "#2f9e44", "#e67700", "#c92a2a", "#862e9c",
+ "#0c8599", "#1864ab", "#5c940d", "#e67700", "#a61e4d"]
+
+ for col_idx, (section_holes, _) in enumerate(zip(thirds, section_labels), start=1):
+ for hi, (_, hole) in enumerate(section_holes.iterrows()):
+ east_list, elev_list = compute_trace_easting_elevation(
+ hole["HOLEID"], collar, survey
+ )
+ x_vals = east_list if orientation == "EW" else [hole["NORTH"]] * len(east_list)
+
+ fig.add_trace(go.Scatter(
+ x=x_vals,
+ y=elev_list,
+ mode="lines",
+ line=dict(color=colors[hi % len(colors)], width=2),
+ name=hole["HOLEID"],
+ hovertemplate=(
+ f"{hole['HOLEID']}
"
+ f"{x_title[:-4]}: %{{x:.0f}} m
"
+ "Elevation RL: %{y:.0f} m"
+ ),
+ legendgroup=hole["HOLEID"],
+ showlegend=(col_idx == 1),
+ ), row=1, col=col_idx)
+
+ x0 = east_list[0] if orientation == "EW" else hole["NORTH"]
+ fig.add_trace(go.Scatter(
+ x=[x0],
+ y=[elev_list[0]],
+ mode="markers+text",
+ marker=dict(color=colors[hi % len(colors)], size=7, symbol="triangle-down"),
+ text=[hole["HOLEID"]] if hi == 0 else [],
+ textposition="top center",
+ textfont=dict(size=7, color="#6c757d"),
+ showlegend=False,
+ hoverinfo="skip",
+ legendgroup=hole["HOLEID"],
+ ), row=1, col=col_idx)
+
+ # ─── Multi-axis formation contact shapes ─────────────────────────────────
+ def section_x_range(section_holes):
+ xs = section_holes["EAST"].tolist() if orientation == "EW" else section_holes["NORTH"].tolist()
+ if not xs:
+ return 350000, 350600
+ return min(xs) - 20, max(xs) + 20
+
+ x_ranges = [section_x_range(s) for s in thirds]
+ mids = [(lo + hi) / 2 for lo, hi in x_ranges]
+
+ # ─── Sentinel traces for plot-wide hover ─────────────────────────────────
+ # Invisible scatter points spanning the elevation range ensure hoverData
+ # fires anywhere in the chart, not just near actual hole trace data.
+ elev_sentinel = list(np.linspace(50, 450, 150))
+ for col_idx, x_range in enumerate(x_ranges, start=1):
+ x_mid = (x_range[0] + x_range[1]) / 2
+ fig.add_trace(go.Scatter(
+ x=[x_mid] * len(elev_sentinel),
+ y=elev_sentinel,
+ mode="markers",
+ marker=dict(opacity=0, size=3),
+ hoverinfo="skip",
+ showlegend=False,
+ ), row=1, col=col_idx)
+
+ # ─── Elevation cursor + measure shapes (one per panel) ────────────────────
+ # Each shape anchored to its own yref so they align correctly even when
+ # panels are zoomed independently.
+ for cidx, (xref, yref, x_range) in enumerate(
+ zip(["x", "x2", "x3"], ["y", "y2", "y3"], x_ranges), start=1
+ ):
+ fig.add_shape(
+ type="line",
+ x0=x_range[0], x1=x_range[1],
+ y0=-1000, y1=-1000,
+ xref=xref, yref=yref,
+ line=dict(color="#e8a020", width=1.5, dash="dash"),
+ name=f"elev-cursor-{cidx}",
+ visible=False,
+ )
+ fig.add_shape(
+ type="rect",
+ x0=x_range[0], x1=x_range[1],
+ y0=0, y1=0,
+ xref=xref, yref=yref,
+ fillcolor="rgba(232,160,32,0.12)",
+ line=dict(color="#e8a020", width=1),
+ name=f"measure-span-{cidx}",
+ visible=False,
+ )
+
+ for contact in FORMATION_CONTACTS:
+ elev_base = contact["elev"]
+ dip = contact["dip_m_per_m"]
+ color = contact["color"]
+
+ # Elevation at each panel's (lo, hi) x-edge, computed from the dip slope
+ ys = [
+ (elev_base + dip * (x_ranges[i][0] - mids[i]),
+ elev_base + dip * (x_ranges[i][1] - mids[i]))
+ for i in range(3)
+ ]
+
+ # Single multi-axis path traversing both panels and the gaps between them.
+ # Each coordinate in the path maps to the matching xref entry.
+ fig.add_shape(
+ type="path",
+ path=(
+ f"M {x_ranges[0][0]} {ys[0][0]} "
+ f"L {x_ranges[0][1]} {ys[0][1]} "
+ f"L {x_ranges[1][0]} {ys[1][0]} "
+ f"L {x_ranges[1][1]} {ys[1][1]} "
+ f"L {x_ranges[2][0]} {ys[2][0]} "
+ f"L {x_ranges[2][1]} {ys[2][1]}"
+ ),
+ xref=["x", "x", "x2", "x2", "x3", "x3"],
+ yref=["y", "y", "y2", "y2", "y3", "y3"],
+ line=dict(color=color, width=1.5, dash="dot"),
+ layer="below",
+ )
+
+ # Label at right edge of col3, anchored to panel 3's own y-axis.
+ x_col3_right = x_ranges[2][1]
+ elev_label = ys[2][1]
+ fig.add_annotation(
+ x=x_col3_right,
+ y=elev_label,
+ xref="x3", yref="y3",
+ text=contact["name"],
+ showarrow=False,
+ xanchor="left",
+ font=dict(size=9, color=color),
+ bgcolor="rgba(255,255,255,0.85)",
+ )
+
+ # ─── Spanning Mineralised Porphyry Zone rect ─────────────────────────────
+ porphyry_top = 220
+ porphyry_bottom = 90
+
+ fig.add_shape(
+ type="rect",
+ xref=["x", "x3"],
+ yref=["y", "y3"],
+ x0=x_ranges[0][0], y0=porphyry_bottom,
+ x1=x_ranges[2][1], y1=porphyry_top,
+ fillcolor="rgba(232, 160, 32, 0.10)",
+ line=dict(color="#e8a020", width=1, dash="dash"),
+ layer="below",
+ label=dict(
+ text="Mineralised Porphyry Zone",
+ textposition="top left",
+ font=dict(size=10, color="#d48806", family="Inter, sans-serif"),
+ padding=6,
+ ),
+ )
+
+ # ─── Layout ──────────────────────────────────────────────────────────────
+ fig.update_layout(**{
+ **CHART_LAYOUT,
+ "height": 600,
+ "margin": dict(l=60, r=140, t=50, b=50),
+ "hovermode": "closest",
+ "legend": dict(
+ bgcolor="#ffffff",
+ bordercolor="#dee2e6",
+ font=dict(color="#495057", size=9),
+ orientation="v",
+ x=1.01, y=1,
+ ),
+ "hoverlabel": dict(bgcolor="#ffffff", font_color="#212529", bordercolor="#dee2e6"),
+ })
+
+ for col_idx in range(1, 4):
+ fig.update_yaxes(
+ title_text="Elevation RL (m)" if col_idx == 1 else None,
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d"),
+ title_font=dict(color="#495057"),
+ zeroline=False,
+ range=[150, 450],
+ row=1, col=col_idx,
+ )
+ fig.update_xaxes(
+ title_text=x_title,
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d"),
+ title_font=dict(color="#495057"),
+ zeroline=False,
+ row=1, col=col_idx,
+ )
+
+ return fig
+
+
+def layout():
+ collar, assay, lith, survey = load_data()
+
+ total_holes = len(collar)
+ total_meters = int(collar["TOTDEPTH"].sum())
+ east_range = collar["EAST"].max() - collar["EAST"].min()
+ north_range = collar["NORTH"].max() - collar["NORTH"].min()
+ area_km2 = (east_range * north_range) / 1e6
+
+ formation_legend = dmc.Group(
+ id="cs-formation-legend",
+ gap="md",
+ children=[
+ dmc.Group(gap="xs", children=[
+ html.Span(style={
+ "display": "inline-block",
+ "width": "24px", "height": "3px",
+ "borderTop": f"2px dotted {c['color']}",
+ "verticalAlign": "middle",
+ }),
+ dmc.Text(c["name"], size="xs", c="dimmed"),
+ ])
+ for c in FORMATION_CONTACTS
+ ],
+ )
+
+ feature_chips = dmc.Group(gap="xs", mt="xs", mb="xs", children=[
+ dmc.Tooltip(
+ label="Hover the Elevation (Y) axis tick labels and drag up/down to pan · scroll over the axis to zoom · double-click anywhere to reset",
+ multiline=True, w=300, withArrow=True, position="bottom",
+ children=dmc.Badge("↕ Drag Y-Axis", color="blue", variant="light", size="sm",
+ style={"cursor": "help"}),
+ ),
+ ])
+
+ things_to_try = dmc.Paper([
+ dmc.Group(gap="xs", mb="sm", children=[
+ DashIconify(icon="tabler:bulb", width=16, color="#e8a020"),
+ dmc.Text("Things to Try", fw=600, size="sm", c="orange"),
+ ]),
+ dmc.Stack(gap="sm", children=[
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:arrows-up-down", width=14),
+ size="sm", variant="light", color="blue", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Drag the Elevation (Y) axis", fw=600, size="xs"),
+ dmc.Text(
+ "Hover the tick labels on the left edge and drag up or down to pan. "
+ "Scroll over the axis to zoom into any elevation band.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:zoom", width=14),
+ size="sm", variant="light", color="teal", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Zoom any single panel independently", fw=600, size="xs"),
+ dmc.Text(
+ "Each section panel has its own X-axis. Scroll or drag within Section A — "
+ "Sections B and C are completely unaffected.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:line-dashed", width=14),
+ size="sm", variant="light", color="orange", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Watch the formation contacts span all panels", fw=600, size="xs"),
+ dmc.Text(
+ "Dotted lines and the Porphyry Zone rect are anchored to each panel's own axis "
+ "via xref/yref arrays. Zoom Section A — only its segment moves.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:rotate-2", width=14),
+ size="sm", variant="light", color="gray", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Double-click to reset view", fw=600, size="xs"),
+ dmc.Text(
+ "Double-click anywhere on the chart to reset all axes to their default range.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:crosshair", width=14),
+ size="sm", variant="light", color="grape", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Hover to track elevation · click to pin", fw=600, size="xs"),
+ dmc.Text(
+ "A gold cursor line tracks your elevation across all three panels simultaneously. "
+ "Click anywhere to pin the marker at that elevation.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ ]),
+ ], p="md", radius="md", withBorder=True, className="tip-paper")
+
+ return [
+ dtc.DashTour(
+ id="cs-tour",
+ isOpen=False,
+ accentColor="#e8a020",
+ rounded=8,
+ showNumber=True,
+ steps=CS_TOUR_STEPS,
+ ),
+
+ dmc.Stack([
+ things_to_try,
+
+ dmc.SimpleGrid(
+ cols={"base": 2, "md": 4},
+ spacing="md",
+ children=[
+ kpi_card("Total Holes", str(total_holes), "drillholes in program", icon="tabler:drone"),
+ kpi_card("Meters Drilled", f"{total_meters:,} m", "cumulative penetration", icon="tabler:ruler-measure"),
+ kpi_card("Prospect Area", f"{area_km2:.2f} km²", "surface footprint", icon="tabler:map-pin"),
+ kpi_card("Section Panels", "3", "South · Central · North", icon="tabler:chart-grid-dots"),
+ ],
+ ),
+
+ # Cross-section chart card
+ dmc.Paper([
+ dmc.Group([
+ html.Div([
+ html.P("Cross-Section View", className="section-title"),
+ html.P(
+ "Three geographic panels. Drag the Elevation axis to pan · "
+ "scroll to zoom · hover a panel's X-axis to zoom grade independently.",
+ className="section-description",
+ ),
+ ], style={"flex": 1}),
+ html.Div(
+ id="cs-orientation-group",
+ children=dmc.Group(gap="xs", align="center", children=[
+ dmc.Button(
+ dmc.Group([DashIconify(icon="tabler:help", width=13), "Tour"],
+ gap=4, align="center"),
+ id="cs-tour-btn",
+ variant="subtle",
+ color="gray",
+ size="xs",
+ ),
+ dmc.SegmentedControl(
+ id="section-orientation",
+ data=[
+ {"value": "EW", "label": "E–W Sections"},
+ {"value": "NS", "label": "N–S Sections"},
+ ],
+ value="EW",
+ color="orange",
+ size="xs",
+ ),
+ ]),
+ ),
+ ], justify="space-between", align="flex-start", wrap="nowrap", mb="xs"),
+
+ # Feature interaction chips
+ feature_chips,
+
+ formation_legend,
+
+ # Chart with Y-axis hint overlay
+ html.Div(
+ style={"position": "relative"},
+ children=[
+ html.Div(
+ id="cs-yaxis-hint",
+ className="y-axis-hint",
+ children=[
+ DashIconify(icon="tabler:arrows-up-down", width=10, color="#adb5bd"),
+ " drag · scroll to zoom",
+ ],
+ ),
+ dcc.Graph(
+ id="cross-section-chart",
+ figure=_build_figure(collar, survey, "EW"),
+ config={"displayModeBar": True, "scrollZoom": True},
+ style={"height": "600px", "marginTop": "8px"},
+ ),
+ ],
+ ),
+ ], id="cs-chart-paper", p="md", radius="md", withBorder=True, className="chart-paper"),
+
+ dmc.Grid(gutter="md", children=[
+ dmc.GridCol(
+ dmc.Paper([
+ html.P("Collar Plan Map", className="section-title"),
+ html.P(
+ "Plan view of drillhole collar positions. Marker colour = total depth drilled. "
+ "Equal-aspect projection preserves true spatial relationships.",
+ className="section-description",
+ ),
+ dcc.Graph(
+ figure=collar_map(collar),
+ config={"displayModeBar": False, "scrollZoom": True},
+ ),
+ ], p="md", radius="md", withBorder=True, className="chart-paper"),
+ span={"base": 12, "md": 8},
+ ),
+ dmc.GridCol(
+ dmc.Paper([
+ html.P("Hole Summary", className="section-title"),
+ html.P(
+ "AZ = azimuth from North. DIP = downhole inclination (negative = sub-vertical).",
+ className="section-description",
+ ),
+ html.Div(summary_table(collar), className="table-scroll"),
+ dmc.Text(
+ f"Showing 20 of {total_holes} holes · scroll for more",
+ size="xs", c="dimmed", mt="xs",
+ ),
+ ], p="md", radius="md", withBorder=True, className="chart-paper"),
+ span={"base": 12, "md": 4},
+ ),
+ ]),
+
+ # Depth distribution
+ dmc.Paper([
+ html.P("Hole Depth Distribution", className="section-title"),
+ html.P(
+ "Most holes target the 200–350 m depth range where the Au-Cu mineralized porphyry sits. "
+ "Shallower holes test the weathered zone; deeper holes test the fresh granite footwall.",
+ className="section-description",
+ ),
+ dcc.Graph(figure=depth_histogram(collar), config={"displayModeBar": False}),
+ ], p="md", radius="md", withBorder=True, className="chart-paper"),
+ ], gap="md"),
+ ]
diff --git a/drillholes-demo/pages/downhole_logs.py b/drillholes-demo/pages/downhole_logs.py
new file mode 100644
index 0000000..7148832
--- /dev/null
+++ b/drillholes-demo/pages/downhole_logs.py
@@ -0,0 +1,430 @@
+"""
+Downhole Logs page — showcases Plotly.js plot-wide hover/click events.
+
+Two new-feature demonstrations:
+1. Depth cursor: a horizontal gold line that tracks the mouse across ALL
+ four strip-log panels simultaneously, even over empty areas between
+ data points (plot-wide hover events via transparent sentinel traces +
+ clientside callback for zero-latency response).
+
+2. Click-to-measure: clicking anywhere on the plot (plot-wide click events)
+ records a start depth, then a second click computes the interval
+ thickness and draws a shaded span across all panels.
+"""
+
+import plotly.graph_objects as go
+from plotly.subplots import make_subplots
+from dash import html, dcc
+import dash_mantine_components as dmc
+from dash_iconify import DashIconify
+import dash_tour_component as dtc
+import numpy as np
+import pandas as pd
+
+from utils import load_data, CHART_LAYOUT, LITH_COLORS, LITH_ORDER
+
+DL_TOUR_STEPS = [
+ {
+ "selector": "#strip-log-chart-paper",
+ "content": "Welcome to Downhole Logs! Step through to discover all the interactive features on this page.",
+ "position": "bottom",
+ },
+ {
+ "selector": "#strip-log-chart",
+ "content": "Hover anywhere on the chart — even over lithology blocks and empty areas — to see a gold dashed cursor track depth across all four panels simultaneously.",
+ "position": "right",
+ },
+ {
+ "selector": "#strip-log-chart",
+ "content": "Click once anywhere to mark a start depth (a gold line snaps to that position). Then click a second time to measure the interval — a shaded span appears across all panels and the exact thickness is shown.",
+ "position": "right",
+ },
+ {
+ "selector": "#hole-selector",
+ "content": "Use this dropdown to switch between drillholes. All four panels update together.",
+ "position": "bottom",
+ },
+]
+
+
+def _strip_log_figure(hole_id: str, collar, assay, lith, survey) -> go.Figure:
+ hole_assay = assay[assay["HOLEID"] == hole_id].sort_values("FROM")
+ hole_lith = lith[lith["HOLEID"] == hole_id].sort_values("FROM")
+ hole_survey = survey[survey["HOLEID"] == hole_id].sort_values("DEPTH")
+ hole_collar = collar[collar["HOLEID"] == hole_id].iloc[0]
+
+ max_depth = float(hole_collar["TOTDEPTH"])
+ depth_range = list(np.arange(0, max_depth + 5, 5))
+
+ fig = make_subplots(
+ rows=1, cols=4,
+ shared_yaxes=True,
+ column_widths=[0.14, 0.30, 0.30, 0.26],
+ subplot_titles=["Lithology", "Au Grade (g/t)", "Cu Grade (%)", "Hole Deviation (°)"],
+ horizontal_spacing=0.03,
+ )
+
+ for ann in fig.layout.annotations:
+ ann.font = dict(size=11, color="#495057")
+
+ # ── Col 1: Lithology rectangles ─────────────────────────────────────────
+ for _, row in hole_lith.iterrows():
+ color = LITH_COLORS.get(row["LITHOLOGY"], "#aaa")
+ fig.add_shape(
+ type="rect",
+ x0=0, x1=1,
+ y0=row["FROM"], y1=row["TO"],
+ xref="x", yref="y",
+ fillcolor=color,
+ line_width=0,
+ layer="below",
+ )
+ mid = (row["FROM"] + row["TO"]) / 2
+ if row["TO"] - row["FROM"] >= 8:
+ fig.add_annotation(
+ x=0.5, y=mid,
+ text=row["LITHOLOGY"],
+ xref="x", yref="y",
+ showarrow=False,
+ font=dict(size=8, color="#212529"),
+ bgcolor="rgba(255,255,255,0.75)",
+ borderpad=2,
+ )
+
+ # Invisible trace on col1 so axis is registered
+ fig.add_trace(go.Scatter(
+ x=[0.5] * len(depth_range),
+ y=depth_range,
+ mode="markers",
+ marker=dict(opacity=0, size=1),
+ hoverinfo="skip",
+ showlegend=False,
+ ), row=1, col=1)
+
+ fig.update_xaxes(
+ showticklabels=False, showgrid=False, zeroline=False,
+ range=[0, 1], row=1, col=1,
+ )
+
+ # ── Col 2: Au grade bars ─────────────────────────────────────────────────
+ mid_depths = (hole_assay["FROM"] + hole_assay["TO"]) / 2
+ widths = hole_assay["TO"] - hole_assay["FROM"]
+
+ fig.add_trace(go.Bar(
+ x=hole_assay["Au_ppm"],
+ y=mid_depths,
+ orientation="h",
+ width=widths,
+ marker=dict(
+ color=hole_assay["Au_ppm"],
+ colorscale=[[0, "#f8f9fa"], [0.3, "#e8a020"], [1, "#ff6b35"]],
+ cmin=0, cmax=float(hole_assay["Au_ppm"].quantile(0.99)),
+ showscale=False,
+ line_width=0,
+ ),
+ hovertemplate="Depth: %{y:.1f} m
Au: %{x:.3f} g/t",
+ name="Au (g/t)",
+ showlegend=False,
+ ), row=1, col=2)
+
+ # Sentinel trace for hover coverage on col2
+ fig.add_trace(go.Scatter(
+ x=[0] * len(depth_range), y=depth_range,
+ mode="markers", marker=dict(opacity=0, size=3),
+ hoverinfo="skip", showlegend=False,
+ ), row=1, col=2)
+
+ # ── Col 3: Cu grade bars ─────────────────────────────────────────────────
+ fig.add_trace(go.Bar(
+ x=hole_assay["Cu_pct"],
+ y=mid_depths,
+ orientation="h",
+ width=widths,
+ marker=dict(
+ color=hole_assay["Cu_pct"],
+ colorscale=[[0, "#f8f9fa"], [0.3, "#FF8C00"], [1, "#ff4444"]],
+ cmin=0, cmax=float(hole_assay["Cu_pct"].quantile(0.99)),
+ showscale=False,
+ line_width=0,
+ ),
+ hovertemplate="Depth: %{y:.1f} m
Cu: %{x:.4f} %",
+ name="Cu (%)",
+ showlegend=False,
+ ), row=1, col=3)
+
+ fig.add_trace(go.Scatter(
+ x=[0] * len(depth_range), y=depth_range,
+ mode="markers", marker=dict(opacity=0, size=3),
+ hoverinfo="skip", showlegend=False,
+ ), row=1, col=3)
+
+ # ── Col 4: Survey dip line ────────────────────────────────────────────────
+ fig.add_trace(go.Scatter(
+ x=hole_survey["DIP"],
+ y=hole_survey["DEPTH"],
+ mode="lines+markers",
+ line=dict(color="#1971c2", width=2),
+ marker=dict(size=4, color="#1971c2"),
+ hovertemplate="Depth: %{y:.1f} m
Dip: %{x:.1f}° from vertical",
+ name="Dip (°)",
+ showlegend=False,
+ ), row=1, col=4)
+
+ fig.add_trace(go.Scatter(
+ x=[hole_survey["DIP"].mean()] * len(depth_range), y=depth_range,
+ mode="markers", marker=dict(opacity=0, size=3),
+ hoverinfo="skip", showlegend=False,
+ ), row=1, col=4)
+
+ # ── Depth cursor shape ──────────────────────────────────────────────────
+ # xref="paper" spans the full plot width across all 4 panels.
+ # Updated by a clientside callback on hoverData (plot-wide hover feature).
+ fig.add_shape(
+ type="line",
+ x0=0, x1=1,
+ y0=-10, y1=-10,
+ xref="paper", yref="y",
+ line=dict(color="#e8a020", width=1.5, dash="dash"),
+ name="depth-cursor",
+ visible=False,
+ )
+
+ # ── Measurement span shape (hidden initially) ────────────────────────────
+ fig.add_shape(
+ type="rect",
+ x0=0, x1=1,
+ y0=0, y1=0,
+ xref="paper", yref="y",
+ fillcolor="rgba(232,160,32,0.12)",
+ line=dict(color="#e8a020", width=1),
+ name="measure-span",
+ visible=False,
+ )
+
+ # ── Layout ────────────────────────────────────────────────────────────────
+ fig.update_yaxes(
+ autorange="reversed",
+ title_text="Depth (m ↓ downhole)",
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d"),
+ title_font=dict(color="#495057"),
+ range=[max_depth + 5, -5],
+ row=1, col=1,
+ )
+ for col_idx in range(2, 5):
+ fig.update_xaxes(
+ showgrid=True, gridcolor="#e9ecef",
+ tickfont=dict(color="#6c757d"),
+ zeroline=True, zerolinecolor="#ced4da",
+ row=1, col=col_idx,
+ )
+ fig.update_xaxes(
+ title_text="Au (g/t) — gold grade", title_font=dict(color="#495057"), row=1, col=2,
+ )
+ fig.update_xaxes(
+ title_text="Cu (%) — copper grade", title_font=dict(color="#495057"), row=1, col=3,
+ )
+ fig.update_xaxes(
+ title_text="Dip (°) from vertical", title_font=dict(color="#495057"), row=1, col=4,
+ )
+
+ fig.update_layout(**{
+ **CHART_LAYOUT,
+ "height": 750,
+ "margin": dict(l=60, r=20, t=40, b=50),
+ "hovermode": "y",
+ "hoverdistance": 30,
+ "bargap": 0,
+ "bargroupgap": 0,
+ "hoverlabel": dict(bgcolor="#ffffff", font_color="#212529", bordercolor="#dee2e6"),
+ })
+
+ return fig
+
+
+def layout():
+ collar, assay, lith, survey = load_data()
+ hole_ids = sorted(collar["HOLEID"].tolist())
+ default_hole = hole_ids[0]
+
+ default_depth = int(collar.loc[collar["HOLEID"] == default_hole, "TOTDEPTH"].iloc[0])
+ default_lith_count = int(lith[lith["HOLEID"] == default_hole].shape[0])
+
+ things_to_try = dmc.Paper([
+ dmc.Group(gap="xs", mb="sm", children=[
+ DashIconify(icon="tabler:bulb", width=16, color="#e8a020"),
+ dmc.Text("Things to Try", fw=600, size="sm", c="orange"),
+ ]),
+ dmc.Stack(gap="sm", children=[
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:arrow-move-down", width=14),
+ size="sm", variant="light", color="orange", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Hover to track depth", fw=600, size="xs"),
+ dmc.Text(
+ "The gold depth cursor tracks your mouse across all four panels simultaneously, "
+ "even over lithology rectangles and empty areas.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:vector-triangle", width=14),
+ size="sm", variant="light", color="grape", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Click once · click again to measure", fw=600, size="xs"),
+ dmc.Text(
+ "Click anywhere to mark a start depth (a gold line appears and the readout confirms it). "
+ "Click a second time — the shaded span and thickness annotation appear across all panels.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:rotate-2", width=14),
+ size="sm", variant="light", color="gray", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Clear and restart", fw=600, size="xs"),
+ dmc.Text(
+ "Hit the Clear button to dismiss the span and reset to a fresh measurement.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:adjustments-horizontal", width=14),
+ size="sm", variant="light", color="blue", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Switch drillholes", fw=600, size="xs"),
+ dmc.Text(
+ "Use the Hole Selector dropdown to jump between holes — all panels update together.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ ]),
+ ], p="md", radius="md", withBorder=True, className="tip-paper")
+
+ return [
+ dtc.DashTour(
+ id="dl-tour",
+ isOpen=False,
+ accentColor="#e8a020",
+ rounded=8,
+ showNumber=True,
+ steps=DL_TOUR_STEPS,
+ ),
+ dmc.Stack([
+ things_to_try,
+
+ dmc.SimpleGrid(
+ cols={"base": 1, "sm": 2},
+ spacing="md",
+ children=[
+ dmc.Paper([
+ dmc.Group([
+ dmc.Text("Current Hole Depth", size="xs", c="dimmed", tt="uppercase", fw=600),
+ DashIconify(icon="tabler:arrow-down-to-arc", width=16, color="#868e96"),
+ ], justify="space-between"),
+ dmc.Text(f"{default_depth} m", id="kpi-hole-depth", size="xl", fw=700, c="dark", mt=4),
+ dmc.Text("total drilled depth", size="xs", c="dimmed"),
+ ], p="md", radius="md", withBorder=True, className="kpi-card"),
+ dmc.Paper([
+ dmc.Group([
+ dmc.Text("Lithology Intervals", size="xs", c="dimmed", tt="uppercase", fw=600),
+ DashIconify(icon="tabler:layers-difference", width=16, color="#868e96"),
+ ], justify="space-between"),
+ dmc.Text(str(default_lith_count), id="kpi-lith-count", size="xl", fw=700, c="dark", mt=4),
+ dmc.Text("logged intervals for hole", size="xs", c="dimmed"),
+ ], p="md", radius="md", withBorder=True, className="kpi-card"),
+ ],
+ ),
+
+ # Strip log card
+ dmc.Paper([
+ dmc.Group([
+ html.Div([
+ html.P("Downhole Strip Log", className="section-title"),
+ html.P(
+ "Four-panel strip log: lithology, Au (g/t), Cu (%), hole deviation. "
+ "Hover anywhere to track depth across all panels. Click once to start an interval, "
+ "click again to measure its thickness.",
+ className="section-description",
+ ),
+ ], style={"flex": 1}),
+ html.Div(children=dmc.Group(gap="xs", align="center", children=[
+ dmc.Button(
+ dmc.Group([DashIconify(icon="tabler:help", width=13), "Tour"],
+ gap=4, align="center"),
+ id="dl-tour-btn",
+ variant="subtle",
+ color="gray",
+ size="xs",
+ ),
+ dmc.Select(
+ id="hole-selector",
+ label="Select Hole",
+ data=[{"value": h, "label": h} for h in hole_ids],
+ value=default_hole,
+ w=160,
+ size="xs",
+ styles={"label": {"color": "#6c757d", "fontSize": "0.75rem"}},
+ ),
+ ])),
+ ], justify="space-between", align="flex-end", wrap="nowrap", mb="xs"),
+ dmc.Group(gap="xs", mt="xs", mb="xs", children=[
+ dmc.Tooltip(
+ label=(
+ "Click once anywhere on the chart to mark a start depth — "
+ "a gold line appears. Click a second time to measure the interval "
+ "and see the thickness."
+ ),
+ multiline=True, w=300, withArrow=True, position="bottom",
+ children=dmc.Badge(
+ "⊕ Click to Measure", color="orange", variant="light", size="sm",
+ style={"cursor": "help"},
+ ),
+ ),
+ ]),
+
+ # Measurement readout
+ dmc.Group(gap="xs", mb="sm", children=[
+ dmc.Text("Interval:", size="sm", c="dimmed"),
+ html.Div(id="measure-readout", className="measure-readout",
+ children="Click a depth to start measuring"),
+ dmc.Button("Clear", id="measure-clear-btn", variant="subtle",
+ color="gray", size="xs"),
+ ]),
+
+ dcc.Graph(
+ id="strip-log-chart",
+ figure=_strip_log_figure(default_hole, collar, assay, lith, survey),
+ config={"displayModeBar": True, "scrollZoom": True},
+ style={"height": "750px"},
+ ),
+ ], id="strip-log-chart-paper", p="md", radius="md", withBorder=True, className="chart-paper"),
+
+ dmc.Paper([
+ html.P("Lithology Key", className="section-title"),
+ dmc.Group(gap="md", wrap="wrap", children=[
+ dmc.Group(gap="xs", children=[
+ html.Span(className="lith-swatch", style={"backgroundColor": color}),
+ dmc.Text(lith_name, size="xs", c="dimmed"),
+ ])
+ for lith_name, color in LITH_COLORS.items()
+ ]),
+ ], p="md", radius="md", withBorder=True, className="chart-paper"),
+ ], gap="md"),
+ ]
diff --git a/drillholes-demo/pages/explorer.py b/drillholes-demo/pages/explorer.py
new file mode 100644
index 0000000..62bb50f
--- /dev/null
+++ b/drillholes-demo/pages/explorer.py
@@ -0,0 +1,146 @@
+"""
+Explorer page — port of the "Drill-Hole Cross-Section Explorer" CodePen.
+
+Dash owns the page shell only. The chart (4-hole subplots, multi-axis spanning
+geological bands) and all hover/click interactivity are built in
+assets/explorer.js using Plotly.js 3.x's hoveranywhere/clickanywhere flags.
+The sidebar exposes id-tagged spans the JS writes into directly.
+"""
+
+from dash import html, dcc
+import dash_mantine_components as dmc
+from dash_iconify import DashIconify
+
+
+def _things_to_try():
+ return dmc.Paper([
+ dmc.Group(gap="xs", mb="sm", children=[
+ DashIconify(icon="tabler:bulb", width=16, color="#e8a020"),
+ dmc.Text("Things to Try", fw=600, size="sm", c="orange"),
+ ]),
+ dmc.Stack(gap="sm", children=[
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:crosshair", width=14),
+ size="sm", variant="light", color="grape", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Hover anywhere to track depth", fw=600, size="xs"),
+ dmc.Text(
+ "A horizontal crosshair plus depth pill follows the cursor across all four "
+ "hole panels — including the empty space between them. Powered by Plotly 3.x's "
+ "hoveranywhere flag.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:layers-intersect", width=14),
+ size="sm", variant="light", color="orange", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Multi-axis spanning bands", fw=600, size="xs"),
+ dmc.Text(
+ "Geological units are quadrilateral paths anchored to consecutive y-axes "
+ '(yref=["y","y2","y2","y"]) — they connect adjacent subplots automatically '
+ "even when each hole has its own axis pair.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:vector-triangle", width=14),
+ size="sm", variant="light", color="red", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Click two points to measure", fw=600, size="xs"),
+ dmc.Text(
+ "Click two depths inside the same hole panel to drop markers and read out the "
+ "depth interval. A third click resets. Cross-hole clicks are ignored.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[
+ dmc.ThemeIcon(
+ DashIconify(icon="tabler:zoom", width=14),
+ size="sm", variant="light", color="teal", radius="xl",
+ style={"flexShrink": 0},
+ ),
+ html.Div([
+ dmc.Text("Each hole is independent", fw=600, size="xs"),
+ dmc.Text(
+ "Every hole has its own x/y axis pair. Pan or zoom one panel without disturbing "
+ "the others — the spanning geological bands stretch correctly.",
+ size="xs", c="dimmed",
+ ),
+ ]),
+ ]),
+ ]),
+ ], p="md", radius="md", withBorder=True, className="tip-paper")
+
+
+def _sidebar():
+ cursor_panel = dmc.Paper([
+ dmc.Text("Cursor Position", className="explorer-panel-title"),
+ html.Div(className="explorer-info-row", children=[
+ html.Span("Depth", className="explorer-info-label"),
+ html.Span("--", id="cursor-depth", className="explorer-info-value"),
+ ]),
+ html.Div(className="explorer-info-row", children=[
+ html.Span("Hole", className="explorer-info-label"),
+ html.Span("--", id="cursor-hole", className="explorer-info-value"),
+ ]),
+ html.Div(className="explorer-info-row", children=[
+ html.Span("Value", className="explorer-info-label"),
+ html.Span("--", id="cursor-value", className="explorer-info-value"),
+ ]),
+ ], p="md", radius="md", withBorder=True, className="chart-paper explorer-info-panel")
+
+ measure_panel = dmc.Paper([
+ dmc.Text("Click-to-Measure", className="explorer-panel-title"),
+ dmc.Text(
+ "Click two points in the same subplot to measure the depth interval. "
+ "Click again to reset.",
+ size="xs", c="dimmed", mb=6,
+ ),
+ html.Div(id="distance-result", className="explorer-distance-result"),
+ ], p="md", radius="md", withBorder=True, className="chart-paper explorer-info-panel")
+
+ return dmc.Stack([cursor_panel, measure_panel], gap="md")
+
+
+def _chart_paper():
+ return dmc.Paper([
+ html.P("Drill-Hole Cross-Section Explorer", className="section-title"),
+ html.P(
+ "Four drill holes side by side. Geological units span between panels via multi-axis "
+ "shapes. Hover anywhere for the depth crosshair; click two points within one hole to "
+ "measure interval thickness.",
+ className="section-description",
+ ),
+ html.Div(
+ id="explorer-chart",
+ style={"height": "640px", "width": "100%"},
+ ),
+ ], p="md", radius="md", withBorder=True, className="chart-paper")
+
+
+def layout():
+ return [
+ # Hidden dcc.Graph forces Dash 4 to lazy-load Plotly.js on this page.
+ # The visible chart is rendered by assets/explorer.js into #explorer-chart.
+ dcc.Graph(id="_explorer-plotly-loader", figure={}, style={"display": "none"}),
+ dmc.Stack([
+ _things_to_try(),
+ dmc.Grid(gutter="md", children=[
+ dmc.GridCol(_sidebar(), span={"base": 12, "md": 3}),
+ dmc.GridCol(_chart_paper(), span={"base": 12, "md": 9}),
+ ]),
+ ], gap="md"),
+ ]
diff --git a/drillholes-demo/requirements.txt b/drillholes-demo/requirements.txt
new file mode 100644
index 0000000..294daa7
--- /dev/null
+++ b/drillholes-demo/requirements.txt
@@ -0,0 +1,9 @@
+dash>=3.0.0
+dash-ag-grid>=33.0.0
+dash-mantine-components>=0.14.0
+dash-iconify>=0.1.2
+dash-tour-component>=0.0.2
+plotly>=6.0.0
+pandas>=2.0.0
+numpy>=1.26.0
+gunicorn>=21.0.0
diff --git a/drillholes-demo/utils.py b/drillholes-demo/utils.py
new file mode 100644
index 0000000..cc0f823
--- /dev/null
+++ b/drillholes-demo/utils.py
@@ -0,0 +1,210 @@
+import pathlib
+from functools import lru_cache
+import numpy as np
+import pandas as pd
+from dash import html
+import dash_mantine_components as dmc
+from dash_iconify import DashIconify
+
+PATH = pathlib.Path(__file__).parent
+DATA_PATH = PATH / "data"
+
+LITH_COLORS = {
+ "Alluvium": "#C2B280",
+ "Weathered Granite": "#D4A574",
+ "Granite": "#9E8B6B",
+ "Quartz Diorite": "#8B7355",
+ "Mineralized Porphyry": "#A0522D",
+ "Fresh Granite": "#6B5B45",
+}
+
+LITH_ORDER = list(LITH_COLORS.keys())
+
+CHART_LAYOUT = dict(
+ paper_bgcolor="#ffffff",
+ plot_bgcolor="#f8f9fa",
+ font=dict(family="Inter, sans-serif", size=12, color="#495057"),
+ margin=dict(l=50, r=20, t=40, b=50),
+)
+
+# Keep alias so any external references still work
+DARK_CHART_LAYOUT = CHART_LAYOUT
+
+GRADE_COLORS = {
+ "Au_ppm": "#FFD700",
+ "Cu_pct": "#FF8C00",
+ "Ag_ppm": "#C0C0C0",
+}
+
+GRADE_LABELS = {
+ "Au_ppm": "Au (g/t)",
+ "Cu_pct": "Cu (%)",
+ "Ag_ppm": "Ag (ppm)",
+}
+
+
+@lru_cache(maxsize=1)
+def load_data():
+ collar = pd.read_csv(DATA_PATH / "collar.csv")
+ assay = pd.read_csv(DATA_PATH / "assay.csv")
+ lith = pd.read_csv(DATA_PATH / "lith.csv")
+ survey = pd.read_csv(DATA_PATH / "survey.csv")
+ return collar, assay, lith, survey
+
+
+def compute_trace_easting_elevation(hole_id, collar_df, survey_df):
+ """
+ Minimum-curvature method: converts downhole survey (depth, az, dip)
+ to (easting, elevation) pairs for cross-section plotting.
+ """
+ hole = collar_df[collar_df["HOLEID"] == hole_id].iloc[0]
+ surveys = survey_df[survey_df["HOLEID"] == hole_id].sort_values("DEPTH").copy()
+
+ e, z = float(hole["EAST"]), float(hole["ELEV"])
+ east_list, elev_list = [e], [z]
+
+ prev_depth = 0.0
+ prev_az = np.radians(float(hole["AZ"]))
+ prev_dip = np.radians(abs(float(hole["DIP"])))
+
+ for _, svy in surveys.iterrows():
+ dl = float(svy["DEPTH"]) - prev_depth
+ if dl <= 0:
+ continue
+ az2 = np.radians(float(svy["AZ"]))
+ dip2 = np.radians(abs(float(svy["DIP"])))
+
+ dl_cos = (np.cos(dip2 - prev_dip)
+ - np.sin(prev_dip) * np.sin(dip2) * (1 - np.cos(az2 - prev_az)))
+ rf = 2.0 / (1.0 + dl_cos) if abs(1.0 + dl_cos) > 0.001 else 1.0
+
+ de = (dl / 2.0) * (np.sin(prev_dip) * np.sin(prev_az)
+ + np.sin(dip2) * np.sin(az2)) * rf
+ dz = -(dl / 2.0) * (np.cos(prev_dip) + np.cos(dip2)) * rf
+
+ e += de
+ z += dz
+ east_list.append(round(e, 2))
+ elev_list.append(round(z, 2))
+
+ prev_depth = float(svy["DEPTH"])
+ prev_az, prev_dip = az2, dip2
+
+ return east_list, elev_list
+
+
+NAV_ITEMS = [
+ {"label": "Cross-Section", "href": "/", "icon": "tabler:chart-grid-dots", "id": "nav-cross-section"},
+ {"label": "Explorer", "href": "/explorer", "icon": "tabler:compass", "id": "nav-explorer"},
+ {"label": "Downhole Logs", "href": "/downhole-logs", "icon": "tabler:align-left", "id": "nav-downhole"},
+ {"label": "Comparison", "href": "/comparison", "icon": "tabler:columns-3", "id": "nav-comparison"},
+ {"label": "Block Model", "href": "/block-model", "icon": "tabler:cube", "id": "nav-block-model"},
+]
+
+
+def create_header():
+ brand = dmc.Group([
+ html.Img(src="/assets/plotly-logo.png", height=40, alt="Plotly"),
+ dmc.Divider(orientation="vertical", size="sm"),
+ html.Div([
+ html.P("Drillhole Visualizer", className="brand-title"),
+ html.P("Western Australia", className="brand-subtitle"),
+ ]),
+ ], gap="sm", align="center", wrap="nowrap")
+
+ status = dmc.Group([
+ dmc.Group([
+ DashIconify(icon="tabler:circle-filled", width=10, color="#40c057"),
+ dmc.Text("Active", size="xs", c="dimmed"),
+ ], gap=4),
+ dmc.Divider(orientation="vertical", size="sm"),
+ dmc.Text("Prospect", size="xs", c="dimmed"),
+ dmc.Badge("WA Au-Cu Porphyry", color="orange", variant="light", size="sm"),
+ dmc.Divider(orientation="vertical", size="sm"),
+ dmc.Text("Last Survey", size="xs", c="dimmed"),
+ dmc.Text("Apr 2026", size="xs", fw=500),
+ dmc.ActionIcon(
+ DashIconify(icon="tabler:bell", width=18),
+ variant="subtle",
+ color="gray",
+ size="lg",
+ ),
+ ], gap="sm", wrap="nowrap")
+
+ return dmc.Paper(
+ dmc.Group([brand, status], justify="space-between", align="center"),
+ px="md",
+ py="sm",
+ radius=0,
+ withBorder=False,
+ className="app-header",
+ )
+
+
+def create_nav_sidebar():
+ nav_links = [
+ dmc.NavLink(
+ label=item["label"],
+ leftSection=DashIconify(icon=item["icon"], width=16),
+ href=item["href"],
+ id=item["id"],
+ variant="subtle",
+ )
+ for item in NAV_ITEMS
+ ]
+
+ return html.Div(
+ [
+ dmc.Group(
+ [
+ dmc.Text("Navigation", id="sidebar-title", size="xs", fw=600, c="dimmed", tt="uppercase"),
+ dmc.ActionIcon(
+ DashIconify(icon="charm:cross", width=14, id="sidebar-btn-icon"),
+ id="sidebar-btn",
+ size="sm",
+ variant="subtle",
+ color="gray",
+ ),
+ ],
+ id="sidebar-title-div",
+ justify="space-between",
+ align="center",
+ className="title-pad space-between",
+ ),
+ html.Div(
+ [
+ dmc.Space(h="35vh"),
+ html.Div(
+ html.Div("▾ Navigation ▾", className="sidebar-collapsed-title"),
+ style={"transform": "rotate(270deg)"},
+ ),
+ ],
+ id="sidebar-collapsed-title-div",
+ style={"display": "none"},
+ ),
+ html.Div(
+ html.Div(
+ html.Div(nav_links, id="sidebar-inner-div", className="sidebar-inner"),
+ id="sidebar-outer-div",
+ className="sidebar-outer",
+ ),
+ id="sidebar-btn-div",
+ ),
+ ],
+ id="filter-sidebar",
+ className="filter-sidebar flex-column",
+ )
+
+
+def kpi_card(title, value, unit="", icon=None):
+ header_children = [
+ dmc.Text(title, size="xs", c="dimmed", tt="uppercase", fw=600),
+ ]
+ if icon:
+ header_children.append(DashIconify(icon=icon, width=16, color="#868e96"))
+
+ return dmc.Paper([
+ dmc.Group(header_children, justify="space-between", align="center"),
+ dmc.Text(value, size="xl", fw=700, c="dark", mt=4),
+ dmc.Text(unit, size="xs", c="dimmed") if unit else None,
+ ], p="md", radius="md", withBorder=True, className="kpi-card")
diff --git a/investments-dashboard/Procfile b/investments-dashboard/Procfile
new file mode 100644
index 0000000..673048e
--- /dev/null
+++ b/investments-dashboard/Procfile
@@ -0,0 +1 @@
+web: uvicorn app:server --host 0.0.0.0 --port 8000
diff --git a/investments-dashboard/app.py b/investments-dashboard/app.py
new file mode 100644
index 0000000..3bbc775
--- /dev/null
+++ b/investments-dashboard/app.py
@@ -0,0 +1,230 @@
+import dash
+from dash import html, dcc, Input, Output, callback
+import dash_mantine_components as dmc
+from dash_iconify import DashIconify
+
+from pages import dashboard, performance, portfolio, fees
+from callbacks import dashboard as dashboard_callbacks
+from callbacks import performance as performance_callbacks
+from callbacks import portfolio as portfolio_callbacks
+from callbacks import fees as fees_callbacks
+from callbacks import export_all as export_all_callbacks
+
+app = dash.Dash(
+ __name__,
+ backend="fastapi",
+ websocket_callbacks=True,
+ suppress_callback_exceptions=True,
+ external_stylesheets=dmc.styles.ALL,
+ title="Investment Insights"
+)
+server = app.server
+
+def create_nav_link(icon, label, href):
+ return dmc.NavLink(
+ label=label,
+ leftSection=DashIconify(icon=icon, width=20),
+ href=href,
+ variant="subtle",
+ active=True,
+ )
+
+def create_header():
+ return dmc.Paper(
+ dmc.Group([
+ dmc.Group([
+ dmc.Title("Investment Insights", order=3),
+ dmc.Divider(orientation="vertical", size="sm"),
+ html.Img(src="/assets/DE-logo.png", height=40),
+ ], gap="sm", align="center", wrap="nowrap"),
+ dmc.Group([
+ dmc.Group([
+ DashIconify(icon="tabler:circle-filled", width=10, color="#40c057"),
+ dmc.Text("Market Open", size="xs", c="dimmed"),
+ ], gap=4),
+ dmc.Text("NYSE", size="xs", fw=500),
+ dmc.Divider(orientation="vertical", size="sm"),
+ dmc.Text("Last Updated", size="xs", c="dimmed"),
+ dmc.Text("Apr 8, 2026 3:45 PM", size="xs", fw=500),
+ dmc.Divider(orientation="vertical", size="sm"),
+ dmc.Button(
+ "Download PDF",
+ id="generate-pdf-all-btn",
+ size="xs",
+ variant="light",
+ color="blue",
+ leftSection=DashIconify(icon="tabler:file-type-pdf", width=14),
+ ),
+ dmc.ActionIcon(
+ DashIconify(icon="tabler:bell", width=20),
+ variant="subtle",
+ size="lg",
+ ),
+ ], gap="sm", align="center", wrap="nowrap"),
+ ], justify="space-between", align="center", wrap="nowrap"),
+ p="md",
+ withBorder=True,
+ radius=0,
+ )
+
+def create_navbar():
+ return dmc.Paper(
+ dmc.Stack([
+ dmc.Stack([
+ dmc.Text("Navigation", size="xs", c="dimmed", fw=600, tt="uppercase", mb="xs"),
+ dmc.NavLink(
+ label="Dashboard",
+ leftSection=DashIconify(icon="tabler:dashboard", width=20),
+ href="/",
+ id="nav-dashboard",
+ ),
+ dmc.NavLink(
+ label="Price Performance",
+ leftSection=DashIconify(icon="tabler:chart-line", width=20),
+ href="/performance",
+ id="nav-performance",
+ ),
+ dmc.NavLink(
+ label="Portfolio Analysis",
+ leftSection=DashIconify(icon="tabler:chart-donut", width=20),
+ href="/portfolio",
+ id="nav-portfolio",
+ ),
+ dmc.NavLink(
+ label="Fees & Distributions",
+ leftSection=DashIconify(icon="tabler:receipt", width=20),
+ href="/fees",
+ id="nav-fees",
+ ),
+ dmc.Divider(my="md"),
+ dmc.Text("Fund Info", size="xs", c="dimmed", fw=600, tt="uppercase", mb="xs"),
+ dmc.Stack([
+ dmc.Group([
+ dmc.Text("Fund:", size="sm", c="dimmed"),
+ dmc.Text("500 Index Fund", size="sm", fw=500),
+ ], justify="space-between"),
+ dmc.Group([
+ dmc.Text("Category:", size="sm", c="dimmed"),
+ dmc.Text("Large Blend", size="sm", fw=500),
+ ], justify="space-between"),
+ dmc.Group([
+ dmc.Text("Expense:", size="sm", c="dimmed"),
+ dmc.Badge("0.14%", color="green", size="sm"),
+ ], justify="space-between"),
+ ], gap="xs"),
+ dmc.Divider(my="md"),
+ dmc.Text("Resources", size="xs", c="dimmed", fw=600, tt="uppercase", mb="xs"),
+ dmc.Anchor(
+ dmc.NavLink(
+ label="Prospectus",
+ leftSection=DashIconify(icon="tabler:file-text", width=18),
+ rightSection=DashIconify(icon="tabler:external-link", width=14, color="gray"),
+ variant="subtle",
+ py=6,
+ ),
+ href="https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000036405&type=485&dateb=&owner=include&count=40",
+ target="_blank",
+ underline=False,
+ ),
+ dmc.Anchor(
+ dmc.NavLink(
+ label="Fact Sheet",
+ leftSection=DashIconify(icon="tabler:file-description", width=18),
+ rightSection=DashIconify(icon="tabler:external-link", width=14, color="gray"),
+ variant="subtle",
+ py=6,
+ ),
+ href="https://investor.vanguard.com/investment-products/mutual-funds/profile/vfiax",
+ target="_blank",
+ underline=False,
+ ),
+ dmc.Anchor(
+ dmc.NavLink(
+ label="Annual Report",
+ leftSection=DashIconify(icon="tabler:report", width=18),
+ rightSection=DashIconify(icon="tabler:external-link", width=14, color="gray"),
+ variant="subtle",
+ py=6,
+ ),
+ href="https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000036405&type=N-CSR&dateb=&owner=include&count=40",
+ target="_blank",
+ underline=False,
+ ),
+ dmc.Anchor(
+ dmc.NavLink(
+ label="Tax Documents",
+ leftSection=DashIconify(icon="tabler:file-invoice", width=18),
+ rightSection=DashIconify(icon="tabler:external-link", width=14, color="gray"),
+ variant="subtle",
+ py=6,
+ ),
+ href="https://investor.vanguard.com/client-benefits/tax-center",
+ target="_blank",
+ underline=False,
+ ),
+ ], gap=4, style={"flex": 1}),
+ ], gap="md", justify="space-between", h="100%"),
+ p="md",
+ h="100%",
+ withBorder=True,
+ radius=0,
+ style={"minWidth": "250px"}
+ )
+
+app.layout = dmc.MantineProvider(
+ id="mantine-provider",
+ forceColorScheme="light",
+ children=[
+ dcc.Location(id="url", refresh=False),
+ dcc.Download(id="download-pdf-all"),
+ html.Div(id="pdf-status-all", style={"display": "none"}),
+ dmc.AppShell(
+ [
+ dmc.AppShellHeader(create_header()),
+ dmc.AppShellNavbar(create_navbar()),
+ dmc.AppShellMain(
+ dmc.Container(
+ id="page-content",
+ fluid=True,
+ p="md",
+ )
+ ),
+ ],
+ header={"height": 73},
+ navbar={"width": 280, "breakpoint": "sm", "collapsed": {"mobile": True}},
+ padding="md",
+ ),
+ ]
+)
+
+@callback(
+ Output("page-content", "children"),
+ Input("url", "pathname")
+)
+def display_page(pathname):
+ if pathname == "/performance":
+ return performance.layout
+ elif pathname == "/portfolio":
+ return portfolio.layout
+ elif pathname == "/fees":
+ return fees.layout
+ else:
+ return dashboard.layout
+
+@callback(
+ [Output("nav-dashboard", "active"),
+ Output("nav-performance", "active"),
+ Output("nav-portfolio", "active"),
+ Output("nav-fees", "active")],
+ Input("url", "pathname")
+)
+def update_nav_active(pathname):
+ return [
+ pathname == "/" or pathname is None,
+ pathname == "/performance",
+ pathname == "/portfolio",
+ pathname == "/fees",
+ ]
+
+if __name__ == "__main__":
+ app.run(debug=True)
diff --git a/investments-dashboard/assets/DE-logo.png b/investments-dashboard/assets/DE-logo.png
new file mode 100644
index 0000000..a037590
Binary files /dev/null and b/investments-dashboard/assets/DE-logo.png differ
diff --git a/investments-dashboard/assets/styles.css b/investments-dashboard/assets/styles.css
new file mode 100644
index 0000000..a462441
--- /dev/null
+++ b/investments-dashboard/assets/styles.css
@@ -0,0 +1,137 @@
+/* Financial Dashboard V2 - Custom Styles */
+
+/* Global */
+body {
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+}
+
+.mantine-AppShell-header .mantine-Title-root {
+ white-space: nowrap;
+}
+
+.mantine-AppShell-header img {
+ flex-shrink: 0;
+}
+
+/* Scrollbar styling */
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: rgba(0, 0, 0, 0.05);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb {
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: rgba(0, 0, 0, 0.3);
+}
+
+/* Chart containers */
+.js-plotly-plot .plotly .modebar {
+ top: 5px !important;
+ right: 5px !important;
+}
+
+.js-plotly-plot .plotly .modebar-btn {
+ font-size: 14px !important;
+}
+
+/* Table styling */
+.mantine-Table-table {
+ font-size: 0.875rem;
+}
+
+.mantine-Table-th {
+ background-color: rgba(0, 0, 0, 0.02);
+}
+
+/* Dark mode table adjustments */
+[data-mantine-color-scheme="dark"] .mantine-Table-th {
+ background-color: rgba(255, 255, 255, 0.05);
+}
+
+/* NavLink active state */
+.mantine-NavLink-root[data-active="true"] {
+ font-weight: 600;
+}
+
+/* Paper hover effect */
+.mantine-Paper-root {
+ transition: box-shadow 0.2s ease;
+}
+
+.mantine-Paper-root:hover {
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+}
+
+/* KPI card animations */
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes pulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.3; }
+}
+
+/* Progress bars */
+.mantine-Progress-root {
+ background-color: rgba(0, 0, 0, 0.05);
+}
+
+/* Badge styling */
+.mantine-Badge-root {
+ text-transform: none;
+}
+
+/* Date picker */
+.mantine-DatePickerInput-input {
+ min-height: 36px;
+}
+
+/* Multi-select */
+.mantine-MultiSelect-input {
+ min-height: 36px;
+}
+
+/* Responsive adjustments */
+@media (max-width: 768px) {
+ .mantine-AppShell-navbar {
+ display: none;
+ }
+
+ .mantine-Container-root {
+ padding: 0.5rem;
+ }
+}
+
+/* Print styles */
+@media print {
+ .mantine-AppShell-header,
+ .mantine-AppShell-navbar,
+ .mantine-Button-root,
+ .mantine-Select-root,
+ .mantine-MultiSelect-root {
+ display: none !important;
+ }
+
+ .mantine-Paper-root {
+ break-inside: avoid;
+ box-shadow: none !important;
+ border: 1px solid #dee2e6 !important;
+ }
+}
diff --git a/investments-dashboard/callbacks/__init__.py b/investments-dashboard/callbacks/__init__.py
new file mode 100644
index 0000000..ac1e363
--- /dev/null
+++ b/investments-dashboard/callbacks/__init__.py
@@ -0,0 +1,5 @@
+from . import dashboard
+from . import performance
+from . import portfolio
+from . import fees
+from . import export_all
diff --git a/investments-dashboard/callbacks/dashboard.py b/investments-dashboard/callbacks/dashboard.py
new file mode 100644
index 0000000..5e88189
--- /dev/null
+++ b/investments-dashboard/callbacks/dashboard.py
@@ -0,0 +1,224 @@
+import asyncio
+import random
+from datetime import datetime
+
+from dash import callback, ctx, Input, Output, State, dcc, set_props, html
+import dash_mantine_components as dmc
+from dash_iconify import DashIconify
+
+from utils.data_loader import get_fund_metrics, get_returns_data, get_time_series_data, df_fund_facts, calculate_risk_metrics
+from components.charts import create_hypothetical_growth_chart, create_sparkline, CHART_COLORS, CHART_LAYOUT
+import plotly.graph_objects as go
+
+def get_metrics_for_fund(fund_id, period="1Y"):
+ """Get metrics for a specific fund and period"""
+ ts = get_time_series_data()
+ returns = get_returns_data()
+ facts = dict(zip(df_fund_facts['label'], df_fund_facts['value']))
+
+ if fund_id == "calibre":
+ col = 'Calibre Index Fund'
+ fund_name = "Calibre Index Fund"
+ else:
+ col = '"S&P 500 Index, y"'
+ fund_name = "500 Index Fund"
+
+ latest_price = ts[col].iloc[-1]
+
+ period_map = {
+ "1Y": 252,
+ "3Y": 252 * 3,
+ "5Y": 252 * 5,
+ "10Y": 252 * 10,
+ "All": len(ts)
+ }
+
+ lookback = min(period_map.get(period, 252), len(ts) - 1)
+ start_price = ts[col].iloc[-lookback] if lookback < len(ts) else ts[col].iloc[0]
+ period_return = ((latest_price - start_price) / start_price) * 100
+
+ fund_returns = returns[returns['Entity'].str.contains('500 Index Fund', na=False)].iloc[0]
+
+ return {
+ 'nav': latest_price,
+ 'period_return': period_return,
+ 'period': period,
+ '1y_return': fund_returns['1Y'],
+ '3y_return': fund_returns['3Y'],
+ '5y_return': fund_returns['5Y'],
+ '10y_return': fund_returns['10Y'],
+ 'fund_name': fund_name,
+ 'expense_ratio': facts.get('Expense ratio as of 04/27/2017', '0.14%'),
+ 'category': facts.get('Category', 'Large Blend'),
+ 'asset_class': facts.get('Asset Class', 'Domestic Stock'),
+ 'min_investment': facts.get('Minimum investment', '$3,000'),
+ }
+
+def create_dynamic_growth_chart(fund_id, initial=10000, show_benchmark=True):
+ """Create growth chart for selected fund"""
+ ts = get_time_series_data()
+
+ col = 'Calibre Index Fund' if fund_id == "calibre" else '"S&P 500 Index, y"'
+ fund_name = "Calibre Index Fund" if fund_id == "calibre" else "500 Index Fund"
+ benchmark_col = '"S&P 500 Index, y"'
+
+ yearly_data = ts.set_index('Date').resample('YE').last().reset_index()
+ yearly_data = yearly_data.tail(10)
+
+ first_price = yearly_data[col].iloc[0]
+ fund_values = [initial * (p / first_price) for p in yearly_data[col]]
+ years = yearly_data['Date'].dt.year.astype(str).tolist()
+
+ first_bench = yearly_data[benchmark_col].iloc[0]
+ benchmark_values = [initial * (p / first_bench) for p in yearly_data[benchmark_col]]
+
+ fig = go.Figure()
+
+ fig.add_trace(go.Scatter(
+ x=years,
+ y=fund_values,
+ name=fund_name,
+ fill='tozeroy',
+ line={'color': CHART_COLORS['primary'], 'width': 2},
+ fillcolor='rgba(34, 139, 230, 0.1)',
+ hovertemplate='$%{y:,.2f}',
+ ))
+
+ if show_benchmark:
+ fig.add_trace(go.Scatter(
+ x=years,
+ y=benchmark_values,
+ name='S&P 500 Index',
+ line={'color': CHART_COLORS['gray'], 'width': 2, 'dash': 'dash'},
+ hovertemplate='$%{y:,.2f}',
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': f'Hypothetical Growth of ${initial:,}', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ legend={'orientation': 'h', 'y': -0.15},
+ yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$', 'tickformat': ','},
+ xaxis={'showgrid': False},
+ )
+
+ return fig
+
+@callback(
+ [Output("kpi-nav-value", "children"),
+ Output("kpi-nav-trend", "children"),
+ Output("kpi-nav-trend", "c"),
+ Output("kpi-period-value", "children"),
+ Output("kpi-period-title", "children"),
+ Output("kpi-period-subtitle", "children"),
+ Output("kpi-expense-value", "children"),
+ Output("kpi-category-value", "children"),
+ Output("kpi-category-subtitle", "children"),
+ Output("growth-chart", "figure"),
+ Output("quick-1y", "children"),
+ Output("quick-3y", "children"),
+ Output("quick-5y", "children"),
+ Output("quick-min", "children"),
+ Output("risk-volatility-bar", "value"),
+ Output("risk-volatility-value", "children"),
+ Output("risk-beta-bar", "value"),
+ Output("risk-beta-value", "children"),
+ Output("risk-sharpe-bar", "value"),
+ Output("risk-sharpe-value", "children"),
+ Output("risk-alpha-bar", "value"),
+ Output("risk-alpha-value", "children")],
+ [Input("dashboard-fund-select", "value"),
+ Input("dashboard-period", "value"),
+ Input("benchmark-toggle", "checked"),
+ Input("investment-amount", "value")]
+)
+def update_dashboard(fund, period, show_benchmark, investment):
+ metrics = get_metrics_for_fund(fund, period)
+ risk = calculate_risk_metrics(fund, period)
+
+ investment = investment or 10000
+
+ nav_value = f"${metrics['nav']:.2f}"
+ trend_icon = "↑" if metrics['period_return'] > 0 else "↓"
+ trend_value = f"{trend_icon} {abs(metrics['period_return']):.1f}% {period}"
+ trend_color = "teal" if metrics['period_return'] > 0 else "red"
+
+ period_labels = {"1Y": "1 Year", "3Y": "3 Year", "5Y": "5 Year", "10Y": "10 Year", "All": "All Time"}
+ period_title = f"{period_labels.get(period, period)} Return"
+
+ period_return_map = {"1Y": metrics['1y_return'], "3Y": metrics['3y_return'],
+ "5Y": metrics['5y_return'], "10Y": metrics['10y_return'], "All": metrics['period_return']}
+ period_value = f"{period_return_map.get(period, metrics['1y_return']):.2f}%"
+
+ growth_chart = create_dynamic_growth_chart(fund, investment, show_benchmark)
+
+ return (
+ nav_value,
+ trend_value,
+ trend_color,
+ period_value,
+ period_title,
+ "vs S&P 500",
+ metrics['expense_ratio'],
+ metrics['category'],
+ metrics['asset_class'],
+ growth_chart,
+ f"{metrics['1y_return']:.2f}%",
+ f"{metrics['3y_return']:.2f}%",
+ f"{metrics['5y_return']:.2f}%",
+ metrics['min_investment'].replace('"', ''),
+ risk['volatility_pct'],
+ risk['volatility_level'],
+ risk['beta_pct'],
+ f"{risk['beta']:.2f}",
+ risk['sharpe_pct'],
+ f"{risk['sharpe']:.2f}",
+ risk['alpha_pct'],
+ f"{risk['alpha']:.2f}%",
+ )
+
+@callback(
+ Output("live-streaming", "data"),
+ Input("live-toggle", "checked"),
+)
+def toggle_streaming(checked):
+ return checked
+
+
+@callback(persistent=True)
+async def stream_market_prices():
+ ws = ctx.websocket
+ prices = {"AAPL": 189.50, "GOOGL": 176.30, "MSFT": 420.15, "AMZN": 185.60, "TSLA": 178.90}
+ base_prices = dict(prices)
+ history = {s: [p] for s, p in prices.items()}
+
+ while not ws.is_shutdown:
+ streaming = await ws.get_prop("live-streaming", "data")
+ if streaming:
+ for sym in prices:
+ change_pct = round(random.gauss(0, 0.3), 2)
+ prices[sym] = round(prices[sym] * (1 + change_pct / 100), 2)
+ history[sym].append(prices[sym])
+ if len(history[sym]) > 30:
+ history[sym] = history[sym][-30:]
+
+ dollar_change = round(prices[sym] - base_prices[sym], 2)
+ total_pct = round((prices[sym] - base_prices[sym]) / base_prices[sym] * 100, 2)
+ sign = "+" if dollar_change >= 0 else ""
+ color = "#40c057" if dollar_change >= 0 else "#fa5252"
+
+ set_props(f"live-price-{sym}", {"children": f"${prices[sym]:.2f}"})
+ set_props(f"live-change-{sym}", {
+ "children": f"{sign}{dollar_change:.2f} ({sign}{total_pct:.2f}%)",
+ "style": {"color": color},
+ })
+
+ selected = await ws.get_prop("sparkline-symbol", "value")
+ if selected and selected in history:
+ fig = create_sparkline(history[selected], selected)
+ set_props("sparkline-chart", {"figure": fig})
+
+ await asyncio.sleep(1)
+ else:
+ await asyncio.sleep(0.5)
+
+
diff --git a/investments-dashboard/callbacks/export_all.py b/investments-dashboard/callbacks/export_all.py
new file mode 100644
index 0000000..42067e3
--- /dev/null
+++ b/investments-dashboard/callbacks/export_all.py
@@ -0,0 +1,56 @@
+from datetime import datetime
+
+from dash import callback, Input, Output, dcc, html
+
+from utils.pdf_export import create_pdf_report
+from utils.data_loader import get_time_series_data, get_sector_allocation
+from components.charts import (
+ create_hypothetical_growth_chart,
+ create_performance_line_chart,
+ create_sector_donut_chart,
+ create_fee_comparison_chart,
+)
+from pages.performance import create_drawdown_chart
+
+
+@callback(
+ Output("download-pdf-all", "data"),
+ Output("pdf-status-all", "children"),
+ Input("generate-pdf-all-btn", "n_clicks"),
+ prevent_initial_call=True,
+)
+def generate_all_pdf(n_clicks):
+ if not n_clicks:
+ return None, ""
+ try:
+ ts_data = get_time_series_data()
+ sector_data = get_sector_allocation()
+
+ figures = [
+ create_hypothetical_growth_chart().to_dict(),
+ create_performance_line_chart(ts_data, "Performance Over Time").to_dict(),
+ create_drawdown_chart(ts_data).to_dict(),
+ create_sector_donut_chart(sector_data, "Sector Allocation").to_dict(),
+ create_fee_comparison_chart().to_dict(),
+ ]
+ titles = [
+ "Hypothetical Growth",
+ "Price Performance",
+ "Drawdown Analysis",
+ "Sector Allocation",
+ "Fee Comparison",
+ ]
+
+ pdf_bytes = create_pdf_report(
+ figures=figures,
+ titles=titles,
+ report_title="Investment Report",
+ )
+ filename = f"investment_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf"
+ return dcc.send_bytes(pdf_bytes, filename), ""
+ except Exception as e:
+ import traceback
+ return None, html.Div(
+ f"PDF error: {e}\n{traceback.format_exc()}",
+ style={"color": "red", "white-space": "pre-wrap", "fontSize": "12px"},
+ )
diff --git a/investments-dashboard/callbacks/fees.py b/investments-dashboard/callbacks/fees.py
new file mode 100644
index 0000000..755e7ab
--- /dev/null
+++ b/investments-dashboard/callbacks/fees.py
@@ -0,0 +1,129 @@
+from dash import callback, Input, Output, State, dcc, html
+import plotly.graph_objects as go
+import pandas as pd
+from datetime import datetime
+
+from utils.data_loader import get_dividend_history
+from components.charts import CHART_COLORS, CHART_LAYOUT
+
+def calculate_fees(investment, years, fund_expense=0.0014, avg_expense=0.0099, annual_return=0.07):
+ """Calculate fee impact over time"""
+ fund_values = []
+ avg_values = []
+
+ fund_value = investment
+ avg_value = investment
+
+ for _ in range(years):
+ fund_value *= (1 + annual_return - fund_expense)
+ avg_value *= (1 + annual_return - avg_expense)
+ fund_values.append(fund_value)
+ avg_values.append(avg_value)
+
+ fund_fees = investment * (1 + annual_return) ** years - fund_values[-1]
+ avg_fees = investment * (1 + annual_return) ** years - avg_values[-1]
+ savings = avg_fees - fund_fees
+
+ return {
+ 'fund_values': fund_values,
+ 'avg_values': avg_values,
+ 'fund_final': fund_values[-1],
+ 'avg_final': avg_values[-1],
+ 'fund_fees': fund_fees,
+ 'avg_fees': avg_fees,
+ 'savings': savings
+ }
+
+def create_dynamic_fee_comparison(investment, years):
+ """Create fee comparison chart with custom investment amount"""
+ results = calculate_fees(investment, years)
+
+ fig = go.Figure()
+
+ fig.add_trace(go.Bar(
+ x=['Category Average', 'This Fund'],
+ y=[results['avg_fees'], results['fund_fees']],
+ marker_color=[CHART_COLORS['gray'], CHART_COLORS['primary']],
+ text=[f"${results['avg_fees']:,.0f}", f"${results['fund_fees']:,.0f}"],
+ textposition='outside',
+ ))
+
+ fig.add_annotation(
+ x=1, y=results['fund_fees'] + results['savings'] * 0.15,
+ text=f"Save ${results['savings']:,.0f}",
+ showarrow=True,
+ arrowhead=2,
+ arrowcolor=CHART_COLORS['secondary'],
+ font={'color': CHART_COLORS['secondary'], 'weight': 600},
+ )
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': f'Fees on ${investment:,} Over {years} Years', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$', 'tickformat': ','},
+ showlegend=False,
+ )
+
+ return fig
+
+def create_dynamic_cost_impact(investment, years):
+ """Create cost impact chart with custom parameters"""
+ all_years = list(range(1, years + 1))
+ results = calculate_fees(investment, years)
+
+ fig = go.Figure()
+
+ fig.add_trace(go.Scatter(
+ x=all_years,
+ y=results['avg_values'],
+ name='Category Avg (0.99%)',
+ line={'color': CHART_COLORS['gray'], 'width': 2},
+ ))
+
+ fig.add_trace(go.Scatter(
+ x=all_years,
+ y=results['fund_values'],
+ name='This Fund (0.14%)',
+ line={'color': CHART_COLORS['primary'], 'width': 2},
+ fill='tonexty',
+ fillcolor='rgba(34, 139, 230, 0.1)',
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': f'Long-Term Cost Impact (7% annual return)', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ xaxis={'title': 'Years'},
+ yaxis={'title': 'Portfolio Value', 'tickprefix': '$', 'tickformat': ','},
+ legend={'orientation': 'h', 'y': -0.15},
+ )
+
+ return fig
+
+@callback(
+ [Output("fee-comparison-chart", "figure"),
+ Output("cost-impact-chart", "figure"),
+ Output("savings-amount", "children"),
+ Output("final-value-fund", "children"),
+ Output("final-value-avg", "children")],
+ [Input("investment-amount", "value"),
+ Input("time-horizon", "value")]
+)
+def update_fee_calculations(amount, years):
+ if amount is None or amount <= 0:
+ amount = 10000
+ if years is None or years <= 0:
+ years = 10
+
+ results = calculate_fees(amount, years)
+
+ fee_chart = create_dynamic_fee_comparison(amount, years)
+ cost_chart = create_dynamic_cost_impact(amount, years)
+
+ return (
+ fee_chart,
+ cost_chart,
+ f"${results['savings']:,.0f}",
+ f"${results['fund_final']:,.0f}",
+ f"${results['avg_final']:,.0f}"
+ )
+
diff --git a/investments-dashboard/callbacks/performance.py b/investments-dashboard/callbacks/performance.py
new file mode 100644
index 0000000..b042c18
--- /dev/null
+++ b/investments-dashboard/callbacks/performance.py
@@ -0,0 +1,341 @@
+from dash import callback, Input, Output, State, dcc, html
+import plotly.graph_objects as go
+import pandas as pd
+from datetime import datetime, timedelta
+
+from utils.data_loader import get_time_series_data
+from components.charts import CHART_COLORS, CHART_LAYOUT
+
+BENCHMARK_COLUMNS = {
+ "calibre": ("Calibre Index Fund", CHART_COLORS['primary']),
+ "msci": ("MSCI EAFE Index Fund (ETF)", CHART_COLORS['secondary']),
+ "sp500": ('"S&P 500 Index, y"', CHART_COLORS['tertiary']),
+}
+
+BENCHMARK_LABELS = {
+ "calibre": "Calibre Index Fund",
+ "msci": "MSCI EAFE Index",
+ "sp500": "S&P 500",
+}
+
+def calculate_date_range_from_period(period, df):
+ """Calculate date range based on period selector"""
+ if period == "All" or not period:
+ return None
+
+ end_date = df['Date'].max()
+
+ period_map = {
+ "1M": timedelta(days=30),
+ "3M": timedelta(days=90),
+ "6M": timedelta(days=180),
+ "1Y": timedelta(days=365),
+ "3Y": timedelta(days=365 * 3),
+ "5Y": timedelta(days=365 * 5),
+ }
+
+ delta = period_map.get(period, timedelta(days=365))
+ start_date = end_date - delta
+
+ return [start_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d')]
+
+def filter_data_by_date(df, date_range):
+ """Filter dataframe by date range"""
+ if date_range and len(date_range) == 2 and date_range[0] and date_range[1]:
+ start_date = pd.to_datetime(date_range[0])
+ end_date = pd.to_datetime(date_range[1])
+ return df[(df['Date'] >= start_date) & (df['Date'] <= end_date)]
+ return df
+
+def normalize_series(df, columns):
+ """Normalize series to start at 100"""
+ normalized_df = df.copy()
+ for col in columns:
+ if col in normalized_df.columns:
+ first_val = normalized_df[col].iloc[0]
+ if first_val != 0:
+ normalized_df[col] = (normalized_df[col] / first_val) * 100
+ return normalized_df
+
+def calculate_moving_average(df, col_name, window):
+ """Calculate moving average"""
+ if col_name in df.columns and window > 0:
+ return df[col_name].rolling(window=window).mean()
+ return None
+
+def calculate_performance_metrics(df, col_name):
+ """Calculate volatility, max drawdown, Sharpe, best/worst day"""
+ if col_name not in df.columns or len(df) < 2:
+ return {
+ 'volatility': 0, 'max_drawdown': 0, 'sharpe': 0,
+ 'best_day': 0, 'worst_day': 0
+ }
+
+ returns = df[col_name].pct_change().dropna()
+
+ if len(returns) == 0:
+ return {
+ 'volatility': 0, 'max_drawdown': 0, 'sharpe': 0,
+ 'best_day': 0, 'worst_day': 0
+ }
+
+ volatility = returns.std() * (252 ** 0.5) * 100
+
+ prices = df[col_name].values
+ peak = prices[0]
+ max_dd = 0
+ for price in prices:
+ if price > peak:
+ peak = price
+ dd = (price - peak) / peak * 100
+ if dd < max_dd:
+ max_dd = dd
+
+ risk_free = 0.02
+ excess = returns.mean() * 252 - risk_free
+ std_ann = returns.std() * (252 ** 0.5)
+ sharpe = excess / std_ann if std_ann > 0 else 0
+
+ best_day = returns.max() * 100
+ worst_day = returns.min() * 100
+
+ return {
+ 'volatility': volatility,
+ 'max_drawdown': max_dd,
+ 'sharpe': sharpe,
+ 'best_day': best_day,
+ 'worst_day': worst_day
+ }
+
+def create_dynamic_performance_chart(df, benchmarks, normalize=False, ma_period=None, log_scale=False, title="Performance Over Time"):
+ """Create performance chart with selected benchmarks, normalization, MA, and log scale"""
+ fig = go.Figure()
+
+ columns_to_plot = []
+ for benchmark in benchmarks:
+ if benchmark in BENCHMARK_COLUMNS:
+ col_name, _ = BENCHMARK_COLUMNS[benchmark]
+ if col_name in df.columns:
+ columns_to_plot.append(col_name)
+
+ plot_df = df.copy()
+ if normalize and columns_to_plot:
+ plot_df = normalize_series(plot_df, columns_to_plot)
+
+ for benchmark in benchmarks:
+ if benchmark in BENCHMARK_COLUMNS:
+ col_name, color = BENCHMARK_COLUMNS[benchmark]
+ if col_name in plot_df.columns:
+ fig.add_trace(go.Scatter(
+ x=plot_df['Date'],
+ y=plot_df[col_name],
+ name=BENCHMARK_LABELS.get(benchmark, benchmark),
+ line={'color': color, 'width': 2},
+ hovertemplate='%{y:.2f}'
+ ))
+
+ if ma_period and ma_period != "none":
+ window = int(ma_period)
+ ma = calculate_moving_average(plot_df, col_name, window)
+ if ma is not None:
+ fig.add_trace(go.Scatter(
+ x=plot_df['Date'],
+ y=ma,
+ name=f"{BENCHMARK_LABELS.get(benchmark, benchmark)} {window}MA",
+ line={'color': color, 'width': 1, 'dash': 'dot'},
+ hovertemplate='%{y:.2f}'
+ ))
+
+ y_prefix = '' if normalize else '$'
+ y_type = 'log' if log_scale else 'linear'
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': title, 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ legend={'orientation': 'h', 'y': -0.15},
+ xaxis={
+ 'showgrid': True,
+ 'gridcolor': 'rgba(0,0,0,0.05)',
+ },
+ yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': y_prefix, 'type': y_type},
+ )
+
+ return fig
+
+def create_dynamic_drawdown_chart(df, benchmarks, show_all=False):
+ """Calculate and plot drawdown for selected benchmarks"""
+ fig = go.Figure()
+
+ colors = [CHART_COLORS['danger'], CHART_COLORS['secondary'], CHART_COLORS['tertiary']]
+ fill_colors = ['rgba(250, 82, 82, 0.2)', 'rgba(64, 192, 87, 0.15)', 'rgba(250, 176, 5, 0.15)']
+
+ benchmarks_to_show = benchmarks if show_all else [benchmarks[0]] if benchmarks else ["calibre"]
+
+ for idx, benchmark in enumerate(benchmarks_to_show):
+ col_name = BENCHMARK_COLUMNS.get(benchmark, BENCHMARK_COLUMNS["calibre"])[0]
+
+ if col_name not in df.columns:
+ continue
+
+ prices = df[col_name].values
+ peak = prices[0]
+ drawdowns = []
+
+ for price in prices:
+ if price > peak:
+ peak = price
+ drawdown = (price - peak) / peak * 100
+ drawdowns.append(drawdown)
+
+ color = colors[idx % len(colors)]
+ fill = fill_colors[idx % len(fill_colors)] if idx == 0 else 'rgba(0,0,0,0)'
+
+ fig.add_trace(go.Scatter(
+ x=df['Date'],
+ y=drawdowns,
+ fill='tozeroy' if idx == 0 else 'none',
+ line={'color': color, 'width': 2 if idx == 0 else 1},
+ fillcolor=fill,
+ name=BENCHMARK_LABELS.get(benchmark, benchmark),
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Drawdown Analysis', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'ticksuffix': '%'},
+ showlegend=len(benchmarks_to_show) > 1,
+ legend={'orientation': 'h', 'y': -0.15},
+ )
+ return fig
+
+def create_rolling_returns_chart(df, benchmarks, show_all=False, window=252):
+ """Create rolling returns chart for selected benchmarks"""
+ fig = go.Figure()
+
+ if len(df) < window + 1:
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': f'Rolling 1-Year Returns', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ annotations=[{'text': 'Insufficient data for rolling calculation', 'showarrow': False, 'x': 0.5, 'y': 0.5, 'xref': 'paper', 'yref': 'paper'}]
+ )
+ return fig
+
+ benchmarks_to_show = benchmarks if show_all else [benchmarks[0]] if benchmarks else ["calibre"]
+
+ for idx, benchmark in enumerate(benchmarks_to_show):
+ col_name, color = BENCHMARK_COLUMNS.get(benchmark, BENCHMARK_COLUMNS["calibre"])
+
+ if col_name not in df.columns:
+ continue
+
+ rolling_returns = (df[col_name] / df[col_name].shift(window) - 1) * 100
+
+ fill = 'tozeroy' if idx == 0 else 'none'
+ fill_color = 'rgba(34, 139, 230, 0.15)' if idx == 0 else 'rgba(0,0,0,0)'
+
+ fig.add_trace(go.Scatter(
+ x=df['Date'],
+ y=rolling_returns,
+ fill=fill,
+ line={'color': color, 'width': 2 if idx == 0 else 1},
+ fillcolor=fill_color,
+ name=BENCHMARK_LABELS.get(benchmark, benchmark),
+ ))
+
+ fig.add_hline(y=0, line_dash="dash", line_color="gray", line_width=1)
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': f'Rolling 1-Year Returns', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'ticksuffix': '%'},
+ showlegend=len(benchmarks_to_show) > 1,
+ legend={'orientation': 'h', 'y': -0.15},
+ )
+ return fig
+
+def calculate_stats(df, col_name="Calibre Index Fund"):
+ """Calculate stats for the filtered data"""
+ if col_name not in df.columns:
+ col_name = "Calibre Index Fund"
+
+ high_val = df[col_name].max()
+ high_date = df.loc[df[col_name].idxmax(), 'Date']
+
+ low_val = df[col_name].min()
+ low_date = df.loc[df[col_name].idxmin(), 'Date']
+
+ current_val = df[col_name].iloc[-1]
+
+ total_return = ((df[col_name].iloc[-1] - df[col_name].iloc[0]) / df[col_name].iloc[0]) * 100
+
+ return {
+ 'high': high_val,
+ 'high_date': high_date,
+ 'low': low_val,
+ 'low_date': low_date,
+ 'current': current_val,
+ 'total_return': total_return
+ }
+
+@callback(
+ [Output("performance-chart", "figure"),
+ Output("drawdown-chart", "figure"),
+ Output("rolling-returns-chart", "figure"),
+ Output("period-high-value", "children"),
+ Output("period-high-date", "children"),
+ Output("period-low-value", "children"),
+ Output("period-low-date", "children"),
+ Output("current-price-value", "children"),
+ Output("total-return-value", "children"),
+ Output("total-return-value", "c"),
+ Output("perf-volatility", "children"),
+ Output("perf-max-drawdown", "children"),
+ Output("perf-sharpe", "children"),
+ Output("perf-best-day", "children"),
+ Output("perf-worst-day", "children")],
+ [Input("benchmark-selector", "value"),
+ Input("performance-period", "value"),
+ Input("normalize-toggle", "checked"),
+ Input("ma-selector", "value"),
+ Input("log-scale-toggle", "checked")]
+)
+def update_performance(benchmarks, period, normalize, ma_period, log_scale):
+ df = get_time_series_data()
+
+ date_range = calculate_date_range_from_period(period, df)
+ filtered_df = filter_data_by_date(df, date_range)
+
+ if not benchmarks:
+ benchmarks = ["calibre"]
+
+ primary_benchmark = benchmarks[0] if benchmarks else "calibre"
+ col_name = BENCHMARK_COLUMNS.get(primary_benchmark, BENCHMARK_COLUMNS["calibre"])[0]
+
+ perf_chart = create_dynamic_performance_chart(filtered_df, benchmarks, normalize, ma_period, log_scale)
+ drawdown_chart = create_dynamic_drawdown_chart(filtered_df, benchmarks, show_all=normalize)
+ rolling_chart = create_rolling_returns_chart(filtered_df, benchmarks, show_all=normalize)
+
+ stats = calculate_stats(filtered_df, col_name)
+ metrics = calculate_performance_metrics(filtered_df, col_name)
+
+ high_date_str = stats['high_date'].strftime('%Y-%m-%d') if hasattr(stats['high_date'], 'strftime') else str(stats['high_date'])
+ low_date_str = stats['low_date'].strftime('%Y-%m-%d') if hasattr(stats['low_date'], 'strftime') else str(stats['low_date'])
+
+ return (
+ perf_chart,
+ drawdown_chart,
+ rolling_chart,
+ f"${stats['high']:.2f}",
+ high_date_str,
+ f"${stats['low']:.2f}",
+ low_date_str,
+ f"${stats['current']:.2f}",
+ f"{stats['total_return']:.1f}%",
+ "green" if stats['total_return'] > 0 else "red",
+ f"{metrics['volatility']:.1f}%",
+ f"{metrics['max_drawdown']:.1f}%",
+ f"{metrics['sharpe']:.2f}",
+ f"+{metrics['best_day']:.1f}%",
+ f"{metrics['worst_day']:.1f}%",
+ )
+
diff --git a/investments-dashboard/callbacks/portfolio.py b/investments-dashboard/callbacks/portfolio.py
new file mode 100644
index 0000000..418bccf
--- /dev/null
+++ b/investments-dashboard/callbacks/portfolio.py
@@ -0,0 +1,192 @@
+from dash import callback, Input, Output, State, dcc, html
+import plotly.graph_objects as go
+import plotly.express as px
+from datetime import datetime
+
+from utils.data_loader import get_sector_allocation
+from components.charts import CHART_COLORS, CHART_LAYOUT
+
+sector_data = get_sector_allocation()
+
+def create_sector_bar_with_highlight(highlighted_sector=None):
+ """Create sector bar chart with optional highlight"""
+ fig = go.Figure()
+
+ colors = [CHART_COLORS['primary'] if (highlighted_sector is None or s == highlighted_sector)
+ else 'rgba(34, 139, 230, 0.3)'
+ for s in sector_data['Sector']]
+
+ fig.add_trace(go.Bar(
+ y=sector_data['Sector'],
+ x=sector_data['Fund'],
+ name='Fund',
+ orientation='h',
+ marker_color=colors,
+ ))
+
+ benchmark_colors = [CHART_COLORS['gray'] if (highlighted_sector is None or s == highlighted_sector)
+ else 'rgba(134, 142, 150, 0.3)'
+ for s in sector_data['Sector']]
+
+ fig.add_trace(go.Bar(
+ y=sector_data['Sector'],
+ x=sector_data['Benchmark'],
+ name='Benchmark',
+ orientation='h',
+ marker_color=benchmark_colors,
+ ))
+
+ title = 'Sector Allocation vs Benchmark'
+ if highlighted_sector:
+ title = f'Sector Allocation - {highlighted_sector} Highlighted'
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': title, 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ barmode='group',
+ bargap=0.3,
+ legend={'orientation': 'h', 'y': -0.15},
+ xaxis={'title': 'Allocation %', 'ticksuffix': '%'},
+ yaxis={'title': ''},
+ height=450,
+ )
+
+ return fig
+
+@callback(
+ [Output("allocation-view", "style"),
+ Output("characteristics-view", "style"),
+ Output("risk-view", "style")],
+ Input("portfolio-view", "value")
+)
+def switch_portfolio_view(view):
+ """Switch between allocation, characteristics, and risk views"""
+ hidden = {"display": "none"}
+ visible = {"display": "block"}
+
+ if view == "allocation":
+ return visible, hidden, hidden
+ elif view == "characteristics":
+ return hidden, visible, hidden
+ else:
+ return hidden, hidden, visible
+
+@callback(
+ Output("sector-bar-chart", "figure"),
+ Input("sector-donut", "clickData"),
+ State("sector-donut", "figure"),
+ prevent_initial_call=True
+)
+def highlight_sector(click_data, current_figure):
+ """Highlight selected sector in bar chart (synced with donut toggle)"""
+ if click_data and 'points' in click_data:
+ selected_idx = click_data['points'][0].get('pointNumber', None)
+ sector_name = click_data['points'][0].get('label', None)
+
+ current_pull = current_figure.get('data', [{}])[0].get('pull', [])
+ already_selected = (
+ current_pull and
+ selected_idx is not None and
+ len(current_pull) > selected_idx and
+ current_pull[selected_idx] > 0
+ )
+
+ if not already_selected:
+ return create_sector_bar_with_highlight(sector_name)
+ return create_sector_bar_with_highlight(None)
+
+@callback(
+ Output("sector-detail-text", "children"),
+ Input("sector-donut", "clickData"),
+ State("sector-donut", "figure")
+)
+def update_sector_detail(click_data, current_figure):
+ """Show sector details when clicked (synced with donut toggle)"""
+ if click_data and 'points' in click_data:
+ point = click_data['points'][0]
+ selected_idx = point.get('pointNumber', None)
+ sector = point.get('label', 'Unknown')
+ value = point.get('value', 0)
+
+ current_pull = current_figure.get('data', [{}])[0].get('pull', []) if current_figure else []
+ already_selected = (
+ current_pull and
+ selected_idx is not None and
+ len(current_pull) > selected_idx and
+ current_pull[selected_idx] > 0
+ )
+
+ if not already_selected:
+ return f"Selected: {sector} ({value:.1f}% allocation)"
+ return "Click on a sector to see details"
+
+@callback(
+ Output("sector-donut", "figure"),
+ Input("sector-donut", "clickData"),
+ State("sector-donut", "figure"),
+ prevent_initial_call=True
+)
+def highlight_donut_sector(click_data, current_figure):
+ """Highlight selected sector in donut chart (click again to reset)"""
+ import re
+ colors = px.colors.qualitative.Set3[:len(sector_data)]
+
+ pull_values = [0] * len(sector_data)
+ opacities = [1] * len(sector_data)
+
+ if click_data and 'points' in click_data:
+ selected_idx = click_data['points'][0].get('pointNumber', None)
+ if selected_idx is not None:
+ current_pull = current_figure.get('data', [{}])[0].get('pull', [])
+ already_selected = (
+ current_pull and
+ len(current_pull) > selected_idx and
+ current_pull[selected_idx] > 0
+ )
+
+ if not already_selected:
+ pull_values = [0.15 if i == selected_idx else 0 for i in range(len(sector_data))]
+ opacities = [1 if i == selected_idx else 0.4 for i in range(len(sector_data))]
+
+ adjusted_colors = []
+ for i, c in enumerate(colors):
+ if c.startswith('rgb('):
+ rgb_match = re.match(r'rgb\((\d+),\s*(\d+),\s*(\d+)\)', c)
+ if rgb_match:
+ r, g, b = rgb_match.groups()
+ adjusted_colors.append(f'rgba({r}, {g}, {b}, {opacities[i]})')
+ else:
+ adjusted_colors.append(c)
+ elif c.startswith('#'):
+ rgb = px.colors.hex_to_rgb(c)
+ adjusted_colors.append(f'rgba({rgb[0]}, {rgb[1]}, {rgb[2]}, {opacities[i]})')
+ else:
+ adjusted_colors.append(c)
+
+ fig = go.Figure(go.Pie(
+ labels=sector_data['Sector'],
+ values=sector_data['Fund'],
+ hole=0.6,
+ marker={'colors': adjusted_colors, 'line': {'color': 'white', 'width': 2}},
+ textinfo='percent',
+ textposition='outside',
+ pull=pull_values,
+ hovertemplate='%{label}
%{value:.1f}%'
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Sector Allocation (Click to highlight)', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ showlegend=True,
+ legend={'orientation': 'v', 'x': 1.05, 'y': 0.5},
+ annotations=[{
+ 'text': 'Sectors',
+ 'x': 0.5, 'y': 0.5,
+ 'font': {'size': 14, 'weight': 600},
+ 'showarrow': False
+ }]
+ )
+
+ return fig
+
+
diff --git a/investments-dashboard/components/__init__.py b/investments-dashboard/components/__init__.py
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/investments-dashboard/components/__init__.py
@@ -0,0 +1 @@
+
diff --git a/investments-dashboard/components/charts.py b/investments-dashboard/components/charts.py
new file mode 100644
index 0000000..9377d30
--- /dev/null
+++ b/investments-dashboard/components/charts.py
@@ -0,0 +1,232 @@
+import dash_mantine_components as dmc
+from dash import dcc
+import plotly.graph_objects as go
+import plotly.express as px
+
+CHART_COLORS = {
+ 'primary': '#228be6',
+ 'secondary': '#40c057',
+ 'tertiary': '#fab005',
+ 'danger': '#fa5252',
+ 'gray': '#868e96',
+}
+
+CHART_LAYOUT = {
+ 'paper_bgcolor': 'rgba(0,0,0,0)',
+ 'plot_bgcolor': 'rgba(0,0,0,0)',
+ 'font': {'family': 'Inter, sans-serif'},
+ 'margin': {'l': 40, 'r': 20, 't': 40, 'b': 40},
+ 'hovermode': 'x unified',
+ 'hoverlabel': {
+ 'bgcolor': 'white',
+ 'bordercolor': '#dee2e6',
+ 'font': {'family': 'Inter, sans-serif', 'size': 13, 'color': '#333'},
+ },
+}
+
+def create_performance_line_chart(df, title="Performance Over Time"):
+ """Create multi-series line chart for fund performance"""
+
+ fig = go.Figure()
+
+ fig.add_trace(go.Scatter(
+ x=df['Date'],
+ y=df['Calibre Index Fund'],
+ name='Calibre Index Fund',
+ line={'color': CHART_COLORS['primary'], 'width': 2},
+ hovertemplate='%{y:.2f}'
+ ))
+
+ fig.add_trace(go.Scatter(
+ x=df['Date'],
+ y=df['MSCI EAFE Index Fund (ETF)'],
+ name='MSCI EAFE Index',
+ line={'color': CHART_COLORS['secondary'], 'width': 2},
+ hovertemplate='%{y:.2f}'
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': title, 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ legend={'orientation': 'h', 'y': -0.15},
+ xaxis={
+ 'showgrid': True,
+ 'gridcolor': 'rgba(0,0,0,0.05)',
+ 'rangeselector': {
+ 'buttons': [
+ {'count': 1, 'label': '1M', 'step': 'month'},
+ {'count': 6, 'label': '6M', 'step': 'month'},
+ {'count': 1, 'label': 'YTD', 'step': 'year', 'stepmode': 'todate'},
+ {'count': 1, 'label': '1Y', 'step': 'year'},
+ {'count': 3, 'label': '3Y', 'step': 'year'},
+ {'count': 5, 'label': '5Y', 'step': 'year'},
+ {'step': 'all', 'label': 'All'}
+ ],
+ 'bgcolor': 'rgba(0,0,0,0.02)',
+ 'activecolor': CHART_COLORS['primary'],
+ },
+ 'rangeslider': {'visible': False},
+ },
+ yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$'},
+ )
+ fig.update_layout(margin={'l': 40, 'r': 20, 't': 100, 'b': 40})
+
+ return fig
+
+def create_sparkline(prices, symbol=""):
+ """Minimal area sparkline for live price history"""
+ color = CHART_COLORS['secondary'] if len(prices) > 1 and prices[-1] >= prices[0] else CHART_COLORS['danger']
+ hex_to_rgba = lambda c, a: f"rgba({int(c[1:3],16)},{int(c[3:5],16)},{int(c[5:7],16)},{a})"
+
+ fig = go.Figure(go.Scatter(
+ y=prices,
+ mode='lines',
+ fill='tozeroy',
+ line={'color': color, 'width': 2.5},
+ fillcolor=hex_to_rgba(color, 0.15),
+ hovertemplate='$%{y:.2f}',
+ ))
+
+ if len(prices) > 1:
+ ymin, ymax = min(prices), max(prices)
+ padding = max((ymax - ymin) * 0.3, 0.10)
+ yrange = [ymin - padding, ymax + padding]
+ else:
+ yrange = None
+
+ fig.update_layout(
+ paper_bgcolor='rgba(0,0,0,0)',
+ plot_bgcolor='rgba(0,0,0,0)',
+ font={'family': 'Inter, sans-serif'},
+ margin={'l': 0, 'r': 0, 't': 20, 'b': 0},
+ xaxis={'visible': False},
+ yaxis={'visible': False, 'range': yrange},
+ showlegend=False,
+ title={'text': symbol, 'x': 0, 'font': {'size': 13, 'weight': 600}},
+ hovermode='x unified',
+ )
+ return fig
+
+def create_sector_donut_chart(sector_data, title="Sector Allocation"):
+ """Create donut chart for sector allocation"""
+
+ colors = px.colors.qualitative.Set3[:len(sector_data)]
+
+ fig = go.Figure(go.Pie(
+ labels=sector_data['Sector'],
+ values=sector_data['Fund'],
+ hole=0.6,
+ marker={'colors': colors},
+ textinfo='percent',
+ textposition='outside',
+ hovertemplate='%{label}
%{value:.1f}%'
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': title, 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ showlegend=True,
+ legend={'orientation': 'v', 'x': 1.05, 'y': 0.5},
+ annotations=[{
+ 'text': 'Sectors',
+ 'x': 0.5, 'y': 0.5,
+ 'font': {'size': 14, 'weight': 600},
+ 'showarrow': False
+ }]
+ )
+
+ return fig
+
+def create_hypothetical_growth_chart(initial=10000):
+ """Create hypothetical growth of $10k chart"""
+
+ years = ['2008', '2010', '2012', '2014', '2016', '2018']
+ fund_values = [10000, 11500, 14000, 18500, 22000, 27500]
+ benchmark_values = [10000, 10800, 13200, 17000, 20500, 25000]
+
+ fig = go.Figure()
+
+ fig.add_trace(go.Scatter(
+ x=years,
+ y=fund_values,
+ name='Calibre Index Fund',
+ fill='tozeroy',
+ line={'color': CHART_COLORS['primary'], 'width': 2},
+ fillcolor='rgba(34, 139, 230, 0.1)',
+ hovertemplate='$%{y:,.2f}',
+ ))
+
+ fig.add_trace(go.Scatter(
+ x=years,
+ y=benchmark_values,
+ name='S&P 500 Index',
+ line={'color': CHART_COLORS['gray'], 'width': 2, 'dash': 'dash'},
+ hovertemplate='$%{y:,.2f}',
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': f'Hypothetical Growth of ${initial:,}', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ legend={'orientation': 'h', 'y': -0.15},
+ yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$', 'tickformat': ','},
+ xaxis={'showgrid': False},
+ )
+
+ return fig
+
+def create_fee_comparison_chart(fund_fee=329, avg_fee=2242):
+ """Create fee comparison bar chart"""
+
+ savings = avg_fee - fund_fee
+
+ fig = go.Figure()
+
+ fig.add_trace(go.Bar(
+ x=['Category Average', 'This Fund'],
+ y=[avg_fee, fund_fee],
+ marker_color=[CHART_COLORS['gray'], CHART_COLORS['primary']],
+ text=[f'${avg_fee:,}', f'${fund_fee:,}'],
+ textposition='outside',
+ ))
+
+ fig.add_annotation(
+ x=1, y=fund_fee + 300,
+ text=f'Save ${savings:,}',
+ showarrow=True,
+ arrowhead=2,
+ arrowcolor=CHART_COLORS['secondary'],
+ font={'color': CHART_COLORS['secondary'], 'weight': 600},
+ )
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Fees on $10,000 Over 10 Years', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$'},
+ showlegend=False,
+ )
+
+ return fig
+
+def create_dividend_timeline(dividend_data):
+ """Create dividend history chart"""
+
+ df = dividend_data.copy()
+ df['Amount'] = df['Amount'].str.replace('$', '').astype(float)
+
+ fig = go.Figure()
+
+ fig.add_trace(go.Bar(
+ x=df['Payable_Date'],
+ y=df['Amount'],
+ marker_color=CHART_COLORS['primary'],
+ name='Dividend',
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Dividend History', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$'},
+ xaxis={'title': 'Payment Date'},
+ )
+
+ return fig
diff --git a/investments-dashboard/components/kpi_cards.py b/investments-dashboard/components/kpi_cards.py
new file mode 100644
index 0000000..036d311
--- /dev/null
+++ b/investments-dashboard/components/kpi_cards.py
@@ -0,0 +1,87 @@
+import dash_mantine_components as dmc
+from dash import html
+from dash_iconify import DashIconify
+
+def create_kpi_card(title, value, subtitle=None, trend=None, trend_positive=True, icon=None):
+ """Create a KPI card with optional trend indicator"""
+
+ trend_color = "teal" if trend_positive else "red"
+ trend_icon = "tabler:trending-up" if trend_positive else "tabler:trending-down"
+
+ content = [
+ dmc.Group([
+ dmc.Text(title, size="sm", c="dimmed", fw=500),
+ DashIconify(icon=icon, width=20, color="gray") if icon else None,
+ ], justify="space-between"),
+ dmc.Group([
+ dmc.Text(value, size="xl", fw=700),
+ dmc.Group([
+ DashIconify(icon=trend_icon, width=16, color=trend_color) if trend else None,
+ dmc.Text(trend, size="sm", c=trend_color, fw=500) if trend else None,
+ ], gap=4) if trend else None,
+ ], justify="space-between", mt="xs"),
+ ]
+
+ if subtitle:
+ content.append(dmc.Text(subtitle, size="xs", c="dimmed", mt=4))
+
+ return dmc.Paper(
+ dmc.Stack(content, gap="xs"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ style={"minWidth": "200px"}
+ )
+
+def create_kpi_grid(metrics):
+ """Create a grid of KPI cards from metrics dict"""
+
+ cards = [
+ create_kpi_card(
+ title="Net Asset Value",
+ value=f"${metrics['nav']:.2f}",
+ trend=f"{metrics['ytd_return']:.1f}% YTD",
+ trend_positive=metrics['ytd_return'] > 0,
+ icon="tabler:currency-dollar"
+ ),
+ create_kpi_card(
+ title="1 Year Return",
+ value=f"{metrics['1y_return']:.2f}%",
+ subtitle="vs S&P 500",
+ trend_positive=True,
+ icon="tabler:chart-line"
+ ),
+ create_kpi_card(
+ title="Expense Ratio",
+ value=metrics['expense_ratio'],
+ subtitle="vs 0.99% category avg",
+ trend="85% lower",
+ trend_positive=True,
+ icon="tabler:percentage"
+ ),
+ create_kpi_card(
+ title="Category",
+ value=metrics['category'],
+ subtitle=metrics['asset_class'],
+ icon="tabler:category"
+ ),
+ ]
+
+ return dmc.SimpleGrid(
+ cards,
+ cols={"base": 1, "sm": 2, "lg": 4},
+ spacing="md"
+ )
+
+def create_stat_card(label, value, description=None):
+ """Simple stat card for fund facts"""
+ return dmc.Paper(
+ dmc.Stack([
+ dmc.Text(label, size="xs", c="dimmed", tt="uppercase", fw=600),
+ dmc.Text(value, size="lg", fw=600),
+ dmc.Text(description, size="xs", c="dimmed") if description else None,
+ ], gap=4),
+ p="sm",
+ radius="sm",
+ withBorder=True,
+ )
diff --git a/investments-dashboard/components/tables.py b/investments-dashboard/components/tables.py
new file mode 100644
index 0000000..e14c6c8
--- /dev/null
+++ b/investments-dashboard/components/tables.py
@@ -0,0 +1,103 @@
+import dash_mantine_components as dmc
+from dash import html
+import pandas as pd
+
+def create_data_table(df, title=None, striped=True):
+ """Create a styled Mantine table from DataFrame"""
+
+ columns = df.columns.tolist()
+
+ header = dmc.TableThead(
+ dmc.TableTr([
+ dmc.TableTh(col, style={'fontWeight': 600}) for col in columns
+ ])
+ )
+
+ rows = []
+ for _, row in df.iterrows():
+ cells = []
+ for i, val in enumerate(row):
+ style = {}
+ if isinstance(val, str):
+ if '%' in val:
+ try:
+ num = float(val.replace('%', ''))
+ style['color'] = '#40c057' if num > 0 else '#fa5252' if num < 0 else None
+ style['fontWeight'] = 500
+ except:
+ pass
+ cells.append(dmc.TableTd(val, style=style))
+ rows.append(dmc.TableTr(cells))
+
+ body = dmc.TableTbody(rows)
+
+ table = dmc.Table(
+ [header, body],
+ striped=striped,
+ highlightOnHover=True,
+ withTableBorder=True,
+ withColumnBorders=True,
+ )
+
+ if title:
+ return dmc.Stack([
+ dmc.Text(title, fw=600, size="lg"),
+ dmc.ScrollArea(table, type="auto"),
+ ], gap="sm")
+
+ return dmc.ScrollArea(table, type="auto")
+
+def create_returns_table(df):
+ """Create formatted returns comparison table"""
+ return create_data_table(df, title="Average Annual Returns")
+
+def create_fund_facts_table(df):
+ """Create fund facts key-value table"""
+
+ rows = []
+ for _, row in df.iterrows():
+ rows.append(
+ dmc.TableTr([
+ dmc.TableTd(row['label'], style={'fontWeight': 500, 'color': 'dimmed'}),
+ dmc.TableTd(str(row['value']).replace('"', ''), style={'fontWeight': 600}),
+ ])
+ )
+
+ return dmc.Table(
+ dmc.TableTbody(rows),
+ withTableBorder=True,
+ highlightOnHover=True,
+ )
+
+def create_dividend_table(df):
+ """Create dividend history table"""
+ return create_data_table(df, title="Distribution History")
+
+def create_comparison_table(data, columns, title=None):
+ """Create a generic comparison table"""
+
+ header = dmc.TableThead(
+ dmc.TableTr([dmc.TableTh(col, style={'fontWeight': 600}) for col in columns])
+ )
+
+ rows = []
+ for row_data in data:
+ cells = [dmc.TableTd(cell) for cell in row_data]
+ rows.append(dmc.TableTr(cells))
+
+ body = dmc.TableTbody(rows)
+
+ table = dmc.Table(
+ [header, body],
+ striped=True,
+ highlightOnHover=True,
+ withTableBorder=True,
+ )
+
+ if title:
+ return dmc.Stack([
+ dmc.Text(title, fw=600, size="lg"),
+ table
+ ], gap="sm")
+
+ return table
diff --git a/investments-dashboard/data/df_after_tax.csv b/investments-dashboard/data/df_after_tax.csv
new file mode 100644
index 0000000..9ca9949
--- /dev/null
+++ b/investments-dashboard/data/df_after_tax.csv
@@ -0,0 +1,10 @@
+A,B,C,D,E,F
+'-,1 Year,3 Year,5 Year,10 Year,Since Inception 08/31/1976
+500 Index Fund Inv,'-,'-,'-,'-,'-
+Returns before taxes,21.67%,11.26%,15.62%,8.37%,11.11%
+Returns after taxes on distributions,21.15%,10.75%,15.10%,7.95%,—
+Returns after taxes on distributions and sale of fund shares,12.64%,8.71%,12.51%,6.75%,—
+Average Large Blend Fund,'-,'-,'-,'-,'-
+Returns before taxes,20.44%,9.70%,14.24%,7.61%,—
+Returns after taxes on distributions,—,—,—,—,—
+Returns after taxes on distributions and sale of fund shares,—,—,—,—,—
diff --git a/investments-dashboard/data/df_avg_returns.csv b/investments-dashboard/data/df_avg_returns.csv
new file mode 100644
index 0000000..b659957
--- /dev/null
+++ b/investments-dashboard/data/df_avg_returns.csv
@@ -0,0 +1,4 @@
+A,B,C,D,E,F
+'-,1 Year,3 Year,5 Year,10 Year,Since Inception 08/31/1976
+500 Index Fund Inv,16.94%,11.00%,14.57%,9.60%,11.12%
+S&P 500 Index*,17.10%,11.14%,14.73%,9.73%,'-
diff --git a/investments-dashboard/data/df_current_prices.csv b/investments-dashboard/data/df_current_prices.csv
new file mode 100644
index 0000000..b8c13ad
--- /dev/null
+++ b/investments-dashboard/data/df_current_prices.csv
@@ -0,0 +1,7 @@
+label,price,percent
+Price as of 02/27/2018,$254.07,
+Change,'-$3.23,'-1.26%
+SEC yield,,1.67%
+52-week high 01/26/2018,$265.42,
+52-week low 04/13/2017,$215.11,
+Range,$50.31,23.39%
diff --git a/investments-dashboard/data/df_dividend.csv b/investments-dashboard/data/df_dividend.csv
new file mode 100644
index 0000000..9a2e8ef
--- /dev/null
+++ b/investments-dashboard/data/df_dividend.csv
@@ -0,0 +1,8 @@
+A,B,C,D,E,F,G,H
+Distribution Type,Most Recent Distribution,Record Date,Reinvest Date,Payable Date,Reinvest Price,Distribution Yield,SEC Yield
+Dividend,$1.12620,12/21/2017,12/22/2017,12/26/2017,$247.63,—,1.77% B
+Dividend,$1.12900,09/18/2017,09/19/2017,09/20/2017,$231.32,—,—
+Dividend,$0.96000,06/21/2017,06/22/2017,06/23/2017,$224.71,—,—
+Dividend,$0.96100,03/20/2017,03/21/2017,03/22/2017,$216.27,—,—
+Dividend,$1.25400,12/20/2016,12/21/2016,12/22/2016,$208.90,—,—
+Dividend,$0.85200,09/09/2016,09/12/2016,09/13/2016,$199.17,—,—
diff --git a/investments-dashboard/data/df_equity_char.csv b/investments-dashboard/data/df_equity_char.csv
new file mode 100644
index 0000000..766bdf9
--- /dev/null
+++ b/investments-dashboard/data/df_equity_char.csv
@@ -0,0 +1,13 @@
+A,B,C
+'-,500 Index Fund Inv,S&P 500 Index
+Number of stocks,507,505
+Median market cap,$105.4 billion,$105.4 billion
+Price/earnings ratio,23.9x,24.3x
+Price/book ratio,3.3x,3.3x
+Return on equity,16.1%,16.1%
+Earnings growth rate,9.9%,8.9%
+Foreign holdings,0.1%,—
+Turnover rate (as of fiscal year end December),4.1%,—
+Short-term reserves,0.0%,—
+Fund total net assets,$421.1 billion,—
+Share class total net assets,$29.0 billion,—
diff --git a/investments-dashboard/data/df_equity_diver.csv b/investments-dashboard/data/df_equity_diver.csv
new file mode 100644
index 0000000..ef345d8
--- /dev/null
+++ b/investments-dashboard/data/df_equity_diver.csv
@@ -0,0 +1,14 @@
+A,B,C
+'-,500 Index Fund Inv as of 01/31/2018,S&P 500 Index as of 01/31/2018
+Consumer Discretionary,12.60%,12.60%
+Consumer Staples,7.90%,7.90%
+Energy,6.00%,6.00%
+Financials,14.90%,14.90%
+Health Care,13.90%,13.90%
+Industrials,10.30%,10.30%
+Information Technology,24.20%,24.20%
+Materials,2.90%,2.90%
+Other,0.00%,—
+Real Estate,2.70%,2.70%
+Telecommunication Services,1.90%,1.90%
+Utilities,2.70%,2.70%
diff --git a/investments-dashboard/data/df_expenses.csv b/investments-dashboard/data/df_expenses.csv
new file mode 100644
index 0000000..5fa99cf
--- /dev/null
+++ b/investments-dashboard/data/df_expenses.csv
@@ -0,0 +1,4 @@
+A,B
+'-,Expense Ratio
+500 Index Fund Inv,0.14%
+Average expense ratio of similar funds*,0.99%
diff --git a/investments-dashboard/data/df_fund_facts.csv b/investments-dashboard/data/df_fund_facts.csv
new file mode 100644
index 0000000..9136141
--- /dev/null
+++ b/investments-dashboard/data/df_fund_facts.csv
@@ -0,0 +1,7 @@
+label,value
+Asset Class,Domestic Stock - General
+Category,Large Blend
+Expense ratio as of 04/27/2017,0.14%
+Minimum investment,"""$3,000"""
+Fund number,0040
+Fund advisor,Equity Index Group
diff --git a/investments-dashboard/data/df_graph.csv b/investments-dashboard/data/df_graph.csv
new file mode 100644
index 0000000..6ca62e7
--- /dev/null
+++ b/investments-dashboard/data/df_graph.csv
@@ -0,0 +1,2564 @@
+Date,Calibre Index Fund,"""Nasdaq Composite, x""","""Nasdaq Composite, y""","""MSCI EAFE Index Fund (ETF), x""",MSCI EAFE Index Fund (ETF),"""Dow Jones Industrial Average, y""","""S&P 500 Index, y"""
+2007-12-31,135.149994,2018-02-07,7051.97998,2008-01-02,78.22,13264.820313,1468.359985
+2008-01-02,133.220001,2018-02-08,6777.160156,2008-01-03,78.35,13043.959961,1447.160034
+2008-01-03,133.220001,2018-02-09,6874.490234000001,2008-01-04,76.57,13056.719727,1447.160034
+2008-01-04,129.949997,2018-02-12,6981.959961,2008-01-07,76.65,12800.179688,1411.630005
+2008-01-07,130.369995,2018-02-13,7013.509765999999,2008-01-08,76.22,12827.490234,1416.180054
+2008-01-08,128.020004,2018-02-14,7143.620117,2008-01-09,76.77,12589.070313,1390.189941
+2008-01-09,129.770004,2018-02-15,7256.430176000001,2008-01-10,76.69,12735.30957,1409.130005
+2008-01-10,130.800003,2018-02-16,7239.470215,2008-01-11,75.16,12853.089844,1420.329956
+2008-01-11,129.03999299999998,2018-02-20,7234.310059,2008-01-14,76.36,12606.299805,1401.02002
+2008-01-14,130.440002,2018-02-21,7218.22998,2008-01-15,73.88,12778.150391,1416.25
+2008-01-15,127.190002,2018-02-22,7210.089844,2008-01-16,72.39,12501.110352,1380.949951
+2008-01-16,126.480003,2018-02-23,7337.390137,2008-01-17,71.3,12466.160156,1373.199951
+2008-01-17,122.809998,2018-02-26,7421.459961,2008-01-18,71.71,12159.209961,1333.25
+2008-01-18,122.07,2018-02-27,7330.350098000001,2008-01-22,69.71,12099.299805,1325.189941
+2008-01-22,120.709999,2018-02-28,7273.009765999999,2008-01-23,69.3,11971.19043,1310.5
+2008-01-23,123.300003,2018-03-01,7180.560059,2008-01-24,71.73,12270.169922,1338.599976
+2008-01-24,124.540001,2018-03-02,7257.870117,2008-01-25,70.69,12378.610352,1352.069946
+2008-01-25,122.57,2018-03-05,7330.709961,2008-01-28,71.48,12207.169922,1330.609985
+2008-01-28,124.720001,2018-03-06,7372.009765999999,2008-01-29,71.91,12383.889648,1353.959961
+2008-01-29,125.5,,,2008-01-30,71.58,12480.299805,1362.300049
+2008-01-30,124.910004,,,2008-01-31,72.34,12442.830078,1355.810059
+2008-01-31,127.019997,,,2008-02-01,73.55,12650.360352,1378.550049
+2008-02-01,128.580002,,,2008-02-04,72.8,12743.19043,1395.420044
+2008-02-04,127.230003,,,2008-02-05,69.46,12635.160156,1380.819946
+2008-02-05,123.16999799999999,,,2008-02-06,69.4,12265.129883,1336.640015
+2008-02-06,122.279999,,,2008-02-07,69.05,12200.099609,1326.449951
+2008-02-07,123.279999,,,2008-02-08,68.34,12247.0,1336.910034
+2008-02-08,122.760002,,,2008-02-11,68.7,12182.129883,1331.290039
+2008-02-11,123.489998,,,2008-02-12,70.18,12240.009766,1339.130005
+2008-02-12,124.389999,,,2008-02-13,70.66,12373.410156,1348.859985
+2008-02-13,126.129997,,,2008-02-14,70.34,12552.240234,1367.209961
+2008-02-14,124.440002,,,2008-02-15,70.6,12376.980469,1348.859985
+2008-02-15,124.550003,,,2008-02-19,71.29,12348.209961,1349.98999
+2008-02-19,124.449997,,,2008-02-20,70.92,12337.219727,1348.780029
+2008-02-20,125.489998,,,2008-02-21,70.79,12427.259766,1360.030029
+2008-02-21,123.91999799999999,,,2008-02-22,71.69,12284.299805,1342.530029
+2008-02-22,124.910004,,,2008-02-25,72.83,12381.019531,1353.109985
+2008-02-25,126.639999,,,2008-02-26,73.91,12570.219727,1371.800049
+2008-02-26,127.519997,,,2008-02-27,74.15,12684.919922,1381.290039
+2008-02-27,127.43,,,2008-02-28,73.44,12694.280273,1380.02002
+2008-02-28,126.300003,,,2008-02-29,71.6,12582.179688,1367.680054
+2008-02-29,122.889999,,,2008-03-03,71.81,12266.389648,1330.630005
+2008-03-03,122.949997,,,2008-03-04,70.72,12258.900391,1331.339966
+2008-03-04,122.529999,,,2008-03-05,71.57,12213.799805,1326.75
+2008-03-05,123.230003,,,2008-03-06,70.55,12254.990234,1333.699951
+2008-03-06,120.540001,,,2008-03-07,69.72,12040.389648,1304.339966
+2008-03-07,119.519997,,,2008-03-10,69.37,11893.69043,1293.369995
+2008-03-10,117.690002,,,2008-03-11,71.56,11740.150391,1273.369995
+2008-03-11,122.059998,,,2008-03-12,71.56,12156.80957,1320.650024
+2008-03-12,120.989998,,,2008-03-13,71.68,12110.240234,1308.77002
+2008-03-13,121.620003,,,2008-03-14,69.95,12145.740234,1315.47998
+2008-03-14,119.089996,,,2008-03-17,68.89,11951.089844,1288.140015
+2008-03-17,118.040001,,,2008-03-18,71.0,11972.25,1276.599976
+2008-03-18,123.050003,,,2008-03-19,68.43,12392.660156,1330.73999
+2008-03-19,120.059998,,,2008-03-20,69.46,12099.660156,1298.420044
+2008-03-20,122.940002,,,2008-03-24,70.73,12361.320313,1329.51001
+2008-03-24,124.82,,,2008-03-25,71.76,12548.639648,1349.880005
+2008-03-25,125.110001,,,2008-03-26,71.76,12532.599609,1352.98999
+2008-03-26,124.019997,,,2008-03-27,71.7,12422.860352,1341.130005
+2008-03-27,122.019997,,,2008-03-28,71.64,12302.459961,1325.76001
+2008-03-28,121.059998,,,2008-03-31,71.9,12216.400391,1315.219971
+2008-03-31,121.75,,,2008-04-01,74.17,12262.889648,1322.699951
+2008-04-01,126.120003,,,2008-04-02,74.33,12654.360352,1370.180054
+2008-04-02,125.900002,,,2008-04-03,74.55,12608.919922,1367.530029
+2008-04-03,126.059998,,,2008-04-04,74.8,12626.030273,1369.310059
+2008-04-04,126.160004,,,2008-04-07,75.26,12609.419922,1370.400024
+2008-04-07,126.360001,,,2008-04-08,74.47,12612.429688,1372.540039
+2008-04-08,125.760002,,,2008-04-09,73.86,12576.44043,1365.540039
+2008-04-09,124.75,,,2008-04-10,73.63,12527.259766,1354.48999
+2008-04-10,125.309998,,,2008-04-11,72.64,12581.980469,1360.550049
+2008-04-11,122.769997,,,2008-04-14,72.8,12325.419922,1332.829956
+2008-04-14,122.349998,,,2008-04-15,73.31,12302.05957,1328.319946
+2008-04-15,122.91999799999999,,,2008-04-16,75.62,12362.469727,1334.430054
+2008-04-16,125.720001,,,2008-04-17,74.78,12619.269531,1364.709961
+2008-04-17,125.809998,,,2008-04-18,75.31,12620.490234,1365.560059
+2008-04-18,128.080002,,,2008-04-21,75.9,12849.360352,1390.329956
+2008-04-21,127.889999,,,2008-04-22,75.11,12825.019531,1388.170044
+2008-04-22,126.760002,,,2008-04-23,75.5,12720.230469,1375.939941
+2008-04-23,127.129997,,,2008-04-24,75.01,12763.219727,1379.930054
+2008-04-24,127.949997,,,2008-04-25,75.63,12848.950195,1388.819946
+2008-04-25,128.779999,,,2008-04-28,76.07,12891.860352,1397.839966
+2008-04-28,128.649994,,,2008-04-29,75.4,12871.75,1396.369995
+2008-04-29,128.149994,,,2008-04-30,75.81,12831.94043,1390.939941
+2008-04-30,127.66999799999999,,,2008-05-01,76.27,12820.129883,1385.589966
+2008-05-01,129.880005,,,2008-05-02,76.48,13010.0,1409.339966
+2008-05-02,130.300003,,,2008-05-05,76.61,13058.200195,1413.900024
+2008-05-05,129.720001,,,2008-05-06,77.18,12969.540039,1407.48999
+2008-05-06,130.71000700000002,,,2008-05-07,75.83,13020.830078,1418.26001
+2008-05-07,128.399994,,,2008-05-08,76.49,12814.349609,1392.569946
+2008-05-08,128.869995,,,2008-05-09,75.88,12866.780273,1397.680054
+2008-05-09,128.029999,,,2008-05-12,76.64,12745.879883,1388.280029
+2008-05-12,129.449997,,,2008-05-13,76.38,12876.30957,1403.579956
+2008-05-13,129.429993,,,2008-05-14,76.38,12832.179688,1403.040039
+2008-05-14,129.970001,,,2008-05-15,77.68,12898.379883,1408.660034
+2008-05-15,131.369995,,,2008-05-16,78.52,12992.660156,1423.569946
+2008-05-16,131.53999299999998,,,2008-05-19,78.2,12986.799805,1425.349976
+2008-05-19,131.669998,,,2008-05-20,77.48,13028.160156,1426.630005
+2008-05-20,130.449997,,,2008-05-21,76.6,12828.679688,1413.400024
+2008-05-21,128.360001,,,2008-05-22,77.49,12601.19043,1390.709961
+2008-05-22,128.720001,,,2008-05-23,76.61,12625.620117,1394.349976
+2008-05-23,127.019997,,,2008-05-27,76.46,12479.629883,1375.930054
+2008-05-27,127.889999,,,2008-05-28,76.45,12548.349609,1385.349976
+2008-05-28,128.419998,,,2008-05-29,76.28,12594.030273,1390.839966
+2008-05-29,129.119995,,,2008-05-30,76.71,12646.219727,1398.26001
+2008-05-30,129.309998,,,2008-06-02,75.91,12638.320313,1400.380005
+2008-06-02,127.959999,,,2008-06-03,75.75,12503.820313,1385.670044
+2008-06-03,127.220001,,,2008-06-04,75.31,12402.849609,1377.650024
+2008-06-04,127.239998,,,2008-06-05,76.56,12390.480469,1377.199951
+2008-06-05,129.729996,,,2008-06-06,74.36,12604.450195,1404.050049
+2008-06-06,125.739998,,,2008-06-09,74.26,12209.80957,1360.680054
+2008-06-09,125.839996,,,2008-06-10,73.0,12280.320313,1361.76001
+2008-06-10,125.540001,,,2008-06-11,72.07,12289.759766,1358.439941
+2008-06-11,123.440002,,,2008-06-12,71.82,12083.769531,1335.48999
+2008-06-12,123.860001,,,2008-06-13,72.48,12141.580078,1339.869995
+2008-06-13,125.720001,,,2008-06-16,72.85,12307.349609,1360.030029
+2008-06-16,125.730003,,,2008-06-17,73.07,12269.080078,1360.140015
+2008-06-17,124.879997,,,2008-06-18,72.47,12160.299805,1350.930054
+2008-06-18,123.66999799999999,,,2008-06-19,72.33,12029.05957,1337.810059
+2008-06-19,124.16999799999999,,,2008-06-20,70.75,12063.089844,1342.829956
+2008-06-20,121.870003,,,2008-06-23,70.74,11842.69043,1317.930054
+2008-06-23,121.870003,,,2008-06-24,70.42,11842.360352,1318.0
+2008-06-24,121.529999,,,2008-06-25,69.85,11807.429688,1314.290039
+2008-06-25,122.25,,,2008-06-26,68.08,11811.830078,1321.969971
+2008-06-26,118.120003,,,2008-06-27,68.26,11453.419922,1283.150024
+2008-06-27,117.68,,,2008-06-30,68.67,11346.509766,1278.380005
+2008-06-30,117.83000200000001,,,2008-07-01,67.93,11350.009766,1280.0
+2008-07-01,118.309998,,,2008-07-02,66.85,11382.259766,1284.910034
+2008-07-02,116.160004,,,2008-07-03,67.28,11215.509766,1261.52002
+2008-07-03,116.290001,,,2008-07-07,66.7,11288.540039,1262.900024
+2008-07-07,115.32,,,2008-07-08,67.05,11231.959961,1252.310059
+2008-07-08,117.33000200000001,,,2008-07-09,66.18,11384.209961,1273.699951
+2008-07-09,114.66999799999999,,,2008-07-10,66.75,11147.44043,1244.689941
+2008-07-10,115.470001,,,2008-07-11,65.7,11229.019531,1253.390015
+2008-07-11,114.199997,,,2008-07-14,65.56,11100.540039,1239.48999
+2008-07-14,113.16999799999999,,,2008-07-15,64.51,11055.19043,1228.300049
+2008-07-15,111.940002,,,2008-07-16,65.7,10962.540039,1214.910034
+2008-07-16,114.760002,,,2008-07-17,66.7,11239.280273,1245.359985
+2008-07-17,116.139999,,,2008-07-18,67.13,11446.660156,1260.319946
+2008-07-18,116.18,,,2008-07-21,67.52,11496.570313,1260.680054
+2008-07-21,116.120003,,,2008-07-22,67.75,11467.339844,1260.0
+2008-07-22,117.690002,,,2008-07-23,68.0,11602.5,1277.0
+2008-07-23,118.160004,,,2008-07-24,66.76,11632.379883,1282.189941
+2008-07-24,115.43,,,2008-07-25,66.9,11349.280273,1252.540039
+2008-07-25,115.91999799999999,,,2008-07-28,65.78,11370.69043,1257.76001
+2008-07-28,113.760002,,,2008-07-29,66.43,11131.080078,1234.369995
+2008-07-29,116.43,,,2008-07-30,67.05,11397.55957,1263.199951
+2008-07-30,118.379997,,,2008-07-31,66.39,11583.69043,1284.26001
+2008-07-31,116.849998,,,2008-08-01,65.4,11378.019531,1267.380005
+2008-08-01,116.199997,,,2008-08-04,64.78,11326.320313,1260.310059
+2008-08-04,115.160004,,,2008-08-05,66.42,11284.150391,1249.01001
+2008-08-05,118.470001,,,2008-08-06,66.44,11615.769531,1284.880005
+2008-08-06,118.93,,,2008-08-07,65.11,11656.070313,1289.189941
+2008-08-07,116.809998,,,2008-08-08,65.38,11431.429688,1266.069946
+2008-08-08,119.599998,,,2008-08-11,65.32,11734.320313,1296.319946
+2008-08-11,120.459999,,,2008-08-12,64.85,11782.349609,1305.319946
+2008-08-12,119.010002,,,2008-08-13,63.83,11642.469727,1289.589966
+2008-08-13,118.709999,,,2008-08-14,63.58,11532.959961,1285.829956
+2008-08-14,119.370003,,,2008-08-15,63.16,11615.929688,1292.930054
+2008-08-15,119.870003,,,2008-08-18,62.84,11659.900391,1298.199951
+2008-08-18,118.07,,,2008-08-19,62.13,11479.389648,1278.599976
+2008-08-19,116.980003,,,2008-08-20,62.5,11348.549805,1266.689941
+2008-08-20,117.709999,,,2008-08-21,62.75,11417.429688,1274.540039
+2008-08-21,118.010002,,,2008-08-22,63.04,11430.209961,1277.719971
+2008-08-22,119.360001,,,2008-08-25,62.05,11628.05957,1292.199951
+2008-08-25,117.019997,,,2008-08-26,62.36,11386.25,1266.839966
+2008-08-26,117.449997,,,2008-08-27,62.95,11412.870117,1271.51001
+2008-08-27,118.410004,,,2008-08-28,63.76,11502.509766,1281.660034
+2008-08-28,120.18,,,2008-08-29,63.57,11715.179688,1300.680054
+2008-08-29,118.540001,,,2008-09-02,62.59,11543.959961,1282.829956
+2008-09-02,118.050003,,,2008-09-03,62.33,11516.919922,1277.579956
+2008-09-03,117.870003,,,2008-09-04,59.66,11532.879883,1274.97998
+2008-09-04,114.349998,,,2008-09-05,59.44,11188.230469,1236.829956
+2008-09-05,114.860001,,,2008-09-08,60.77,11220.959961,1242.310059
+2008-09-08,117.230003,,,2008-09-09,58.8,11510.740234,1267.790039
+2008-09-09,113.230003,,,2008-09-10,59.37,11230.730469,1224.51001
+2008-09-10,113.93,,,2008-09-11,59.24,11268.919922,1232.040039
+2008-09-11,115.540001,,,2008-09-12,60.4,11433.709961,1249.050049
+2008-09-12,115.790001,,,2008-09-15,57.83,11421.990234,1251.699951
+2008-09-15,110.360001,,,2008-09-16,57.4,10917.509766,1192.699951
+2008-09-16,112.269997,,,2008-09-17,55.21,11059.019531,1213.599976
+2008-09-17,106.980003,,,2008-09-18,57.72,10609.660156,1156.390015
+2008-09-18,111.639999,,,2008-09-19,61.81,11019.69043,1206.51001
+2008-09-19,116.139999,,,2008-09-22,59.7,11388.44043,1255.079956
+2008-09-22,111.709999,,,2008-09-23,58.86,11015.69043,1207.089966
+2008-09-23,109.959999,,,2008-09-24,59.03,10854.169922,1188.219971
+2008-09-24,109.75,,,2008-09-25,60.39,10825.169922,1185.869995
+2008-09-25,111.269997,,,2008-09-26,59.75,11022.05957,1209.180054
+2008-09-26,111.650002,,,2008-09-29,53.08,11143.129883,1213.27002
+2008-09-29,101.849998,,,2008-09-30,56.3,10365.450195,1106.420044
+2008-09-30,107.370003,,,2008-10-01,55.88,10850.660156,1166.359985
+2008-10-01,106.900002,,,2008-10-02,53.44,10831.070313,1161.060059
+2008-10-02,102.610001,,,2008-10-03,53.23,10482.849609,1114.280029
+2008-10-03,101.230003,,,2008-10-06,50.22,10325.379883,1099.22998
+2008-10-06,97.33000200000001,,,2008-10-07,47.87,9955.5,1056.890015
+2008-10-07,91.739998,,,2008-10-08,46.8,9447.110352,996.2299800000001
+2008-10-08,90.75,,,2008-10-09,44.0,9258.099609,984.9400019999999
+2008-10-09,83.839996,,,2008-10-10,42.36,8579.19043,909.919983
+2008-10-10,82.870003,,,2008-10-13,49.09,8451.19043,899.2199710000001
+2008-10-13,92.459999,,,2008-10-14,48.08,9387.610352,1003.349976
+2008-10-14,91.970001,,,2008-10-15,42.95,9310.990234,998.01001
+2008-10-15,83.66999799999999,,,2008-10-16,45.48,8577.910156,907.840027
+2008-10-16,87.230003,,,2008-10-17,44.51,8979.259766,946.429993
+2008-10-17,86.690002,,,2008-10-20,47.35,8852.219727,940.5499880000001
+2008-10-20,90.82,,,2008-10-21,44.68,9265.429688,985.400024
+2008-10-21,88.029999,,,2008-10-22,41.18,9033.660156,955.0499880000001
+2008-10-22,82.66999799999999,,,2008-10-23,42.33,8519.209961,896.7800289999999
+2008-10-23,83.720001,,,2008-10-24,39.59,8691.25,908.1099849999999
+2008-10-24,80.82,,,2008-10-27,37.51,8378.950195,876.7700199999999
+2008-10-27,78.25,,,2008-10-28,42.68,8175.77002,848.919983
+2008-10-28,86.699997,,,2008-10-29,42.78,9065.120117,940.51001
+2008-10-29,85.75,,,2008-10-30,44.28,8990.959961,930.090027
+2008-10-30,87.989998,,,2008-10-31,44.57,9180.69043,954.090027
+2008-10-31,89.339996,,,2008-11-03,44.75,9325.009766,968.75
+2008-11-03,89.120003,,,2008-11-04,47.82,9319.830078,966.2999880000001
+2008-11-04,92.75,,,2008-11-05,45.22,9625.280273,1005.75
+2008-11-05,87.91999799999999,,,2008-11-06,42.3,9139.269531,952.7700199999999
+2008-11-06,83.519997,,,2008-11-07,44.69,8695.790039,904.8800050000001
+2008-11-07,85.959999,,,2008-11-10,44.02,8943.80957,930.98999
+2008-11-10,84.889999,,,2008-11-11,42.57,8870.540039,919.2100220000001
+2008-11-11,83.010002,,,2008-11-12,40.28,8693.959961,898.9500119999999
+2008-11-12,78.75,,,2008-11-13,43.71,8282.660156,852.2999880000001
+2008-11-13,84.199997,,,2008-11-14,41.2,8835.25,911.2899779999999
+2008-11-14,80.699997,,,2008-11-17,40.45,8497.30957,873.2899779999999
+2008-11-17,78.629997,,,2008-11-18,40.52,8273.580078,850.75
+2008-11-18,79.43,,,2008-11-19,37.81,8424.75,859.1199949999999
+2008-11-19,74.58000200000001,,,2008-11-20,35.73,7997.279785,806.580017
+2008-11-20,69.57,,,2008-11-21,38.27,7552.290039,752.4400019999999
+2008-11-21,73.989998,,,2008-11-24,40.56,8046.419922,800.030029
+2008-11-24,78.779999,,,2008-11-25,41.3,8443.389648,851.8099980000001
+2008-11-25,79.300003,,,2008-11-26,41.75,8479.469727,857.3900150000001
+2008-11-26,82.139999,,,2008-11-28,41.73,8726.610352,887.679993
+2008-11-28,82.93,,,2008-12-01,38.32,8829.040039,896.23999
+2008-12-01,75.540001,,,2008-12-02,40.4,8149.089844,816.210022
+2008-12-02,78.559998,,,2008-12-03,40.94,8419.089844,848.8099980000001
+2008-12-03,80.629997,,,2008-12-04,39.68,8591.69043,870.73999
+2008-12-04,78.269997,,,2008-12-05,40.18,8376.240234,845.2199710000001
+2008-12-05,81.120003,,,2008-12-08,42.09,8635.419922,876.070007
+2008-12-08,84.25,,,2008-12-09,41.7,8934.179688,909.7000119999999
+2008-12-09,82.309998,,,2008-12-10,42.8,8691.330078,888.669983
+2008-12-10,83.290001,,,2008-12-11,42.61,8761.419922,899.23999
+2008-12-11,80.940002,,,2008-12-12,43.03,8565.089844,873.590027
+2008-12-12,81.510002,,,2008-12-15,43.14,8629.679688,879.7299800000001
+2008-12-15,80.489998,,,2008-12-16,45.62,8564.530273,868.570007
+2008-12-16,84.620003,,,2008-12-17,45.49,8924.139648,913.179993
+2008-12-17,83.809998,,,2008-12-18,44.0,8824.339844,904.419983
+2008-12-18,82.050003,,,2008-12-19,43.36,8604.990234,885.2800289999999
+2008-12-19,82.269997,,,2008-12-22,43.06,8579.110352,887.8800050000001
+2008-12-22,80.779999,,,2008-12-23,42.2,8519.69043,871.6300050000001
+2008-12-23,80.0,,,2008-12-24,42.76,8419.490234,863.159973
+2008-12-24,80.5,,,2008-12-26,42.96,8468.480469,868.150024
+2008-12-26,80.230003,,,2008-12-29,42.97,8515.549805,872.7999880000001
+2008-12-29,79.970001,,,2008-12-30,44.26,8483.929688,869.419983
+2008-12-30,81.93,,,2008-12-31,44.86,8668.389648,890.6400150000001
+2008-12-31,83.089996,,,2009-01-02,45.44,8776.389648,903.25
+2009-01-02,85.75,,,2009-01-05,44.71,9034.69043,931.7999880000001
+2009-01-05,85.349998,,,2009-01-06,45.19,8952.889648,927.4500119999999
+2009-01-06,86.019997,,,2009-01-07,44.41,9015.099609,934.7000119999999
+2009-01-07,83.480003,,,2009-01-08,45.07,8769.700195,906.650024
+2009-01-08,83.769997,,,2009-01-09,43.51,8742.459961,909.7299800000001
+2009-01-09,81.980003,,,2009-01-12,42.46,8599.179688,890.349976
+2009-01-12,80.139999,,,2009-01-13,41.68,8473.969727,870.26001
+2009-01-13,80.279999,,,2009-01-14,39.97,8448.55957,871.7899779999999
+2009-01-14,77.599998,,,2009-01-15,40.33,8200.139648,842.6199949999999
+2009-01-15,77.709999,,,2009-01-16,40.57,8212.490234,843.73999
+2009-01-16,78.300003,,,2009-01-20,37.6,8281.219727,850.1199949999999
+2009-01-20,74.16999799999999,,,2009-01-21,39.44,7949.089844,805.219971
+2009-01-21,77.400002,,,2009-01-22,38.52,8228.099609,840.23999
+2009-01-22,76.230003,,,2009-01-23,38.25,8122.799805,827.5
+2009-01-23,76.639999,,,2009-01-26,39.0,8077.560059,831.950012
+2009-01-26,77.059998,,,2009-01-27,39.76,8116.029785,836.570007
+2009-01-27,77.910004,,,2009-01-28,40.93,8174.72998,845.7100220000001
+2009-01-28,80.529999,,,2009-01-29,39.07,8375.450195,874.090027
+2009-01-29,77.870003,,,2009-01-30,38.7,8149.009765999999,845.1400150000001
+2009-01-30,76.099998,,,2009-02-02,38.32,8000.859863,825.880005
+2009-02-02,76.050003,,,2009-02-03,39.42,7936.75,825.4400019999999
+2009-02-03,77.260002,,,2009-02-04,39.22,8078.359863,838.51001
+2009-02-04,76.739998,,,2009-02-05,39.78,7956.660156,832.22998
+2009-02-05,78.0,,,2009-02-06,40.7,8063.069823999999,845.849976
+2009-02-06,80.129997,,,2009-02-09,40.69,8280.589844,868.599976
+2009-02-09,80.25,,,2009-02-10,38.67,8270.870117,869.8900150000001
+2009-02-10,76.309998,,,2009-02-11,39.09,7888.879883,827.159973
+2009-02-11,76.949997,,,2009-02-12,38.97,7939.529785,833.73999
+2009-02-12,77.099998,,,2009-02-13,38.55,7932.759765999999,835.1900019999999
+2009-02-13,76.33000200000001,,,2009-02-17,36.5,7850.410156,826.840027
+2009-02-17,72.870003,,,2009-02-18,36.47,7552.600098000001,789.169983
+2009-02-18,72.809998,,,2009-02-19,36.42,7555.629883,788.419983
+2009-02-19,71.989998,,,2009-02-20,35.89,7465.950195,778.9400019999999
+2009-02-20,71.190002,,,2009-02-23,34.52,7365.669922,770.049988
+2009-02-23,68.720001,,,2009-02-24,35.96,7114.779785,743.330017
+2009-02-24,71.470001,,,2009-02-25,34.97,7350.939941,773.1400150000001
+2009-02-25,70.730003,,,2009-02-26,34.68,7270.890137,764.900024
+2009-02-26,69.629997,,,2009-02-27,34.68,7182.080078,752.830017
+2009-02-27,67.989998,,,2009-03-02,32.69,7062.930176000001,735.090027
+2009-03-02,64.83000200000001,,,2009-03-03,32.56,6763.290039,700.820007
+2009-03-03,64.400002,,,2009-03-04,34.01,6726.02002,696.330017
+2009-03-04,65.959999,,,2009-03-05,32.64,6875.839844,712.869995
+2009-03-05,63.16,,,2009-03-06,32.58,6594.439941,682.549988
+2009-03-06,63.259997999999996,,,2009-03-09,31.7,6626.939941,683.380005
+2009-03-09,62.650002,,,2009-03-10,33.83,6547.049805,676.530029
+2009-03-10,66.629997,,,2009-03-11,34.02,6926.490234000001,719.599976
+2009-03-11,66.82,,,2009-03-12,34.79,6930.399901999999,721.3599849999999
+2009-03-12,69.550003,,,2009-03-13,35.02,7170.060059,750.73999
+2009-03-13,70.089996,,,2009-03-16,35.4,7223.97998,756.549988
+2009-03-16,69.839996,,,2009-03-17,36.33,7216.970215,753.8900150000001
+2009-03-17,72.08000200000001,,,2009-03-18,37.37,7395.700195,778.119995
+2009-03-18,73.57,,,2009-03-19,37.35,7486.580078,794.349976
+2009-03-19,72.629997,,,2009-03-20,36.83,7400.799805,784.039978
+2009-03-20,71.199997,,,2009-03-23,39.48,7278.379883,768.539978
+2009-03-23,76.239998,,,2009-03-24,38.24,7775.859863,822.919983
+2009-03-24,74.690002,,,2009-03-25,38.83,7659.970215,806.119995
+2009-03-25,75.410004,,,2009-03-26,39.35,7749.810059,813.880005
+2009-03-26,76.639999,,,2009-03-27,38.09,7924.560059,832.8599849999999
+2009-03-27,75.110001,,,2009-03-30,36.64,7776.180176000001,815.9400019999999
+2009-03-30,72.489998,,,2009-03-31,37.59,7522.02002,787.530029
+2009-03-31,73.440002,,,2009-04-01,38.57,7608.919922,797.869995
+2009-04-01,74.66999799999999,,,2009-04-02,40.31,7761.600098000001,811.080017
+2009-04-02,76.82,,,2009-04-03,40.54,7978.080078,834.380005
+2009-04-03,77.57,,,2009-04-06,39.7,8017.589844,842.5
+2009-04-06,76.91999799999999,,,2009-04-07,38.87,7975.850098000001,835.47998
+2009-04-07,75.139999,,,2009-04-08,39.26,7789.560059,815.549988
+2009-04-08,76.029999,,,2009-04-09,40.31,7837.109863,825.159973
+2009-04-09,78.91999799999999,,,2009-04-13,40.71,8083.379883,856.5599980000001
+2009-04-13,79.110001,,,2009-04-14,40.32,8057.810059,858.7299800000001
+2009-04-14,77.519997,,,2009-04-15,40.85,7920.180176000001,841.5
+2009-04-15,78.5,,,2009-04-16,41.11,8029.620117,852.0599980000001
+2009-04-16,79.720001,,,2009-04-17,40.97,8125.430176000001,865.2999880000001
+2009-04-17,80.120003,,,2009-04-20,39.29,8131.330078,869.599976
+2009-04-20,76.709999,,,2009-04-21,40.19,7841.72998,832.3900150000001
+2009-04-21,78.33000200000001,,,2009-04-22,39.87,7969.560059,850.080017
+2009-04-22,77.739998,,,2009-04-23,40.87,7886.569823999999,843.5499880000001
+2009-04-23,78.519997,,,2009-04-24,41.5,7957.060059,851.919983
+2009-04-24,79.839996,,,2009-04-27,41.01,8076.290039,866.2299800000001
+2009-04-27,79.040001,,,2009-04-28,40.62,8025.0,857.51001
+2009-04-28,78.82,,,2009-04-29,41.66,8016.950195,855.159973
+2009-04-29,80.529999,,,2009-04-30,41.92,8185.72998,873.6400150000001
+2009-04-30,80.459999,,,2009-05-01,42.41,8168.120117,872.8099980000001
+2009-05-01,80.900002,,,2009-05-04,44.17,8212.410156,877.5200199999999
+2009-05-04,83.639999,,,2009-05-05,43.73,8426.740234,907.23999
+2009-05-05,83.339996,,,2009-05-06,44.79,8410.650391,903.7999880000001
+2009-05-06,84.800003,,,2009-05-07,44.04,8512.280273,919.5300289999999
+2009-05-07,83.699997,,,2009-05-08,45.95,8409.849609,907.3900150000001
+2009-05-08,85.699997,,,2009-05-11,44.78,8574.650391,929.2299800000001
+2009-05-11,83.910004,,,2009-05-12,45.26,8418.769531,909.23999
+2009-05-12,83.83000200000001,,,2009-05-13,43.72,8469.110352,908.349976
+2009-05-13,81.610001,,,2009-05-14,44.15,8284.889648,883.919983
+2009-05-14,82.459999,,,2009-05-15,43.75,8331.320313,893.070007
+2009-05-15,81.550003,,,2009-05-18,45.42,8268.639648,882.8800050000001
+2009-05-18,84.029999,,,2009-05-19,45.83,8504.080078,909.7100220000001
+2009-05-19,83.900002,,,2009-05-20,46.13,8474.849609,908.1300050000001
+2009-05-20,83.470001,,,2009-05-21,45.78,8422.040039,903.4699710000001
+2009-05-21,82.099998,,,2009-05-22,46.04,8292.129883,888.330017
+2009-05-22,81.980003,,,2009-05-26,46.96,8277.320313,887.0
+2009-05-26,84.139999,,,2009-05-27,46.05,8473.490234,910.330017
+2009-05-27,82.559998,,,2009-05-28,46.52,8300.019531,893.0599980000001
+2009-05-28,83.839996,,,2009-05-29,47.45,8403.799805,906.830017
+2009-05-29,84.980003,,,2009-06-01,48.62,8500.330078,919.1400150000001
+2009-06-01,87.16999799999999,,,2009-06-02,49.04,8721.44043,942.8699949999999
+2009-06-02,87.349998,,,2009-06-03,47.58,8740.870117,944.73999
+2009-06-03,86.16999799999999,,,2009-06-04,47.88,8675.240234,931.76001
+2009-06-04,87.18,,,2009-06-05,47.29,8750.240234,942.4600220000001
+2009-06-05,86.959999,,,2009-06-08,47.19,8763.129883,940.090027
+2009-06-08,86.900002,,,2009-06-09,47.77,8764.490234,939.1400150000001
+2009-06-09,87.209999,,,2009-06-10,47.86,8763.05957,942.429993
+2009-06-10,86.910004,,,2009-06-11,48.68,8739.019531,939.150024
+2009-06-11,87.459999,,,2009-06-12,48.43,8770.919922,944.8900150000001
+2009-06-12,87.58000200000001,,,2009-06-15,46.69,8799.259766,946.2100220000001
+2009-06-15,85.510002,,,2009-06-16,46.15,8612.129883,923.7199710000001
+2009-06-16,84.43,,,2009-06-17,46.28,8504.669922,911.9699710000001
+2009-06-17,84.32,,,2009-06-18,46.2,8497.179688,910.7100220000001
+2009-06-18,85.040001,,,2009-06-19,46.93,8555.599609,918.3699949999999
+2009-06-19,85.300003,,,2009-06-22,45.42,8539.730469,921.2299800000001
+2009-06-22,82.709999,,,2009-06-23,45.06,8339.009766,893.0399779999999
+2009-06-23,82.459999,,,2009-06-24,45.1,8322.910156,895.099976
+2009-06-24,83.010002,,,2009-06-25,46.05,8299.860352,900.9400019999999
+2009-06-25,84.790001,,,2009-06-26,45.96,8472.400391,920.26001
+2009-06-26,84.68,,,2009-06-29,46.35,8438.389648,918.900024
+2009-06-29,85.440002,,,2009-06-30,45.81,8529.379883,927.2299800000001
+2009-06-30,84.720001,,,2009-07-01,46.57,8447.0,919.320007
+2009-07-01,85.099998,,,2009-07-02,45.23,8504.05957,923.330017
+2009-07-02,82.629997,,,2009-07-06,45.29,8280.740234,896.419983
+2009-07-06,82.839996,,,2009-07-07,44.19,8324.870117,898.7199710000001
+2009-07-07,81.209999,,,2009-07-08,44.01,8163.600098000001,881.0300289999999
+2009-07-08,81.120003,,,2009-07-09,44.55,8178.410156,879.5599980000001
+2009-07-09,81.410004,,,2009-07-10,44.03,8183.169922,882.679993
+2009-07-10,81.08000200000001,,,2009-07-13,44.8,8146.52002,879.1300050000001
+2009-07-13,83.099998,,,2009-07-14,45.04,8331.679688,901.0499880000001
+2009-07-14,83.540001,,,2009-07-15,46.58,8359.490234,905.840027
+2009-07-15,86.029999,,,2009-07-16,46.99,8616.209961,932.679993
+2009-07-16,86.779999,,,2009-07-17,46.82,8711.820313,940.73999
+2009-07-17,86.75,,,2009-07-20,47.73,8743.94043,940.3800050000001
+2009-07-20,87.739998,,,2009-07-21,48.03,8848.150391,951.1300050000001
+2009-07-21,88.07,,,2009-07-22,48.15,8915.94043,954.580017
+2009-07-22,88.019997,,,2009-07-23,48.96,8881.259766,954.070007
+2009-07-23,90.08000200000001,,,2009-07-24,49.26,9069.290039,976.2899779999999
+2009-07-24,90.360001,,,2009-07-27,49.31,9093.240234,979.26001
+2009-07-27,90.629997,,,2009-07-28,49.1,9108.509766,982.179993
+2009-07-28,90.389999,,,2009-07-29,48.7,9096.719727,979.6199949999999
+2009-07-29,89.989998,,,2009-07-30,49.65,9070.719727,975.150024
+2009-07-30,91.07,,,2009-07-31,50.41,9154.459961,986.75
+2009-07-31,91.139999,,,2009-08-03,51.58,9171.610352,987.4799800000001
+2009-08-03,92.540001,,,2009-08-04,51.5,9286.55957,1002.6300050000001
+2009-08-04,92.82,,,2009-08-05,51.29,9320.19043,1005.650024
+2009-08-05,92.58000200000001,,,2009-08-06,50.97,9280.969727,1002.7199710000001
+2009-08-06,92.07,,,2009-08-07,50.92,9256.259766,997.080017
+2009-08-07,93.300003,,,2009-08-10,50.61,9370.070313,1010.4799800000001
+2009-08-10,92.989998,,,2009-08-12,50.89,9337.950195,1007.099976
+2009-08-11,91.839996,,,2009-08-13,51.67,9241.450195,994.349976
+2009-08-12,92.93,,,2009-08-14,51.23,9361.610352,1005.8099980000001
+2009-08-13,93.58000200000001,,,2009-08-17,49.58,9398.19043,1012.7299800000001
+2009-08-14,92.779999,,,2009-08-18,50.44,9321.400391,1004.090027
+2009-08-17,90.550003,,,2009-08-19,50.87,9135.339844,979.7299800000001
+2009-08-18,91.489998,,,2009-08-20,51.23,9217.94043,989.669983
+2009-08-19,92.129997,,,2009-08-21,52.35,9279.160156,996.4600220000001
+2009-08-20,93.139999,,,2009-08-24,52.34,9350.049805,1007.3699949999999
+2009-08-21,94.889999,,,2009-08-25,52.86,9505.959961,1026.130005
+2009-08-24,94.839996,,,2009-08-26,52.64,9509.280273,1025.569946
+2009-08-25,95.059998,,,2009-08-27,53.04,9539.290039,1028.0
+2009-08-26,95.089996,,,2009-08-28,53.07,9543.519531,1028.119995
+2009-08-27,95.360001,,,2009-08-31,52.68,9580.629883,1030.97998
+2009-08-28,95.18,,,2009-09-01,51.37,9544.200195,1028.930054
+2009-08-31,94.41999799999999,,,2009-09-02,51.31,9496.280273,1020.6199949999999
+2009-09-01,92.33000200000001,,,2009-09-03,51.71,9310.599609,998.0399779999999
+2009-09-02,92.050003,,,2009-09-04,52.5,9280.669922,994.75
+2009-09-03,92.839996,,,2009-09-08,53.54,9344.610352,1003.23999
+2009-09-04,94.07,,,2009-09-09,54.2,9441.269531,1016.400024
+2009-09-08,94.910004,,,2009-09-10,54.68,9497.339844,1025.390015
+2009-09-09,95.650002,,,2009-09-11,54.61,9547.219727,1033.369995
+2009-09-10,96.650002,,,2009-09-14,54.72,9627.480469,1044.140015
+2009-09-11,96.540001,,,2009-09-15,54.73,9605.410156,1042.72998
+2009-09-14,97.150002,,,2009-09-16,55.81,9626.799805,1049.339966
+2009-09-15,97.459999,,,2009-09-17,55.45,9683.410156,1052.630005
+2009-09-16,98.959999,,,2009-09-18,55.6,9791.709961,1068.76001
+2009-09-17,98.66999799999999,,,2009-09-21,55.01,9783.919922,1065.48999
+2009-09-18,98.93,,,2009-09-22,55.77,9820.200195,1068.300049
+2009-09-21,98.589996,,,2009-09-23,55.29,9778.860352,1064.660034
+2009-09-22,99.239998,,,2009-09-24,54.48,9829.870117,1071.660034
+2009-09-23,98.239998,,,2009-09-25,54.25,9748.549805,1060.869995
+2009-09-24,97.32,,,2009-09-28,54.99,9707.44043,1050.780029
+2009-09-25,96.730003,,,2009-09-29,54.66,9665.19043,1044.380005
+2009-09-28,97.980003,,,2009-09-30,54.68,9789.360352,1062.97998
+2009-09-29,97.769997,,,2009-10-01,53.25,9742.200195,1060.609985
+2009-09-30,97.449997,,,2009-10-02,52.66,9712.280273,1057.079956
+2009-10-01,94.940002,,,2009-10-05,53.42,9509.280273,1029.849976
+2009-10-02,94.519997,,,2009-10-06,54.32,9487.669922,1025.209961
+2009-10-05,95.91999799999999,,,2009-10-07,54.52,9599.75,1040.459961
+2009-10-06,97.239998,,,2009-10-08,55.31,9731.25,1054.719971
+2009-10-07,97.550003,,,2009-10-09,55.17,9725.580078,1057.579956
+2009-10-08,98.279999,,,2009-10-12,55.5,9786.870117,1065.47998
+2009-10-09,98.839996,,,2009-10-13,55.38,9864.94043,1071.48999
+2009-10-12,99.269997,,,2009-10-14,56.71,9885.799805,1076.189941
+2009-10-13,99.0,,,2009-10-15,56.97,9871.05957,1073.189941
+2009-10-14,100.739998,,,2009-10-16,56.11,10015.860352,1092.02002
+2009-10-15,101.160004,,,2009-10-19,57.01,10062.94043,1096.560059
+2009-10-16,100.339996,,,2009-10-20,56.71,9995.910156,1087.680054
+2009-10-19,101.279999,,,2009-10-21,56.52,10092.19043,1097.910034
+2009-10-20,100.660004,,,2009-10-22,57.07,10041.480469,1091.060059
+2009-10-21,99.779999,,,2009-10-23,56.17,9949.360352,1081.400024
+2009-10-22,100.849998,,,2009-10-26,55.32,10081.30957,1092.910034
+2009-10-23,99.620003,,,2009-10-27,54.88,9972.179688,1079.599976
+2009-10-26,98.449997,,,2009-10-28,53.56,9867.959961,1066.949951
+2009-10-27,98.120003,,,2009-10-29,55.14,9882.169922,1063.410034
+2009-10-28,96.220001,,,2009-10-30,53.3,9762.69043,1042.630005
+2009-10-29,98.389999,,,2009-11-02,53.82,9962.580078,1066.109985
+2009-10-30,95.629997,,,2009-11-03,53.61,9712.730469,1036.189941
+2009-11-02,96.25,,,2009-11-04,54.15,9789.44043,1042.880005
+2009-11-03,96.480003,,,2009-11-05,54.85,9771.910156,1045.410034
+2009-11-04,96.620003,,,2009-11-06,55.01,9802.139648,1046.5
+2009-11-05,98.480003,,,2009-11-09,56.55,10005.959961,1066.630005
+2009-11-06,98.739998,,,2009-11-10,56.25,10023.419922,1069.300049
+2009-11-09,100.959999,,,2009-11-11,56.42,10226.94043,1093.079956
+2009-11-10,100.980003,,,2009-11-12,55.6,10246.969727,1093.01001
+2009-11-11,101.489998,,,2009-11-13,56.38,10291.259766,1098.51001
+2009-11-12,100.459999,,,2009-11-16,57.28,10197.469727,1087.23999
+2009-11-13,101.040001,,,2009-11-17,56.9,10270.469727,1093.47998
+2009-11-16,102.519997,,,2009-11-18,56.72,10406.959961,1109.300049
+2009-11-17,102.620003,,,2009-11-19,55.65,10437.419922,1110.319946
+2009-11-18,102.589996,,,2009-11-20,55.34,10426.30957,1109.800049
+2009-11-19,101.209999,,,2009-11-23,56.33,10332.44043,1094.900024
+2009-11-20,100.910004,,,2009-11-24,56.1,10318.160156,1091.380005
+2009-11-23,102.279999,,,2009-11-25,56.85,10450.950195,1106.23999
+2009-11-24,102.239998,,,2009-11-27,55.21,10433.709961,1105.650024
+2009-11-25,102.709999,,,2009-11-30,55.39,10464.400391,1110.630005
+2009-11-27,100.959999,,,2009-12-01,56.91,10309.919922,1091.48999
+2009-11-30,101.349998,,,2009-12-02,57.0,10344.839844,1095.630005
+2009-12-01,102.58000200000001,,,2009-12-03,56.87,10471.580078,1108.859985
+2009-12-02,102.629997,,,2009-12-04,56.67,10452.679688,1109.23999
+2009-12-03,101.769997,,,2009-12-07,56.36,10366.150391,1099.920044
+2009-12-04,102.33000200000001,,,2009-12-08,55.38,10388.900391,1105.97998
+2009-12-07,102.08000200000001,,,2009-12-09,55.31,10390.110352,1103.25
+2009-12-08,101.050003,,,2009-12-10,55.48,10285.969727,1091.939941
+2009-12-09,101.43,,,2009-12-11,55.46,10337.049805,1095.949951
+2009-12-10,102.029999,,,2009-12-14,56.0,10405.830078,1102.349976
+2009-12-11,102.41999799999999,,,2009-12-15,55.38,10471.5,1106.410034
+2009-12-14,103.139999,,,2009-12-16,56.03,10501.049805,1114.109985
+2009-12-15,102.57,,,2009-12-17,54.71,10452.0,1107.930054
+2009-12-16,102.690002,,,2009-12-18,54.84,10441.120117,1109.180054
+2009-12-17,101.480003,,,2009-12-21,55.0,10308.259766,1096.079956
+2009-12-18,102.07,,,2009-12-22,54.85,10328.889648,1102.469971
+2009-12-21,103.150002,,,2009-12-23,55.35,10414.139648,1114.050049
+2009-12-22,103.519997,,,2009-12-24,55.57,10464.929688,1118.02002
+2009-12-23,103.790001,,,2009-12-28,55.81,10466.44043,1120.589966
+2009-12-24,104.339996,,,2009-12-29,55.9,10520.089844,1126.47998
+2009-12-28,103.809998,,,2009-12-30,55.67,10547.080078,1127.780029
+2009-12-29,103.68,,,2009-12-31,55.28,10545.410156,1126.199951
+2009-12-30,103.709999,,,2010-01-04,56.73,10548.509766,1126.420044
+2009-12-31,102.66999799999999,,,2010-01-05,56.78,10428.049805,1115.099976
+2010-01-04,104.32,,,2010-01-06,57.02,10583.959961,1132.98999
+2010-01-05,104.639999,,,2010-01-07,56.8,10572.019531,1136.52002
+2010-01-06,104.75,,,2010-01-08,57.25,10573.679688,1137.140015
+2010-01-07,105.16999799999999,,,2010-01-11,57.72,10606.860352,1141.689941
+2010-01-08,105.480003,,,2010-01-12,57.04,10618.19043,1144.97998
+2010-01-11,105.660004,,,2010-01-13,57.52,10663.990234,1146.97998
+2010-01-12,104.66999799999999,,,2010-01-14,57.96,10627.259766,1136.219971
+2010-01-13,105.550003,,,2010-01-15,57.05,10680.769531,1145.680054
+2010-01-14,105.809998,,,2010-01-19,57.61,10710.549805,1148.459961
+2010-01-15,104.66999799999999,,,2010-01-20,56.14,10609.650391,1136.030029
+2010-01-19,105.970001,,,2010-01-21,54.94,10725.429688,1150.22998
+2010-01-20,104.860001,,,2010-01-22,53.87,10603.150391,1138.040039
+2010-01-21,102.879997,,,2010-01-25,54.53,10389.879883,1116.47998
+2010-01-22,100.599998,,,2010-01-26,54.22,10172.980469,1091.76001
+2010-01-25,101.059998,,,2010-01-27,54.16,10196.860352,1096.780029
+2010-01-26,100.639999,,,2010-01-28,53.25,10194.290039,1092.170044
+2010-01-27,101.139999,,,2010-01-29,52.48,10236.160156,1097.5
+2010-01-28,99.949997,,,2010-02-01,53.44,10120.459961,1084.530029
+2010-01-29,98.970001,,,2010-02-02,54.33,10067.330078,1073.869995
+2010-02-01,100.379997,,,2010-02-03,53.76,10185.530273,1089.189941
+2010-02-02,101.68,,,2010-02-04,51.57,10296.849609,1103.319946
+2010-02-03,101.160004,,,2010-02-05,51.48,10270.549805,1097.280029
+2010-02-04,98.010002,,,2010-02-08,50.46,10002.179688,1063.109985
+2010-02-05,98.290001,,,2010-02-09,52.05,10012.230469,1066.189941
+2010-02-08,97.449997,,,2010-02-10,51.72,9908.389648,1056.73999
+2010-02-09,98.730003,,,2010-02-11,52.2,10058.639648,1070.52002
+2010-02-10,98.529999,,,2010-02-12,51.75,10038.379883,1068.130005
+2010-02-11,99.5,,,2010-02-16,52.9,10144.19043,1078.469971
+2010-02-12,99.25,,,2010-02-17,52.97,10099.139648,1075.51001
+2010-02-16,101.050003,,,2010-02-18,53.27,10268.80957,1094.869995
+2010-02-17,101.5,,,2010-02-19,52.94,10309.240234,1099.51001
+2010-02-18,102.16999799999999,,,2010-02-22,53.04,10392.900391,1106.75
+2010-02-19,102.410004,,,2010-02-23,52.29,10402.349609,1109.170044
+2010-02-22,102.300003,,,2010-02-24,52.62,10383.379883,1108.01001
+2010-02-23,101.07,,,2010-02-25,52.3,10282.410156,1094.599976
+2010-02-24,102.07,,,2010-02-26,52.62,10374.160156,1105.23999
+2010-02-25,101.879997,,,2010-03-01,53.03,10321.030273,1102.939941
+2010-02-26,102.029999,,,2010-03-02,53.43,10325.259766,1104.48999
+2010-03-01,103.059998,,,2010-03-03,54.07,10403.790039,1115.709961
+2010-03-02,103.300003,,,2010-03-04,53.93,10405.980469,1118.310059
+2010-03-03,103.360001,,,2010-03-05,54.98,10396.759766,1118.790039
+2010-03-04,103.75,,,2010-03-08,54.98,10444.139648,1122.969971
+2010-03-05,105.209999,,,2010-03-09,54.85,10566.200195,1138.699951
+2010-03-08,105.209999,,,2010-03-10,55.08,10552.519531,1138.5
+2010-03-09,105.389999,,,2010-03-11,55.29,10564.379883,1140.449951
+2010-03-10,105.879997,,,2010-03-12,55.66,10567.330078,1145.609985
+2010-03-11,106.33000200000001,,,2010-03-15,55.27,10611.839844,1150.23999
+2010-03-12,106.309998,,,2010-03-16,55.97,10624.69043,1149.98999
+2010-03-15,106.360001,,,2010-03-17,56.27,10642.150391,1150.51001
+2010-03-16,107.199997,,,2010-03-18,55.94,10685.980469,1159.459961
+2010-03-17,107.83000200000001,,,2010-03-19,55.37,10733.669922,1166.209961
+2010-03-18,107.790001,,,2010-03-22,55.53,10779.169922,1165.829956
+2010-03-19,107.239998,,,2010-03-23,55.92,10741.980469,1159.900024
+2010-03-22,107.790001,,,2010-03-24,55.0,10785.889648,1165.810059
+2010-03-23,108.58000200000001,,,2010-03-25,54.97,10888.830078,1174.170044
+2010-03-24,107.980003,,,2010-03-26,55.51,10836.150391,1167.719971
+2010-03-25,107.800003,,,2010-03-29,55.98,10841.209961,1165.72998
+2010-03-26,107.879997,,,2010-03-30,55.98,10850.360352,1166.589966
+2010-03-29,108.07,,,2010-03-31,55.98,10895.860352,1173.219971
+2010-03-30,108.089996,,,2010-04-01,56.97,10907.419922,1173.27002
+2010-03-31,107.730003,,,2010-04-05,57.03,10856.629883,1169.430054
+2010-04-01,108.540001,,,2010-04-06,56.87,10927.070313,1178.099976
+2010-04-05,109.400002,,,2010-04-07,56.47,10973.549805,1187.439941
+2010-04-06,109.589996,,,2010-04-08,56.41,10969.990234,1189.439941
+2010-04-07,108.989998,,,2010-04-09,57.15,10897.519531,1182.449951
+2010-04-08,109.360001,,,2010-04-12,57.33,10927.070313,1186.439941
+2010-04-09,110.089996,,,2010-04-13,57.28,10997.349609,1194.369995
+2010-04-12,110.290001,,,2010-04-14,58.04,11005.969727,1196.47998
+2010-04-13,110.370003,,,2010-04-15,58.0,11019.419922,1197.300049
+2010-04-14,111.599998,,,2010-04-16,56.72,11123.110352,1210.650024
+2010-04-15,111.699997,,,2010-04-19,56.57,11144.570313,1211.670044
+2010-04-16,109.900002,,,2010-04-20,56.92,11018.660156,1192.130005
+2010-04-19,110.389999,,,2010-04-21,56.55,11092.049805,1197.52002
+2010-04-20,111.279999,,,2010-04-22,56.04,11117.05957,1207.170044
+2010-04-21,111.16999799999999,,,2010-04-23,56.46,11124.919922,1205.939941
+2010-04-22,111.43,,,2010-04-26,56.52,11134.290039,1208.670044
+2010-04-23,112.220001,,,2010-04-27,54.25,11204.280273,1217.280029
+2010-04-26,111.739998,,,2010-04-28,54.26,11205.030273,1212.050049
+2010-04-27,109.120003,,,2010-04-29,55.1,10991.990234,1183.709961
+2010-04-28,109.849998,,,2010-04-30,54.41,11045.269531,1191.359985
+2010-04-29,111.279999,,,2010-05-03,54.8,11167.320313,1206.780029
+2010-04-30,109.43,,,2010-05-04,52.63,11008.610352,1186.689941
+2010-05-03,110.860001,,,2010-05-05,51.62,11151.830078,1202.26001
+2010-05-04,108.220001,,,2010-05-06,49.32,10926.769531,1173.599976
+2010-05-05,107.540001,,,2010-05-07,49.21,10866.830078,1165.869995
+2010-05-06,104.08000200000001,,,2010-05-10,52.4,10520.320313,1128.150024
+2010-05-07,102.480003,,,2010-05-11,51.55,10380.429688,1110.880005
+2010-05-10,106.989998,,,2010-05-12,52.13,10785.139648,1159.72998
+2010-05-11,106.650002,,,2010-05-13,51.45,10748.259766,1155.790039
+2010-05-12,108.150002,,,2010-05-14,49.99,10896.910156,1171.670044
+2010-05-13,106.849998,,,2010-05-17,50.06,10782.950195,1157.439941
+2010-05-14,104.839996,,,2010-05-18,48.98,10620.160156,1135.680054
+2010-05-17,104.970001,,,2010-05-19,49.17,10625.830078,1136.939941
+2010-05-18,103.5,,,2010-05-20,47.46,10510.950195,1120.800049
+2010-05-19,102.980003,,,2010-05-21,48.62,10444.370117,1115.050049
+2010-05-20,98.970001,,,2010-05-24,47.51,10068.009766,1071.589966
+2010-05-21,100.459999,,,2010-05-25,47.32,10193.389648,1087.689941
+2010-05-24,99.160004,,,2010-05-26,46.62,10066.570313,1073.650024
+2010-05-25,99.199997,,,2010-05-27,49.27,10043.75,1074.030029
+2010-05-26,98.650002,,,2010-05-28,48.32,9974.450195,1067.949951
+2010-05-27,101.93,,,2010-06-01,47.84,10258.990234,1103.060059
+2010-05-28,100.68,,,2010-06-02,49.12,10136.629883,1089.410034
+2010-06-01,98.949997,,,2010-06-03,48.97,10024.019531,1070.709961
+2010-06-02,101.519997,,,2010-06-04,46.88,10249.540039,1098.380005
+2010-06-03,101.940002,,,2010-06-07,46.29,10255.280273,1102.829956
+2010-06-04,98.43,,,2010-06-08,47.03,9931.969727,1064.880005
+2010-06-07,97.110001,,,2010-06-09,46.86,9816.490234,1050.469971
+2010-06-08,98.190002,,,2010-06-10,48.84,9939.980469,1062.0
+2010-06-09,97.610001,,,2010-06-11,48.91,9899.25,1055.689941
+2010-06-10,100.489998,,,2010-06-14,49.22,10172.530273,1086.839966
+2010-06-11,100.959999,,,2010-06-15,50.78,10211.070313,1091.599976
+2010-06-14,100.779999,,,2010-06-16,50.54,10190.889648,1089.630005
+2010-06-15,103.150002,,,2010-06-17,50.7,10404.769531,1115.22998
+2010-06-16,103.099998,,,2010-06-18,50.61,10409.459961,1114.609985
+2010-06-17,103.239998,,,2010-06-21,50.6,10434.169922,1116.040039
+2010-06-18,103.379997,,,2010-06-22,49.96,10450.639648,1117.51001
+2010-06-21,102.980003,,,2010-06-23,49.43,10442.410156,1113.199951
+2010-06-22,101.339996,,,2010-06-24,48.57,10293.519531,1095.310059
+2010-06-23,101.040001,,,2010-06-25,48.85,10298.44043,1092.040039
+2010-06-24,99.339996,,,2010-06-28,48.49,10152.799805,1073.689941
+2010-06-25,99.620003,,,2010-06-29,46.83,10143.80957,1076.76001
+2010-06-28,98.93,,,2010-06-30,46.51,10138.519531,1074.569946
+2010-06-29,95.870003,,,2010-07-01,47.19,9870.299805,1041.23999
+2010-06-30,94.910004,,,2010-07-02,47.09,9774.019531,1030.709961
+2010-07-01,94.610001,,,2010-07-06,48.03,9732.530273,1027.369995
+2010-07-02,94.16999799999999,,,2010-07-07,49.52,9686.480469,1022.580017
+2010-07-06,94.66999799999999,,,2010-07-08,50.01,9743.620117,1028.060059
+2010-07-07,97.690002,,,2010-07-09,50.06,10018.280273,1060.27002
+2010-07-08,98.610001,,,2010-07-12,49.87,10138.990234,1070.25
+2010-07-09,99.32,,,2010-07-13,50.79,10198.030273,1077.959961
+2010-07-12,99.389999,,,2010-07-14,50.97,10216.269531,1078.75
+2010-07-13,100.93,,,2010-07-15,51.22,10363.019531,1095.339966
+2010-07-14,100.910004,,,2010-07-16,49.58,10366.719727,1095.170044
+2010-07-15,101.029999,,,2010-07-19,49.9,10359.30957,1096.47998
+2010-07-16,98.129997,,,2010-07-20,50.24,10097.900391,1064.880005
+2010-07-19,98.709999,,,2010-07-21,49.33,10154.429688,1071.25
+2010-07-20,99.839996,,,2010-07-22,50.99,10229.959961,1083.47998
+2010-07-21,98.57,,,2010-07-23,51.59,10120.530273,1069.589966
+2010-07-22,100.800003,,,2010-07-26,51.95,10322.299805,1093.670044
+2010-07-23,101.629997,,,2010-07-27,52.1,10424.620117,1102.660034
+2010-07-26,102.760002,,,2010-07-28,51.83,10525.429688,1115.01001
+2010-07-27,102.660004,,,2010-07-29,52.07,10537.69043,1113.839966
+2010-07-28,101.949997,,,2010-07-30,51.91,10497.879883,1106.130005
+2010-07-29,101.540001,,,2010-08-02,53.66,10467.160156,1101.530029
+2010-07-30,101.550003,,,2010-08-03,53.58,10465.94043,1101.599976
+2010-08-02,103.790001,,,2010-08-04,53.63,10674.379883,1125.859985
+2010-08-03,103.290001,,,2010-08-05,53.59,10636.379883,1120.459961
+2010-08-04,103.949997,,,2010-08-06,53.75,10680.429688,1127.23999
+2010-08-05,103.82,,,2010-08-09,53.81,10674.980469,1125.810059
+2010-08-06,103.449997,,,2010-08-10,53.38,10653.55957,1121.640015
+2010-08-09,104.010002,,,2010-08-11,50.95,10698.75,1127.790039
+2010-08-10,103.400002,,,2010-08-12,50.89,10644.25,1121.060059
+2010-08-11,100.529999,,,2010-08-13,50.71,10378.830078,1089.469971
+2010-08-12,100.0,,,2010-08-16,51.12,10319.950195,1083.609985
+2010-08-13,99.599998,,,2010-08-17,51.69,10303.150391,1079.25
+2010-08-16,99.620003,,,2010-08-18,51.67,10302.009766,1079.380005
+2010-08-17,100.860001,,,2010-08-19,50.84,10405.849609,1092.540039
+2010-08-18,101.029999,,,2010-08-20,50.31,10415.540039,1094.160034
+2010-08-19,99.32,,,2010-08-23,50.21,10271.209961,1075.630005
+2010-08-20,98.949997,,,2010-08-24,49.52,10213.620117,1071.689941
+2010-08-23,98.550003,,,2010-08-25,49.57,10174.410156,1067.359985
+2010-08-24,97.129997,,,2010-08-26,49.55,10040.450195,1051.869995
+2010-08-25,97.459999,,,2010-08-27,50.52,10060.05957,1055.329956
+2010-08-26,96.709999,,,2010-08-30,49.79,9985.80957,1047.219971
+2010-08-27,98.339996,,,2010-08-31,49.94,10150.650391,1064.589966
+2010-08-30,96.910004,,,2010-09-01,51.72,10009.730469,1048.920044
+2010-08-31,96.949997,,,2010-09-02,52.01,10014.719727,1049.329956
+2010-09-01,99.82,,,2010-09-03,52.49,10269.469727,1080.290039
+2010-09-02,100.739998,,,2010-09-07,51.76,10320.099609,1090.099976
+2010-09-03,102.07,,,2010-09-08,52.16,10447.929688,1104.51001
+2010-09-07,100.910004,,,2010-09-09,52.65,10340.69043,1091.839966
+2010-09-08,101.58000200000001,,,2010-09-10,52.81,10387.009766,1098.869995
+2010-09-09,102.07,,,2010-09-13,53.77,10415.240234,1104.180054
+2010-09-10,102.57,,,2010-09-14,54.13,10462.769531,1109.550049
+2010-09-13,103.739998,,,2010-09-15,54.15,10544.129883,1121.900024
+2010-09-14,103.66999799999999,,,2010-09-16,53.89,10526.490234,1121.099976
+2010-09-15,104.040001,,,2010-09-17,53.63,10572.730469,1125.069946
+2010-09-16,104.019997,,,2010-09-20,54.56,10594.830078,1124.660034
+2010-09-17,104.099998,,,2010-09-21,54.55,10607.849609,1125.589966
+2010-09-20,105.690002,,,2010-09-22,54.47,10753.620117,1142.709961
+2010-09-21,105.41999799999999,,,2010-09-23,53.88,10761.030273,1139.780029
+2010-09-22,104.91999799999999,,,2010-09-24,55.38,10739.30957,1134.280029
+2010-09-23,103.519997,,,2010-09-27,55.1,10662.419922,1124.829956
+2010-09-24,105.709999,,,2010-09-28,55.42,10860.259766,1148.670044
+2010-09-27,105.120003,,,2010-09-29,55.33,10812.040039,1142.160034
+2010-09-28,105.639999,,,2010-09-30,54.92,10858.139648,1147.699951
+2010-09-29,105.379997,,,2010-10-01,55.47,10835.280273,1144.72998
+2010-09-30,105.059998,,,2010-10-04,54.67,10788.049805,1141.199951
+2010-10-01,105.519997,,,2010-10-05,56.22,10829.679688,1146.23999
+2010-10-04,104.68,,,2010-10-06,56.69,10751.269531,1137.030029
+2010-10-05,106.860001,,,2010-10-07,56.5,10944.719727,1160.75
+2010-10-06,106.849998,,,2010-10-08,56.87,10967.650391,1159.969971
+2010-10-07,106.66999799999999,,,2010-10-11,56.8,10948.580078,1158.060059
+2010-10-08,107.32,,,2010-10-12,56.68,11006.480469,1165.150024
+2010-10-11,107.339996,,,2010-10-13,57.32,11010.339844,1165.319946
+2010-10-12,107.75,,,2010-10-14,57.72,11020.400391,1169.77002
+2010-10-13,108.519997,,,2010-10-15,57.53,11096.080078,1178.099976
+2010-10-14,108.129997,,,2010-10-18,57.66,11094.570313,1173.810059
+2010-10-15,108.349998,,,2010-10-19,56.39,11062.780273,1176.189941
+2010-10-18,109.129997,,,2010-10-20,57.45,11143.69043,1184.709961
+2010-10-19,107.400002,,,2010-10-21,57.14,10978.620117,1165.900024
+2010-10-20,108.550003,,,2010-10-22,57.29,11107.969727,1178.170044
+2010-10-21,108.75,,,2010-10-25,57.51,11146.570313,1180.26001
+2010-10-22,109.0,,,2010-10-26,57.14,11132.55957,1183.079956
+2010-10-25,109.239998,,,2010-10-27,56.59,11164.049805,1185.619995
+2010-10-26,109.239998,,,2010-10-28,57.03,11169.459961,1185.640015
+2010-10-27,108.959999,,,2010-10-29,57.01,11126.280273,1182.449951
+2010-10-28,109.089996,,,2010-11-01,56.8,11113.950195,1183.780029
+2010-10-29,109.040001,,,2010-11-02,57.74,11118.490234,1183.26001
+2010-11-01,109.139999,,,2010-11-03,58.14,11124.620117,1184.380005
+2010-11-02,109.989998,,,2010-11-04,59.46,11188.719727,1193.569946
+2010-11-03,110.41999799999999,,,2010-11-05,59.2,11215.129883,1197.959961
+2010-11-04,112.559998,,,2010-11-08,58.84,11434.839844,1221.060059
+2010-11-05,113.010002,,,2010-11-09,58.25,11444.080078,1225.849976
+2010-11-08,112.779999,,,2010-11-10,58.42,11406.839844,1223.25
+2010-11-09,111.910004,,,2010-11-11,57.92,11346.75,1213.400024
+2010-11-10,112.41999799999999,,,2010-11-12,57.44,11357.040039,1218.709961
+2010-11-11,111.949997,,,2010-11-15,57.4,11283.099609,1213.540039
+2010-11-12,110.629997,,,2010-11-16,56.05,11192.580078,1199.209961
+2010-11-15,110.5,,,2010-11-17,56.36,11201.969727,1197.75
+2010-11-16,108.739998,,,2010-11-18,57.77,11023.5,1178.339966
+2010-11-17,108.779999,,,2010-11-19,57.77,11007.879883,1178.589966
+2010-11-18,110.449997,,,2010-11-22,57.15,11181.230469,1196.689941
+2010-11-19,110.739998,,,2010-11-23,55.43,11203.549805,1199.72998
+2010-11-22,110.57,,,2010-11-24,56.31,11178.580078,1197.839966
+2010-11-23,108.989998,,,2010-11-26,55.37,11036.370117,1180.72998
+2010-11-24,110.620003,,,2010-11-29,54.88,11187.280273,1198.349976
+2010-11-26,109.82,,,2010-11-30,54.26,11091.870117,1189.400024
+2010-11-29,109.699997,,,2010-12-01,55.8,11052.490234,1187.76001
+2010-11-30,109.040001,,,2010-12-02,56.86,11006.019531,1180.550049
+2010-12-01,111.410004,,,2010-12-03,57.41,11255.780273,1206.069946
+2010-12-02,112.839996,,,2010-12-06,57.15,11362.410156,1221.530029
+2010-12-03,113.139999,,,2010-12-07,57.18,11382.089844,1224.709961
+2010-12-06,113.0,,,2010-12-08,57.35,11362.19043,1223.119995
+2010-12-07,113.059998,,,2010-12-09,57.5,11359.160156,1223.75
+2010-12-08,113.510002,,,2010-12-10,57.63,11372.480469,1228.280029
+2010-12-09,113.949997,,,2010-12-13,58.25,11370.05957,1233.0
+2010-12-10,114.639999,,,2010-12-14,58.34,11410.320313,1240.400024
+2010-12-13,114.660004,,,2010-12-15,57.57,11428.55957,1240.459961
+2010-12-14,114.760002,,,2010-12-16,57.89,11476.540039,1241.589966
+2010-12-15,114.18,,,2010-12-17,57.57,11457.469727,1235.22998
+2010-12-16,114.889999,,,2010-12-20,57.7,11499.25,1242.869995
+2010-12-17,114.980003,,,2010-12-21,57.64,11491.910156,1243.910034
+2010-12-20,115.279999,,,2010-12-22,57.75,11478.129883,1247.079956
+2010-12-21,115.989998,,,2010-12-23,57.72,11533.160156,1254.599976
+2010-12-22,116.400002,,,2010-12-27,57.6,11559.490234,1258.839966
+2010-12-23,115.720001,,,2010-12-28,57.65,11573.490234,1256.77002
+2010-12-27,115.790001,,,2010-12-29,58.15,11555.030273,1257.540039
+2010-12-28,115.879997,,,2010-12-30,57.87,11575.540039,1258.51001
+2010-12-29,116.019997,,,2010-12-31,58.22,11585.379883,1259.780029
+2010-12-30,115.839996,,,2011-01-03,58.7,11569.709961,1257.880005
+2010-12-31,115.82,,,2011-01-04,58.52,11577.509766,1257.640015
+2011-01-03,117.129997,,,2011-01-05,58.27,11670.75,1271.869995
+2011-01-04,116.980003,,,2011-01-06,57.6,11691.179688,1270.199951
+2011-01-05,117.58000200000001,,,2011-01-07,57.37,11722.889648,1276.560059
+2011-01-06,117.379997,,,2011-01-10,57.27,11697.30957,1273.849976
+2011-01-07,117.160004,,,2011-01-11,57.66,11674.759766,1271.5
+2011-01-10,117.0,,,2011-01-12,58.93,11637.450195,1269.75
+2011-01-11,117.43,,,2011-01-13,59.09,11671.879883,1274.47998
+2011-01-12,118.5,,,2011-01-14,59.45,11755.44043,1285.959961
+2011-01-13,118.300003,,,2011-01-18,59.84,11731.900391,1283.76001
+2011-01-14,119.18,,,2011-01-19,59.43,11787.379883,1293.23999
+2011-01-18,119.349998,,,2011-01-20,58.92,11837.929688,1295.02002
+2011-01-19,118.150002,,,2011-01-21,59.24,11825.290039,1281.920044
+2011-01-20,118.0,,,2011-01-24,59.87,11822.799805,1280.26001
+2011-01-21,118.290001,,,2011-01-25,59.75,11871.839844,1283.349976
+2011-01-24,118.980003,,,2011-01-26,60.13,11980.519531,1290.839966
+2011-01-25,119.010002,,,2011-01-27,60.27,11977.19043,1291.180054
+2011-01-26,119.519997,,,2011-01-28,58.93,11985.44043,1296.630005
+2011-01-27,119.790001,,,2011-01-31,59.44,11989.830078,1299.540039
+2011-01-28,117.650002,,,2011-02-01,60.85,11823.700195,1276.339966
+2011-01-31,118.550003,,,2011-02-02,60.78,11891.929688,1286.119995
+2011-02-01,120.529999,,,2011-02-03,60.81,12040.160156,1307.589966
+2011-02-02,120.220001,,,2011-02-04,60.79,12041.969727,1304.030029
+2011-02-03,120.519997,,,2011-02-07,60.98,12062.259766,1307.099976
+2011-02-04,120.870003,,,2011-02-08,61.38,12092.150391,1310.869995
+2011-02-07,121.629997,,,2011-02-09,61.2,12161.629883,1319.050049
+2011-02-08,122.16999799999999,,,2011-02-10,60.8,12233.150391,1324.569946
+2011-02-09,121.849998,,,2011-02-11,60.83,12239.889648,1320.880005
+2011-02-10,121.949997,,,2011-02-14,60.95,12229.290039,1321.869995
+2011-02-11,122.639999,,,2011-02-15,60.82,12273.259766,1329.150024
+2011-02-14,122.949997,,,2011-02-16,61.5,12268.19043,1332.319946
+2011-02-15,122.57,,,2011-02-17,61.71,12226.639648,1328.01001
+2011-02-16,123.360001,,,2011-02-18,61.91,12288.169922,1336.319946
+2011-02-17,123.75,,,2011-02-22,60.13,12318.139648,1340.430054
+2011-02-18,123.989998,,,2011-02-23,60.22,12391.25,1343.01001
+2011-02-22,121.440002,,,2011-02-24,60.27,12212.790039,1315.439941
+2011-02-23,120.699997,,,2011-02-25,61.04,12105.780273,1307.400024
+2011-02-24,120.610001,,,2011-02-28,61.55,12068.5,1306.099976
+2011-02-25,121.91999799999999,,,2011-03-01,60.69,12130.450195,1319.880005
+2011-02-28,122.599998,,,2011-03-02,60.99,12226.339844,1327.219971
+2011-03-01,120.66999799999999,,,2011-03-03,61.79,12058.019531,1306.329956
+2011-03-02,120.879997,,,2011-03-04,61.23,12066.799805,1308.439941
+2011-03-03,122.970001,,,2011-03-07,60.62,12258.200195,1330.969971
+2011-03-04,122.059998,,,2011-03-08,60.85,12169.879883,1321.150024
+2011-03-07,121.050003,,,2011-03-09,60.85,12090.030273,1310.130005
+2011-03-08,122.150002,,,2011-03-10,59.35,12214.379883,1321.819946
+2011-03-09,122.0,,,2011-03-11,59.34,12213.089844,1320.02002
+2011-03-10,119.699997,,,2011-03-14,58.28,11984.610352,1295.109985
+2011-03-11,120.58000200000001,,,2011-03-15,57.06,12044.400391,1304.280029
+2011-03-14,119.849998,,,2011-03-16,55.31,11993.160156,1296.390015
+2011-03-15,118.510002,,,2011-03-17,57.13,11855.419922,1281.869995
+2011-03-16,116.209999,,,2011-03-18,57.9,11613.299805,1256.880005
+2011-03-17,117.760002,,,2011-03-21,59.37,11774.589844,1273.719971
+2011-03-18,118.269997,,,2011-03-22,59.18,11858.519531,1279.209961
+2011-03-21,120.040001,,,2011-03-23,59.25,12036.530273,1298.380005
+2011-03-22,119.629997,,,2011-03-24,60.04,12018.629883,1293.77002
+2011-03-23,119.980003,,,2011-03-25,59.38,12086.019531,1297.540039
+2011-03-24,120.589996,,,2011-03-28,59.35,12170.55957,1309.660034
+2011-03-25,120.980003,,,2011-03-29,59.66,12220.589844,1313.800049
+2011-03-28,120.639999,,,2011-03-30,60.37,12197.879883,1310.189941
+2011-03-29,121.519997,,,2011-03-31,60.09,12279.009766,1319.439941
+2011-03-30,122.339996,,,2011-04-01,60.65,12350.610352,1328.26001
+2011-03-31,122.120003,,,2011-04-04,60.73,12319.730469,1325.829956
+2011-04-01,122.730003,,,2011-04-05,60.57,12376.719727,1332.410034
+2011-04-04,122.779999,,,2011-04-06,61.08,12400.030273,1332.869995
+2011-04-05,122.760002,,,2011-04-07,60.78,12393.900391,1332.630005
+2011-04-06,123.08000200000001,,,2011-04-08,61.28,12426.75,1335.540039
+2011-04-07,122.900002,,,2011-04-11,61.16,12409.490234,1333.51001
+2011-04-08,122.400002,,,2011-04-12,60.59,12380.049805,1328.170044
+2011-04-11,122.059998,,,2011-04-13,60.74,12381.110352,1324.459961
+2011-04-12,121.120003,,,2011-04-14,61.04,12263.580078,1314.160034
+2011-04-13,121.150002,,,2011-04-15,60.95,12270.990234,1314.410034
+2011-04-14,121.160004,,,2011-04-18,59.7,12285.150391,1314.52002
+2011-04-15,121.639999,,,2011-04-19,60.14,12341.830078,1319.680054
+2011-04-18,120.300003,,,2011-04-20,61.71,12201.589844,1305.140015
+2011-04-19,120.989998,,,2011-04-21,62.07,12266.75,1312.619995
+2011-04-20,122.629997,,,2011-04-25,62.07,12453.540039,1330.359985
+2011-04-21,123.279999,,,2011-04-26,62.56,12505.990234,1337.380005
+2011-04-25,123.08000200000001,,,2011-04-27,63.32,12479.879883,1335.25
+2011-04-26,124.18,,,2011-04-28,63.76,12595.370117,1347.23999
+2011-04-27,124.980003,,,2011-04-29,63.46,12690.959961,1355.660034
+2011-04-28,125.43,,,2011-05-02,63.87,12763.30957,1360.47998
+2011-04-29,125.720001,,,2011-05-03,63.35,12810.540039,1363.609985
+2011-05-02,125.5,,,2011-05-04,62.82,12807.360352,1361.219971
+2011-05-03,125.08000200000001,,,2011-05-05,61.55,12807.509766,1356.619995
+2011-05-04,124.239998,,,2011-05-06,61.6,12723.580078,1347.319946
+2011-05-05,123.120003,,,2011-05-09,62.04,12584.169922,1335.099976
+2011-05-06,123.599998,,,2011-05-10,62.63,12638.740234,1340.199951
+2011-05-09,124.16999799999999,,,2011-05-11,61.37,12684.679688,1346.290039
+2011-05-10,125.16999799999999,,,2011-05-12,61.57,12760.360352,1357.160034
+2011-05-11,123.849998,,,2011-05-13,60.61,12630.030273,1342.079956
+2011-05-12,124.470001,,,2011-05-16,60.5,12695.919922,1348.650024
+2011-05-13,123.470001,,,2011-05-17,60.64,12595.75,1337.77002
+2011-05-16,122.709999,,,2011-05-18,60.99,12548.370117,1329.469971
+2011-05-17,122.690002,,,2011-05-19,61.36,12479.580078,1328.97998
+2011-05-18,123.800003,,,2011-05-20,60.43,12560.179688,1340.680054
+2011-05-19,124.08000200000001,,,2011-05-23,59.08,12605.320313,1343.599976
+2011-05-20,123.120003,,,2011-05-24,59.42,12512.040039,1333.27002
+2011-05-23,121.650002,,,2011-05-25,59.8,12381.259766,1317.369995
+2011-05-24,121.550003,,,2011-05-26,60.36,12356.209961,1316.280029
+2011-05-25,121.949997,,,2011-05-27,60.8,12394.660156,1320.469971
+2011-05-26,122.459999,,,2011-05-31,62.06,12402.759766,1325.689941
+2011-05-27,122.980003,,,2011-06-01,60.59,12441.580078,1331.099976
+2011-05-31,124.279999,,,2011-06-02,60.91,12569.790039,1345.199951
+2011-06-01,121.470001,,,2011-06-03,60.93,12290.139648,1314.550049
+2011-06-02,121.32,,,2011-06-06,60.14,12248.549805,1312.939941
+2011-06-03,120.150002,,,2011-06-07,60.68,12151.259766,1300.160034
+2011-06-06,118.860001,,,2011-06-08,59.93,12089.959961,1286.170044
+2011-06-07,118.75,,,2011-06-09,60.55,12070.80957,1284.939941
+2011-06-08,118.269997,,,2011-06-10,59.11,12048.94043,1279.560059
+2011-06-09,119.150002,,,2011-06-13,59.22,12124.360352,1289.0
+2011-06-10,117.480003,,,2011-06-14,60.26,11951.910156,1270.97998
+2011-06-13,117.599998,,,2011-06-15,58.27,11952.969727,1271.829956
+2011-06-14,119.089996,,,2011-06-16,58.07,12076.110352,1287.869995
+2011-06-15,117.019997,,,2011-06-17,58.68,11897.269531,1265.420044
+2011-06-16,117.239998,,,2011-06-20,58.6,11961.519531,1267.640015
+2011-06-17,117.599998,,,2011-06-21,59.85,12004.360352,1271.5
+2011-06-20,118.230003,,,2011-06-22,58.14,12080.379883,1278.359985
+2011-06-21,119.83000200000001,,,2011-06-23,57.65,12190.009766,1295.52002
+2011-06-22,119.059998,,,2011-06-24,57.1,12109.669922,1287.140015
+2011-06-23,118.190002,,,2011-06-27,57.6,12050.0,1283.5
+2011-06-24,116.800003,,,2011-06-28,58.26,11934.580078,1268.449951
+2011-06-27,117.870003,,,2011-06-29,59.28,12043.55957,1280.099976
+2011-06-28,119.41999799999999,,,2011-06-30,60.14,12188.69043,1296.670044
+2011-06-29,120.43,,,2011-07-01,60.8,12261.419922,1307.410034
+2011-06-30,121.650002,,,2011-07-05,60.44,12414.339844,1320.640015
+2011-07-01,123.410004,,,2011-07-06,60.06,12582.769531,1339.670044
+2011-07-05,123.25,,,2011-07-07,60.59,12569.870117,1337.880005
+2011-07-06,123.41999799999999,,,2011-07-08,59.82,12626.019531,1339.219971
+2011-07-07,124.720001,,,2011-07-11,58.03,12719.490234,1353.219971
+2011-07-08,123.849998,,,2011-07-12,57.66,12657.200195,1343.800049
+2011-07-11,121.610001,,,2011-07-13,58.48,12505.759766,1319.48999
+2011-07-12,121.07,,,2011-07-14,57.99,12446.879883,1313.640015
+2011-07-13,121.459999,,,2011-07-15,58.18,12491.610352,1317.719971
+2011-07-14,120.639999,,,2011-07-18,57.32,12437.120117,1308.869995
+2011-07-15,121.309998,,,2011-07-19,58.2,12479.730469,1316.140015
+2011-07-18,120.33000200000001,,,2011-07-20,58.87,12385.160156,1305.439941
+2011-07-19,122.290001,,,2011-07-21,60.13,12587.419922,1326.72998
+2011-07-20,122.230003,,,2011-07-22,60.22,12571.910156,1325.839966
+2011-07-21,123.889999,,,2011-07-25,59.79,12724.410156,1343.800049
+2011-07-22,124.010002,,,2011-07-26,60.16,12681.160156,1345.02002
+2011-07-25,123.309998,,,2011-07-27,58.69,12592.799805,1337.430054
+2011-07-26,122.800003,,,2011-07-28,58.56,12501.299805,1331.939941
+2011-07-27,120.309998,,,2011-07-29,58.65,12302.549805,1304.890015
+2011-07-28,119.93,,,2011-08-01,57.97,12240.110352,1300.670044
+2011-07-29,119.160004,,,2011-08-02,56.44,12143.240234,1292.280029
+2011-08-01,118.660004,,,2011-08-03,56.79,12132.490234,1286.939941
+2011-08-02,115.629997,,,2011-08-04,52.79,11866.620117,1254.050049
+2011-08-03,116.25,,,2011-08-05,53.75,11896.44043,1260.339966
+2011-08-04,110.699997,,,2011-08-08,49.73,11383.679688,1200.069946
+2011-08-05,110.639999,,,2011-08-09,53.08,11444.610352,1199.380005
+2011-08-08,103.279999,,,2011-08-10,49.89,10809.849609,1119.459961
+2011-08-09,108.18,,,2011-08-11,52.3,11239.769531,1172.530029
+2011-08-10,103.449997,,,2011-08-12,52.91,10719.94043,1120.76001
+2011-08-11,108.25,,,2011-08-15,54.13,11143.30957,1172.640015
+2011-08-12,108.82,,,2011-08-16,53.34,11269.019531,1178.810059
+2011-08-15,111.199997,,,2011-08-17,53.65,11482.900391,1204.48999
+2011-08-16,110.139999,,,2011-08-18,51.03,11405.929688,1192.76001
+2011-08-17,110.269997,,,2011-08-19,50.17,11410.209961,1193.890015
+2011-08-18,105.360001,,,2011-08-22,50.47,10990.580078,1140.650024
+2011-08-19,103.779999,,,2011-08-23,52.16,10817.650391,1123.530029
+2011-08-22,103.809998,,,2011-08-24,52.15,10854.650391,1123.819946
+2011-08-23,107.360001,,,2011-08-25,50.87,11176.759766,1162.349976
+2011-08-24,108.790001,,,2011-08-26,51.69,11320.709961,1177.599976
+2011-08-25,107.099998,,,2011-08-29,52.93,11149.820313,1159.27002
+2011-08-26,108.730003,,,2011-08-30,52.63,11284.540039,1176.800049
+2011-08-29,111.82,,,2011-08-31,53.59,11539.25,1210.079956
+2011-08-30,112.099998,,,2011-09-01,52.91,11559.950195,1212.920044
+2011-08-31,112.66999799999999,,,2011-09-02,51.7,11613.530273,1218.890015
+2011-09-01,111.339996,,,2011-09-06,50.02,11493.570313,1204.420044
+2011-09-02,108.529999,,,2011-09-07,51.52,11240.259766,1173.969971
+2011-09-06,107.730003,,,2011-09-08,50.49,11139.299805,1165.23999
+2011-09-07,110.839996,,,2011-09-09,48.76,11414.860352,1198.619995
+2011-09-08,109.660004,,,2011-09-12,48.56,11295.80957,1185.900024
+2011-09-09,106.739998,,,2011-09-13,49.09,10992.129883,1154.22998
+2011-09-12,107.489998,,,2011-09-14,49.8,11061.120117,1162.27002
+2011-09-13,108.5,,,2011-09-15,50.89,11105.849609,1172.869995
+2011-09-14,109.959999,,,2011-09-16,50.85,11246.730469,1188.680054
+2011-09-15,111.879997,,,2011-09-19,49.48,11433.179688,1209.109985
+2011-09-16,112.519997,,,2011-09-20,49.7,11509.089844,1216.01001
+2011-09-19,111.410004,,,2011-09-21,48.25,11401.009766,1204.089966
+2011-09-20,111.230003,,,2011-09-22,46.66,11408.660156,1202.089966
+2011-09-21,107.959999,,,2011-09-23,47.19,11124.839844,1166.76001
+2011-09-22,103.970001,,,2011-09-26,48.16,10733.830078,1129.560059
+2011-09-23,104.610001,,,2011-09-27,49.35,10771.480469,1136.430054
+2011-09-26,107.050003,,,2011-09-28,48.54,11043.860352,1162.949951
+2011-09-27,108.199997,,,2011-09-29,49.46,11190.69043,1175.380005
+2011-09-28,105.989998,,,2011-09-30,47.75,11010.900391,1151.060059
+2011-09-29,106.849998,,,2011-10-03,46.52,11153.980469,1160.400024
+2011-09-30,104.18,,,2011-10-04,47.3,10913.379883,1131.420044
+2011-10-03,101.220001,,,2011-10-05,48.03,10655.299805,1099.22998
+2011-10-04,103.510002,,,2011-10-06,49.32,10808.709961,1123.949951
+2011-10-05,105.410004,,,2011-10-07,48.98,10939.950195,1144.030029
+2011-10-06,107.349998,,,2011-10-10,50.83,11123.330078,1164.969971
+2011-10-07,106.480003,,,2011-10-11,50.76,11103.120117,1155.459961
+2011-10-10,110.110001,,,2011-10-12,51.5,11433.179688,1194.890015
+2011-10-11,110.16999799999999,,,2011-10-13,51.52,11416.299805,1195.540039
+2011-10-12,111.269997,,,2011-10-14,52.12,11518.849609,1207.25
+2011-10-13,110.949997,,,2011-10-17,50.92,11478.129883,1203.660034
+2011-10-14,112.870003,,,2011-10-18,51.65,11644.490234,1224.579956
+2011-10-17,110.690002,,,2011-10-19,50.68,11397.0,1200.859985
+2011-10-18,112.949997,,,2011-10-20,50.85,11577.049805,1225.380005
+2011-10-19,111.540001,,,2011-10-21,52.1,11504.620117,1209.880005
+2011-10-20,112.050003,,,2011-10-24,52.86,11541.780273,1215.390015
+2011-10-21,114.160004,,,2011-10-25,51.95,11808.790039,1238.25
+2011-10-24,115.629997,,,2011-10-26,52.68,11913.620117,1254.189941
+2011-10-25,113.309998,,,2011-10-27,55.43,11706.620117,1229.050049
+2011-10-26,114.5,,,2011-10-28,55.2,11869.040039,1242.0
+2011-10-27,118.440002,,,2011-10-31,52.37,12208.549805,1284.589966
+2011-10-28,118.480003,,,2011-11-01,50.69,12231.110352,1285.089966
+2011-10-31,115.550003,,,2011-11-02,51.17,11955.009766,1253.300049
+2011-11-01,112.33000200000001,,,2011-11-03,52.46,11657.959961,1218.280029
+2011-11-02,114.150002,,,2011-11-04,51.8,11836.040039,1237.900024
+2011-11-03,116.309998,,,2011-11-07,52.02,12044.469727,1261.150024
+2011-11-04,115.58000200000001,,,2011-11-08,52.62,11983.240234,1253.22998
+2011-11-07,116.32,,,2011-11-09,49.95,12068.389648,1261.119995
+2011-11-08,117.75,,,2011-11-10,50.54,12170.179688,1275.920044
+2011-11-09,113.440002,,,2011-11-11,51.8,11780.94043,1229.099976
+2011-11-10,114.43,,,2011-11-14,50.88,11893.860352,1239.699951
+2011-11-11,116.660004,,,2011-11-15,50.74,12153.679688,1263.849976
+2011-11-14,115.559998,,,2011-11-16,49.77,12078.980469,1251.780029
+2011-11-15,116.139999,,,2011-11-17,49.23,12096.160156,1257.810059
+2011-11-16,114.239998,,,2011-11-18,49.4,11905.589844,1236.910034
+2011-11-17,112.33000200000001,,,2011-11-21,48.15,11770.730469,1216.130005
+2011-11-18,112.290001,,,2011-11-22,48.01,11796.160156,1215.650024
+2011-11-21,110.199997,,,2011-11-23,46.68,11547.30957,1192.97998
+2011-11-22,109.75,,,2011-11-25,46.45,11493.719727,1188.040039
+2011-11-23,107.33000200000001,,,2011-11-28,48.44,11257.549805,1161.790039
+2011-11-25,107.059998,,,2011-11-29,48.75,11231.650391,1158.670044
+2011-11-28,110.199997,,,2011-11-30,51.29,11523.009766,1192.550049
+2011-11-29,110.480003,,,2011-12-01,50.8,11555.629883,1195.189941
+2011-11-30,115.279999,,,2011-12-02,50.83,12045.679688,1246.959961
+2011-12-01,115.07,,,2011-12-05,51.37,12020.030273,1244.579956
+2011-12-02,115.040001,,,2011-12-06,51.13,12019.419922,1244.280029
+2011-12-05,116.230003,,,2011-12-07,51.49,12097.830078,1257.079956
+2011-12-06,116.360001,,,2011-12-08,49.81,12150.129883,1258.469971
+2011-12-07,116.629997,,,2011-12-09,51.04,12196.370117,1261.01001
+2011-12-08,114.16999799999999,,,2011-12-12,49.53,11997.700195,1234.349976
+2011-12-09,116.089996,,,2011-12-13,48.88,12184.259766,1255.189941
+2011-12-12,114.360001,,,2011-12-14,48.27,12021.389648,1236.469971
+2011-12-13,113.389999,,,2011-12-15,48.56,11954.94043,1225.72998
+2011-12-14,112.120003,,,2011-12-16,48.35,11823.480469,1211.819946
+2011-12-15,112.489998,,,2011-12-19,47.9,11868.80957,1215.75
+2011-12-16,112.860001,,,2011-12-20,49.01,11866.389648,1219.660034
+2011-12-19,111.529999,,,2011-12-21,48.73,11766.259766,1205.349976
+2011-12-20,114.879997,,,2011-12-22,49.18,12103.580078,1241.300049
+2011-12-21,115.099998,,,2011-12-23,49.5,12107.740234,1243.719971
+2011-12-22,115.43,,,2011-12-27,49.31,12169.650391,1254.0
+2011-12-23,116.470001,,,2011-12-28,48.43,12294.0,1265.329956
+2011-12-27,116.480003,,,2011-12-29,49.31,12291.349609,1265.430054
+2011-12-28,115.059998,,,2011-12-30,49.53,12151.410156,1249.640015
+2011-12-29,116.290001,,,2012-01-03,50.89,12287.040039,1263.02002
+2011-12-30,115.800003,,,2012-01-04,50.58,12217.55957,1257.599976
+2012-01-03,117.589996,,,2012-01-05,49.84,12397.379883,1277.060059
+2012-01-04,117.639999,,,2012-01-06,49.15,12418.419922,1277.300049
+2012-01-05,117.980003,,,2012-01-09,49.36,12415.700195,1281.060059
+2012-01-06,117.730003,,,2012-01-10,50.09,12359.919922,1277.810059
+2012-01-09,117.989998,,,2012-01-11,49.95,12392.69043,1280.699951
+2012-01-10,119.040001,,,2012-01-12,50.14,12462.469727,1292.079956
+2012-01-11,119.089996,,,2012-01-13,49.61,12449.450195,1292.47998
+2012-01-12,119.370003,,,2012-01-17,50.16,12471.019531,1295.5
+2012-01-13,118.779999,,,2012-01-18,51.03,12422.05957,1289.089966
+2012-01-17,119.199997,,,2012-01-19,51.66,12482.070313,1293.670044
+2012-01-18,120.540001,,,2012-01-20,51.93,12578.950195,1308.040039
+2012-01-19,121.139999,,,2012-01-23,52.13,12623.980469,1314.5
+2012-01-20,121.230003,,,2012-01-24,51.84,12720.480469,1315.380005
+2012-01-23,121.279999,,,2012-01-25,52.38,12708.820313,1316.0
+2012-01-24,121.160004,,,2012-01-26,52.4,12675.75,1314.650024
+2012-01-25,122.209999,,,2012-01-27,52.49,12758.849609,1326.060059
+2012-01-26,121.519997,,,2012-01-30,51.87,12734.629883,1318.430054
+2012-01-27,121.33000200000001,,,2012-01-31,52.14,12660.459961,1316.329956
+2012-01-30,121.019997,,,2012-02-01,52.97,12653.719727,1313.01001
+2012-01-31,120.970001,,,2012-02-03,53.91,12632.910156,1312.410034
+2012-02-01,122.07,,,2012-02-06,53.64,12716.459961,1324.089966
+2012-02-02,122.209999,,,2012-02-07,53.97,12705.410156,1325.540039
+2012-02-03,124.010002,,,2012-02-08,54.16,12862.230469,1344.900024
+2012-02-06,123.959999,,,2012-02-09,54.3,12845.129883,1344.329956
+2012-02-07,124.209999,,,2012-02-10,53.28,12878.200195,1347.050049
+2012-02-08,124.519997,,,2012-02-13,53.9,12883.950195,1349.959961
+2012-02-09,124.709999,,,2012-02-14,53.48,12890.459961,1351.949951
+2012-02-10,123.849998,,,2012-02-15,53.54,12801.230469,1342.640015
+2012-02-13,124.720001,,,2012-02-16,54.28,12874.040039,1351.77002
+2012-02-14,124.620003,,,2012-02-17,54.52,12878.280273,1350.5
+2012-02-15,124.0,,,2012-02-21,54.53,12780.950195,1343.22998
+2012-02-16,125.379997,,,2012-02-22,54.34,12904.080078,1358.040039
+2012-02-17,125.68,,,2012-02-23,54.82,12949.870117,1361.22998
+2012-02-21,125.769997,,,2012-02-24,55.15,12965.69043,1362.209961
+2012-02-22,125.349998,,,2012-02-27,54.87,12938.669922,1357.660034
+2012-02-23,125.910004,,,2012-02-28,55.38,12984.69043,1363.459961
+2012-02-24,126.139999,,,2012-02-29,54.7,12982.950195,1365.73999
+2012-02-27,126.32,,,2012-03-01,55.28,12981.509766,1367.589966
+2012-02-28,126.760002,,,2012-03-02,54.76,13005.120117,1372.180054
+2012-02-29,126.18,,,2012-03-05,54.48,12952.070313,1365.680054
+2012-03-01,126.970001,,,2012-03-06,52.74,12980.299805,1374.089966
+2012-03-02,126.559998,,,2012-03-07,53.39,12977.570313,1369.630005
+2012-03-05,126.08000200000001,,,2012-03-08,54.53,12962.80957,1364.329956
+2012-03-06,124.139999,,,2012-03-09,54.37,12759.150391,1343.359985
+2012-03-07,125.040001,,,2012-03-12,54.21,12837.330078,1352.630005
+2012-03-08,126.279999,,,2012-03-13,55.08,12907.94043,1365.910034
+2012-03-09,126.739998,,,2012-03-14,54.63,12922.019531,1370.869995
+2012-03-12,126.760002,,,2012-03-15,55.13,12959.709961,1371.089966
+2012-03-13,129.100006,,,2012-03-16,55.49,13177.679688,1395.949951
+2012-03-14,128.949997,,,2012-03-19,55.8,13194.099609,1394.280029
+2012-03-15,129.720001,,,2012-03-20,55.15,13252.759766,1402.599976
+2012-03-16,129.869995,,,2012-03-21,54.76,13232.620117,1404.170044
+2012-03-19,130.380005,,,2012-03-22,54.37,13239.129883,1409.75
+2012-03-20,129.990005,,,2012-03-23,54.78,13170.19043,1405.52002
+2012-03-21,129.759995,,,2012-03-26,55.47,13124.620117,1402.890015
+2012-03-22,128.830002,,,2012-03-27,55.14,13046.139648,1392.780029
+2012-03-23,128.690002,,,2012-03-28,54.75,13080.730469,1397.109985
+2012-03-26,130.479996,,,2012-03-29,54.42,13241.629883,1416.51001
+2012-03-27,130.119995,,,2012-03-30,54.9,13197.730469,1412.52002
+2012-03-28,129.509995,,,2012-04-02,55.51,13126.209961,1405.540039
+2012-03-29,129.300003,,,2012-04-03,54.57,13145.820313,1403.280029
+2012-03-30,129.779999,,,2012-04-04,53.35,13212.040039,1408.469971
+2012-04-02,130.759995,,,2012-04-05,53.02,13264.490234,1419.040039
+2012-04-03,130.270004,,,2012-04-09,52.78,13199.549805,1413.380005
+2012-04-04,128.940002,,,2012-04-10,51.67,13074.75,1398.959961
+2012-04-05,128.91000400000001,,,2012-04-11,52.38,13060.139648,1398.079956
+2012-04-09,127.440002,,,2012-04-12,53.33,12929.589844,1382.199951
+2012-04-10,125.269997,,,2012-04-13,52.34,12715.929688,1358.589966
+2012-04-11,126.220001,,,2012-04-16,52.68,12805.389648,1368.709961
+2012-04-12,127.959999,,,2012-04-17,53.54,12986.580078,1387.569946
+2012-04-13,126.360001,,,2012-04-18,53.28,12849.589844,1370.26001
+2012-04-16,126.300003,,,2012-04-19,52.94,12921.410156,1369.569946
+2012-04-17,128.259995,,,2012-04-20,53.43,13115.540039,1390.780029
+2012-04-18,127.739998,,,2012-04-23,52.38,13032.75,1385.140015
+2012-04-19,126.980003,,,2012-04-24,52.8,12964.099609,1376.920044
+2012-04-20,127.139999,,,2012-04-25,53.52,13029.259766,1378.530029
+2012-04-23,126.07,,,2012-04-26,53.84,12927.169922,1366.939941
+2012-04-24,126.529999,,,2012-04-27,54.06,13001.55957,1371.969971
+2012-04-25,128.270004,,,2012-04-30,53.75,13090.719727,1390.689941
+2012-04-26,129.139999,,,2012-05-01,53.97,13204.620117,1399.97998
+2012-04-27,129.449997,,,2012-05-02,53.57,13228.30957,1403.359985
+2012-04-30,128.949997,,,2012-05-03,53.08,13213.629883,1397.910034
+2012-05-01,129.679993,,,2012-05-04,52.27,13279.320313,1405.819946
+2012-05-02,129.369995,,,2012-05-07,52.65,13268.570313,1402.310059
+2012-05-03,128.399994,,,2012-05-08,51.86,13206.589844,1391.569946
+2012-05-04,126.33000200000001,,,2012-05-09,51.25,13038.269531,1369.099976
+2012-05-07,126.379997,,,2012-05-10,51.48,13008.530273,1369.579956
+2012-05-08,125.849998,,,2012-05-11,51.17,12932.089844,1363.719971
+2012-05-09,125.040001,,,2012-05-14,50.18,12835.05957,1354.579956
+2012-05-10,125.400002,,,2012-05-15,49.55,12855.040039,1357.98999
+2012-05-11,124.980003,,,2012-05-16,49.02,12820.599609,1353.390015
+2012-05-14,123.610001,,,2012-05-17,48.46,12695.349609,1338.349976
+2012-05-15,122.91999799999999,,,2012-05-18,48.13,12632.0,1330.660034
+2012-05-16,122.41999799999999,,,2012-05-21,49.17,12598.549805,1324.800049
+2012-05-17,120.589996,,,2012-05-22,48.99,12442.490234,1304.859985
+2012-05-18,119.699997,,,2012-05-23,48.59,12369.379883,1295.219971
+2012-05-21,121.620003,,,2012-05-24,48.27,12504.480469,1315.98999
+2012-05-22,121.68,,,2012-05-25,48.1,12502.80957,1316.630005
+2012-05-23,121.889999,,,2012-05-29,48.71,12496.150391,1318.859985
+2012-05-24,122.08000200000001,,,2012-05-30,47.56,12529.75,1320.680054
+2012-05-25,121.82,,,2012-05-31,47.76,12454.830078,1317.819946
+2012-05-29,123.18,,,2012-06-01,46.55,12580.69043,1332.420044
+2012-05-30,121.449997,,,2012-06-04,46.95,12419.860352,1313.319946
+2012-05-31,121.190002,,,2012-06-05,47.23,12393.450195,1310.329956
+2012-06-01,118.209999,,,2012-06-06,48.58,12118.570313,1278.040039
+2012-06-04,118.220001,,,2012-06-07,48.67,12101.459961,1278.180054
+2012-06-05,118.900002,,,2012-06-08,48.51,12127.950195,1285.5
+2012-06-06,121.66999799999999,,,2012-06-11,48.01,12414.790039,1315.130005
+2012-06-07,121.66999799999999,,,2012-06-12,48.85,12460.959961,1314.98999
+2012-06-08,122.660004,,,2012-06-13,48.44,12554.200195,1325.660034
+2012-06-11,121.110001,,,2012-06-14,48.82,12411.230469,1308.930054
+2012-06-12,122.529999,,,2012-06-15,49.48,12573.799805,1324.180054
+2012-06-13,121.709999,,,2012-06-18,49.36,12496.379883,1314.880005
+2012-06-14,123.029999,,,2012-06-19,50.18,12651.910156,1329.099976
+2012-06-15,124.300003,,,2012-06-20,50.47,12767.169922,1342.839966
+2012-06-18,124.480003,,,2012-06-21,48.04,12741.820313,1344.780029
+2012-06-19,125.699997,,,2012-06-22,48.49,12837.330078,1357.97998
+2012-06-20,125.5,,,2012-06-25,47.36,12824.389648,1355.689941
+2012-06-21,122.720001,,,2012-06-26,47.68,12573.570313,1325.51001
+2012-06-22,122.989998,,,2012-06-27,48.11,12640.780273,1335.02002
+2012-06-25,121.040001,,,2012-06-28,48.22,12502.660156,1313.719971
+2012-06-26,121.620003,,,2012-06-29,49.96,12534.669922,1319.98999
+2012-06-27,122.739998,,,2012-07-02,50.28,12627.009766,1331.849976
+2012-06-28,122.489998,,,2012-07-03,50.75,12602.259766,1329.040039
+2012-06-29,125.550003,,,2012-07-05,49.91,12880.089844,1362.160034
+2012-07-02,125.860001,,,2012-07-06,49.44,12871.389648,1365.51001
+2012-07-03,126.66999799999999,,,2012-07-09,49.33,12943.660156,1374.02002
+2012-07-05,126.08000200000001,,,2012-07-10,49.03,12896.669922,1367.579956
+2012-07-06,124.93,,,2012-07-11,49.15,12772.469727,1354.680054
+2012-07-09,124.730003,,,2012-07-12,48.7,12736.290039,1352.459961
+2012-07-10,123.720001,,,2012-07-13,49.34,12653.120117,1341.469971
+2012-07-11,123.730003,,,2012-07-16,49.34,12604.530273,1341.449951
+2012-07-12,123.110001,,,2012-07-17,49.48,12573.269531,1334.76001
+2012-07-13,125.139999,,,2012-07-18,49.87,12777.089844,1356.780029
+2012-07-16,124.849998,,,2012-07-19,50.34,12727.209961,1353.640015
+2012-07-17,125.779999,,,2012-07-20,49.17,12805.540039,1363.670044
+2012-07-18,126.639999,,,2012-07-23,48.14,12908.700195,1372.780029
+2012-07-19,126.989998,,,2012-07-24,47.62,12943.360352,1376.51001
+2012-07-20,125.720001,,,2012-07-25,47.88,12822.570313,1362.660034
+2012-07-23,124.599998,,,2012-07-26,49.32,12721.459961,1350.52002
+2012-07-24,123.470001,,,2012-07-27,50.39,12617.320313,1338.310059
+2012-07-25,123.440002,,,2012-07-30,50.31,12676.049805,1337.890015
+2012-07-26,125.480003,,,2012-07-31,50.0,12887.929688,1360.02002
+2012-07-27,127.879997,,,2012-08-01,50.01,13075.660156,1385.969971
+2012-07-30,127.83000200000001,,,2012-08-02,49.31,13073.009766,1385.300049
+2012-07-31,127.269997,,,2012-08-03,50.99,13008.679688,1379.319946
+2012-08-01,126.91999799999999,,,2012-08-06,51.35,12976.129883,1375.319946
+2012-08-02,125.980003,,,2012-08-07,51.82,12878.879883,1365.0
+2012-08-03,128.399994,,,2012-08-08,51.75,13096.169922,1390.98999
+2012-08-06,128.690002,,,2012-08-09,51.78,13117.509766,1394.22998
+2012-08-07,129.350006,,,2012-08-10,51.87,13168.599609,1401.349976
+2012-08-08,129.470001,,,2012-08-13,51.62,13175.639648,1402.219971
+2012-08-09,129.580002,,,2012-08-14,51.74,13165.19043,1402.800049
+2012-08-10,129.869995,,,2012-08-15,51.59,13207.950195,1405.869995
+2012-08-13,129.729996,,,2012-08-16,52.22,13169.429688,1404.109985
+2012-08-14,129.740005,,,2012-08-17,52.3,13172.139648,1403.930054
+2012-08-15,129.929993,,,2012-08-20,52.24,13164.780273,1405.530029
+2012-08-16,130.860001,,,2012-08-21,52.54,13250.110352,1415.51001
+2012-08-17,131.110001,,,2012-08-22,52.48,13275.200195,1418.160034
+2012-08-20,131.100006,,,2012-08-23,52.18,13271.639648,1418.130005
+2012-08-21,130.649994,,,2012-08-24,52.1,13203.580078,1413.170044
+2012-08-22,130.690002,,,2012-08-27,52.13,13172.759766,1413.48999
+2012-08-23,129.630005,,,2012-08-28,52.08,13057.459961,1402.079956
+2012-08-24,130.490005,,,2012-08-29,51.92,13157.969727,1411.130005
+2012-08-27,130.419998,,,2012-08-30,51.15,13124.669922,1410.439941
+2012-08-28,130.330002,,,2012-08-31,51.6,13102.990234,1409.300049
+2012-08-29,130.46000700000002,,,2012-09-04,51.34,13107.480469,1410.48999
+2012-08-30,129.46000700000002,,,2012-09-05,51.2,13000.709961,1399.47998
+2012-08-31,130.119995,,,2012-09-06,52.46,13090.839844,1406.579956
+2012-09-04,129.970001,,,2012-09-07,53.26,13035.94043,1404.939941
+2012-09-05,129.869995,,,2012-09-10,52.84,13047.480469,1403.439941
+2012-09-06,132.53999299999998,,,2012-09-11,53.44,13292.0,1432.119995
+2012-09-07,133.080002,,,2012-09-12,53.79,13306.639648,1437.920044
+2012-09-10,132.270004,,,2012-09-13,54.62,13254.290039,1429.079956
+2012-09-11,132.679993,,,2012-09-14,55.15,13323.360352,1433.560059
+2012-09-12,133.0,,,2012-09-17,54.86,13333.349609,1436.560059
+2012-09-13,135.179993,,,2012-09-18,54.63,13539.860352000002,1459.98999
+2012-09-14,135.720001,,,2012-09-19,54.86,13593.370116999999,1465.77002
+2012-09-17,135.300003,,,2012-09-20,54.5,13553.099609,1461.189941
+2012-09-18,135.130005,,,2012-09-21,54.52,13564.639647999998,1459.319946
+2012-09-19,135.28999299999998,,,2012-09-24,54.35,13577.959961000002,1461.050049
+2012-09-20,135.240005,,,2012-09-25,54.0,13596.929688,1460.26001
+2012-09-21,134.570007,,,2012-09-26,53.45,13579.469727000002,1460.150024
+2012-09-24,134.270004,,,2012-09-27,54.07,13558.919922,1456.890015
+2012-09-25,132.880005,,,2012-09-28,53.0,13457.549805,1441.589966
+2012-09-26,132.139999,,,2012-10-01,53.44,13413.509766,1433.319946
+2012-09-27,133.429993,,,2012-10-02,53.64,13485.969727000002,1447.150024
+2012-09-28,132.830002,,,2012-10-03,53.42,13437.129883000001,1440.670044
+2012-10-01,133.179993,,,2012-10-04,54.06,13515.110352000002,1444.48999
+2012-10-02,133.309998,,,2012-10-05,54.14,13482.360352000002,1445.75
+2012-10-03,133.820007,,,2012-10-08,53.82,13494.610352000002,1450.98999
+2012-10-04,134.779999,,,2012-10-09,53.04,13575.360352000002,1461.400024
+2012-10-05,134.779999,,,2012-10-10,52.89,13610.150391,1460.930054
+2012-10-08,134.320007,,,2012-10-11,53.23,13583.650391,1455.880005
+2012-10-09,132.990005,,,2012-10-12,53.17,13473.530272999998,1441.47998
+2012-10-10,132.179993,,,2012-10-15,53.69,13344.969727,1432.560059
+2012-10-11,132.229996,,,2012-10-16,54.59,13326.389648,1432.839966
+2012-10-12,131.830002,,,2012-10-17,55.09,13328.849609,1428.589966
+2012-10-15,132.899994,,,2012-10-18,54.86,13424.230469,1440.130005
+2012-10-16,134.259995,,,2012-10-19,54.11,13551.780272999998,1454.920044
+2012-10-17,134.830002,,,2012-10-22,54.52,13557.0,1460.910034
+2012-10-18,134.509995,,,2012-10-23,53.35,13548.94043,1457.339966
+2012-10-19,132.279999,,,2012-10-24,53.38,13343.509766,1433.189941
+2012-10-22,132.33999599999999,,,2012-10-25,53.7,13345.889648,1433.819946
+2012-10-23,130.429993,,,2012-10-26,53.61,13102.530273,1413.109985
+2012-10-24,130.029999,,,2012-10-31,53.57,13077.339844,1408.75
+2012-10-25,130.419998,,,2012-11-01,54.21,13103.679688,1412.969971
+2012-10-26,130.320007,,,2012-11-02,53.66,13107.209961,1411.939941
+2012-10-31,130.360001,,,2012-11-05,53.56,13096.459961,1412.160034
+2012-11-01,131.78999299999998,,,2012-11-06,54.07,13232.620117,1427.589966
+2012-11-02,130.550003,,,2012-11-07,53.26,13093.160156,1414.199951
+2012-11-05,130.850006,,,2012-11-08,52.8,13112.44043,1417.26001
+2012-11-06,131.880005,,,2012-11-09,52.8,13245.679688,1428.390015
+2012-11-07,128.869995,,,2012-11-12,52.78,12932.730469,1394.530029
+2012-11-08,127.300003,,,2012-11-13,52.49,12811.320313,1377.51001
+2012-11-09,127.519997,,,2012-11-14,51.96,12815.389648,1379.849976
+2012-11-12,127.529999,,,2012-11-15,52.1,12815.080078,1380.030029
+2012-11-13,127.07,,,2012-11-16,52.09,12756.179688,1374.530029
+2012-11-14,125.349998,,,2012-11-19,53.19,12570.950195,1355.48999
+2012-11-15,125.160004,,,2012-11-20,53.3,12542.379883,1353.329956
+2012-11-16,125.779999,,,2012-11-21,53.39,12588.30957,1359.880005
+2012-11-19,128.279999,,,2012-11-23,54.54,12795.959961,1386.890015
+2012-11-20,128.380005,,,2012-11-26,54.41,12788.509766,1387.810059
+2012-11-21,128.679993,,,2012-11-27,54.14,12836.889648,1391.030029
+2012-11-23,130.369995,,,2012-11-28,54.53,13009.530273,1409.150024
+2012-11-26,130.110001,,,2012-11-29,55.0,12967.370117,1406.290039
+2012-11-27,129.440002,,,2012-11-30,55.07,12878.129883,1398.939941
+2012-11-28,130.490005,,,2012-12-03,55.14,12985.110352,1409.930054
+2012-11-29,131.070007,,,2012-12-04,55.28,13021.820313,1415.949951
+2012-11-30,131.08999599999999,,,2012-12-05,55.36,13025.580078,1416.180054
+2012-12-03,130.479996,,,2012-12-06,55.47,12965.599609,1409.459961
+2012-12-04,130.259995,,,2012-12-07,55.5,12951.780273,1407.050049
+2012-12-05,130.509995,,,2012-12-10,55.55,13034.490234,1409.280029
+2012-12-06,130.970001,,,2012-12-11,55.87,13074.040039,1413.939941
+2012-12-07,131.360001,,,2012-12-12,56.05,13155.129883,1418.069946
+2012-12-10,131.41000400000001,,,2012-12-13,55.88,13169.879883,1418.550049
+2012-12-11,132.270004,,,2012-12-14,56.08,13248.44043,1427.839966
+2012-12-12,132.360001,,,2012-12-17,56.32,13245.450195,1428.47998
+2012-12-13,131.559998,,,2012-12-18,56.28,13170.719727,1419.449951
+2012-12-14,131.020004,,,2012-12-19,56.48,13135.009766,1413.579956
+2012-12-17,132.570007,,,2012-12-20,56.86,13235.389648,1430.359985
+2012-12-18,134.100006,,,2012-12-21,56.51,13350.959961,1446.790039
+2012-12-19,133.08999599999999,,,2012-12-24,56.36,13251.969727,1435.810059
+2012-12-20,133.83999599999999,,,2012-12-26,56.35,13311.719727,1443.689941
+2012-12-21,131.690002,,,2012-12-27,56.61,13190.839844,1430.150024
+2012-12-24,131.380005,,,2012-12-28,56.01,13138.929688,1426.660034
+2012-12-26,130.75,,,2012-12-31,56.86,13114.589844,1419.829956
+2012-12-27,130.619995,,,2013-01-02,57.74,13096.30957,1418.099976
+2012-12-28,129.190002,,,2013-01-03,57.18,12938.110352,1402.430054
+2012-12-31,131.369995,,,2013-01-04,57.47,13104.139648,1426.189941
+2013-01-02,134.740005,,,2013-01-07,57.22,13412.549805,1462.420044
+2013-01-03,134.46000700000002,,,2013-01-08,56.9,13391.360352,1459.369995
+2013-01-04,135.110001,,,2013-01-09,57.19,13435.209961000002,1466.469971
+2013-01-07,134.690002,,,2013-01-10,57.92,13384.290039,1461.890015
+2013-01-08,134.300003,,,2013-01-11,58.04,13328.849609,1457.150024
+2013-01-09,134.649994,,,2013-01-14,58.11,13390.509766,1461.02002
+2013-01-10,135.679993,,,2013-01-15,58.02,13471.219727000002,1472.119995
+2013-01-11,135.679993,,,2013-01-16,57.74,13488.429688,1472.050049
+2013-01-14,135.559998,,,2013-01-17,58.21,13507.320313,1470.680054
+2013-01-15,135.71000700000002,,,2013-01-18,58.15,13534.889647999998,1472.339966
+2013-01-16,135.75,,,2013-01-22,58.18,13511.230469,1472.630005
+2013-01-17,136.520004,,,2013-01-23,58.12,13596.019531,1480.939941
+2013-01-18,136.979996,,,2013-01-24,58.4,13649.700195,1485.97998
+2013-01-22,137.600006,,,2013-01-25,59.03,13712.209961000002,1492.560059
+2013-01-23,137.800003,,,2013-01-28,58.74,13779.330078,1494.810059
+2013-01-24,137.809998,,,2013-01-29,59.14,13825.330078,1494.819946
+2013-01-25,138.559998,,,2013-01-30,59.2,13895.980469,1502.959961
+2013-01-28,138.309998,,,2013-01-31,58.98,13881.929688,1500.180054
+2013-01-29,139.020004,,,2013-02-01,59.45,13954.419922,1507.839966
+2013-01-30,138.509995,,,2013-02-04,58.38,13910.419922,1501.959961
+2013-01-31,138.169998,,,2013-02-05,58.65,13860.580078,1498.109985
+2013-02-01,139.559998,,,2013-02-06,58.64,14009.790038999998,1513.170044
+2013-02-04,137.949997,,,2013-02-07,58.16,13880.080078,1495.709961
+2013-02-05,139.399994,,,2013-02-08,58.53,13979.299805,1511.290039
+2013-02-06,139.490005,,,2013-02-11,58.47,13986.519531,1512.119995
+2013-02-07,139.300003,,,2013-02-12,58.76,13944.049805,1509.390015
+2013-02-08,140.08999599999999,,,2013-02-13,58.9,13992.969727000002,1517.930054
+2013-02-11,140.009995,,,2013-02-14,58.58,13971.240234,1517.01001
+2013-02-12,140.240005,,,2013-02-15,58.43,14018.700195,1519.430054
+2013-02-13,140.380005,,,2013-02-19,59.12,13982.910156,1520.329956
+2013-02-14,140.5,,,2013-02-20,58.54,13973.389647999998,1521.380005
+2013-02-15,140.360001,,,2013-02-21,57.66,13981.759766,1519.790039
+2013-02-19,141.41000400000001,,,2013-02-22,58.49,14035.669922,1530.939941
+2013-02-20,139.66000400000001,,,2013-02-25,57.09,13927.540038999998,1511.949951
+2013-02-21,138.809998,,,2013-02-26,57.55,13880.620116999999,1502.420044
+2013-02-22,140.050003,,,2013-02-27,58.28,14000.570313,1515.599976
+2013-02-25,137.490005,,,2013-02-28,58.22,13784.169922,1487.849976
+2013-02-26,138.33999599999999,,,2013-03-01,58.1,13900.129883000001,1496.939941
+2013-02-27,140.139999,,,2013-03-04,58.35,14075.370116999999,1515.98999
+2013-02-28,140.020004,,,2013-03-05,58.93,14054.490234,1514.680054
+2013-03-01,140.350006,,,2013-03-06,59.08,14089.660156,1518.199951
+2013-03-04,141.0,,,2013-03-07,59.25,14127.820313,1525.199951
+2013-03-05,142.350006,,,2013-03-08,59.38,14253.769531,1539.790039
+2013-03-06,142.53999299999998,,,2013-03-11,59.56,14296.240234,1541.459961
+2013-03-07,142.820007,,,2013-03-12,59.26,14329.490234,1544.26001
+2013-03-08,143.470001,,,2013-03-13,59.16,14397.070313,1551.180054
+2013-03-11,143.940002,,,2013-03-14,59.75,14447.290038999998,1556.219971
+2013-03-12,143.600006,,,2013-03-15,59.87,14450.05957,1552.47998
+2013-03-13,143.83999599999999,,,2013-03-18,59.21,14455.280272999998,1554.52002
+2013-03-14,144.649994,,,2013-03-19,59.03,14539.139647999998,1563.22998
+2013-03-15,144.41000400000001,,,2013-03-20,59.39,14514.110352000002,1560.699951
+2013-03-18,143.619995,,,2013-03-21,58.85,14452.05957,1552.099976
+2013-03-19,143.270004,,,2013-03-22,59.36,14455.820313,1548.339966
+2013-03-20,144.229996,,,2013-03-25,58.62,14511.730469,1558.709961
+2013-03-21,142.399994,,,2013-03-26,58.98,14421.490234,1545.800049
+2013-03-22,143.419998,,,2013-03-27,58.7,14512.030272999998,1556.890015
+2013-03-25,142.940002,,,2013-03-28,58.98,14447.75,1551.689941
+2013-03-26,144.100006,,,2013-04-01,58.17,14559.650391,1563.77002
+2013-03-27,144.029999,,,2013-04-02,58.81,14526.160156,1562.849976
+2013-03-28,144.610001,,,2013-04-03,58.52,14578.540038999998,1569.189941
+2013-04-01,143.970001,,,2013-04-04,59.04,14572.849609,1562.170044
+2013-04-02,144.71000700000002,,,2013-04-05,58.77,14662.009766,1570.25
+2013-04-03,143.21000700000002,,,2013-04-08,59.0,14550.349609,1553.689941
+2013-04-04,143.800003,,,2013-04-09,59.21,14606.110352000002,1559.97998
+2013-04-05,143.179993,,,2013-04-10,60.08,14565.25,1553.280029
+2013-04-08,144.130005,,,2013-04-11,60.56,14613.480469,1563.069946
+2013-04-09,144.639999,,,2013-04-12,60.41,14673.459961000002,1568.609985
+2013-04-10,146.419998,,,2013-04-15,59.22,14802.240234,1587.72998
+2013-04-11,146.940002,,,2013-04-16,60.06,14865.139647999998,1593.369995
+2013-04-12,146.529999,,,2013-04-17,58.81,14865.05957,1588.849976
+2013-04-15,143.169998,,,2013-04-18,58.63,14599.200195,1552.359985
+2013-04-16,145.21000700000002,,,2013-04-19,59.1,14756.780272999998,1574.569946
+2013-04-17,143.130005,,,2013-04-22,59.35,14618.589844,1552.01001
+2013-04-18,142.179993,,,2013-04-23,60.19,14537.139647999998,1541.609985
+2013-04-19,143.440002,,,2013-04-24,60.71,14547.509766,1555.25
+2013-04-22,144.110001,,,2013-04-25,61.03,14567.169922,1562.5
+2013-04-23,145.610001,,,2013-04-26,61.08,14719.459961000002,1578.780029
+2013-04-24,145.630005,,,2013-04-29,61.86,14676.299805,1578.790039
+2013-04-25,146.220001,,,2013-04-30,61.94,14700.799805,1585.160034
+2013-04-26,145.96000700000002,,,2013-05-01,61.57,14712.549805,1582.23999
+2013-04-29,147.009995,,,2013-05-02,61.76,14818.75,1593.609985
+2013-04-30,147.369995,,,2013-05-03,62.55,14839.799805,1597.569946
+2013-05-01,146.009995,,,2013-05-06,62.47,14700.950195,1582.699951
+2013-05-02,147.389999,,,2013-05-07,62.57,14831.580078,1597.589966
+2013-05-03,148.96000700000002,,,2013-05-08,63.23,14973.959961000002,1614.420044
+2013-05-06,149.240005,,,2013-05-09,62.62,14968.889647999998,1617.5
+2013-05-07,150.029999,,,2013-05-10,62.69,15056.200195,1625.959961
+2013-05-08,150.720001,,,2013-05-13,62.66,15105.120116999999,1632.689941
+2013-05-09,150.229996,,,2013-05-14,62.78,15082.620116999999,1626.670044
+2013-05-10,150.880005,,,2013-05-15,63.05,15118.490234,1633.699951
+2013-05-13,150.899994,,,2013-05-16,62.62,15091.679688,1633.77002
+2013-05-14,152.46000700000002,,,2013-05-17,63.05,15215.25,1650.339966
+2013-05-15,153.28999299999998,,,2013-05-20,63.4,15275.69043,1658.780029
+2013-05-16,152.529999,,,2013-05-21,63.53,15233.219727000002,1650.469971
+2013-05-17,154.100006,,,2013-05-22,62.89,15354.400391,1667.469971
+2013-05-20,153.990005,,,2013-05-23,61.99,15335.280272999998,1666.290039
+2013-05-21,154.259995,,,2013-05-24,61.45,15387.580078,1669.160034
+2013-05-22,153.009995,,,2013-05-28,61.61,15307.169922,1655.349976
+2013-05-23,152.580002,,,2013-05-29,61.02,15294.5,1650.51001
+2013-05-24,152.509995,,,2013-05-30,61.26,15303.099609,1649.599976
+2013-05-28,153.46000700000002,,,2013-05-31,60.07,15409.389647999998,1660.060059
+2013-05-29,152.41000400000001,,,2013-06-03,60.3,15302.799805,1648.359985
+2013-05-30,152.990005,,,2013-06-04,60.52,15324.530272999998,1654.410034
+2013-05-31,150.800003,,,2013-06-05,59.17,15115.570313,1630.73999
+2013-06-03,151.71000700000002,,,2013-06-06,59.5,15254.030272999998,1640.420044
+2013-06-04,150.880005,,,2013-06-07,60.3,15177.540038999998,1631.380005
+2013-06-05,148.83999599999999,,,2013-06-10,60.36,14960.589844,1608.900024
+2013-06-06,150.119995,,,2013-06-11,59.62,15040.620116999999,1622.560059
+2013-06-07,152.050003,,,2013-06-12,59.55,15248.120116999999,1643.380005
+2013-06-10,152.0,,,2013-06-13,60.46,15238.589844,1642.810059
+2013-06-11,150.46000700000002,,,2013-06-14,59.8,15122.019531,1626.130005
+2013-06-12,149.229996,,,2013-06-17,60.66,14995.230469,1612.52002
+2013-06-13,151.46000700000002,,,2013-06-18,61.09,15176.080078,1636.359985
+2013-06-14,150.570007,,,2013-06-19,59.95,15070.179688,1626.72998
+2013-06-17,151.71000700000002,,,2013-06-20,57.75,15179.849609,1639.040039
+2013-06-18,152.889999,,,2013-06-21,57.94,15318.230469,1651.810059
+2013-06-19,150.779999,,,2013-06-24,57.03,15112.19043,1628.930054
+2013-06-20,147.029999,,,2013-06-25,57.76,14758.320313,1588.189941
+2013-06-21,146.720001,,,2013-06-26,57.98,14799.400391,1592.430054
+2013-06-24,144.940002,,,2013-06-27,57.41,14659.55957,1573.089966
+2013-06-25,146.330002,,,2013-06-28,57.3,14760.30957,1588.030029
+2013-06-26,147.759995,,,2013-07-01,57.84,14910.139647999998,1603.26001
+2013-06-27,148.690002,,,2013-07-02,57.55,15024.490234,1613.199951
+2013-06-28,148.059998,,,2013-07-03,57.57,14909.599609,1606.280029
+2013-07-01,148.869995,,,2013-07-05,57.84,14974.959961000002,1614.959961
+2013-07-02,148.820007,,,2013-07-08,58.2,14932.410156,1614.079956
+2013-07-03,148.940002,,,2013-07-09,58.52,14988.370116999999,1615.410034
+2013-07-05,150.46000700000002,,,2013-07-10,58.69,15135.839844,1631.890015
+2013-07-08,151.300003,,,2013-07-11,60.21,15224.69043,1640.459961
+2013-07-09,152.389999,,,2013-07-12,59.81,15300.339844,1652.319946
+2013-07-10,152.429993,,,2013-07-15,60.18,15291.660156,1652.619995
+2013-07-11,154.509995,,,2013-07-16,60.14,15460.919922,1675.02002
+2013-07-12,154.979996,,,2013-07-17,60.32,15464.299805,1680.189941
+2013-07-15,155.199997,,,2013-07-18,60.72,15484.259766,1682.5
+2013-07-16,154.619995,,,2013-07-19,60.67,15451.849609,1676.26001
+2013-07-17,155.059998,,,2013-07-22,61.01,15470.519531,1680.910034
+2013-07-18,155.860001,,,2013-07-23,61.14,15548.540038999998,1689.369995
+2013-07-19,156.119995,,,2013-07-24,61.06,15543.740234,1692.089966
+2013-07-22,156.429993,,,2013-07-25,61.18,15545.549805,1695.530029
+2013-07-23,156.139999,,,2013-07-26,60.8,15567.740234,1692.390015
+2013-07-24,155.550003,,,2013-07-29,60.22,15542.240234,1685.939941
+2013-07-25,155.949997,,,2013-07-30,60.21,15555.610352000002,1690.25
+2013-07-26,156.080002,,,2013-07-31,60.35,15558.830078,1691.6500239999998
+2013-07-29,155.5,,,2013-08-01,61.17,15521.969727000002,1685.3299559999998
+2013-07-30,155.570007,,,2013-08-02,61.67,15520.589844,1685.959961
+2013-07-31,155.570007,,,2013-08-05,61.54,15499.540038999998,1685.72998
+2013-08-01,157.529999,,,2013-08-06,61.45,15628.019531,1706.869995
+2013-08-02,157.78999299999998,,,2013-08-07,61.18,15658.360352000002,1709.6700440000002
+2013-08-05,157.570007,,,2013-08-08,61.74,15612.129883000001,1707.140015
+2013-08-06,156.679993,,,2013-08-09,61.84,15518.740234,1697.369995
+2013-08-07,156.130005,,,2013-08-12,61.67,15470.669922,1690.910034
+2013-08-08,156.770004,,,2013-08-13,62.07,15498.320313,1697.47998
+2013-08-09,156.240005,,,2013-08-14,62.1,15425.509766,1691.4200440000002
+2013-08-12,156.059998,,,2013-08-15,61.58,15419.679688,1689.469971
+2013-08-13,156.529999,,,2013-08-16,61.69,15451.009766,1694.160034
+2013-08-14,155.75,,,2013-08-19,61.25,15337.660156,1685.390015
+2013-08-15,153.550003,,,2013-08-20,61.17,15112.19043,1661.319946
+2013-08-16,153.050003,,,2013-08-21,60.45,15081.469727000002,1655.829956
+2013-08-19,152.16000400000001,,,2013-08-22,61.04,15010.740234,1646.060059
+2013-08-20,152.740005,,,2013-08-23,61.57,15002.990234,1652.349976
+2013-08-21,151.860001,,,2013-08-26,61.12,14897.549805,1642.800049
+2013-08-22,153.169998,,,2013-08-27,60.08,14963.740234,1656.959961
+2013-08-23,153.800003,,,2013-08-28,60.01,15010.509766,1663.5
+2013-08-26,153.179993,,,2013-08-29,59.91,14946.459961000002,1656.780029
+2013-08-27,150.75,,,2013-08-30,59.17,14776.129883000001,1630.47998
+2013-08-28,151.190002,,,2013-09-03,60.31,14824.509766,1634.959961
+2013-08-29,151.509995,,,2013-09-04,60.85,14840.950195,1638.170044
+2013-08-30,151.03999299999998,,,2013-09-05,60.8,14810.30957,1632.969971
+2013-09-03,151.679993,,,2013-09-06,61.13,14833.959961000002,1639.77002
+2013-09-04,152.940002,,,2013-09-09,61.97,14930.870116999999,1653.079956
+2013-09-05,153.130005,,,2013-09-10,62.67,14937.480469,1655.079956
+2013-09-06,153.16000400000001,,,2013-09-11,62.89,14922.5,1655.170044
+2013-09-09,154.690002,,,2013-09-12,62.53,15063.120116999999,1671.709961
+2013-09-10,155.830002,,,2013-09-13,62.83,15191.05957,1683.9899899999998
+2013-09-11,156.330002,,,2013-09-16,63.32,15326.599609,1689.130005
+2013-09-12,155.83999599999999,,,2013-09-17,63.36,15300.639647999998,1683.4200440000002
+2013-09-13,156.270004,,,2013-09-18,65.05,15376.05957,1687.9899899999998
+2013-09-16,157.149994,,,2013-09-19,64.74,15494.780272999998,1697.5999760000002
+2013-09-17,157.820007,,,2013-09-20,64.26,15529.730469,1704.7600100000002
+2013-09-18,159.740005,,,2013-09-23,64.25,15676.94043,1725.52002
+2013-09-19,159.470001,,,2013-09-24,64.15,15636.549805,1722.339966
+2013-09-20,157.570007,,,2013-09-25,64.22,15451.089844,1709.910034
+2013-09-23,156.830002,,,2013-09-26,64.49,15401.379883000001,1701.839966
+2013-09-24,156.440002,,,2013-09-27,64.26,15334.589844,1697.4200440000002
+2013-09-25,156.009995,,,2013-09-30,63.8,15273.259766,1692.77002
+2013-09-26,156.58999599999999,,,2013-10-01,64.14,15328.299805,1698.6700440000002
+2013-09-27,155.96000700000002,,,2013-10-02,64.12,15258.240234,1691.75
+2013-09-30,155.020004,,,2013-10-03,63.7,15129.669922,1681.550049
+2013-10-01,156.270004,,,2013-10-04,63.85,15191.700195,1695.0
+2013-10-02,156.190002,,,2013-10-07,63.19,15133.139647999998,1693.869995
+2013-10-03,154.78999299999998,,,2013-10-08,62.7,14996.480469,1678.660034
+2013-10-04,155.889999,,,2013-10-09,62.97,15072.580078,1690.5
+2013-10-07,154.559998,,,2013-10-10,64.1,14936.240234,1676.119995
+2013-10-08,152.699997,,,2013-10-11,64.44,14776.530272999998,1655.449951
+2013-10-09,152.800003,,,2013-10-14,64.66,14802.980469,1656.400024
+2013-10-10,156.16000400000001,,,2013-10-15,64.35,15126.070313,1692.560059
+2013-10-11,157.139999,,,2013-10-16,64.84,15237.110352000002,1703.199951
+2013-10-14,157.779999,,,2013-10-17,65.69,15301.259766,1710.140015
+2013-10-15,156.669998,,,2013-10-18,66.08,15168.009766,1698.060059
+2013-10-16,158.850006,,,2013-10-21,66.18,15373.830078,1721.540039
+2013-10-17,159.929993,,,2013-10-22,66.84,15371.650391,1733.1500239999998
+2013-10-18,160.979996,,,2013-10-23,66.19,15399.650391,1744.5
+2013-10-21,160.990005,,,2013-10-24,66.65,15392.200195,1744.660034
+2013-10-22,161.919998,,,2013-10-25,66.46,15467.660156,1754.6700440000002
+2013-10-23,161.149994,,,2013-10-28,66.35,15413.330078,1746.380005
+2013-10-24,161.679993,,,2013-10-29,66.49,15509.209961000002,1752.069946
+2013-10-25,162.389999,,,2013-10-30,66.25,15570.280272999998,1759.77002
+2013-10-28,162.610001,,,2013-10-31,65.88,15568.929688,1762.109985
+2013-10-29,163.520004,,,2013-11-01,65.56,15680.349609,1771.949951
+2013-10-30,162.740005,,,2013-11-04,65.88,15618.759766,1763.310059
+2013-10-31,162.130005,,,2013-11-05,65.3,15545.75,1756.540039
+2013-11-01,162.58999599999999,,,2013-11-06,65.88,15615.549805,1761.640015
+2013-11-04,163.179993,,,2013-11-07,64.84,15639.120116999999,1767.930054
+2013-11-05,162.729996,,,2013-11-08,65.22,15618.219727000002,1762.969971
+2013-11-06,163.520004,,,2013-11-11,65.36,15746.879883000001,1770.4899899999998
+2013-11-07,161.399994,,,2013-11-12,65.14,15593.980469,1747.1500239999998
+2013-11-08,163.570007,,,2013-11-13,65.35,15761.780272999998,1770.609985
+2013-11-11,163.679993,,,2013-11-14,65.64,15783.099609,1771.890015
+2013-11-12,163.309998,,,2013-11-15,66.18,15750.669922,1767.689941
+2013-11-13,164.669998,,,2013-11-18,66.18,15821.629883000001,1782.0
+2013-11-14,165.5,,,2013-11-19,66.01,15876.219727000002,1790.619995
+2013-11-15,166.199997,,,2013-11-20,65.55,15961.700195,1798.180054
+2013-11-18,165.58999599999999,,,2013-11-21,65.96,15976.019531,1791.530029
+2013-11-19,165.279999,,,2013-11-22,66.15,15967.030272999998,1787.869995
+2013-11-20,164.690002,,,2013-11-25,65.95,15900.820313,1781.369995
+2013-11-21,166.03999299999998,,,2013-11-26,65.95,16009.990234,1795.8499760000002
+2013-11-22,166.880005,,,2013-11-27,66.11,16064.769531,1804.7600100000002
+2013-11-25,166.669998,,,2013-11-29,66.24,16072.540038999998,1802.47998
+2013-11-26,166.720001,,,2013-12-02,65.75,16072.799805,1802.75
+2013-11-27,167.169998,,,2013-12-03,65.29,16097.330078,1807.22998
+2013-11-29,167.03999299999998,,,2013-12-04,64.94,16086.410156,1805.810059
+2013-12-02,166.58999599999999,,,2013-12-05,64.57,16008.769531,1800.9000239999998
+2013-12-03,166.070007,,,2013-12-06,65.37,15914.620116999999,1795.1500239999998
+2013-12-04,165.899994,,,2013-12-09,65.3,15889.769531,1792.810059
+2013-12-05,165.179993,,,2013-12-10,65.19,15821.509766,1785.030029
+2013-12-06,167.050003,,,2013-12-11,64.58,16020.200195,1805.089966
+2013-12-09,167.360001,,,2013-12-12,64.11,16025.530272999998,1808.369995
+2013-12-10,166.830002,,,2013-12-13,64.07,15973.129883000001,1802.619995
+2013-12-11,164.96000700000002,,,2013-12-16,64.53,15843.530272999998,1782.219971
+2013-12-12,164.380005,,,2013-12-17,64.25,15739.429688,1775.5
+2013-12-13,164.360001,,,2013-12-18,64.7,15755.360352000002,1775.319946
+2013-12-16,165.399994,,,2013-12-19,64.7,15884.570313,1786.540039
+2013-12-17,164.889999,,,2013-12-20,65.07,15875.259766,1781.0
+2013-12-18,167.639999,,,2013-12-23,65.74,16167.969727000002,1810.6500239999998
+2013-12-19,167.559998,,,2013-12-24,65.87,16179.080078,1809.5999760000002
+2013-12-20,168.380005,,,2013-12-26,66.23,16221.139647999998,1818.319946
+2013-12-23,168.419998,,,2013-12-27,66.57,16294.610352000002,1827.9899899999998
+2013-12-24,168.929993,,,2013-12-30,66.85,16357.549805,1833.319946
+2013-12-26,169.729996,,,2013-12-31,67.1,16479.880859,1842.02002
+2013-12-27,169.699997,,,2014-01-02,65.91,16478.410156,1841.4000239999998
+2013-12-30,169.679993,,,2014-01-03,65.98,16504.289063,1841.069946
+2013-12-31,170.360001,,,2014-01-06,65.9,16576.660156,1848.359985
+2014-01-02,168.880005,,,2014-01-07,66.27,16441.349609,1831.97998
+2014-01-03,168.820007,,,2014-01-08,66.25,16469.990234,1831.369995
+2014-01-06,168.399994,,,2014-01-09,66.2,16425.099609,1826.77002
+2014-01-07,169.419998,,,2014-01-10,66.81,16530.939453,1837.880005
+2014-01-08,169.440002,,,2014-01-13,66.23,16462.740234,1837.4899899999998
+2014-01-09,169.5,,,2014-01-14,66.76,16444.759766,1838.130005
+2014-01-10,169.889999,,,2014-01-15,67.04,16437.050781,1842.369995
+2014-01-13,167.770004,,,2014-01-16,67.01,16257.94043,1819.199951
+2014-01-14,169.580002,,,2014-01-17,66.81,16373.860352000002,1838.880005
+2014-01-15,170.46000700000002,,,2014-01-21,67.13,16481.939453,1848.380005
+2014-01-16,170.229996,,,2014-01-22,67.13,16417.009766,1845.890015
+2014-01-17,169.580002,,,2014-01-23,66.68,16458.560547,1838.699951
+2014-01-21,170.050003,,,2014-01-24,64.85,16414.439453,1843.800049
+2014-01-22,170.16000400000001,,,2014-01-27,64.55,16373.339844,1844.859985
+2014-01-23,168.649994,,,2014-01-28,65.11,16197.349609,1828.459961
+2014-01-24,165.130005,,,2014-01-29,64.38,15879.110352000002,1790.290039
+2014-01-27,164.330002,,,2014-01-30,64.71,15837.879883000001,1781.560059
+2014-01-28,165.33999599999999,,,2014-01-31,63.61,15928.55957,1792.5
+2014-01-29,163.669998,,,2014-02-03,62.31,15738.790038999998,1774.199951
+2014-01-30,165.520004,,,2014-02-04,63.03,15848.610352000002,1794.189941
+2014-01-31,164.449997,,,2014-02-05,63.16,15698.849609,1782.589966
+2014-02-03,160.690002,,,2014-02-06,64.28,15372.799805,1741.890015
+2014-02-04,161.929993,,,2014-02-07,65.12,15445.240234,1755.199951
+2014-02-05,161.649994,,,2014-02-10,64.9,15440.230469,1751.640015
+2014-02-06,163.740005,,,2014-02-11,65.93,15628.530272999998,1773.430054
+2014-02-07,165.919998,,,2014-02-12,66.04,15794.080078,1797.02002
+2014-02-10,166.179993,,,2014-02-13,66.24,15801.790038999998,1799.839966
+2014-02-11,168.020004,,,2014-02-14,66.49,15994.769531,1819.75
+2014-02-12,168.059998,,,2014-02-18,67.06,15963.94043,1819.2600100000002
+2014-02-13,169.050003,,,2014-02-19,66.61,16027.589844,1829.8299559999998
+2014-02-14,169.880005,,,2014-02-20,66.84,16154.389647999998,1838.630005
+2014-02-18,170.100006,,,2014-02-21,66.97,16130.400391,1840.7600100000002
+2014-02-19,169.0,,,2014-02-24,67.55,16040.55957,1828.75
+2014-02-20,170.050003,,,2014-02-25,67.39,16133.230469,1839.780029
+2014-02-21,169.75,,,2014-02-26,67.16,16103.299805,1836.25
+2014-02-24,170.800003,,,2014-02-27,67.39,16207.139647999998,1847.609985
+2014-02-25,170.570007,,,2014-02-28,67.51,16179.660156,1845.119995
+2014-02-26,170.600006,,,2014-03-03,66.08,16198.410156,1845.160034
+2014-02-27,171.470001,,,2014-03-04,67.39,16272.650391,1854.290039
+2014-02-28,171.949997,,,2014-03-05,67.33,16321.709961000002,1859.449951
+2014-03-03,170.690002,,,2014-03-06,68.03,16168.030272999998,1845.72998
+2014-03-04,173.28999299999998,,,2014-03-07,67.66,16395.880859,1873.910034
+2014-03-05,173.320007,,,2014-03-10,67.24,16360.179688,1873.810059
+2014-03-06,173.649994,,,2014-03-11,66.75,16421.890625,1877.030029
+2014-03-07,173.75,,,2014-03-12,66.5,16452.720703,1878.040039
+2014-03-10,173.679993,,,2014-03-13,65.26,16418.679688,1877.1700440000002
+2014-03-11,172.800003,,,2014-03-14,65.12,16351.25,1867.630005
+2014-03-12,172.899994,,,2014-03-17,65.94,16340.080078,1868.199951
+2014-03-13,170.899994,,,2014-03-18,66.35,16108.889647999998,1846.339966
+2014-03-14,170.419998,,,2014-03-19,65.54,16065.669922,1841.130005
+2014-03-17,172.050003,,,2014-03-20,65.29,16247.219727000002,1858.8299559999998
+2014-03-18,173.300003,,,2014-03-21,65.16,16336.19043,1872.25
+2014-03-19,172.240005,,,2014-03-24,65.33,16222.169922,1860.77002
+2014-03-20,173.279999,,,2014-03-25,66.04,16331.049805,1872.0100100000002
+2014-03-21,172.03999299999998,,,2014-03-26,66.03,16302.769531,1866.52002
+2014-03-24,171.199997,,,2014-03-27,66.36,16276.69043,1857.439941
+2014-03-25,171.970001,,,2014-03-28,66.86,16367.879883000001,1865.619995
+2014-03-26,170.770004,,,2014-03-31,67.2,16268.990234,1852.560059
+2014-03-27,170.470001,,,2014-04-01,67.63,16264.230469,1849.040039
+2014-03-28,171.270004,,,2014-04-02,67.76,16323.05957,1857.619995
+2014-03-31,172.630005,,,2014-04-03,67.57,16457.660156,1872.339966
+2014-04-01,173.860001,,,2014-04-04,67.36,16532.609375,1885.52002
+2014-04-02,174.380005,,,2014-04-07,67.04,16573.0,1890.9000239999998
+2014-04-03,174.190002,,,2014-04-08,67.0,16572.550781,1888.77002
+2014-04-04,172.009995,,,2014-04-09,67.86,16412.710938,1865.089966
+2014-04-07,170.16000400000001,,,2014-04-10,66.66,16245.870116999999,1845.040039
+2014-04-08,170.850006,,,2014-04-11,66.26,16256.139647999998,1851.959961
+2014-04-09,172.729996,,,2014-04-14,66.64,16437.179688,1872.180054
+2014-04-10,169.130005,,,2014-04-15,66.36,16170.219727000002,1833.0799559999998
+2014-04-11,167.53999299999998,,,2014-04-16,67.18,16026.75,1815.689941
+2014-04-14,168.91000400000001,,,2014-04-17,67.53,16173.240234,1830.609985
+2014-04-15,170.050003,,,2014-04-21,67.62,16262.55957,1842.97998
+2014-04-16,171.83999599999999,,,2014-04-22,67.9,16424.849609,1862.310059
+2014-04-17,172.080002,,,2014-04-23,67.74,16408.539063,1864.8499760000002
+2014-04-21,172.729996,,,2014-04-24,67.73,16449.25,1871.890015
+2014-04-22,173.440002,,,2014-04-25,67.4,16514.369141,1879.550049
+2014-04-23,173.080002,,,2014-04-28,67.61,16501.650391,1875.390015
+2014-04-24,173.369995,,,2014-04-29,68.05,16501.650391,1878.609985
+2014-04-25,171.970001,,,2014-04-30,68.32,16361.459961000002,1863.4000239999998
+2014-04-28,172.53999299999998,,,2014-05-01,68.51,16448.740234,1869.430054
+2014-04-29,173.360001,,,2014-05-02,68.4,16535.369141,1878.3299559999998
+2014-04-30,173.880005,,,2014-05-05,68.35,16580.839844,1883.949951
+2014-05-01,173.869995,,,2014-05-06,68.23,16558.869141,1883.680054
+2014-05-02,173.630005,,,2014-05-07,68.31,16512.890625,1881.140015
+2014-05-05,173.970001,,,2014-05-08,68.32,16530.550781,1884.660034
+2014-05-06,172.41000400000001,,,2014-05-09,68.22,16401.019531,1867.719971
+2014-05-07,173.449997,,,2014-05-12,68.67,16518.539063,1878.209961
+2014-05-08,173.259995,,,2014-05-13,68.77,16550.970703,1875.630005
+2014-05-09,173.550003,,,2014-05-14,68.64,16583.339844,1878.47998
+2014-05-12,175.229996,,,2014-05-15,68.34,16695.470703,1896.6500239999998
+2014-05-13,175.350006,,,2014-05-16,68.49,16715.439453,1897.449951
+2014-05-14,174.559998,,,2014-05-19,68.35,16613.970703,1888.530029
+2014-05-15,172.949997,,,2014-05-20,67.92,16446.810547,1870.8499760000002
+2014-05-16,173.600006,,,2014-05-21,68.45,16491.310547,1877.859985
+2014-05-19,174.279999,,,2014-05-22,68.54,16511.859375,1885.0799559999998
+2014-05-20,173.149994,,,2014-05-23,68.72,16374.30957,1872.8299559999998
+2014-05-21,174.580002,,,2014-05-27,69.21,16533.060547,1888.030029
+2014-05-22,175.020004,,,2014-05-28,68.98,16543.080078,1892.4899899999998
+2014-05-23,175.759995,,,2014-05-29,69.4,16606.269531,1900.530029
+2014-05-27,176.809998,,,2014-05-30,69.41,16675.5,1911.910034
+2014-05-28,176.639999,,,2014-06-02,69.55,16633.179688,1909.780029
+2014-05-29,177.610001,,,2014-06-03,69.38,16698.740234,1920.030029
+2014-05-30,177.940002,,,2014-06-04,69.36,16717.169922,1923.569946
+2014-06-02,178.08999599999999,,,2014-06-05,69.84,16743.630859,1924.969971
+2014-06-03,178.029999,,,2014-06-06,70.22,16722.339844,1924.2399899999998
+2014-06-04,178.389999,,,2014-06-09,70.15,16737.529297,1927.880005
+2014-06-05,179.570007,,,2014-06-10,70.0,16836.109375,1940.459961
+2014-06-06,180.429993,,,2014-06-11,69.65,16924.279297,1949.439941
+2014-06-09,180.600006,,,2014-06-12,69.67,16943.099609,1951.27002
+2014-06-10,180.559998,,,2014-06-13,69.72,16945.919922,1950.790039
+2014-06-11,179.940002,,,2014-06-16,69.74,16843.880859,1943.890015
+2014-06-12,178.71000700000002,,,2014-06-17,69.69,16734.189453,1930.109985
+2014-06-13,179.270004,,,2014-06-18,70.29,16775.740234,1936.160034
+2014-06-16,179.419998,,,2014-06-19,70.67,16781.009766,1937.780029
+2014-06-17,179.809998,,,2014-06-20,70.55,16808.490234,1941.9899899999998
+2014-06-18,181.199997,,,2014-06-23,70.36,16906.619141,1956.97998
+2014-06-19,181.46000700000002,,,2014-06-24,69.92,16921.460938,1959.47998
+2014-06-20,181.009995,,,2014-06-25,68.22,16947.080078,1962.869995
+2014-06-23,180.990005,,,2014-06-26,68.27,16937.259766,1962.609985
+2014-06-24,179.83999599999999,,,2014-06-27,68.31,16818.130859,1949.97998
+2014-06-25,180.720001,,,2014-06-30,68.37,16867.509766,1959.530029
+2014-06-26,180.53999299999998,,,2014-07-01,68.97,16846.130859,1957.219971
+2014-06-27,180.889999,,,2014-07-02,69.08,16851.839844,1960.959961
+2014-06-30,180.830002,,,2014-07-03,69.22,16826.599609,1960.22998
+2014-07-01,182.070007,,,2014-07-07,68.68,16956.070313,1973.319946
+2014-07-02,182.199997,,,2014-07-08,67.96,16976.240234,1974.619995
+2014-07-03,183.199997,,,2014-07-09,68.18,17068.259766,1985.439941
+2014-07-07,182.479996,,,2014-07-10,67.43,17024.210938,1977.6500239999998
+2014-07-08,181.25,,,2014-07-11,67.47,16906.619141,1963.709961
+2014-07-09,182.100006,,,2014-07-14,67.97,16985.609375,1972.8299559999998
+2014-07-10,181.350006,,,2014-07-15,67.8,16915.070313,1964.680054
+2014-07-11,181.630005,,,2014-07-16,68.22,16943.810547,1967.569946
+2014-07-14,182.509995,,,2014-07-17,67.35,17055.419922,1977.0999760000002
+2014-07-15,182.16000400000001,,,2014-07-18,67.88,17060.679688,1973.280029
+2014-07-16,182.949997,,,2014-07-21,67.63,17138.199219,1981.569946
+2014-07-17,180.800003,,,2014-07-22,67.93,16976.810547,1958.119995
+2014-07-18,182.649994,,,2014-07-23,68.07,17100.179688,1978.219971
+2014-07-21,182.229996,,,2014-07-24,68.23,17051.730469,1973.630005
+2014-07-22,183.149994,,,2014-07-25,67.95,17113.539063,1983.530029
+2014-07-23,183.470001,,,2014-07-28,67.96,17086.630859,1987.0100100000002
+2014-07-24,183.559998,,,2014-07-29,67.82,17083.800781,1987.97998
+2014-07-25,182.669998,,,2014-07-30,67.72,16960.570313,1978.339966
+2014-07-28,182.720001,,,2014-07-31,66.59,16982.589844,1978.910034
+2014-07-29,181.899994,,,2014-08-01,66.13,16912.109375,1969.949951
+2014-07-30,181.940002,,,2014-08-04,66.44,16880.359375,1970.069946
+2014-07-31,178.320007,,,2014-08-05,65.59,16563.300781,1930.6700440000002
+2014-08-01,177.809998,,,2014-08-06,65.43,16493.369141,1925.1500239999998
+2014-08-04,179.080002,,,2014-08-07,64.9,16569.279297,1938.9899899999998
+2014-08-05,177.360001,,,2014-08-08,65.28,16429.470703,1920.209961
+2014-08-06,177.419998,,,2014-08-11,65.53,16443.339844,1920.2399899999998
+2014-08-07,176.479996,,,2014-08-12,65.48,16368.269531,1909.569946
+2014-08-08,178.509995,,,2014-08-13,65.85,16553.929688,1931.589966
+2014-08-11,179.03999299999998,,,2014-08-14,66.2,16569.980469,1936.9200440000002
+2014-08-12,178.75,,,2014-08-15,66.13,16560.539063,1933.75
+2014-08-13,180.0,,,2014-08-18,66.56,16651.800781,1946.719971
+2014-08-14,180.78999299999998,,,2014-08-19,66.72,16713.580078,1955.180054
+2014-08-15,180.800003,,,2014-08-20,66.51,16662.910156,1955.060059
+2014-08-18,182.350006,,,2014-08-21,66.79,16838.740234,1971.7399899999998
+2014-08-19,183.300003,,,2014-08-22,66.47,16919.589844,1981.5999760000002
+2014-08-20,183.759995,,,2014-08-25,66.9,16979.130859,1986.5100100000002
+2014-08-21,184.309998,,,2014-08-26,66.91,17039.490234,1992.369995
+2014-08-22,183.970001,,,2014-08-27,67.04,17001.220703,1988.4000239999998
+2014-08-25,184.850006,,,2014-08-28,66.74,17076.869141,1997.9200440000002
+2014-08-26,185.03999299999998,,,2014-08-29,66.71,17106.699219,2000.02002
+2014-08-27,185.08999599999999,,,2014-09-02,66.84,17122.009766,2000.119995
+2014-08-28,184.800003,,,2014-09-03,67.31,17079.570313,1996.7399899999998
+2014-08-29,185.429993,,,2014-09-04,66.99,17098.449219,2003.369995
+2014-09-02,185.330002,,,2014-09-05,67.0,17067.560547,2002.280029
+2014-09-03,185.220001,,,2014-09-08,66.29,17078.279297,2000.719971
+2014-09-04,184.940002,,,2014-09-09,66.1,17069.580078,1997.6500239999998
+2014-09-05,185.869995,,,2014-09-10,66.48,17137.359375,2007.709961
+2014-09-08,185.330002,,,2014-09-11,66.11,17111.419922,2001.540039
+2014-09-09,184.119995,,,2014-09-12,66.02,17013.869141,1988.439941
+2014-09-10,184.809998,,,2014-09-15,65.88,17068.710938,1995.689941
+2014-09-11,185.020004,,,2014-09-16,66.16,17049.0,1997.449951
+2014-09-12,183.919998,,,2014-09-17,65.69,16987.509766,1985.540039
+2014-09-15,183.78999299999998,,,2014-09-18,66.2,17031.140625,1984.130005
+2014-09-16,185.169998,,,2014-09-19,65.97,17131.970703,1998.97998
+2014-09-17,185.41000400000001,,,2014-09-22,65.68,17156.849609,2001.569946
+2014-09-18,186.350006,,,2014-09-23,65.13,17265.990234,2011.359985
+2014-09-19,185.429993,,,2014-09-24,65.46,17279.740234,2010.4000239999998
+2014-09-22,183.940002,,,2014-09-25,64.5,17172.679688,1994.290039
+2014-09-23,182.899994,,,2014-09-26,64.77,17055.869141,1982.77002
+2014-09-24,184.330002,,,2014-09-29,64.17,17210.060547,1998.300049
+2014-09-25,181.350006,,,2014-09-30,64.12,16945.800781,1965.9899899999998
+2014-09-26,182.940002,,,2014-10-01,63.36,17113.150391,1982.8499760000002
+2014-09-29,182.490005,,,2014-10-02,62.68,17071.220703,1977.800049
+2014-09-30,181.990005,,,2014-10-03,62.68,17042.900391,1972.290039
+2014-10-01,179.58999599999999,,,2014-10-06,63.08,16804.710938,1946.160034
+2014-10-02,179.610001,,,2014-10-07,62.01,16801.050781,1946.1700440000002
+2014-10-03,181.610001,,,2014-10-08,62.99,17009.689453,1967.9000239999998
+2014-10-06,181.330002,,,2014-10-09,61.3,16991.910156,1964.819946
+2014-10-07,178.58999599999999,,,2014-10-10,60.38,16719.390625,1935.0999760000002
+2014-10-08,181.770004,,,2014-10-13,60.3,16994.220703,1968.890015
+2014-10-09,178.020004,,,2014-10-14,60.45,16659.25,1928.209961
+2014-10-10,176.0,,,2014-10-15,60.09,16544.099609,1906.130005
+2014-10-13,173.100006,,,2014-10-16,59.53,16321.070313,1874.7399899999998
+2014-10-14,173.380005,,,2014-10-17,60.64,16315.19043,1877.699951
+2014-10-15,171.979996,,,2014-10-20,61.02,16141.740234,1862.4899899999998
+2014-10-16,172.009995,,,2014-10-21,61.75,16117.240234,1862.7600100000002
+2014-10-17,174.229996,,,2014-10-22,61.3,16380.410156,1886.7600100000002
+2014-10-20,175.830002,,,2014-10-23,61.89,16399.669922,1904.0100100000002
+2014-10-21,179.270004,,,2014-10-24,62.23,16614.810547,1941.280029
+2014-10-22,177.979996,,,2014-10-27,61.88,16461.320313,1927.109985
+2014-10-23,180.169998,,,2014-10-28,62.82,16677.900391,1950.819946
+2014-10-24,181.440002,,,2014-10-29,62.34,16805.410156,1964.5799559999998
+2014-10-27,181.169998,,,2014-10-30,62.79,16817.939453,1961.630005
+2014-10-28,183.330002,,,2014-10-31,63.95,17005.75,1985.050049
+2014-10-29,183.08999599999999,,,2014-11-03,63.4,16974.310547,1982.300049
+2014-10-30,184.240005,,,2014-11-04,63.04,17195.419922,1994.6500239999998
+2014-10-31,186.399994,,,2014-11-05,63.16,17390.519531,2018.050049
+2014-11-03,186.380005,,,2014-11-06,62.82,17366.240234,2017.810059
+2014-11-04,185.850006,,,2014-11-07,62.85,17383.839844,2012.0999760000002
+2014-11-05,186.979996,,,2014-11-10,63.13,17484.529297,2023.569946
+2014-11-06,187.740005,,,2014-11-11,63.51,17554.470703,2031.209961
+2014-11-07,187.83999599999999,,,2014-11-12,62.97,17573.929688,2031.9200440000002
+2014-11-10,188.440002,,,2014-11-13,63.27,17613.740234,2038.2600100000002
+2014-11-11,188.570007,,,2014-11-14,63.36,17614.900391,2039.680054
+2014-11-12,188.490005,,,2014-11-17,63.11,17612.199219,2038.25
+2014-11-13,188.600006,,,2014-11-18,63.8,17652.789063,2039.3299559999998
+2014-11-14,188.669998,,,2014-11-19,63.61,17634.740234,2039.819946
+2014-11-17,188.820007,,,2014-11-20,63.23,17647.75,2041.319946
+2014-11-18,189.820007,,,2014-11-21,63.78,17687.820313,2051.800049
+2014-11-19,189.550003,,,2014-11-24,64.15,17685.730469,2048.719971
+2014-11-20,189.929993,,,2014-11-25,64.26,17719.0,2052.75
+2014-11-21,190.949997,,,2014-11-26,64.51,17810.060547,2063.5
+2014-11-24,191.5,,,2014-11-28,63.99,17817.900391,2069.409912
+2014-11-25,191.300003,,,2014-12-01,63.93,17814.939453,2067.030029
+2014-11-26,191.880005,,,2014-12-02,64.11,17827.75,2072.830078
+2014-11-28,191.399994,,,2014-12-03,64.03,17828.240234,2067.560059
+2014-12-01,190.100006,,,2014-12-04,63.82,17776.800781,2053.439941
+2014-12-02,191.330002,,,2014-12-05,63.96,17879.550781,2066.550049
+2014-12-03,192.100006,,,2014-12-08,63.4,17912.619141,2074.330078
+2014-12-04,191.880005,,,2014-12-09,63.06,17900.099609,2071.919922
+2014-12-05,192.199997,,,2014-12-10,62.26,17958.789063,2075.3701170000004
+2014-12-08,190.830002,,,2014-12-11,62.18,17852.480469,2060.310059
+2014-12-09,190.779999,,,2014-12-12,60.98,17801.199219,2059.820068
+2014-12-10,187.669998,,,2014-12-15,59.97,17533.150391,2026.140015
+2014-12-11,188.570007,,,2014-12-16,60.4,17596.339844,2035.3299559999998
+2014-12-12,185.520004,,,2014-12-17,60.53,17280.830078,2002.3299559999998
+2014-12-15,184.350006,,,2014-12-18,61.61,17180.839844,1989.630005
+2014-12-16,182.78999299999998,,,2014-12-19,61.7,17068.869141,1972.7399899999998
+2014-12-17,185.529999,,,2014-12-22,62.0,17356.869141,2012.890015
+2014-12-18,190.020004,,,2014-12-23,61.8,17778.150391,2061.22998
+2014-12-19,190.889999,,,2014-12-24,62.08,17804.800781,2070.649902
+2014-12-22,191.630005,,,2014-12-26,62.24,17959.439453,2078.540039
+2014-12-23,191.979996,,,2014-12-29,61.79,18024.169922,2082.169922
+2014-12-24,191.96000700000002,,,2014-12-30,61.22,18030.210938,2081.8798829999996
+2014-12-26,192.58999599999999,,,2014-12-31,60.84,18053.710938,2088.77002
+2014-12-29,192.78999299999998,,,2015-01-02,60.58,18038.230469,2090.570068
+2014-12-30,191.869995,,,2015-01-05,59.15,17983.070313,2080.350098
+2014-12-31,189.889999,,,2015-01-06,58.48,17823.070313,2058.899902
+2015-01-02,189.850006,,,2015-01-07,59.13,17832.990234,2058.199951
+2015-01-05,186.389999,,,2015-01-08,59.93,17501.650391,2020.5799559999998
+2015-01-06,184.729996,,,2015-01-09,59.64,17371.640625,2002.609985
+2015-01-07,186.940002,,,2015-01-12,59.5,17584.519531,2025.9000239999998
+2015-01-08,190.279999,,,2015-01-13,59.8,17907.869141,2062.139893
+2015-01-09,188.679993,,,2015-01-14,59.63,17737.369141,2044.810059
+2015-01-12,187.149994,,,2015-01-15,60.01,17640.839844,2028.2600100000002
+2015-01-13,186.690002,,,2015-01-16,60.79,17613.679688,2023.030029
+2015-01-14,185.610001,,,2015-01-20,61.0,17427.089844,2011.27002
+2015-01-15,183.899994,,,2015-01-21,61.48,17320.710938,1992.6700440000002
+2015-01-16,186.369995,,,2015-01-22,61.71,17511.570313,2019.4200440000002
+2015-01-20,186.66000400000001,,,2015-01-23,61.36,17515.230469,2022.550049
+2015-01-21,187.559998,,,2015-01-26,62.2,17554.279297,2032.119995
+2015-01-22,190.429993,,,2015-01-27,62.29,17813.980469,2063.149902
+2015-01-23,189.380005,,,2015-01-28,61.36,17672.599609,2051.820068
+2015-01-26,189.869995,,,2015-01-29,62.2,17678.699219,2057.090088
+2015-01-27,187.330002,,,2015-01-30,61.22,17387.210938,2029.550049
+2015-01-28,184.809998,,,2015-02-02,61.96,17191.369141,2002.160034
+2015-01-29,186.58999599999999,,,2015-02-03,62.95,17416.849609,2021.25
+2015-01-30,184.169998,,,2015-02-04,62.43,17164.949219,1994.9899899999998
+2015-02-02,186.559998,,,2015-02-05,63.29,17361.039063,2020.8499760000002
+2015-02-03,189.25,,,2015-02-06,62.5,17666.400391,2050.030029
+2015-02-04,188.520004,,,2015-02-09,62.2,17673.019531,2041.5100100000002
+2015-02-05,190.5,,,2015-02-10,62.77,17884.880859,2062.52002
+2015-02-06,189.899994,,,2015-02-11,62.43,17824.289063,2055.469971
+2015-02-09,189.100006,,,2015-02-12,63.4,17729.210938,2046.7399899999998
+2015-02-10,191.119995,,,2015-02-13,63.82,17868.759766,2068.590088
+2015-02-11,191.179993,,,2015-02-17,63.97,17862.140625,2068.530029
+2015-02-12,193.070007,,,2015-02-18,64.35,17972.380859,2088.47998
+2015-02-13,193.880005,,,2015-02-19,64.43,18019.349609,2096.98999
+2015-02-17,194.21000700000002,,,2015-02-20,65.03,18047.580078,2100.340088
+2015-02-18,194.16000400000001,,,2015-02-23,64.8,18029.849609,2099.679932
+2015-02-19,193.990005,,,2015-02-24,65.2,17985.769531,2097.449951
+2015-02-20,195.199997,,,2015-02-25,65.25,18140.439453,2110.300049
+2015-02-23,195.139999,,,2015-02-26,65.07,18116.839844,2109.659912
+2015-02-24,195.679993,,,2015-02-27,65.1,18209.189453,2115.47998
+2015-02-25,195.559998,,,2015-03-02,65.2,18224.570313,2113.860107
+2015-02-26,195.309998,,,2015-03-03,64.8,18214.419922,2110.73999
+2015-02-27,194.729996,,,2015-03-04,64.54,18132.699219,2104.5
+2015-03-02,195.929993,,,2015-03-05,64.69,18288.630859,2117.389893
+2015-03-03,195.03999299999998,,,2015-03-06,63.81,18203.369141,2107.780029
+2015-03-04,194.229996,,,2015-03-09,63.91,18096.900391,2098.530029
+2015-03-05,194.470001,,,2015-03-10,62.52,18135.720703,2101.040039
+2015-03-06,191.729996,,,2015-03-11,62.68,17856.779297,2071.26001
+2015-03-09,192.509995,,,2015-03-12,63.46,17995.720703,2079.429932
+2015-03-10,189.25,,,2015-03-13,63.09,17662.939453,2044.160034
+2015-03-11,188.919998,,,2015-03-16,63.8,17635.390625,2040.2399899999998
+2015-03-12,191.350006,,,2015-03-17,63.64,17895.220703,2065.949951
+2015-03-13,190.190002,,,2015-03-18,65.0,17749.310547,2053.399902
+2015-03-16,192.759995,,,2015-03-19,64.24,17977.419922,2081.189941
+2015-03-17,192.119995,,,2015-03-20,65.66,17849.080078,2074.280029
+2015-03-18,194.46000700000002,,,2015-03-23,65.99,18076.189453,2099.5
+2015-03-19,193.520004,,,2015-03-24,65.85,17959.029297,2089.27002
+2015-03-20,194.320007,,,2015-03-25,65.54,18127.650391,2108.100098
+2015-03-23,193.979996,,,2015-03-26,64.97,18116.039063,2104.419922
+2015-03-24,192.809998,,,2015-03-27,65.14,18011.140625,2091.5
+2015-03-25,190.009995,,,2015-03-30,65.18,17718.539063,2061.050049
+2015-03-26,189.559998,,,2015-03-31,64.17,17678.230469,2056.149902
+2015-03-27,190.03999299999998,,,2015-04-01,64.63,17712.660156,2061.02002
+2015-03-30,192.380005,,,2015-04-02,65.19,17976.310547,2086.23999
+2015-03-31,190.71000700000002,,,2015-04-06,65.85,17776.119141,2067.889893
+2015-04-01,189.979996,,,2015-04-07,65.76,17698.179688,2059.689941
+2015-04-02,190.649994,,,2015-04-08,66.04,17763.240234,2066.959961
+2015-04-06,191.91000400000001,,,2015-04-09,66.13,17880.849609,2080.6201170000004
+2015-04-07,191.520004,,,2015-04-10,66.26,17875.419922,2076.330078
+2015-04-08,192.100006,,,2015-04-13,65.84,17902.509766,2081.899902
+2015-04-09,192.96000700000002,,,2015-04-14,66.33,17958.730469,2091.179932
+2015-04-10,193.96000700000002,,,2015-04-15,66.63,18057.650391,2102.060059
+2015-04-13,193.08999599999999,,,2015-04-16,66.81,17977.039063,2092.429932
+2015-04-14,193.399994,,,2015-04-17,65.97,18036.699219,2095.840088
+2015-04-15,194.399994,,,2015-04-20,66.04,18112.609375,2106.6298829999996
+2015-04-16,194.25,,,2015-04-21,66.63,18105.769531,2104.98999
+2015-04-17,192.050003,,,2015-04-22,66.76,17826.300781,2081.179932
+2015-04-20,193.830002,,,2015-04-23,67.01,18034.929688,2100.399902
+2015-04-21,193.53999299999998,,,2015-04-24,67.4,17949.589844,2097.290039
+2015-04-22,194.529999,,,2015-04-27,67.73,18038.269531,2107.959961
+2015-04-23,195.009995,,,2015-04-28,67.81,18058.689453,2112.929932
+2015-04-24,195.449997,,,2015-04-29,67.22,18080.140625,2117.689941
+2015-04-27,194.639999,,,2015-04-30,66.51,18037.970703,2108.919922
+2015-04-28,195.199997,,,2015-05-01,67.25,18110.140625,2114.76001
+2015-04-29,194.479996,,,2015-05-04,67.18,18035.529297,2106.850098
+2015-04-30,192.520004,,,2015-05-05,66.18,17840.519531,2085.51001
+2015-05-01,194.619995,,,2015-05-06,66.35,18024.060547,2108.290039
+2015-05-04,195.190002,,,2015-05-07,66.13,18070.400391,2114.48999
+2015-05-05,192.899994,,,2015-05-08,67.66,17928.199219,2089.459961
+2015-05-06,192.110001,,,2015-05-11,67.07,17841.980469,2080.149902
+2015-05-07,192.880005,,,2015-05-12,67.03,17924.060547,2088.0
+2015-05-08,195.479996,,,2015-05-13,67.53,18191.109375,2116.100098
+2015-05-11,194.520004,,,2015-05-14,68.34,18105.169922,2105.330078
+2015-05-12,193.970001,,,2015-05-15,68.42,18068.230469,2099.1201170000004
+2015-05-13,193.940002,,,2015-05-18,68.19,18060.490234,2098.47998
+2015-05-14,196.050003,,,2015-05-19,67.93,18252.240234,2121.100098
+2015-05-15,196.220001,,,2015-05-20,68.06,18272.560547,2122.72998
+2015-05-18,196.830002,,,2015-05-21,68.42,18298.880859,2129.199951
+2015-05-19,196.740005,,,2015-05-22,67.98,18312.390625,2127.830078
+2015-05-20,196.580002,,,2015-05-26,66.76,18285.400391,2125.850098
+2015-05-21,197.070007,,,2015-05-27,67.41,18285.740234,2130.820068
+2015-05-22,196.630005,,,2015-05-28,67.29,18232.019531,2126.060059
+2015-05-26,194.610001,,,2015-05-29,66.64,18041.539063,2104.199951
+2015-05-27,196.419998,,,2015-06-01,66.46,18162.990234,2123.47998
+2015-05-28,196.199997,,,2015-06-02,66.77,18126.119141,2120.790039
+2015-05-29,194.970001,,,2015-06-03,67.14,18010.679688,2107.389893
+2015-06-01,195.389999,,,2015-06-04,66.42,18040.369141,2111.72998
+2015-06-02,195.199997,,,2015-06-05,65.63,18011.939453,2109.600098
+2015-06-03,195.649994,,,2015-06-08,65.54,18076.269531,2114.070068
+2015-06-04,193.970001,,,2015-06-09,65.18,17905.580078,2095.840088
+2015-06-05,193.690002,,,2015-06-10,66.55,17849.460938,2092.830078
+2015-06-08,192.470001,,,2015-06-11,66.73,17766.550781,2079.280029
+2015-06-09,192.550003,,,2015-06-12,66.2,17764.039063,2080.149902
+2015-06-10,194.880005,,,2015-06-15,65.8,18000.400391,2105.199951
+2015-06-11,195.279999,,,2015-06-16,65.78,18039.369141,2108.860107
+2015-06-12,193.929993,,,2015-06-17,65.63,17898.839844,2094.110107
+2015-06-15,193.029999,,,2015-06-18,66.22,17791.169922,2084.429932
+2015-06-16,194.130005,,,2015-06-19,66.06,17904.480469,2096.290039
+2015-06-17,194.520004,,,2015-06-22,67.31,17935.740234,2100.439941
+2015-06-18,196.470001,,,2015-06-23,67.49,18115.839844,2121.23999
+2015-06-19,194.570007,,,2015-06-24,66.9,18015.949219,2109.98999
+2015-06-22,195.75,,,2015-06-25,65.77,18119.779297,2122.850098
+2015-06-23,195.889999,,,2015-06-26,65.74,18144.070313,2124.199951
+2015-06-24,194.46000700000002,,,2015-06-29,63.72,17966.070313,2108.580078
+2015-06-25,193.889999,,,2015-06-30,63.49,17890.359375,2102.310059
+2015-06-26,193.850006,,,2015-07-01,63.9,17946.679688,2101.48999
+2015-06-29,189.83999599999999,,,2015-07-02,63.98,17596.349609,2057.639893
+2015-06-30,190.360001,,,2015-07-06,62.69,17619.509766,2063.110107
+2015-07-01,191.729996,,,2015-07-07,62.71,17757.910156,2077.419922
+2015-07-02,191.669998,,,2015-07-08,61.25,17730.109375,2076.780029
+2015-07-06,190.929993,,,2015-07-09,62.26,17683.580078,2068.76001
+2015-07-07,192.08999599999999,,,2015-07-10,64.3,17776.910156,2081.340088
+2015-07-08,188.949997,,,2015-07-13,64.54,17515.419922,2046.680054
+2015-07-09,189.380005,,,2015-07-14,65.08,17548.619141,2051.310059
+2015-07-10,191.71000700000002,,,2015-07-15,64.84,17760.410156,2076.6201170000004
+2015-07-13,193.850006,,,2015-07-16,65.4,17977.679688,2099.600098
+2015-07-14,194.71000700000002,,,2015-07-17,65.31,18053.580078,2108.949951
+2015-07-15,194.570007,,,2015-07-20,65.46,18050.169922,2107.399902
+2015-07-16,196.130005,,,2015-07-21,65.27,18120.25,2124.290039
+2015-07-17,196.350006,,,2015-07-22,64.77,18086.449219,2126.639893
+2015-07-20,196.5,,,2015-07-23,64.6,18100.410156,2128.280029
+2015-07-21,195.669998,,,2015-07-24,63.89,17919.289063,2119.209961
+2015-07-22,195.220001,,,2015-07-27,63.42,17851.039063,2114.149902
+2015-07-23,194.130005,,,2015-07-28,64.22,17731.919922,2102.149902
+2015-07-24,192.050003,,,2015-07-29,64.45,17568.529297,2079.649902
+2015-07-27,190.940002,,,2015-07-30,64.4,17440.589844,2067.639893
+2015-07-28,193.300003,,,2015-07-31,64.78,17630.269531,2093.25
+2015-07-29,194.740005,,,2015-08-03,64.61,17751.390625,2108.570068
+2015-07-30,194.759995,,,2015-08-04,64.66,17745.980469,2108.6298829999996
+2015-07-31,194.320007,,,2015-08-05,65.0,17689.859375,2103.840088
+2015-08-03,193.779999,,,2015-08-06,64.73,17598.199219,2098.040039
+2015-08-04,193.350006,,,2015-08-07,64.61,17550.689453,2093.320068
+2015-08-05,194.029999,,,2015-08-10,65.4,17540.470703,2099.840088
+2015-08-06,192.580002,,,2015-08-11,64.4,17419.75,2083.560059
+2015-08-07,192.029999,,,2015-08-12,63.94,17373.380859,2077.570068
+2015-08-10,194.490005,,,2015-08-13,63.9,17615.169922,2104.179932
+2015-08-11,192.669998,,,2015-08-14,64.0,17402.839844,2084.070068
+2015-08-12,192.899994,,,2015-08-17,63.88,17402.509766,2086.050049
+2015-08-13,192.679993,,,2015-08-18,63.4,17408.25,2083.389893
+2015-08-14,193.429993,,,2015-08-19,62.84,17477.400391,2091.540039
+2015-08-17,194.470001,,,2015-08-20,61.32,17545.179688,2102.439941
+2015-08-18,194.0,,,2015-08-21,59.86,17511.339844,2096.919922
+2015-08-19,192.41000400000001,,,2015-08-24,57.85,17348.730469,2079.610107
+2015-08-20,188.350006,,,2015-08-25,58.4,16990.689453,2035.72998
+2015-08-21,182.380005,,,2015-08-26,59.8,16459.75,1970.890015
+2015-08-24,175.190002,,,2015-08-27,60.51,15871.349609,1893.209961
+2015-08-25,172.830002,,,2015-08-28,60.42,15666.44043,1867.609985
+2015-08-26,179.58999599999999,,,2015-08-31,59.97,16285.509766,1940.5100100000002
+2015-08-27,183.970001,,,2015-09-01,57.93,16654.769531,1987.660034
+2015-08-28,184.110001,,,2015-09-02,58.82,16643.009766,1988.869995
+2015-08-31,182.580002,,,2015-09-03,58.94,16528.029297,1972.180054
+2015-09-01,177.190002,,,2015-09-04,57.58,16058.349609,1913.8499760000002
+2015-09-02,180.46000700000002,,,2015-09-08,59.3,16351.379883000001,1948.859985
+2015-09-03,180.679993,,,2015-09-09,59.06,16374.759766,1951.130005
+2015-09-04,177.919998,,,2015-09-10,59.45,16102.379883000001,1921.219971
+2015-09-08,182.399994,,,2015-09-11,59.44,16492.679688,1969.410034
+2015-09-09,179.880005,,,2015-09-14,58.99,16253.570313,1942.040039
+2015-09-10,180.850006,,,2015-09-15,59.39,16330.400391,1952.290039
+2015-09-11,181.71000700000002,,,2015-09-16,60.3,16433.089844,1961.050049
+2015-09-14,180.979996,,,2015-09-17,60.33,16370.959961000002,1953.030029
+2015-09-15,183.300003,,,2015-09-18,58.82,16599.849609,1978.089966
+2015-09-16,184.899994,,,2015-09-21,58.79,16739.949219,1995.310059
+2015-09-17,184.46000700000002,,,2015-09-22,57.39,16674.740234,1990.199951
+2015-09-18,180.570007,,,2015-09-23,57.12,16384.580078,1958.030029
+2015-09-21,181.389999,,,2015-09-24,56.95,16510.189453,1966.969971
+2015-09-22,179.16000400000001,,,2015-09-25,57.43,16330.469727000002,1942.7399899999998
+2015-09-23,178.800003,,,2015-09-28,56.33,16279.889647999998,1938.7600100000002
+2015-09-24,178.199997,,,2015-09-29,56.25,16201.320313,1932.2399899999998
+2015-09-25,178.110001,,,2015-09-30,57.32,16314.669922,1931.339966
+2015-09-28,173.58999599999999,,,2015-10-01,57.5,16001.889647999998,1881.77002
+2015-09-29,173.820007,,,2015-10-02,58.48,16049.129883000001,1884.089966
+2015-09-30,177.139999,,,2015-10-05,59.64,16284.700195,1920.030029
+2015-10-01,177.5,,,2015-10-06,59.71,16272.009766,1923.819946
+2015-10-02,180.059998,,,2015-10-07,60.46,16472.369141,1951.359985
+2015-10-05,183.360001,,,2015-10-08,60.94,16776.429688,1987.050049
+2015-10-06,182.699997,,,2015-10-09,61.05,16790.189453,1979.9200440000002
+2015-10-07,184.240005,,,2015-10-12,60.93,16912.289063,1995.8299559999998
+2015-10-08,185.860001,,,2015-10-13,60.16,17050.75,2013.430054
+2015-10-09,186.0,,,2015-10-14,60.28,17084.490234,2014.890015
+2015-10-12,186.240005,,,2015-10-15,61.32,17131.859375,2017.459961
+2015-10-13,184.979996,,,2015-10-16,61.26,17081.890625,2003.689941
+2015-10-14,184.119995,,,2015-10-19,61.05,16924.75,1994.2399899999998
+2015-10-15,186.869995,,,2015-10-20,60.8,17141.75,2023.859985
+2015-10-16,187.720001,,,2015-10-21,60.77,17215.970703,2033.109985
+2015-10-19,187.770004,,,2015-10-22,61.45,17230.539063,2033.660034
+2015-10-20,187.5,,,2015-10-23,62.06,17217.109375,2030.77002
+2015-10-21,186.429993,,,2015-10-26,61.83,17168.609375,2018.939941
+2015-10-22,189.53999299999998,,,2015-10-27,61.29,17489.160156,2052.51001
+2015-10-23,191.639999,,,2015-10-28,61.71,17646.699219,2075.149902
+2015-10-26,191.259995,,,2015-10-29,61.24,17623.050781,2071.179932
+2015-10-27,190.779999,,,2015-10-30,61.11,17581.429688,2065.889893
+2015-10-28,193.050003,,,2015-11-02,61.69,17779.519531,2090.350098
+2015-10-29,192.990005,,,2015-11-03,61.67,17755.800781,2089.409912
+2015-10-30,192.059998,,,2015-11-04,61.33,17663.539063,2079.360107
+2015-11-02,194.330002,,,2015-11-05,61.22,17828.759766,2104.050049
+2015-11-03,194.869995,,,2015-11-06,60.94,17918.150391,2109.790039
+2015-11-04,194.240005,,,2015-11-09,60.31,17867.580078,2102.310059
+2015-11-05,194.059998,,,2015-11-10,60.27,17863.429688,2099.929932
+2015-11-06,194.009995,,,2015-11-11,60.58,17910.330078,2099.199951
+2015-11-09,192.149994,,,2015-11-12,59.79,17730.480469,2078.580078
+2015-11-10,192.490005,,,2015-11-13,59.29,17758.210938,2081.719971
+2015-11-11,191.860001,,,2015-11-16,60.04,17702.220703,2075.0
+2015-11-12,189.21000700000002,,,2015-11-17,60.2,17448.070313,2045.969971
+2015-11-13,187.08999599999999,,,2015-11-18,60.75,17245.240234,2023.040039
+2015-11-16,189.91000400000001,,,2015-11-19,61.06,17483.009766,2053.189941
+2015-11-17,189.699997,,,2015-11-20,60.92,17489.5,2050.439941
+2015-11-18,192.78999299999998,,,2015-11-23,60.54,17737.160156,2083.580078
+2015-11-19,192.58999599999999,,,2015-11-24,60.55,17732.75,2081.23999
+2015-11-20,193.350006,,,2015-11-25,60.69,17823.810547,2089.169922
+2015-11-23,193.110001,,,2015-11-27,60.7,17792.679688,2086.590088
+2015-11-24,193.350006,,,2015-11-30,60.65,17812.189453,2089.139893
+2015-11-25,193.350006,,,2015-12-01,61.29,17813.390625,2088.8701170000004
+2015-11-27,193.5,,,2015-12-02,60.64,17813.390625,2090.110107
+2015-11-30,192.610001,,,2015-12-03,60.35,17719.919922,2080.409912
+2015-12-01,194.679993,,,2015-12-04,60.84,17888.349609,2102.6298829999996
+2015-12-02,192.58999599999999,,,2015-12-07,60.45,17729.679688,2079.51001
+2015-12-03,189.830002,,,2015-12-08,59.56,17477.669922,2049.6201170000004
+2015-12-04,193.720001,,,2015-12-09,59.29,17847.630859,2091.689941
+2015-12-07,192.380005,,,2015-12-10,59.3,17730.509766,2077.070068
+2015-12-08,191.139999,,,2015-12-11,58.17,17568.0,2063.590088
+2015-12-09,189.669998,,,2015-12-14,58.26,17492.300781,2047.619995
+2015-12-10,190.119995,,,2015-12-15,58.55,17574.75,2052.22998
+2015-12-11,186.46000700000002,,,2015-12-16,59.73,17265.210938,2012.369995
+2015-12-14,187.360001,,,2015-12-17,58.97,17368.5,2021.939941
+2015-12-15,189.350006,,,2015-12-18,58.35,17524.910156,2043.410034
+2015-12-16,192.110001,,,2015-12-21,58.11,17749.089844,2073.070068
+2015-12-17,189.25,,,2015-12-22,58.55,17495.839844,2041.890015
+2015-12-18,184.83999599999999,,,2015-12-23,59.53,17128.550781,2005.550049
+2015-12-21,186.300003,,,2015-12-24,59.43,17251.619141,2021.1500239999998
+2015-12-22,187.96000700000002,,,2015-12-28,59.29,17417.269531,2038.969971
+2015-12-23,190.309998,,,2015-12-29,59.88,17602.609375,2064.290039
+2015-12-24,190.0,,,2015-12-30,59.52,17552.169922,2060.98999
+2015-12-28,189.58999599999999,,,2015-12-31,58.72,17528.269531,2056.5
+2015-12-29,191.639999,,,2016-01-04,57.82,17720.980469,2078.360107
+2015-12-30,190.270004,,,2016-01-05,57.73,17603.869141,2063.360107
+2015-12-31,188.479996,,,2016-01-06,56.78,17425.029297,2043.939941
+2016-01-04,185.639999,,,2016-01-07,55.6,17148.939453,2012.660034
+2016-01-05,186.009995,,,2016-01-08,54.93,17158.660156,2016.709961
+2016-01-06,183.639999,,,2016-01-11,55.16,16906.509766,1990.2600100000002
+2016-01-07,179.28999299999998,,,2016-01-12,55.42,16514.099609,1943.089966
+2016-01-08,177.350006,,,2016-01-13,54.56,16346.450195,1922.030029
+2016-01-11,177.490005,,,2016-01-14,55.26,16398.570313,1923.6700440000002
+2016-01-12,178.880005,,,2016-01-15,53.26,16516.220703,1938.680054
+2016-01-13,174.429993,,,2016-01-19,53.75,16151.410156,1890.280029
+2016-01-14,177.350006,,,2016-01-20,52.53,16379.049805,1921.839966
+2016-01-15,173.520004,,,2016-01-21,52.92,15988.080078,1880.3299559999998
+2016-01-19,173.610001,,,2016-01-22,54.48,16016.019531,1881.3299559999998
+2016-01-20,171.610001,,,2016-01-25,53.75,15766.740234,1859.3299559999998
+2016-01-21,172.5,,,2016-01-26,54.71,15882.679688,1868.9899899999998
+2016-01-22,176.0,,,2016-01-27,54.36,16093.509766,1906.9000239999998
+2016-01-25,173.25,,,2016-01-28,54.52,15885.219727000002,1877.0799559999998
+2016-01-26,175.699997,,,2016-01-29,55.48,16167.230469,1903.630005
+2016-01-27,173.800003,,,2016-02-01,55.42,15944.459961000002,1882.949951
+2016-01-28,174.770004,,,2016-02-02,54.13,16069.639647999998,1893.359985
+2016-01-29,179.100006,,,2016-02-03,54.58,16466.300781,1940.2399899999998
+2016-02-01,179.029999,,,2016-02-04,54.65,16449.179688,1939.380005
+2016-02-02,175.679993,,,2016-02-05,53.81,16153.540038999998,1903.030029
+2016-02-03,176.619995,,,2016-02-08,52.83,16336.660156,1912.530029
+2016-02-04,176.919998,,,2016-02-09,52.2,16416.580078,1915.449951
+2016-02-05,173.66000400000001,,,2016-02-10,52.14,16204.969727000002,1880.050049
+2016-02-08,171.220001,,,2016-02-11,51.38,16027.049805,1853.439941
+2016-02-09,171.139999,,,2016-02-12,52.28,16014.379883000001,1852.209961
+2016-02-10,171.16000400000001,,,2016-02-16,53.34,15914.740234,1851.859985
+2016-02-11,169.08999599999999,,,2016-02-17,54.26,15660.179688,1829.0799559999998
+2016-02-12,172.41000400000001,,,2016-02-18,53.98,15973.839844,1864.780029
+2016-02-16,175.309998,,,2016-02-19,53.92,16196.410156,1895.5799559999998
+2016-02-17,178.220001,,,2016-02-22,54.53,16453.830078,1926.819946
+2016-02-18,177.389999,,,2016-02-23,53.64,16413.429688,1917.8299559999998
+2016-02-19,177.41000400000001,,,2016-02-24,53.45,16391.990234,1917.780029
+2016-02-22,179.970001,,,2016-02-25,54.09,16620.660156,1945.5
+2016-02-23,177.740005,,,2016-02-26,53.95,16431.779297,1921.27002
+2016-02-24,178.53999299999998,,,2016-02-29,53.63,16484.990234,1929.800049
+2016-02-25,180.610001,,,2016-03-01,55.03,16697.289063,1951.699951
+2016-02-26,180.28999299999998,,,2016-03-02,55.41,16639.970703,1948.050049
+2016-02-29,178.83999599999999,,,2016-03-03,55.95,16516.5,1932.22998
+2016-03-01,183.110001,,,2016-03-04,56.36,16865.080078,1978.3499760000002
+2016-03-02,183.899994,,,2016-03-07,56.29,16899.320313,1986.449951
+2016-03-03,184.559998,,,2016-03-08,55.74,16943.900391,1993.4000239999998
+2016-03-04,185.169998,,,2016-03-09,55.95,17006.769531,1999.9899899999998
+2016-03-07,185.350006,,,2016-03-10,55.86,17073.949219,2001.7600100000002
+2016-03-08,183.300003,,,2016-03-11,57.32,16964.099609,1979.2600100000002
+2016-03-09,184.25,,,2016-03-14,57.2,17000.359375,1989.2600100000002
+2016-03-10,184.28999299999998,,,2016-03-15,56.66,16995.130859,1989.569946
+2016-03-11,187.360001,,,2016-03-16,57.16,17213.310547,2022.189941
+2016-03-14,187.139999,,,2016-03-17,57.6,17229.130859,2019.640015
+2016-03-15,186.800003,,,2016-03-18,57.5,17251.529297,2015.930054
+2016-03-16,187.860001,,,2016-03-21,57.41,17325.759766,2027.219971
+2016-03-17,189.100006,,,2016-03-22,57.31,17481.490234,2040.589966
+2016-03-18,188.970001,,,2016-03-23,56.73,17602.300781,2049.580078
+2016-03-21,189.149994,,,2016-03-24,56.35,17623.869141,2051.600098
+2016-03-22,189.009995,,,2016-03-28,56.69,17582.570313,2049.800049
+2016-03-23,187.809998,,,2016-03-29,57.3,17502.589844,2036.709961
+2016-03-24,187.740005,,,2016-03-30,57.73,17515.730469,2035.939941
+2016-03-28,187.83999599999999,,,2016-03-31,57.16,17535.390625,2037.050049
+2016-03-29,189.529999,,,2016-04-01,56.55,17633.109375,2055.01001
+2016-03-30,190.369995,,,2016-04-04,56.43,17716.660156,2063.949951
+2016-03-31,189.990005,,,2016-04-05,55.32,17685.089844,2059.73999
+2016-04-01,191.190002,,,2016-04-06,56.22,17792.75,2072.780029
+2016-04-04,190.610001,,,2016-04-07,55.4,17737.0,2066.1298829999996
+2016-04-05,188.679993,,,2016-04-08,56.46,17603.320313,2045.1700440000002
+2016-04-06,190.729996,,,2016-04-11,56.49,17716.050781,2066.659912
+2016-04-07,188.449997,,,2016-04-12,57.33,17541.960938,2041.910034
+2016-04-08,188.979996,,,2016-04-13,58.24,17576.960938,2047.5999760000002
+2016-04-11,188.46000700000002,,,2016-04-14,58.43,17556.410156,2041.9899899999998
+2016-04-12,190.28999299999998,,,2016-04-15,58.3,17721.25,2061.719971
+2016-04-13,192.220001,,,2016-04-18,58.8,17908.279297,2082.419922
+2016-04-14,192.279999,,,2016-04-19,59.82,17926.429688,2082.780029
+2016-04-15,192.08999599999999,,,2016-04-20,59.87,17897.460938,2080.72998
+2016-04-18,193.350006,,,2016-04-21,59.51,18004.160156,2094.340088
+2016-04-19,193.940002,,,2016-04-22,59.54,18053.599609,2100.800049
+2016-04-20,194.100006,,,2016-04-25,59.24,18096.269531,2102.399902
+2016-04-21,193.08999599999999,,,2016-04-26,59.45,17982.519531,2091.47998
+2016-04-22,193.100006,,,2016-04-27,59.49,18003.75,2091.580078
+2016-04-25,192.75,,,2016-04-28,58.68,17977.240234,2087.790039
+2016-04-26,193.110001,,,2016-04-29,58.43,17990.320313,2091.699951
+2016-04-27,193.440002,,,2016-05-02,58.98,18041.550781,2095.149902
+2016-04-28,191.669998,,,2016-05-03,58.01,17830.759766,2075.810059
+2016-04-29,190.699997,,,2016-05-04,57.34,17773.640625,2065.300049
+2016-05-02,192.190002,,,2016-05-05,57.22,17891.160156,2081.429932
+2016-05-03,190.529999,,,2016-05-06,57.38,17750.910156,2063.3701170000004
+2016-05-04,189.440002,,,2016-05-09,57.26,17651.259766,2051.1201170000004
+2016-05-05,189.429993,,,2016-05-10,58.08,17660.710938,2050.6298829999996
+2016-05-06,190.059998,,,2016-05-11,57.58,17740.630859,2057.139893
+2016-05-09,190.199997,,,2016-05-12,57.56,17705.910156,2058.689941
+2016-05-10,192.580002,,,2016-05-13,56.97,17928.349609,2084.389893
+2016-05-11,190.83999599999999,,,2016-05-16,57.65,17711.119141,2064.459961
+2016-05-12,190.820007,,,2016-05-17,57.23,17720.5,2064.110107
+2016-05-13,189.220001,,,2016-05-18,57.25,17535.320313,2046.609985
+2016-05-16,191.08999599999999,,,2016-05-19,56.84,17710.710938,2066.659912
+2016-05-17,189.350006,,,2016-05-20,57.31,17529.980469,2047.209961
+2016-05-18,189.419998,,,2016-05-23,57.12,17526.619141,2047.630005
+2016-05-19,188.720001,,,2016-05-24,57.95,17435.400391,2040.040039
+2016-05-20,189.880005,,,2016-05-25,58.56,17500.939453,2052.320068
+2016-05-23,189.490005,,,2016-05-26,58.72,17492.929688,2048.040039
+2016-05-24,192.080002,,,2016-05-27,58.66,17706.050781,2076.060059
+2016-05-25,193.429993,,,2016-05-31,58.38,17851.509766,2090.540039
+2016-05-26,193.419998,,,2016-06-01,58.33,17828.289063,2090.100098
+2016-05-27,194.279999,,,2016-06-02,58.33,17873.220703,2099.060059
+2016-05-31,194.100006,,,2016-06-03,58.71,17787.199219,2096.949951
+2016-06-01,194.350006,,,2016-06-06,59.04,17789.669922,2099.330078
+2016-06-02,194.919998,,,2016-06-07,59.47,17838.560547,2105.26001
+2016-06-03,194.360001,,,2016-06-08,59.59,17807.060547,2099.1298829999996
+2016-06-06,195.309998,,,2016-06-09,58.86,17920.330078,2109.409912
+2016-06-07,195.570007,,,2016-06-10,57.15,17938.279297,2112.1298829999996
+2016-06-08,196.25,,,2016-06-13,56.32,18005.050781,2119.1201170000004
+2016-06-09,195.919998,,,2016-06-14,55.42,17985.189453,2115.47998
+2016-06-10,194.130005,,,2016-06-15,55.79,17865.339844,2096.070068
+2016-06-13,192.610001,,,2016-06-16,55.9,17732.480469,2079.060059
+2016-06-14,192.279999,,,2016-06-17,56.46,17674.820313,2075.320068
+2016-06-15,191.940002,,,2016-06-20,57.86,17640.169922,2071.5
+2016-06-16,192.570007,,,2016-06-21,58.33,17733.099609,2077.98999
+2016-06-17,191.940002,,,2016-06-22,57.12,17675.160156,2071.219971
+2016-06-20,192.149994,,,2016-06-23,58.7,17804.869141,2083.25
+2016-06-21,192.690002,,,2016-06-24,53.66,17829.730469,2088.899902
+2016-06-22,192.369995,,,2016-06-27,52.63,17780.830078,2085.449951
+2016-06-23,194.940002,,,2016-06-28,54.01,18011.070313,2113.320068
+2016-06-24,187.929993,,,2016-06-29,55.0,17400.75,2037.410034
+2016-06-27,184.529999,,,2016-06-30,55.82,17140.240234,2000.540039
+2016-06-28,187.860001,,,2016-07-01,55.82,17409.720703,2036.089966
+2016-06-29,191.080002,,,2016-07-05,54.74,17694.679688,2070.77002
+2016-06-30,193.669998,,,2016-07-06,54.64,17929.990234,2098.860107
+2016-07-01,194.080002,,,2016-07-07,54.42,17949.369141,2102.949951
+2016-07-05,192.759995,,,2016-07-08,55.25,17840.619141,2088.550049
+2016-07-06,193.860001,,,2016-07-11,56.06,17918.619141,2099.72998
+2016-07-07,193.71000700000002,,,2016-07-12,56.82,17895.880859,2097.899902
+2016-07-08,196.66000400000001,,,2016-07-13,56.76,18146.740234,2129.899902
+2016-07-11,197.330002,,,2016-07-14,57.25,18226.929688,2137.159912
+2016-07-12,198.720001,,,2016-07-15,56.96,18347.669922,2152.139893
+2016-07-13,198.759995,,,2016-07-18,57.1,18372.119141,2152.429932
+2016-07-14,199.809998,,,2016-07-19,56.65,18506.410156,2163.75
+2016-07-15,199.619995,,,2016-07-20,57.16,18516.550781,2161.73999
+2016-07-18,200.110001,,,2016-07-21,56.93,18533.050781,2166.889893
+2016-07-19,199.820007,,,2016-07-22,57.04,18559.009766,2163.780029
+2016-07-20,200.699997,,,2016-07-25,56.97,18595.029297,2173.02002
+2016-07-21,199.979996,,,2016-07-26,57.21,18517.230469,2165.169922
+2016-07-22,200.889999,,,2016-07-27,57.42,18570.849609,2175.030029
+2016-07-25,200.279999,,,2016-07-28,57.36,18493.060547,2168.47998
+2016-07-26,200.350006,,,2016-07-29,58.04,18473.75,2169.179932
+2016-07-27,200.119995,,,2016-08-01,57.66,18472.169922,2166.580078
+2016-07-28,200.46000700000002,,,2016-08-02,57.37,18456.349609,2170.060059
+2016-07-29,200.78999299999998,,,2016-08-03,57.17,18432.240234,2173.600098
+2016-08-01,200.529999,,,2016-08-04,57.5,18404.509766,2170.840088
+2016-08-02,199.259995,,,2016-08-05,57.76,18313.769531,2157.030029
+2016-08-03,199.940002,,,2016-08-08,57.88,18355.0,2163.790039
+2016-08-04,200.029999,,,2016-08-09,58.34,18352.050781,2164.25
+2016-08-05,201.759995,,,2016-08-10,58.54,18543.529297,2182.8701170000004
+2016-08-08,201.58999599999999,,,2016-08-11,58.96,18529.289063,2180.889893
+2016-08-09,201.679993,,,2016-08-12,58.81,18533.050781,2181.73999
+2016-08-10,201.169998,,,2016-08-15,59.04,18495.660156,2175.48999
+2016-08-11,202.149994,,,2016-08-16,58.95,18613.519531,2185.790039
+2016-08-12,202.0,,,2016-08-17,58.93,18576.470703,2184.050049
+2016-08-15,202.58999599999999,,,2016-08-18,59.23,18636.050781,2190.149902
+2016-08-16,201.509995,,,2016-08-19,58.79,18552.019531,2178.149902
+2016-08-17,201.940002,,,2016-08-22,58.85,18573.939453,2182.219971
+2016-08-18,202.389999,,,2016-08-23,59.1,18597.699219,2187.02002
+2016-08-19,202.119995,,,2016-08-24,58.96,18552.570313,2183.8701170000004
+2016-08-22,202.009995,,,2016-08-25,58.72,18529.419922,2182.639893
+2016-08-23,202.41000400000001,,,2016-08-26,58.37,18547.300781,2186.899902
+2016-08-24,201.360001,,,2016-08-29,58.55,18481.480469,2175.439941
+2016-08-25,201.08999599999999,,,2016-08-30,58.47,18448.410156,2172.469971
+2016-08-26,200.779999,,,2016-08-31,58.35,18395.400391,2169.040039
+2016-08-29,201.850006,,,2016-09-01,58.75,18502.990234,2180.3798829999996
+2016-08-30,201.490005,,,2016-09-02,59.43,18454.300781,2176.1201170000004
+2016-08-31,201.050003,,,2016-09-06,59.83,18400.880859,2170.949951
+2016-09-01,201.03999299999998,,,2016-09-07,59.86,18419.300781,2170.860107
+2016-09-02,201.889999,,,2016-09-08,59.69,18491.960938,2179.97998
+2016-09-06,202.5,,,2016-09-09,58.53,18538.119141,2186.47998
+2016-09-07,202.520004,,,2016-09-12,59.01,18526.140625,2186.159912
+2016-09-08,202.080002,,,2016-09-13,57.82,18479.910156,2181.300049
+2016-09-09,197.119995,,,2016-09-14,57.74,18085.449219,2127.810059
+2016-09-12,199.169998,,,2016-09-15,58.24,18325.070313,2159.040039
+2016-09-13,196.279999,,,2016-09-16,57.49,18066.75,2127.02002
+2016-09-14,196.179993,,,2016-09-19,57.79,18034.769531,2125.77002
+2016-09-15,198.199997,,,2016-09-20,58.14,18212.480469,2147.26001
+2016-09-16,197.449997,,,2016-09-21,59.16,18123.800781,2139.159912
+2016-09-19,197.449997,,,2016-09-22,59.76,18120.169922,2139.1201170000004
+2016-09-20,197.509995,,,2016-09-23,59.26,18129.960938,2139.76001
+2016-09-21,199.66000400000001,,,2016-09-26,58.71,18293.699219,2163.1201170000004
+2016-09-22,200.970001,,,2016-09-27,58.99,18392.460938,2177.179932
+2016-09-23,199.809998,,,2016-09-28,59.41,18261.449219,2164.689941
+2016-09-26,198.110001,,,2016-09-29,58.67,18094.830078,2146.100098
+2016-09-27,199.399994,,,2016-09-30,59.13,18228.300781,2159.929932
+2016-09-28,200.490005,,,2016-10-03,58.97,18339.240234,2171.3701170000004
+2016-09-29,198.630005,,,2016-10-04,58.96,18143.449219,2151.1298829999996
+2016-09-30,200.21000700000002,,,2016-10-05,59.2,18308.150391,2168.27002
+2016-10-03,199.580002,,,2016-10-06,58.88,18253.849609,2161.199951
+2016-10-04,198.610001,,,2016-10-07,58.58,18168.449219,2150.48999
+2016-10-05,199.550003,,,2016-10-10,58.75,18281.029297,2159.72998
+2016-10-06,199.649994,,,2016-10-11,57.92,18268.5,2160.77002
+2016-10-07,199.009995,,,2016-10-12,57.79,18240.490234,2153.73999
+2016-10-10,199.919998,,,2016-10-13,57.57,18329.039063,2163.659912
+2016-10-11,197.440002,,,2016-10-14,57.67,18128.660156,2136.72998
+2016-10-12,197.679993,,,2016-10-17,57.5,18144.199219,2139.179932
+2016-10-13,197.070007,,,2016-10-18,58.07,18098.939453,2132.550049
+2016-10-14,197.110001,,,2016-10-19,58.23,18138.380859,2132.97998
+2016-10-17,196.520004,,,2016-10-20,58.32,18086.400391,2126.5
+2016-10-18,197.720001,,,2016-10-21,58.19,18161.939453,2139.600098
+2016-10-19,198.179993,,,2016-10-24,58.18,18202.619141,2144.290039
+2016-10-20,197.929993,,,2016-10-25,58.14,18162.349609,2141.340088
+2016-10-21,197.91000400000001,,,2016-10-26,57.88,18145.710938,2141.159912
+2016-10-24,198.850006,,,2016-10-27,57.81,18223.029297,2151.330078
+2016-10-25,198.100006,,,2016-10-28,57.79,18169.269531,2143.159912
+2016-10-26,197.75,,,2016-10-31,57.82,18199.330078,2139.429932
+2016-10-27,197.169998,,,2016-11-01,57.57,18169.679688,2133.040039
+2016-10-28,196.570007,,,2016-11-02,57.18,18161.189453,2126.409912
+2016-10-31,196.53999299999998,,,2016-11-03,57.12,18142.419922,2126.149902
+2016-11-01,195.21000700000002,,,2016-11-04,56.57,18037.099609,2111.719971
+2016-11-02,193.96000700000002,,,2016-11-07,57.35,17959.640625,2097.939941
+2016-11-03,193.169998,,,2016-11-08,57.51,17930.669922,2088.659912
+2016-11-04,192.860001,,,2016-11-09,57.56,17888.279297,2085.179932
+2016-11-07,197.139999,,,2016-11-10,57.4,18259.599609,2131.52002
+2016-11-08,197.979996,,,2016-11-11,57.05,18332.740234,2139.560059
+2016-11-09,200.190002,,,2016-11-14,56.74,18589.689453,2163.26001
+2016-11-10,200.600006,,,2016-11-15,56.99,18807.880859,2167.47998
+2016-11-11,200.320007,,,2016-11-16,56.39,18847.660156,2164.449951
+2016-11-14,200.320007,,,2016-11-17,56.82,18868.689453,2164.199951
+2016-11-15,201.869995,,,2016-11-18,56.2,18923.060547,2180.389893
+2016-11-16,201.600006,,,2016-11-21,56.68,18868.140625,2176.939941
+2016-11-17,202.559998,,,2016-11-22,56.82,18903.820313,2187.1201170000004
+2016-11-18,202.110001,,,2016-11-23,56.62,18867.929688,2181.899902
+2016-11-21,203.610001,,,2016-11-25,56.79,18956.689453,2198.179932
+2016-11-22,204.059998,,,2016-11-28,56.49,19023.869141,2202.939941
+2016-11-23,204.240005,,,2016-11-29,56.85,19083.179688,2204.719971
+2016-11-25,205.03999299999998,,,2016-11-30,56.79,19152.140625,2213.350098
+2016-11-28,203.990005,,,2016-12-01,56.57,19097.900391,2201.719971
+2016-11-29,204.309998,,,2016-12-02,56.71,19121.599609,2204.659912
+2016-11-30,203.809998,,,2016-12-05,57.27,19123.580078,2198.810059
+2016-12-01,203.100006,,,2016-12-06,57.66,19191.929688,2191.080078
+2016-12-02,203.179993,,,2016-12-07,58.52,19170.419922,2191.949951
+2016-12-05,204.380005,,,2016-12-08,58.47,19216.240234,2204.709961
+2016-12-06,205.080002,,,2016-12-09,58.72,19251.779297,2212.22998
+2016-12-07,207.820007,,,2016-12-12,58.46,19549.619141,2241.350098
+2016-12-08,208.28999299999998,,,2016-12-13,59.09,19614.810547,2246.189941
+2016-12-09,209.520004,,,2016-12-14,58.22,19756.849609,2259.530029
+2016-12-12,209.300003,,,2016-12-15,58.09,19796.429688,2256.959961
+2016-12-13,210.69999700000002,,,2016-12-16,58.13,19911.210938,2271.719971
+2016-12-14,209.0,,,2016-12-19,58.04,19792.529297,2253.280029
+2016-12-15,209.82000699999998,,,2016-12-20,58.24,19852.240234,2262.030029
+2016-12-16,209.46000700000002,,,2016-12-21,57.66,19843.410156,2258.070068
+2016-12-19,209.88000499999998,,,2016-12-22,57.53,19883.060547,2262.530029
+2016-12-20,210.669998,,,2016-12-23,57.68,19974.619141,2270.76001
+2016-12-21,208.899994,,,2016-12-27,57.61,19941.960938,2265.179932
+2016-12-22,208.53999299999998,,,2016-12-28,57.39,19918.880859,2260.959961
+2016-12-23,208.820007,,,2016-12-29,57.53,19933.810547,2263.790039
+2016-12-27,209.28999299999998,,,2016-12-30,57.73,19945.039063,2268.8798829999996
+2016-12-28,207.580002,,,2017-01-03,58.09,19833.679688,2249.919922
+2016-12-29,207.529999,,,2017-01-04,58.75,19819.779297,2249.26001
+2016-12-30,206.570007,,,2017-01-05,59.25,19762.599609,2238.830078
+2017-01-03,208.330002,,,2017-01-06,59.05,19881.759766,2257.830078
+2017-01-04,209.570007,,,2017-01-09,58.96,19942.160156,2270.75
+2017-01-05,209.41000400000001,,,2017-01-10,58.97,19899.289063,2269.0
+2017-01-06,210.210007,,,2017-01-11,59.28,19963.800781,2276.97998
+2017-01-09,209.46000700000002,,,2017-01-12,59.37,19887.380859,2268.899902
+2017-01-10,209.46000700000002,,,2017-01-13,59.59,19855.529297,2268.899902
+2017-01-11,210.07000699999998,,,2017-01-17,59.37,19954.279297,2275.320068
+2017-01-12,209.619995,,,2017-01-18,59.2,19891.0,2270.439941
+2017-01-13,210.00999500000003,,,2017-01-19,59.05,19885.730469,2274.639893
+2017-01-17,209.380005,,,2017-01-20,59.39,19826.769531,2267.889893
+2017-01-18,209.789993,,,2017-01-23,59.54,19804.720703,2271.889893
+2017-01-19,209.029999,,,2017-01-24,59.69,19732.400391,2263.689941
+2017-01-20,209.74000499999997,,,2017-01-25,60.31,19827.25,2271.310059
+2017-01-23,209.179993,,,2017-01-26,60.07,19799.849609,2265.199951
+2017-01-24,210.55000299999998,,,2017-01-27,59.97,19912.710938,2280.070068
+2017-01-25,212.24000499999997,,,2017-01-30,59.54,20068.509766,2298.3701170000004
+2017-01-26,212.08999599999999,,,2017-01-31,59.63,20100.910156,2296.679932
+2017-01-27,211.919998,,,2017-02-01,59.87,20093.779297,2294.689941
+2017-01-30,210.649994,,,2017-02-02,59.9,19971.130859,2280.899902
+2017-01-31,210.460007,,,2017-02-03,60.14,19864.089844,2278.8701170000004
+2017-02-01,210.57000699999998,,,2017-02-06,59.71,19890.939453,2279.550049
+2017-02-02,210.710007,,,2017-02-07,59.65,19884.910156,2280.850098
+2017-02-03,212.25,,,2017-02-08,59.75,20071.460938,2297.419922
+2017-02-06,211.80000299999998,,,2017-02-09,60.0,20052.419922,2292.560059
+2017-02-07,211.86000099999998,,,2017-02-10,60.14,20090.289063,2293.080078
+2017-02-08,212.07000699999998,,,2017-02-13,60.38,20054.339844,2294.669922
+2017-02-09,213.330002,,,2017-02-14,60.29,20172.400391,2307.8701170000004
+2017-02-10,214.11000099999998,,,2017-02-15,60.52,20269.369141,2316.100098
+2017-02-13,215.27999900000003,,,2017-02-16,60.66,20412.160156,2328.25
+2017-02-14,216.210007,,,2017-02-17,60.5,20504.410156,2337.580078
+2017-02-15,217.32000699999998,,,2017-02-21,60.7,20611.859375,2349.25
+2017-02-16,217.149994,,,2017-02-22,60.7,20619.769531,2347.219971
+2017-02-17,217.520004,,,2017-02-23,60.83,20624.050781,2351.159912
+2017-02-21,218.830002,,,2017-02-24,60.39,20743.0,2365.3798829999996
+2017-02-22,218.61000099999998,,,2017-02-27,60.43,20775.599609,2362.820068
+2017-02-23,218.729996,,,2017-02-28,60.34,20810.320313,2363.810059
+2017-02-24,219.100006,,,2017-03-01,60.97,20821.759766,2367.340088
+2017-02-27,219.36000099999998,,,2017-03-02,60.57,20837.439453,2369.75
+2017-02-28,218.80000299999998,,,2017-03-03,60.93,20812.240234,2363.639893
+2017-03-01,221.830002,,,2017-03-06,60.74,21115.550781,2395.959961
+2017-03-02,220.55000299999998,,,2017-03-07,60.53,21002.970703,2381.919922
+2017-03-03,220.66000400000001,,,2017-03-08,60.31,21005.710938,2383.1201170000004
+2017-03-06,219.940002,,,2017-03-09,60.54,20954.339844,2375.310059
+2017-03-07,219.32000699999998,,,2017-03-10,61.05,20924.759766,2368.389893
+2017-03-08,218.88000499999998,,,2017-03-13,61.37,20855.730469,2362.97998
+2017-03-09,219.05000299999998,,,2017-03-14,60.9,20858.189453,2364.8701170000004
+2017-03-10,219.770004,,,2017-03-15,61.77,20902.980469,2372.600098
+2017-03-13,219.919998,,,2017-03-16,62.07,20881.480469,2373.469971
+2017-03-14,219.17999300000002,,,2017-03-17,62.23,20837.369141,2365.449951
+2017-03-15,221.02999900000003,,,2017-03-20,62.1,20950.099609,2385.26001
+2017-03-16,220.669998,,,2017-03-21,61.82,20934.550781,2381.3798829999996
+2017-03-17,220.38000499999998,,,2017-03-22,61.83,20914.619141,2378.25
+2017-03-20,219.94999700000002,,,2017-03-23,61.97,20905.859375,2373.469971
+2017-03-21,216.270004,,,2017-03-24,62.14,20668.009766,2344.02002
+2017-03-22,216.690002,,,2017-03-27,62.3,20661.300781,2348.449951
+2017-03-23,216.460007,,,2017-03-28,62.6,20656.580078,2345.959961
+2017-03-24,216.27999900000003,,,2017-03-29,62.6,20596.720703,2343.97998
+2017-03-27,216.059998,,,2017-03-30,62.38,20550.980469,2341.590088
+2017-03-28,217.61999500000002,,,2017-03-31,62.29,20701.5,2358.570068
+2017-03-29,217.899994,,,2017-04-03,62.2,20659.320313,2361.1298829999996
+2017-03-30,218.55000299999998,,,2017-04-04,62.18,20728.490234,2368.060059
+2017-03-31,218.05000299999998,,,2017-04-05,61.85,20663.220703,2362.719971
+2017-04-03,217.69999700000002,,,2017-04-06,61.86,20650.210938,2358.840088
+2017-04-04,217.86000099999998,,,2017-04-07,61.82,20689.240234,2360.159912
+2017-04-05,217.22000099999997,,,2017-04-10,61.75,20648.150391,2352.949951
+2017-04-06,217.69999700000002,,,2017-04-11,62.04,20662.949219,2357.48999
+2017-04-07,217.520004,,,2017-04-12,61.99,20656.099609,2355.540039
+2017-04-10,217.67999300000002,,,2017-04-13,61.59,20658.019531,2357.159912
+2017-04-11,217.38999900000002,,,2017-04-17,61.97,20651.300781,2353.780029
+2017-04-12,216.580002,,,2017-04-18,61.69,20591.859375,2344.929932
+2017-04-13,215.11000099999998,,,2017-04-19,61.44,20453.25,2328.949951
+2017-04-17,216.94999700000002,,,2017-04-20,61.93,20636.919922,2349.01001
+2017-04-18,216.330002,,,2017-04-21,61.97,20523.279297,2342.189941
+2017-04-19,215.99000499999997,,,2017-04-24,63.54,20404.490234,2338.169922
+2017-04-20,217.61999500000002,,,2017-04-25,63.99,20578.710938,2355.840088
+2017-04-21,216.960007,,,2017-04-26,63.81,20547.759766,2348.689941
+2017-04-24,219.32000699999998,,,2017-04-27,63.87,20763.890625,2374.149902
+2017-04-25,220.649994,,,2017-04-28,63.8,20996.119141,2388.610107
+2017-04-26,220.55000299999998,,,2017-05-01,64.06,20975.089844,2387.449951
+2017-04-27,220.690002,,,2017-05-02,64.39,20981.330078,2388.77002
+2017-04-28,220.270004,,,2017-05-03,64.26,20940.509766,2384.199951
+2017-05-01,220.649994,,,2017-05-04,64.87,20913.460938,2388.330078
+2017-05-02,220.91000400000001,,,2017-05-05,65.59,20949.890625,2391.169922
+2017-05-03,220.669998,,,2017-05-08,65.1,20957.900391,2388.1298829999996
+2017-05-04,220.809998,,,2017-05-09,64.94,20951.470703,2389.52002
+2017-05-05,221.72000099999997,,,2017-05-10,65.04,21006.939453,2399.290039
+2017-05-08,221.74000499999997,,,2017-05-11,64.88,21012.279297,2399.3798829999996
+2017-05-09,221.52999900000003,,,2017-05-12,65.24,20975.779297,2396.919922
+2017-05-10,221.86000099999998,,,2017-05-15,65.57,20943.109375,2399.6298829999996
+2017-05-11,221.44999700000002,,,2017-05-16,65.99,20919.419922,2394.439941
+2017-05-12,221.13000499999998,,,2017-05-17,65.24,20896.609375,2390.899902
+2017-05-15,222.210007,,,2017-05-18,65.35,20981.939453,2402.320068
+2017-05-16,222.100006,,,2017-05-19,66.11,20979.75,2400.669922
+2017-05-17,218.13000499999998,,,2017-05-22,66.19,20606.929688,2357.030029
+2017-05-18,218.92999300000002,,,2017-05-23,66.2,20663.019531,2365.719971
+2017-05-19,220.419998,,,2017-05-24,66.24,20804.839844,2381.72998
+2017-05-22,221.559998,,,2017-05-25,66.24,20894.830078,2394.02002
+2017-05-23,221.97000099999997,,,2017-05-26,66.05,20937.910156,2398.419922
+2017-05-24,222.52999900000003,,,2017-05-30,65.98,21012.419922,2404.389893
+2017-05-25,223.55000299999998,,,2017-05-31,66.06,21082.949219,2415.070068
+2017-05-26,223.649994,,,2017-06-01,66.49,21080.279297,2415.820068
+2017-05-30,223.41000400000001,,,2017-06-02,67.22,21029.470703,2412.909912
+2017-05-31,223.33999599999999,,,2017-06-05,66.85,21008.650391,2411.800049
+2017-06-01,225.059998,,,2017-06-06,66.66,21144.179688,2430.060059
+2017-06-02,225.88999900000002,,,2017-06-07,66.68,21206.289063,2439.070068
+2017-06-05,225.61999500000002,,,2017-06-08,66.56,21184.039063,2436.100098
+2017-06-06,225.0,,,2017-06-09,66.31,21136.230469,2429.330078
+2017-06-07,225.38999900000002,,,2017-06-12,66.06,21173.689453,2433.139893
+2017-06-08,225.44999700000002,,,2017-06-13,66.57,21182.529297,2433.790039
+2017-06-09,225.270004,,,2017-06-14,66.52,21271.970703,2431.77002
+2017-06-12,225.059998,,,2017-06-15,65.83,21235.669922,2429.389893
+2017-06-13,226.13999900000002,,,2017-06-16,66.39,21328.470703,2440.350098
+2017-06-14,225.92999300000002,,,2017-06-19,66.66,21374.560547,2437.919922
+2017-06-15,225.460007,,,2017-06-20,65.07,21359.900391,2432.459961
+2017-06-16,225.52999900000003,,,2017-06-21,64.99,21384.279297,2433.149902
+2017-06-19,227.41000400000001,,,2017-06-22,64.98,21528.990234,2453.459961
+2017-06-20,225.88999900000002,,,2017-06-23,65.14,21467.140625,2437.030029
+2017-06-21,225.770004,,,2017-06-26,65.25,21410.029297,2435.610107
+2017-06-22,224.710007,,,2017-06-27,65.24,21397.289063,2434.5
+2017-06-23,225.059998,,,2017-06-28,65.81,21394.759766,2438.300049
+2017-06-26,225.13000499999998,,,2017-06-29,65.16,21409.550781,2439.070068
+2017-06-27,223.32000699999998,,,2017-06-30,65.2,21310.660156,2419.3798829999996
+2017-06-28,225.330002,,,2017-07-03,65.12,21454.609375,2440.689941
+2017-06-29,223.38999900000002,,,2017-07-05,65.12,21287.029297,2419.699951
+2017-06-30,223.75,,,2017-07-06,64.83,21349.630859,2423.409912
+2017-07-03,224.27999900000003,,,2017-07-07,64.84,21479.269531,2429.01001
+2017-07-05,224.649994,,,2017-07-10,65.0,21478.169922,2432.540039
+2017-07-06,222.63000499999998,,,2017-07-11,65.15,21320.039063,2409.75
+2017-07-07,224.05000299999998,,,2017-07-12,65.67,21414.339844,2425.179932
+2017-07-10,224.25999500000003,,,2017-07-13,65.86,21408.519531,2427.429932
+2017-07-11,224.08999599999999,,,2017-07-14,66.32,21409.070313,2425.530029
+2017-07-12,225.74000499999997,,,2017-07-17,66.19,21532.140625,2443.25
+2017-07-13,226.169998,,,2017-07-18,66.25,21553.089844,2447.830078
+2017-07-14,227.229996,,,2017-07-19,66.54,21637.740234,2459.27002
+2017-07-17,227.22000099999997,,,2017-07-20,66.81,21629.720703,2459.139893
+2017-07-18,227.36000099999998,,,2017-07-21,66.55,21574.730469,2460.610107
+2017-07-19,228.600006,,,2017-07-24,66.37,21640.75,2473.830078
+2017-07-20,228.580002,,,2017-07-25,66.46,21611.779297,2473.449951
+2017-07-21,228.5,,,2017-07-26,66.87,21580.070313,2472.540039
+2017-07-24,228.25999500000003,,,2017-07-27,66.72,21513.169922,2469.909912
+2017-07-25,228.919998,,,2017-07-28,66.79,21613.429688,2477.1298829999996
+2017-07-26,228.99000499999997,,,2017-07-31,66.93,21711.009766,2477.830078
+2017-07-27,228.789993,,,2017-08-01,67.3,21796.550781,2475.419922
+2017-07-28,228.49000499999997,,,2017-08-02,67.33,21830.310547,2472.100098
+2017-07-31,228.32000699999998,,,2017-08-03,67.37,21891.119141,2470.300049
+2017-08-01,228.88000499999998,,,2017-08-04,67.46,21963.919922,2476.350098
+2017-08-02,229.02999900000003,,,2017-08-07,67.49,22016.240234,2477.570068
+2017-08-03,228.580002,,,2017-08-08,67.13,22026.099609,2472.159912
+2017-08-04,229.00999500000003,,,2017-08-09,67.02,22092.810547,2476.830078
+2017-08-07,229.38999900000002,,,2017-08-10,66.07,22118.419922,2480.909912
+2017-08-08,228.86999500000002,,,2017-08-11,65.95,22085.339844,2474.919922
+2017-08-09,228.809998,,,2017-08-14,66.43,22048.699219,2474.02002
+2017-08-10,225.580002,,,2017-08-15,66.38,21844.009766,2438.209961
+2017-08-11,225.88000499999998,,,2017-08-16,66.76,21858.320313,2441.320068
+2017-08-14,228.16000400000001,,,2017-08-17,66.01,21993.710938,2465.840088
+2017-08-15,228.100006,,,2017-08-18,66.19,21998.990234,2464.610107
+2017-08-16,228.479996,,,2017-08-21,66.17,22024.869141,2468.110107
+2017-08-17,224.97000099999997,,,2017-08-22,66.49,21750.730469,2430.01001
+2017-08-18,224.559998,,,2017-08-23,66.5,21674.509766,2425.550049
+2017-08-21,224.82000699999998,,,2017-08-24,66.35,21703.75,2428.3701170000004
+2017-08-22,227.07000699999998,,,2017-08-25,66.75,21899.890625,2452.51001
+2017-08-23,226.30000299999998,,,2017-08-28,66.75,21812.089844,2444.040039
+2017-08-24,225.83999599999999,,,2017-08-29,66.48,21783.400391,2438.969971
+2017-08-25,226.24000499999997,,,2017-08-30,66.39,21813.669922,2443.050049
+2017-08-28,226.350006,,,2017-08-31,66.9,21808.400391,2444.23999
+2017-08-29,226.580002,,,2017-09-01,66.99,21865.369141,2446.300049
+2017-08-30,227.67999300000002,,,2017-09-05,66.54,21892.429688,2457.590088
+2017-08-31,228.99000499999997,,,2017-09-06,66.95,21948.099609,2471.649902
+2017-09-01,229.47000099999997,,,2017-09-07,67.5,21987.560547,2476.550049
+2017-09-05,227.74000499999997,,,2017-09-08,67.51,21753.310547,2457.850098
+2017-09-06,228.460007,,,2017-09-11,68.04,21807.640625,2465.540039
+2017-09-07,228.460007,,,2017-09-12,68.25,21784.779297,2465.100098
+2017-09-08,228.13999900000002,,,2017-09-13,67.88,21797.789063,2461.429932
+2017-09-11,230.600006,,,2017-09-14,68.0,22057.369141,2488.110107
+2017-09-12,231.38999900000002,,,2017-09-15,68.06,22118.859375,2496.47998
+2017-09-13,231.57000699999998,,,2017-09-18,68.15,22158.179688,2498.3701170000004
+2017-09-14,231.38999900000002,,,2017-09-19,68.47,22203.480469,2495.6201170000004
+2017-09-15,231.83999599999999,,,2017-09-20,68.32,22268.339844,2500.22998
+2017-09-18,232.190002,,,2017-09-21,68.18,22331.349609,2503.8701170000004
+2017-09-19,231.32000699999998,,,2017-09-22,68.39,22370.800781,2506.649902
+2017-09-20,231.460007,,,2017-09-25,68.0,22412.589844,2508.23999
+2017-09-21,230.770004,,,2017-09-26,67.85,22359.230469,2500.600098
+2017-09-22,230.919998,,,2017-09-27,67.9,22349.589844,2502.219971
+2017-09-25,230.399994,,,2017-09-28,68.08,22296.089844,2496.659912
+2017-09-26,230.440002,,,2017-09-29,68.48,22284.320313,2496.840088
+2017-09-27,231.38000499999998,,,2017-10-02,68.42,22340.710938,2507.040039
+2017-09-28,231.69999700000002,,,2017-10-03,68.65,22381.199219,2510.060059
+2017-09-29,232.57000699999998,,,2017-10-04,68.52,22405.089844,2519.360107
+2017-10-02,233.47000099999997,,,2017-10-05,68.48,22557.599609,2529.1201170000004
+2017-10-03,233.979996,,,2017-10-06,68.43,22641.669922,2534.580078
+2017-10-04,234.289993,,,2017-10-09,68.45,22661.640625,2537.73999
+2017-10-05,235.649994,,,2017-10-10,69.1,22775.390625,2552.070068
+2017-10-06,235.47000099999997,,,2017-10-11,69.09,22773.669922,2549.330078
+2017-10-09,235.039993,,,2017-10-12,69.21,22761.070313,2544.72998
+2017-10-10,235.58999599999999,,,2017-10-13,69.57,22830.679688,2550.639893
+2017-10-11,236.020004,,,2017-10-16,69.52,22872.890625,2555.23999
+2017-10-12,235.63999900000002,,,2017-10-17,69.34,22841.009766,2550.929932
+2017-10-13,235.850006,,,2017-10-18,69.54,22871.720703,2553.169922
+2017-10-16,236.270004,,,2017-10-19,69.43,22956.960938,2557.639893
+2017-10-17,236.419998,,,2017-10-20,69.34,22997.439453,2559.360107
+2017-10-18,236.61000099999998,,,2017-10-23,69.19,23157.599609,2561.26001
+2017-10-19,236.69999700000002,,,2017-10-24,69.3,23163.039063,2562.100098
+2017-10-20,237.92999300000002,,,2017-10-25,69.03,23328.630859,2575.209961
+2017-10-23,236.99000499999997,,,2017-10-26,69.02,23273.960938,2564.97998
+2017-10-24,237.38000499999998,,,2017-10-27,69.18,23441.759766,2569.1298829999996
+2017-10-25,236.270004,,,2017-10-30,69.34,23329.460938,2557.149902
+2017-10-26,236.57000699999998,,,2017-10-31,69.63,23400.859375,2560.399902
+2017-10-27,238.479996,,,2017-11-01,69.7,23434.189453,2581.070068
+2017-10-30,237.729996,,,2017-11-02,69.91,23348.740234,2572.830078
+2017-10-31,237.960007,,,2017-11-03,69.8,23377.240234,2575.26001
+2017-11-01,238.33999599999999,,,2017-11-06,69.9,23435.009766,2579.360107
+2017-11-02,238.41000400000001,,,2017-11-07,69.64,23516.259766,2579.850098
+2017-11-03,239.169998,,,2017-11-08,69.87,23539.189453,2587.840088
+2017-11-06,239.5,,,2017-11-09,69.47,23548.419922,2591.1298829999996
+2017-11-07,239.44999700000002,,,2017-11-10,69.28,23557.230469,2590.639893
+2017-11-08,239.80000299999998,,,2017-11-13,68.99,23563.359375,2594.3798829999996
+2017-11-09,238.960007,,,2017-11-14,68.94,23461.939453,2584.6201170000004
+2017-11-10,238.830002,,,2017-11-15,68.61,23422.210938,2582.300049
+2017-11-13,239.059998,,,2017-11-16,69.16,23439.699219,2584.840088
+2017-11-14,238.55000299999998,,,2017-11-17,68.91,23409.470703,2578.8701170000004
+2017-11-15,237.27999900000003,,,2017-11-20,69.06,23271.279297,2564.6201170000004
+2017-11-16,239.30000299999998,,,2017-11-21,69.58,23458.359375,2585.639893
+2017-11-17,238.67999300000002,,,2017-11-22,69.77,23358.240234,2578.850098
+2017-11-20,238.99000499999997,,,2017-11-24,70.34,23430.330078,2582.139893
+2017-11-21,240.559998,,,2017-11-27,69.92,23590.830078,2599.030029
+2017-11-22,240.399994,,,2017-11-28,70.32,23526.179688,2597.080078
+2017-11-24,240.91000400000001,,,2017-11-29,70.04,23557.990234,2602.419922
+2017-11-27,240.83999599999999,,,2017-11-30,70.11,23580.779297,2601.419922
+2017-11-28,243.22000099999997,,,2017-12-01,69.83,23836.710938,2627.040039
+2017-11-29,243.16000400000001,,,2017-12-04,69.58,23940.679688,2626.070068
+2017-11-30,245.24000499999997,,,2017-12-05,69.43,24272.349609,2647.580078
+2017-12-01,244.75,,,2017-12-06,69.29,24231.589844,2642.219971
+2017-12-04,244.5,,,2017-12-07,69.47,24290.050781,2639.439941
+2017-12-05,243.58999599999999,,,2017-12-08,69.84,24180.640625,2629.570068
+2017-12-06,243.57000699999998,,,2017-12-11,70.02,24140.910156,2629.27002
+2017-12-07,244.330002,,,2017-12-12,70.11,24211.480469,2636.97998
+2017-12-08,245.69999700000002,,,2017-12-13,70.38,24329.160156,2651.5
+2017-12-11,246.49000499999997,,,2017-12-14,69.99,24386.029297,2659.98999
+2017-12-12,246.86999500000002,,,2017-12-15,69.97,24504.800781,2664.110107
+2017-12-13,246.75999500000003,,,2017-12-18,70.8,24585.429688,2662.850098
+2017-12-14,245.80000299999998,,,2017-12-19,69.8,24508.660156,2652.01001
+2017-12-15,248.020004,,,2017-12-20,69.68,24651.740234,2675.810059
+2017-12-18,249.36000099999998,,,2017-12-21,69.93,24792.199219,2690.159912
+2017-12-19,248.55000299999998,,,2017-12-22,70.11,24754.75,2681.469971
+2017-12-20,248.38000499999998,,,2017-12-26,70.09,24726.650391,2679.25
+2017-12-21,248.86999500000002,,,2017-12-27,70.22,24782.289063,2684.570068
+2017-12-22,247.63000499999998,,,2017-12-28,70.26,24754.060547,2683.340088
+2017-12-26,247.38000499999998,,,2017-12-29,70.31,24746.210938,2680.5
+2017-12-27,247.58999599999999,,,2018-01-02,70.83,24774.300781,2682.6201170000004
+2017-12-28,248.08999599999999,,,2018-01-03,71.17,24837.509766,2687.540039
+2017-12-29,246.82000699999998,,,2018-01-04,71.95,24719.220703,2673.610107
+2018-01-02,248.88000499999998,,,2018-01-05,72.35,24824.009766,2695.810059
+2018-01-03,250.47000099999997,,,2018-01-08,72.33,24922.679688,2713.060059
+2018-01-04,251.52999900000003,,,2018-01-09,72.41,25075.130859,2723.98999
+2018-01-05,253.30000299999998,,,2018-01-10,72.27,25295.869141,2743.149902
+2018-01-08,253.72000099999997,,,2018-01-11,72.77,25283.0,2747.709961
+2018-01-09,254.11999500000002,,,2018-01-12,73.5,25385.800781,2751.290039
+2018-01-10,253.83999599999999,,,2018-01-16,73.43,25369.130859,2748.22998
+2018-01-11,255.649994,,,2018-01-17,73.81,25574.730469,2767.560059
+2018-01-12,257.369995,,,2018-01-18,73.72,25803.189453,2786.23999
+2018-01-16,256.47000099999997,,,2018-01-19,74.13,25792.859375,2776.419922
+2018-01-17,258.880005,,,2018-01-22,74.51,26115.650391,2802.560059
+2018-01-18,258.480011,,,2018-01-23,74.75,26017.810547,2798.030029
+2018-01-19,259.619995,,,2018-01-24,74.88,26071.720703,2810.300049
+2018-01-22,261.72000099999997,,,2018-01-25,74.59,26214.599609,2832.969971
+2018-01-23,262.290009,,,2018-01-26,75.25,26210.810547,2839.1298829999996
+2018-01-24,262.149994,,,2018-01-29,74.56,26252.119141,2837.540039
+2018-01-25,262.309998,,,2018-01-30,73.94,26392.789063,2839.25
+2018-01-26,265.420013,,,2018-01-31,73.84,26616.710938,2872.8701170000004
+2018-01-29,263.640015,,,2018-02-01,74.05,26439.480469,2853.530029
+2018-01-30,260.790009,,,2018-02-02,72.55,26076.890625,2822.429932
+2018-01-31,260.920013,,,2018-02-05,69.51,26149.390625,2823.810059
+2018-02-01,260.799988,,,2018-02-06,70.88,26186.710938,2821.97998
+2018-02-02,255.27999900000003,,,2018-02-07,70.13,25520.960938,2762.1298829999996
+2018-02-05,244.80000299999998,,,2018-02-08,68.3,24345.75,2648.939941
+2018-02-06,249.11999500000002,,,2018-02-09,68.59,24912.769531,2695.139893
+2018-02-07,247.86999500000002,,,2018-02-12,69.64,24893.349609,2681.659912
+2018-02-08,238.61000099999998,,,2018-02-13,69.43,23860.460938,2581.0
+2018-02-09,242.25,,,2018-02-14,70.66,24190.900391,2619.550049
+2018-02-12,245.61999500000002,,,2018-02-15,71.1,24601.269531,2656.0
+2018-02-13,246.27999900000003,,,2018-02-16,71.42,24640.449219,2662.939941
+2018-02-14,249.649994,,,2018-02-20,70.75,24893.490234,2698.6298829999996
+2018-02-15,252.72000099999997,,,2018-02-21,70.41,25200.369141,2731.199951
+2018-02-16,252.83999599999999,,,2018-02-22,70.78,25219.380859,2732.219971
+2018-02-20,251.36999500000002,,,2018-02-23,71.34,24964.75,2716.26001
+2018-02-21,250.0,,,2018-02-26,72.01,24797.779297,2701.330078
+2018-02-22,250.25999500000003,,,2018-02-27,70.94,24962.480469,2703.959961
+2018-02-23,254.289993,,,2018-02-28,70.27,25309.990234,2747.300049
+2018-02-26,257.299988,,,2018-03-01,69.09,25709.269531,2779.600098
+2018-02-27,254.07000699999998,,,2018-03-02,69.42,25410.029297,2744.280029
+2018-02-28,251.270004,,,2018-03-05,69.79,25029.199219,2713.830078
+2018-03-01,247.97000099999997,,,2018-03-06,70.2,24608.980469,2677.669922
+2018-03-02,249.24000499999997,,,,,24538.060547,2691.25
+2018-03-05,251.99000499999997,,,,,24874.759766,2720.939941
+2018-03-06,252.669998,,,,,24884.119141,2728.1201170000004
diff --git a/investments-dashboard/data/df_hist_prices.csv b/investments-dashboard/data/df_hist_prices.csv
new file mode 100644
index 0000000..23e5c71
--- /dev/null
+++ b/investments-dashboard/data/df_hist_prices.csv
@@ -0,0 +1,6 @@
+date,price
+02/28/2018,$251.27
+02/27/2018,$254.07
+02/26/2018,$257.30
+02/23/2018,$254.29
+02/22/2018,$250.26
diff --git a/investments-dashboard/data/df_minimums.csv b/investments-dashboard/data/df_minimums.csv
new file mode 100644
index 0000000..3ffe5d7
--- /dev/null
+++ b/investments-dashboard/data/df_minimums.csv
@@ -0,0 +1,6 @@
+A,B,C
+'-,Initial Minimum,Additional Investments
+General Account,"""$3,000""",$1
+UGMA/UTMA,"""$3,000""",$1
+IRA,"""$3,000""",$1
+Education savings account,"""$2,000""",$1
diff --git a/investments-dashboard/data/df_price_perf.csv b/investments-dashboard/data/df_price_perf.csv
new file mode 100644
index 0000000..0c01d6d
--- /dev/null
+++ b/investments-dashboard/data/df_price_perf.csv
@@ -0,0 +1,4 @@
+label,price,percent
+Price as of 02/27/2018,$254.07,None
+Change,'-$3.23,'-1.26%
+SEC yield,1.67%,B
diff --git a/investments-dashboard/data/df_realized.csv b/investments-dashboard/data/df_realized.csv
new file mode 100644
index 0000000..87dfd15
--- /dev/null
+++ b/investments-dashboard/data/df_realized.csv
@@ -0,0 +1,4 @@
+A,B
+Realized capital gain/loss,–$0.60
+Realized capital gain/loss as a % of NAV,–0.23%
+Fiscal year end,12/31/2018
diff --git a/investments-dashboard/data/df_recent_returns.csv b/investments-dashboard/data/df_recent_returns.csv
new file mode 100644
index 0000000..53ab5d3
--- /dev/null
+++ b/investments-dashboard/data/df_recent_returns.csv
@@ -0,0 +1,4 @@
+A,B,C,D,E
+'-,YTD as of 03/05/2018,YTD as of 02/28/2018,Previous Month 02/28/2018,3M Total as of 02/28/2018
+500 Index Fund Inv,2.09%,1.81%,–3.69%,2.93%
+S&P 500 Index*,—,1.83%,–3.69%,2.96%
diff --git a/investments-dashboard/data/df_unrealized.csv b/investments-dashboard/data/df_unrealized.csv
new file mode 100644
index 0000000..678eccf
--- /dev/null
+++ b/investments-dashboard/data/df_unrealized.csv
@@ -0,0 +1,3 @@
+A,B
+Unrealized appreciation/depreciation,$107.02
+Unrealized appreciation/depreciation as a % of NAV,41.02%
diff --git a/investments-dashboard/demos/callbacks/01_simple_callback.py b/investments-dashboard/demos/callbacks/01_simple_callback.py
new file mode 100644
index 0000000..4ed076a
--- /dev/null
+++ b/investments-dashboard/demos/callbacks/01_simple_callback.py
@@ -0,0 +1,93 @@
+from dash import Dash, dcc, html, Input, Output, callback
+
+BG = '#0f1117'
+CARD = '#1a1d27'
+BORDER = '#2d3148'
+TEXT = '#e2e8f0'
+MUTED = '#94a3b8'
+ACCENT = '#7c3aed'
+
+app = Dash(__name__)
+
+app.layout = html.Div(style={
+ 'backgroundColor': BG,
+ 'padding': '48px',
+ 'fontFamily': 'Inter, system-ui, sans-serif',
+ 'minHeight': '100vh',
+ 'maxWidth': '640px',
+ 'margin': '0 auto',
+}, children=[
+ html.H2('Callback Anatomy', style={'color': TEXT, 'marginBottom': '4px'}),
+ html.P('The output reacts automatically whenever the input changes.',
+ style={'color': MUTED, 'marginBottom': '40px'}),
+
+ # Input section
+ html.Div(style={
+ 'backgroundColor': CARD,
+ 'border': f'1px solid {BORDER}',
+ 'borderRadius': '10px',
+ 'padding': '20px',
+ 'marginBottom': '12px',
+ }, children=[
+ html.Div('INPUT', style={
+ 'color': MUTED, 'fontSize': '11px', 'fontWeight': '700',
+ 'letterSpacing': '0.1em', 'marginBottom': '10px',
+ }),
+ dcc.Input(
+ id='my-input',
+ value='initial value',
+ type='text',
+ debounce=False,
+ style={
+ 'backgroundColor': BG,
+ 'border': f'1px solid {ACCENT}',
+ 'borderRadius': '6px',
+ 'color': TEXT,
+ 'padding': '10px 14px',
+ 'fontSize': '15px',
+ 'width': '100%',
+ 'outline': 'none',
+ 'boxSizing': 'border-box',
+ },
+ ),
+ html.P('Try changing this value — the output below updates instantly.',
+ style={'color': MUTED, 'fontSize': '12px', 'marginTop': '8px', 'marginBottom': 0}),
+ ]),
+
+ # Arrow indicator
+ html.Div('↓', style={
+ 'color': ACCENT, 'fontSize': '24px', 'textAlign': 'center',
+ 'margin': '4px 0', 'lineHeight': 1,
+ }),
+
+ # Output section
+ html.Div(style={
+ 'backgroundColor': CARD,
+ 'border': f'1px solid {BORDER}',
+ 'borderRadius': '10px',
+ 'padding': '20px',
+ }, children=[
+ html.Div('OUTPUT', style={
+ 'color': MUTED, 'fontSize': '11px', 'fontWeight': '700',
+ 'letterSpacing': '0.1em', 'marginBottom': '10px',
+ }),
+ html.Div(id='my-output', style={
+ 'color': ACCENT,
+ 'fontSize': '22px',
+ 'fontWeight': '600',
+ 'minHeight': '32px',
+ }),
+ ]),
+])
+
+
+@callback(
+ Output('my-output', 'children'),
+ Input('my-input', 'value'),
+)
+def update_output(input_value):
+ return f'Output: {input_value}'
+
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/investments-dashboard/demos/callbacks/02_gapminder_slider.py b/investments-dashboard/demos/callbacks/02_gapminder_slider.py
new file mode 100644
index 0000000..89d2731
--- /dev/null
+++ b/investments-dashboard/demos/callbacks/02_gapminder_slider.py
@@ -0,0 +1,75 @@
+from dash import Dash, dcc, html, Input, Output, callback
+import plotly.express as px
+import pandas as pd
+
+BG = '#0f1117'
+CARD = '#1a1d27'
+BORDER = '#2d3148'
+TEXT = '#e2e8f0'
+MUTED = '#94a3b8'
+TEMPLATE = 'plotly_dark'
+
+app = Dash(__name__)
+
+df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv')
+
+app.layout = html.Div(style={
+ 'backgroundColor': BG,
+ 'padding': '24px',
+ 'fontFamily': 'Inter, system-ui, sans-serif',
+ 'minHeight': '100vh',
+}, children=[
+ html.H2('GDP vs Life Expectancy', style={'color': TEXT, 'marginBottom': '4px'}),
+ html.P('Drag the year slider — the chart animates smoothly between years.',
+ style={'color': MUTED, 'marginBottom': '16px'}),
+
+ dcc.Graph(id='graph-with-slider'),
+
+ html.Div(style={'padding': '8px 40px 0 40px'}, children=[
+ html.Div('Year', style={
+ 'color': MUTED, 'fontSize': '11px', 'fontWeight': '600',
+ 'letterSpacing': '0.08em', 'textTransform': 'uppercase', 'marginBottom': '8px',
+ }),
+ dcc.Slider(
+ df['year'].min(),
+ df['year'].max(),
+ step=None,
+ value=df['year'].min(),
+ marks={
+ str(year): {
+ 'label': str(year),
+ 'style': {'color': MUTED, 'fontSize': '11px'},
+ }
+ for year in df['year'].unique()
+ },
+ id='year-slider',
+ ),
+ ]),
+])
+
+
+@callback(
+ Output('graph-with-slider', 'figure'),
+ Input('year-slider', 'value'))
+def update_figure(selected_year):
+ filtered_df = df[df.year == selected_year]
+
+ fig = px.scatter(
+ filtered_df,
+ x='gdpPercap', y='lifeExp',
+ size='pop', color='continent',
+ hover_name='country',
+ log_x=True, size_max=55,
+ template=TEMPLATE,
+ )
+ fig.update_layout(
+ transition_duration=500,
+ plot_bgcolor=CARD,
+ paper_bgcolor=CARD,
+ margin=dict(l=40, r=40, t=20, b=20),
+ )
+ return fig
+
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/investments-dashboard/demos/callbacks/03_multiple_inputs.py b/investments-dashboard/demos/callbacks/03_multiple_inputs.py
new file mode 100644
index 0000000..2e3c0ad
--- /dev/null
+++ b/investments-dashboard/demos/callbacks/03_multiple_inputs.py
@@ -0,0 +1,121 @@
+from dash import Dash, dcc, html, Input, Output, callback
+import plotly.express as px
+import pandas as pd
+
+BG = '#0f1117'
+CARD = '#1a1d27'
+BORDER = '#2d3148'
+TEXT = '#e2e8f0'
+MUTED = '#94a3b8'
+TEMPLATE = 'plotly_dark'
+
+app = Dash(__name__)
+
+df = pd.read_csv('https://plotly.github.io/datasets/country_indicators.csv')
+
+label_style = {
+ 'color': MUTED,
+ 'fontSize': '11px',
+ 'fontWeight': '600',
+ 'letterSpacing': '0.08em',
+ 'textTransform': 'uppercase',
+ 'marginBottom': '6px',
+}
+
+radio_label_style = {'marginRight': '12px', 'marginTop': '6px', 'color': TEXT, 'fontSize': '13px'}
+
+app.layout = html.Div(style={
+ 'backgroundColor': BG,
+ 'padding': '24px',
+ 'fontFamily': 'Inter, system-ui, sans-serif',
+ 'minHeight': '100vh',
+}, children=[
+ html.H2('Multiple Inputs → One Output', style={'color': TEXT, 'marginBottom': '4px'}),
+ html.P('Any of the 5 controls below triggers the callback and updates the chart.',
+ style={'color': MUTED, 'marginBottom': '20px'}),
+
+ # Controls row
+ html.Div(style={'display': 'flex', 'gap': '24px', 'marginBottom': '16px'}, children=[
+ html.Div(style={'flex': 1}, children=[
+ html.Div('X Axis Indicator', style=label_style),
+ dcc.Dropdown(
+ df['Indicator Name'].unique(),
+ 'Fertility rate, total (births per woman)',
+ id='xaxis-column',
+ style={'backgroundColor': CARD, 'color': TEXT},
+ ),
+ dcc.RadioItems(
+ ['Linear', 'Log'], 'Linear',
+ id='xaxis-type',
+ inline=True,
+ labelStyle=radio_label_style,
+ ),
+ ]),
+ html.Div(style={'flex': 1}, children=[
+ html.Div('Y Axis Indicator', style=label_style),
+ dcc.Dropdown(
+ df['Indicator Name'].unique(),
+ 'Life expectancy at birth, total (years)',
+ id='yaxis-column',
+ style={'backgroundColor': CARD, 'color': TEXT},
+ ),
+ dcc.RadioItems(
+ ['Linear', 'Log'], 'Linear',
+ id='yaxis-type',
+ inline=True,
+ labelStyle=radio_label_style,
+ ),
+ ]),
+ ]),
+
+ dcc.Graph(id='indicator-graphic'),
+
+ html.Div(style={'padding': '8px 40px 0 40px'}, children=[
+ html.Div('Year', style=label_style),
+ dcc.Slider(
+ df['Year'].min(),
+ df['Year'].max(),
+ step=None,
+ id='year--slider',
+ value=df['Year'].max(),
+ marks={
+ str(year): {
+ 'label': str(year),
+ 'style': {'color': MUTED, 'fontSize': '11px'},
+ }
+ for year in df['Year'].unique()
+ },
+ ),
+ ]),
+])
+
+
+@callback(
+ Output('indicator-graphic', 'figure'),
+ Input('xaxis-column', 'value'),
+ Input('yaxis-column', 'value'),
+ Input('xaxis-type', 'value'),
+ Input('yaxis-type', 'value'),
+ Input('year--slider', 'value'))
+def update_graph(xaxis_col, yaxis_col, xaxis_type, yaxis_type, year_value):
+ dff = df[df['Year'] == year_value]
+
+ fig = px.scatter(
+ x=dff[dff['Indicator Name'] == xaxis_col]['Value'],
+ y=dff[dff['Indicator Name'] == yaxis_col]['Value'],
+ hover_name=dff[dff['Indicator Name'] == yaxis_col]['Country Name'],
+ template=TEMPLATE,
+ )
+ fig.update_layout(
+ plot_bgcolor=CARD,
+ paper_bgcolor=CARD,
+ margin=dict(l=40, b=40, t=20, r=20),
+ hovermode='closest',
+ )
+ fig.update_xaxes(title=xaxis_col, type='linear' if xaxis_type == 'Linear' else 'log')
+ fig.update_yaxes(title=yaxis_col, type='linear' if yaxis_type == 'Linear' else 'log')
+ return fig
+
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/investments-dashboard/demos/callbacks/04_state_button.py b/investments-dashboard/demos/callbacks/04_state_button.py
new file mode 100644
index 0000000..81de034
--- /dev/null
+++ b/investments-dashboard/demos/callbacks/04_state_button.py
@@ -0,0 +1,118 @@
+from dash import Dash, dcc, html, Input, Output, State, callback
+
+BG = '#0f1117'
+CARD = '#1a1d27'
+BORDER = '#2d3148'
+TEXT = '#e2e8f0'
+MUTED = '#94a3b8'
+ACCENT = '#7c3aed'
+
+app = Dash(__name__)
+
+input_style = {
+ 'backgroundColor': CARD,
+ 'border': f'1px solid {BORDER}',
+ 'borderRadius': '6px',
+ 'color': TEXT,
+ 'padding': '10px 14px',
+ 'fontSize': '15px',
+ 'width': '100%',
+ 'outline': 'none',
+ 'boxSizing': 'border-box',
+ 'marginBottom': '12px',
+}
+
+label_style = {
+ 'color': MUTED,
+ 'fontSize': '11px',
+ 'fontWeight': '600',
+ 'letterSpacing': '0.08em',
+ 'textTransform': 'uppercase',
+ 'marginBottom': '6px',
+ 'display': 'block',
+}
+
+app.layout = html.Div(style={
+ 'backgroundColor': BG,
+ 'padding': '48px',
+ 'fontFamily': 'Inter, system-ui, sans-serif',
+ 'minHeight': '100vh',
+ 'maxWidth': '560px',
+ 'margin': '0 auto',
+}, children=[
+ html.H2('State vs Input', style={'color': TEXT, 'marginBottom': '4px'}),
+ html.P(
+ 'Typing in the fields does nothing. Only clicking Submit fires the callback.',
+ style={'color': MUTED, 'marginBottom': '32px'},
+ ),
+
+ html.Div(style={
+ 'backgroundColor': CARD,
+ 'border': f'1px solid {BORDER}',
+ 'borderRadius': '10px',
+ 'padding': '24px',
+ 'marginBottom': '16px',
+ }, children=[
+ html.Span('City', style=label_style),
+ dcc.Input(
+ id='input-1-state',
+ type='text',
+ value='Montréal',
+ placeholder='Enter a city',
+ style=input_style,
+ ),
+
+ html.Span('Country', style=label_style),
+ dcc.Input(
+ id='input-2-state',
+ type='text',
+ value='Canada',
+ placeholder='Enter a country',
+ style=input_style,
+ ),
+
+ html.Button(
+ 'Submit',
+ id='submit-button-state',
+ n_clicks=0,
+ style={
+ 'backgroundColor': ACCENT,
+ 'color': '#fff',
+ 'border': 'none',
+ 'borderRadius': '6px',
+ 'padding': '10px 24px',
+ 'fontSize': '14px',
+ 'fontWeight': '600',
+ 'cursor': 'pointer',
+ 'width': '100%',
+ 'marginTop': '4px',
+ },
+ ),
+ ]),
+
+ html.Div(id='output-state', style={
+ 'color': TEXT,
+ 'fontSize': '15px',
+ 'padding': '16px 20px',
+ 'backgroundColor': CARD,
+ 'border': f'1px solid {BORDER}',
+ 'borderRadius': '10px',
+ 'minHeight': '56px',
+ }),
+])
+
+
+@callback(
+ Output('output-state', 'children'),
+ Input('submit-button-state', 'n_clicks'),
+ State('input-1-state', 'value'),
+ State('input-2-state', 'value'),
+)
+def update_output(n_clicks, city, country):
+ if n_clicks == 0:
+ return html.Span('Waiting for submission…', style={'color': MUTED})
+ return f'Submitted {n_clicks} time{"s" if n_clicks != 1 else ""}. City: {city}, Country: {country}.'
+
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/investments-dashboard/demos/interactive-graphing/01_debug_interactions.py b/investments-dashboard/demos/interactive-graphing/01_debug_interactions.py
new file mode 100644
index 0000000..f7f6484
--- /dev/null
+++ b/investments-dashboard/demos/interactive-graphing/01_debug_interactions.py
@@ -0,0 +1,115 @@
+from dash import Dash, dcc, html, Input, Output, callback
+import plotly.express as px
+import pandas as pd
+import json
+
+BG = '#0f1117'
+CARD = '#1a1d27'
+BORDER = '#2d3148'
+TEXT = '#e2e8f0'
+MUTED = '#94a3b8'
+TEMPLATE = 'plotly_dark'
+
+app = Dash(__name__)
+
+df = pd.DataFrame({
+ "x": [1, 2, 1, 2],
+ "y": [1, 2, 3, 4],
+ "customdata": [1, 2, 3, 4],
+ "fruit": ["apple", "apple", "orange", "orange"]
+})
+
+fig = px.scatter(df, x="x", y="y", color="fruit", custom_data=["customdata"],
+ template=TEMPLATE, color_discrete_map={"apple": "#7c3aed", "orange": "#f97316"})
+fig.update_layout(
+ plot_bgcolor=CARD,
+ paper_bgcolor=CARD,
+ clickmode='event+select',
+ margin=dict(l=40, r=40, t=40, b=40),
+)
+fig.update_traces(marker_size=20)
+
+pre_style = {
+ 'backgroundColor': CARD,
+ 'border': f'1px solid {BORDER}',
+ 'color': TEXT,
+ 'borderRadius': '8px',
+ 'padding': '12px',
+ 'overflowX': 'auto',
+ 'fontSize': '12px',
+ 'minHeight': '180px',
+}
+
+label_style = {
+ 'color': MUTED,
+ 'fontSize': '11px',
+ 'fontWeight': '600',
+ 'letterSpacing': '0.08em',
+ 'textTransform': 'uppercase',
+ 'marginBottom': '8px',
+}
+
+panel_style = {
+ 'flex': 1,
+ 'minWidth': 0,
+}
+
+app.layout = html.Div(style={
+ 'backgroundColor': BG,
+ 'padding': '24px',
+ 'fontFamily': 'Inter, system-ui, sans-serif',
+ 'minHeight': '100vh',
+}, children=[
+ html.H2('Graph Interaction Data', style={'color': TEXT, 'marginBottom': '4px'}),
+ html.P('Hover, click, select, or zoom the chart to see the interaction data.',
+ style={'color': MUTED, 'marginBottom': '24px'}),
+
+ dcc.Graph(
+ id='basic-interactions',
+ figure=fig,
+ style={'marginBottom': '24px'},
+ ),
+
+ html.Div(style={'display': 'flex', 'gap': '16px'}, children=[
+ html.Div(style=panel_style, children=[
+ html.Div('Hover Data', style=label_style),
+ html.Pre(id='hover-data', style=pre_style),
+ ]),
+ html.Div(style=panel_style, children=[
+ html.Div('Click Data', style=label_style),
+ html.Pre(id='click-data', style=pre_style),
+ ]),
+ html.Div(style=panel_style, children=[
+ html.Div('Selection Data', style=label_style),
+ html.Pre(id='selected-data', style=pre_style),
+ ]),
+ html.Div(style=panel_style, children=[
+ html.Div('Zoom / Relayout Data', style=label_style),
+ html.Pre(id='relayout-data', style=pre_style),
+ ]),
+ ]),
+])
+
+
+@callback(Output('hover-data', 'children'), Input('basic-interactions', 'hoverData'))
+def display_hover(hoverData):
+ return json.dumps(hoverData, indent=2)
+
+
+@callback(Output('click-data', 'children'), Input('basic-interactions', 'clickData'))
+def display_click(clickData):
+ return json.dumps(clickData, indent=2)
+
+
+@callback(Output('selected-data', 'children'), Input('basic-interactions', 'selectedData'))
+def display_selected(selectedData):
+ return json.dumps(selectedData, indent=2)
+
+
+@callback(Output('relayout-data', 'children'), Input('basic-interactions', 'relayoutData'))
+def display_relayout(relayoutData):
+ return json.dumps(relayoutData, indent=2)
+
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/investments-dashboard/demos/interactive-graphing/02_hover_timeseries.py b/investments-dashboard/demos/interactive-graphing/02_hover_timeseries.py
new file mode 100644
index 0000000..df99904
--- /dev/null
+++ b/investments-dashboard/demos/interactive-graphing/02_hover_timeseries.py
@@ -0,0 +1,183 @@
+from dash import Dash, html, dcc, Input, Output, callback
+import pandas as pd
+import plotly.express as px
+
+BG = '#0f1117'
+CARD = '#1a1d27'
+BORDER = '#2d3148'
+TEXT = '#e2e8f0'
+MUTED = '#94a3b8'
+TEMPLATE = 'plotly_dark'
+
+app = Dash(__name__)
+
+df = pd.read_csv('https://plotly.github.io/datasets/country_indicators.csv')
+
+dropdown_style = {
+ 'backgroundColor': CARD,
+ 'color': TEXT,
+}
+
+label_style = {
+ 'color': MUTED,
+ 'fontSize': '11px',
+ 'fontWeight': '600',
+ 'letterSpacing': '0.08em',
+ 'textTransform': 'uppercase',
+ 'marginBottom': '6px',
+}
+
+radio_style = {
+ 'color': TEXT,
+ 'fontSize': '13px',
+}
+
+app.layout = html.Div(style={
+ 'backgroundColor': BG,
+ 'padding': '24px',
+ 'fontFamily': 'Inter, system-ui, sans-serif',
+ 'minHeight': '100vh',
+}, children=[
+ html.H2('World Indicators Explorer', style={'color': TEXT, 'marginBottom': '4px'}),
+ html.P('Hover over a country in the scatter plot to see its historical trend.',
+ style={'color': MUTED, 'marginBottom': '20px'}),
+
+ # Controls row
+ html.Div(style={'display': 'flex', 'gap': '24px', 'marginBottom': '16px'}, children=[
+ html.Div(style={'flex': 1}, children=[
+ html.Div('X Axis Indicator', style=label_style),
+ dcc.Dropdown(
+ df['Indicator Name'].unique(),
+ 'Fertility rate, total (births per woman)',
+ id='crossfilter-xaxis-column',
+ style=dropdown_style,
+ ),
+ dcc.RadioItems(
+ ['Linear', 'Log'], 'Linear',
+ id='crossfilter-xaxis-type',
+ inline=True,
+ style=radio_style,
+ labelStyle={'marginRight': '12px', 'marginTop': '6px'},
+ ),
+ ]),
+ html.Div(style={'flex': 1}, children=[
+ html.Div('Y Axis Indicator', style=label_style),
+ dcc.Dropdown(
+ df['Indicator Name'].unique(),
+ 'Life expectancy at birth, total (years)',
+ id='crossfilter-yaxis-column',
+ style=dropdown_style,
+ ),
+ dcc.RadioItems(
+ ['Linear', 'Log'], 'Linear',
+ id='crossfilter-yaxis-type',
+ inline=True,
+ style=radio_style,
+ labelStyle={'marginRight': '12px', 'marginTop': '6px'},
+ ),
+ ]),
+ ]),
+
+ # Charts row
+ html.Div(style={'display': 'flex', 'gap': '16px'}, children=[
+ html.Div(style={'flex': '0 0 55%'}, children=[
+ dcc.Graph(
+ id='crossfilter-indicator-scatter',
+ hoverData={'points': [{'customdata': 'Japan'}]},
+ ),
+ ]),
+ html.Div(style={'flex': 1}, children=[
+ dcc.Graph(id='x-time-series'),
+ dcc.Graph(id='y-time-series'),
+ ]),
+ ]),
+
+ # Year slider
+ html.Div(style={'marginTop': '8px', 'paddingRight': '24px', 'width': '55%'}, children=[
+ html.Div('Year', style=label_style),
+ dcc.Slider(
+ df['Year'].min(),
+ df['Year'].max(),
+ step=None,
+ id='crossfilter-year--slider',
+ value=df['Year'].max(),
+ marks={str(year): {'label': str(year), 'style': {'color': MUTED, 'fontSize': '11px'}}
+ for year in df['Year'].unique()},
+ ),
+ ]),
+])
+
+
+@callback(
+ Output('crossfilter-indicator-scatter', 'figure'),
+ Input('crossfilter-xaxis-column', 'value'),
+ Input('crossfilter-yaxis-column', 'value'),
+ Input('crossfilter-xaxis-type', 'value'),
+ Input('crossfilter-yaxis-type', 'value'),
+ Input('crossfilter-year--slider', 'value'))
+def update_scatter(xaxis_col, yaxis_col, xaxis_type, yaxis_type, year):
+ dff = df[df['Year'] == year]
+ fig = px.scatter(
+ x=dff[dff['Indicator Name'] == xaxis_col]['Value'],
+ y=dff[dff['Indicator Name'] == yaxis_col]['Value'],
+ hover_name=dff[dff['Indicator Name'] == yaxis_col]['Country Name'],
+ template=TEMPLATE,
+ )
+ fig.update_traces(
+ customdata=dff[dff['Indicator Name'] == yaxis_col]['Country Name'],
+ marker=dict(size=8, opacity=0.8),
+ )
+ fig.update_xaxes(title=xaxis_col, type='linear' if xaxis_type == 'Linear' else 'log')
+ fig.update_yaxes(title=yaxis_col, type='linear' if yaxis_type == 'Linear' else 'log')
+ fig.update_layout(
+ plot_bgcolor=CARD,
+ paper_bgcolor=CARD,
+ margin=dict(l=40, b=40, t=20, r=20),
+ hovermode='closest',
+ )
+ return fig
+
+
+def create_time_series(dff, axis_type, title):
+ fig = px.scatter(dff, x='Year', y='Value', template=TEMPLATE)
+ fig.update_traces(mode='lines+markers', marker=dict(size=5), line=dict(color='#7c3aed'))
+ fig.update_xaxes(showgrid=False)
+ fig.update_yaxes(type='linear' if axis_type == 'Linear' else 'log')
+ fig.add_annotation(
+ x=0, y=0.85, xanchor='left', yanchor='bottom',
+ xref='paper', yref='paper', showarrow=False, align='left',
+ text=title, font=dict(size=11, color=MUTED),
+ )
+ fig.update_layout(
+ height=225,
+ plot_bgcolor=CARD,
+ paper_bgcolor=CARD,
+ margin=dict(l=20, b=30, r=10, t=10),
+ )
+ return fig
+
+
+@callback(
+ Output('x-time-series', 'figure'),
+ Input('crossfilter-indicator-scatter', 'hoverData'),
+ Input('crossfilter-xaxis-column', 'value'),
+ Input('crossfilter-xaxis-type', 'value'))
+def update_x_timeseries(hoverData, xaxis_col, axis_type):
+ country = hoverData['points'][0]['customdata']
+ dff = df[(df['Country Name'] == country) & (df['Indicator Name'] == xaxis_col)]
+ return create_time_series(dff, axis_type, f'{country}
{xaxis_col}')
+
+
+@callback(
+ Output('y-time-series', 'figure'),
+ Input('crossfilter-indicator-scatter', 'hoverData'),
+ Input('crossfilter-yaxis-column', 'value'),
+ Input('crossfilter-yaxis-type', 'value'))
+def update_y_timeseries(hoverData, yaxis_col, axis_type):
+ country = hoverData['points'][0]['customdata']
+ dff = df[(df['Country Name'] == country) & (df['Indicator Name'] == yaxis_col)]
+ return create_time_series(dff, axis_type, yaxis_col)
+
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/investments-dashboard/demos/interactive-graphing/03_crossfilter.py b/investments-dashboard/demos/interactive-graphing/03_crossfilter.py
new file mode 100644
index 0000000..70663b9
--- /dev/null
+++ b/investments-dashboard/demos/interactive-graphing/03_crossfilter.py
@@ -0,0 +1,111 @@
+from dash import Dash, dcc, html, Input, Output, callback
+import numpy as np
+import pandas as pd
+import plotly.express as px
+
+BG = '#0f1117'
+CARD = '#1a1d27'
+BORDER = '#2d3148'
+TEXT = '#e2e8f0'
+MUTED = '#94a3b8'
+ACCENT = '#7c3aed'
+TEMPLATE = 'plotly_dark'
+
+app = Dash(__name__)
+
+np.random.seed(0)
+df = pd.DataFrame({"Col " + str(i + 1): np.random.rand(30) for i in range(6)})
+
+
+def get_figure(df, x_col, y_col, selectedpoints, selectedpoints_local):
+ if selectedpoints_local and selectedpoints_local.get("range"):
+ ranges = selectedpoints_local["range"]
+ selection_bounds = {
+ "x0": ranges["x"][0], "x1": ranges["x"][1],
+ "y0": ranges["y"][0], "y1": ranges["y"][1],
+ }
+ else:
+ selection_bounds = {
+ "x0": np.min(df[x_col]), "x1": np.max(df[x_col]),
+ "y0": np.min(df[y_col]), "y1": np.max(df[y_col]),
+ }
+
+ fig = px.scatter(df, x=df[x_col], y=df[y_col], text=df.index, template=TEMPLATE)
+ fig.update_traces(
+ selectedpoints=selectedpoints,
+ customdata=df.index,
+ mode="markers+text",
+ marker={"color": ACCENT, "size": 16, "opacity": 0.9},
+ unselected={
+ "marker": {"opacity": 0.15, "color": MUTED},
+ "textfont": {"color": "rgba(0,0,0,0)"},
+ },
+ selected={
+ "marker": {"color": ACCENT, "opacity": 1.0},
+ },
+ textfont={"size": 9, "color": MUTED},
+ )
+ fig.update_layout(
+ plot_bgcolor=CARD,
+ paper_bgcolor=CARD,
+ margin={"l": 20, "r": 10, "b": 20, "t": 30},
+ dragmode="select",
+ hovermode=False,
+ newselection_mode="gradual",
+ xaxis_title=x_col,
+ yaxis_title=y_col,
+ )
+ fig.add_shape(dict(
+ type="rect",
+ line={"width": 1, "dash": "dot", "color": MUTED},
+ **selection_bounds,
+ ))
+ return fig
+
+
+app.layout = html.Div(style={
+ 'backgroundColor': BG,
+ 'padding': '24px',
+ 'fontFamily': 'Inter, system-ui, sans-serif',
+ 'minHeight': '100vh',
+}, children=[
+ html.H2('Crossfilter', style={'color': TEXT, 'marginBottom': '4px'}),
+ html.P('Lasso or box-select points in any chart — the selection filters across all three.',
+ style={'color': MUTED, 'marginBottom': '24px'}),
+
+ html.Div(style={'display': 'flex', 'gap': '16px'}, children=[
+ dcc.Graph(id='g1', config={'displayModeBar': True, 'modeBarButtonsToKeep': ['select2d', 'lasso2d']},
+ style={'flex': 1}),
+ dcc.Graph(id='g2', config={'displayModeBar': True, 'modeBarButtonsToKeep': ['select2d', 'lasso2d']},
+ style={'flex': 1}),
+ dcc.Graph(id='g3', config={'displayModeBar': True, 'modeBarButtonsToKeep': ['select2d', 'lasso2d']},
+ style={'flex': 1}),
+ ]),
+])
+
+
+@callback(
+ Output('g1', 'figure'),
+ Output('g2', 'figure'),
+ Output('g3', 'figure'),
+ Input('g1', 'selectedData'),
+ Input('g2', 'selectedData'),
+ Input('g3', 'selectedData'),
+)
+def update_charts(sel1, sel2, sel3):
+ selectedpoints = df.index
+ for sel in [sel1, sel2, sel3]:
+ if sel and sel['points']:
+ selectedpoints = np.intersect1d(
+ selectedpoints,
+ [p['customdata'] for p in sel['points']]
+ )
+ return [
+ get_figure(df, 'Col 1', 'Col 2', selectedpoints, sel1),
+ get_figure(df, 'Col 3', 'Col 4', selectedpoints, sel2),
+ get_figure(df, 'Col 5', 'Col 6', selectedpoints, sel3),
+ ]
+
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/investments-dashboard/demos/layout/01_hello_dash.py b/investments-dashboard/demos/layout/01_hello_dash.py
new file mode 100644
index 0000000..61f68ae
--- /dev/null
+++ b/investments-dashboard/demos/layout/01_hello_dash.py
@@ -0,0 +1,54 @@
+from dash import Dash, html, dcc
+import plotly.express as px
+import pandas as pd
+
+BG = '#0f1117'
+CARD = '#1a1d27'
+BORDER = '#2d3148'
+TEXT = '#e2e8f0'
+MUTED = '#94a3b8'
+TEMPLATE = 'plotly_dark'
+
+app = Dash(__name__)
+
+df = pd.DataFrame({
+ "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
+ "Amount": [4, 1, 2, 2, 4, 5],
+ "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"],
+})
+
+fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group", template=TEMPLATE)
+fig.update_layout(plot_bgcolor=CARD, paper_bgcolor=CARD, margin=dict(l=40, r=40, t=40, b=40))
+
+app.layout = html.Div(style={
+ 'backgroundColor': BG,
+ 'padding': '32px',
+ 'fontFamily': 'Inter, system-ui, sans-serif',
+ 'minHeight': '100vh',
+}, children=[
+ html.H1('Hello Dash', style={'color': TEXT, 'marginBottom': '4px'}),
+
+ html.Div('Dash: A web application framework for your data.', style={
+ 'color': MUTED,
+ 'fontSize': '15px',
+ 'marginBottom': '24px',
+ }),
+
+ dcc.Graph(id='example-graph', figure=fig),
+
+ html.P(
+ '✏️ Try editing the H1 title above in the code, save the file, and watch the browser update automatically.',
+ style={
+ 'color': MUTED,
+ 'fontSize': '12px',
+ 'marginTop': '16px',
+ 'border': f'1px solid {BORDER}',
+ 'borderRadius': '6px',
+ 'padding': '10px 14px',
+ 'backgroundColor': CARD,
+ },
+ ),
+])
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/investments-dashboard/demos/layout/02_styled_layout.py b/investments-dashboard/demos/layout/02_styled_layout.py
new file mode 100644
index 0000000..25c3a2e
--- /dev/null
+++ b/investments-dashboard/demos/layout/02_styled_layout.py
@@ -0,0 +1,47 @@
+from dash import Dash, dcc, html
+import plotly.express as px
+import pandas as pd
+
+# style dict — the pattern from the docs, upgraded to our palette
+colors = {
+ 'background': '#0f1117',
+ 'card': '#1a1d27',
+ 'text': '#e2e8f0',
+ 'muted': '#94a3b8',
+ 'accent': '#7c3aed',
+}
+
+app = Dash(__name__)
+
+df = pd.DataFrame({
+ "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
+ "Amount": [4, 1, 2, 2, 4, 5],
+ "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"],
+})
+
+fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group", template='plotly_dark')
+fig.update_layout(
+ plot_bgcolor=colors['card'],
+ paper_bgcolor=colors['card'],
+ font_color=colors['text'],
+ margin=dict(l=40, r=40, t=40, b=40),
+)
+
+app.layout = html.Div(
+ style={'backgroundColor': colors['background'], 'padding': '32px',
+ 'fontFamily': 'Inter, system-ui, sans-serif', 'minHeight': '100vh'},
+ children=[
+ html.H1(
+ 'Hello Dash',
+ style={'textAlign': 'center', 'color': colors['accent']},
+ ),
+ html.Div(
+ 'Dash: A web application framework for your data.',
+ style={'textAlign': 'center', 'color': colors['muted'], 'marginBottom': '24px'},
+ ),
+ dcc.Graph(id='example-graph-2', figure=fig),
+ ],
+)
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/investments-dashboard/demos/layout/03_core_components.py b/investments-dashboard/demos/layout/03_core_components.py
new file mode 100644
index 0000000..b385345
--- /dev/null
+++ b/investments-dashboard/demos/layout/03_core_components.py
@@ -0,0 +1,109 @@
+from dash import Dash, html, dcc
+
+BG = '#0f1117'
+CARD = '#1a1d27'
+BORDER = '#2d3148'
+TEXT = '#e2e8f0'
+MUTED = '#94a3b8'
+ACCENT = '#7c3aed'
+
+app = Dash(__name__)
+
+label_style = {
+ 'color': MUTED,
+ 'fontSize': '11px',
+ 'fontWeight': '700',
+ 'letterSpacing': '0.08em',
+ 'textTransform': 'uppercase',
+ 'marginBottom': '8px',
+ 'marginTop': '20px',
+ 'display': 'block',
+}
+
+section_style = {
+ 'backgroundColor': CARD,
+ 'border': f'1px solid {BORDER}',
+ 'borderRadius': '10px',
+ 'padding': '20px 24px',
+ 'flex': 1,
+ 'minWidth': 0,
+}
+
+app.layout = html.Div(style={
+ 'backgroundColor': BG,
+ 'padding': '32px',
+ 'fontFamily': 'Inter, system-ui, sans-serif',
+ 'minHeight': '100vh',
+}, children=[
+ html.H2('Core Components', style={'color': TEXT, 'marginBottom': '4px'}),
+ html.P('Every dcc component is declared entirely through keyword arguments — fully declarative.',
+ style={'color': MUTED, 'marginBottom': '24px'}),
+
+ html.Div(style={'display': 'flex', 'gap': '16px'}, children=[
+
+ # Left column
+ html.Div(style=section_style, children=[
+ html.Span('Dropdown', style=label_style),
+ dcc.Dropdown(
+ ['New York City', 'Montréal', 'San Francisco'],
+ 'Montréal',
+ ),
+
+ html.Span('Multi-Select Dropdown', style=label_style),
+ dcc.Dropdown(
+ ['New York City', 'Montréal', 'San Francisco'],
+ ['Montréal', 'San Francisco'],
+ multi=True,
+ ),
+
+ html.Span('Radio Items', style=label_style),
+ dcc.RadioItems(
+ ['New York City', 'Montréal', 'San Francisco'],
+ 'Montréal',
+ labelStyle={'color': TEXT, 'marginRight': '12px', 'fontSize': '14px'},
+ ),
+ ]),
+
+ # Right column
+ html.Div(style=section_style, children=[
+ html.Span('Checkboxes', style=label_style),
+ dcc.Checklist(
+ ['New York City', 'Montréal', 'San Francisco'],
+ ['Montréal', 'San Francisco'],
+ labelStyle={'color': TEXT, 'marginRight': '12px', 'fontSize': '14px'},
+ ),
+
+ html.Span('Text Input', style=label_style),
+ dcc.Input(
+ value='MTL',
+ type='text',
+ style={
+ 'backgroundColor': BG,
+ 'border': f'1px solid {BORDER}',
+ 'borderRadius': '6px',
+ 'color': TEXT,
+ 'padding': '8px 12px',
+ 'fontSize': '14px',
+ 'outline': 'none',
+ },
+ ),
+
+ html.Span('Slider', style=label_style),
+ dcc.Slider(
+ min=0,
+ max=9,
+ marks={
+ i: {
+ 'label': f'Label {i}' if i == 1 else str(i),
+ 'style': {'color': MUTED, 'fontSize': '11px'},
+ }
+ for i in range(1, 6)
+ },
+ value=5,
+ ),
+ ]),
+ ]),
+])
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/investments-dashboard/pages/__init__.py b/investments-dashboard/pages/__init__.py
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/investments-dashboard/pages/__init__.py
@@ -0,0 +1 @@
+
diff --git a/investments-dashboard/pages/dashboard.py b/investments-dashboard/pages/dashboard.py
new file mode 100644
index 0000000..3fd279a
--- /dev/null
+++ b/investments-dashboard/pages/dashboard.py
@@ -0,0 +1,293 @@
+import dash_mantine_components as dmc
+from dash import dcc, html
+from dash_iconify import DashIconify
+
+from components.charts import create_hypothetical_growth_chart, create_sparkline
+from components.tables import create_fund_facts_table
+from utils.data_loader import get_fund_metrics, df_fund_facts
+
+metrics = get_fund_metrics()
+
+SYMBOLS = ["AAPL", "GOOGL", "MSFT", "AMZN", "TSLA"]
+INITIAL_PRICES = {"AAPL": 189.50, "GOOGL": 176.30, "MSFT": 420.15, "AMZN": 185.60, "TSLA": 178.90}
+
+def create_kpi_card(id_prefix, title, value, trend=None, trend_positive=True, subtitle=None, icon=None):
+ """Create a KPI card with IDs for callback updates"""
+ trend_color = "teal" if trend_positive else "red"
+
+ return dmc.Paper(
+ dmc.Stack([
+ dmc.Group([
+ dmc.Text(title, size="sm", c="dimmed", fw=500, id=f"{id_prefix}-title"),
+ DashIconify(icon=icon, width=20, color="gray") if icon else None,
+ ], justify="space-between"),
+ dmc.Group([
+ dmc.Text(value, size="xl", fw=700, id=f"{id_prefix}-value"),
+ dmc.Text(
+ trend if trend else "",
+ size="sm",
+ c=trend_color,
+ fw=500,
+ id=f"{id_prefix}-trend",
+ style={"display": "block" if trend else "none"}
+ ),
+ ], justify="space-between", mt="xs"),
+ dmc.Text(subtitle, size="xs", c="dimmed", mt=4, id=f"{id_prefix}-subtitle") if subtitle else None,
+ ], gap="xs"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ style={"minWidth": "200px"}
+ )
+
+def create_risk_row(id_prefix, label, value, progress_value, color):
+ """Create a risk metric row with IDs for dynamic updates"""
+ return dmc.Group([
+ dmc.Text(label, size="sm", w=100),
+ dmc.Progress(value=progress_value, color=color, size="lg", style={"flex": 1}, id=f"{id_prefix}-bar"),
+ dmc.Text(value, size="sm", fw=500, w=60, id=f"{id_prefix}-value"),
+ ], gap="sm")
+
+layout = dmc.Stack([
+ # Page Header
+ dmc.Group([
+ dmc.Stack([
+ dmc.Title("Executive Dashboard", order=2),
+ dmc.Text("Fund performance overview and key metrics", c="dimmed"),
+ ], gap=4),
+ dmc.Group([
+ dmc.SegmentedControl(
+ id="dashboard-period",
+ data=[
+ {"value": "1Y", "label": "1Y"},
+ {"value": "3Y", "label": "3Y"},
+ {"value": "5Y", "label": "5Y"},
+ {"value": "10Y", "label": "10Y"},
+ {"value": "All", "label": "All"},
+ ],
+ value="1Y",
+ size="sm",
+ ),
+ dmc.Select(
+ id="dashboard-fund-select",
+ data=[
+ {"value": "500", "label": "500 Index Fund Inv"},
+ {"value": "calibre", "label": "Calibre Index Fund"},
+ ],
+ value="500",
+ w=200,
+ ),
+ dmc.Switch(
+ id="benchmark-toggle",
+ label="Benchmark",
+ checked=True,
+ size="sm",
+ ),
+ dmc.NumberInput(
+ id="investment-amount",
+ value=10000,
+ min=1000,
+ max=1000000,
+ step=1000,
+ prefix="$",
+ thousandSeparator=",",
+ w=130,
+ size="sm",
+ ),
+ ], gap="sm"),
+ ], justify="space-between", mb="lg"),
+
+ # KPI Cards Row
+ dmc.SimpleGrid([
+ create_kpi_card(
+ "kpi-nav",
+ "Net Asset Value",
+ f"${metrics['nav']:.2f}",
+ trend=f"↑ {metrics['ytd_return']:.1f}% YTD",
+ trend_positive=metrics['ytd_return'] > 0,
+ icon="tabler:currency-dollar"
+ ),
+ create_kpi_card(
+ "kpi-period",
+ "1 Year Return",
+ f"{metrics['1y_return']:.2f}%",
+ subtitle="vs S&P 500",
+ icon="tabler:chart-line"
+ ),
+ create_kpi_card(
+ "kpi-expense",
+ "Expense Ratio",
+ metrics['expense_ratio'],
+ trend="↓ 85% lower",
+ trend_positive=True,
+ subtitle="vs 0.99% category avg",
+ icon="tabler:percentage"
+ ),
+ create_kpi_card(
+ "kpi-category",
+ "Category",
+ metrics['category'],
+ subtitle=metrics['asset_class'],
+ icon="tabler:category"
+ ),
+ ], cols={"base": 1, "sm": 2, "lg": 4}, spacing="md"),
+
+ # Main Charts Row
+ dmc.Grid([
+ dmc.GridCol([
+ dcc.Store(id="live-streaming", data=True),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Group([
+ dmc.Group([
+ dmc.Text("Live Market Prices", fw=600, size="lg"),
+ html.Div(
+ style={
+ "width": 8, "height": 8, "borderRadius": "50%",
+ "backgroundColor": "#40c057",
+ "animation": "pulse 1.5s ease-in-out infinite",
+ },
+ id="live-indicator",
+ ),
+ dmc.Badge("LIVE", color="green", size="sm", variant="light"),
+ ], gap="xs"),
+ dmc.Switch(
+ id="live-toggle",
+ label="Stream",
+ checked=True,
+ size="sm",
+ ),
+ ], justify="space-between"),
+ dmc.Divider(),
+ dmc.Stack([
+ dmc.Group([
+ dmc.Text(sym, size="sm", fw=600, w=60),
+ dmc.Text(
+ f"${INITIAL_PRICES[sym]:.2f}",
+ size="sm", fw=700, ff="monospace",
+ id=f"live-price-{sym}",
+ ),
+ dmc.Text(
+ "+0.00 (0.00%)",
+ size="xs", c="dimmed", ff="monospace",
+ id=f"live-change-{sym}",
+ ),
+ ], justify="space-between")
+ for sym in SYMBOLS
+ ], gap="xs"),
+ dmc.Divider(),
+ dmc.Select(
+ id="sparkline-symbol",
+ data=[{"value": s, "label": s} for s in SYMBOLS],
+ value="AAPL",
+ size="xs",
+ w=120,
+ ),
+ dcc.Graph(
+ id="sparkline-chart",
+ figure=create_sparkline([INITIAL_PRICES["AAPL"]], "AAPL"),
+ config={"displayModeBar": False},
+ style={"height": "120px"},
+ ),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 7}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dcc.Graph(
+ id="growth-chart",
+ figure=create_hypothetical_growth_chart(),
+ config={"displayModeBar": False},
+ style={"height": "350px"}
+ ),
+ ]),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 5}),
+ ], gutter="md"),
+
+ # Fund Facts and Quick Stats Row
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Fund Facts", fw=600, size="lg"),
+ create_fund_facts_table(df_fund_facts),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 4}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Quick Comparison", fw=600, size="lg"),
+ dmc.SimpleGrid([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("1Y RETURN", size="xs", c="dimmed", fw=600),
+ dmc.Text(f"{metrics['1y_return']:.2f}%", size="lg", fw=600, id="quick-1y"),
+ dmc.Text("Fund", size="xs", c="dimmed"),
+ ], gap=4),
+ p="sm", radius="sm", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("3Y RETURN", size="xs", c="dimmed", fw=600),
+ dmc.Text(f"{metrics['3y_return']:.2f}%", size="lg", fw=600, id="quick-3y"),
+ dmc.Text("Fund", size="xs", c="dimmed"),
+ ], gap=4),
+ p="sm", radius="sm", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("5Y RETURN", size="xs", c="dimmed", fw=600),
+ dmc.Text(f"{metrics['5y_return']:.2f}%", size="lg", fw=600, id="quick-5y"),
+ dmc.Text("Fund", size="xs", c="dimmed"),
+ ], gap=4),
+ p="sm", radius="sm", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("MIN INVESTMENT", size="xs", c="dimmed", fw=600),
+ dmc.Text(metrics['min_investment'].replace('"', ''), size="lg", fw=600, id="quick-min"),
+ ], gap=4),
+ p="sm", radius="sm", withBorder=True,
+ ),
+ ], cols=2, spacing="sm"),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 4}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Risk Overview", fw=600, size="lg"),
+ dmc.Stack([
+ create_risk_row("risk-volatility", "Volatility", "Medium", 45, "blue"),
+ create_risk_row("risk-beta", "Beta", "1.00", 100, "green"),
+ create_risk_row("risk-sharpe", "Sharpe Ratio", "0.85", 70, "teal"),
+ create_risk_row("risk-alpha", "Alpha", "-0.02", 50, "yellow"),
+ ], gap="md", mt="sm"),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ h="100%",
+ )
+ ], span={"base": 12, "md": 4}),
+ ], gutter="md"),
+
+], gap="md")
diff --git a/investments-dashboard/pages/fees.py b/investments-dashboard/pages/fees.py
new file mode 100644
index 0000000..145ef7a
--- /dev/null
+++ b/investments-dashboard/pages/fees.py
@@ -0,0 +1,333 @@
+import dash_mantine_components as dmc
+from dash import dcc, html
+from dash_iconify import DashIconify
+import plotly.graph_objects as go
+
+from components.charts import create_fee_comparison_chart, create_dividend_timeline, CHART_COLORS, CHART_LAYOUT
+from components.tables import create_data_table, create_dividend_table
+from utils.data_loader import (
+ df_expenses, df_minimums, get_dividend_history,
+ df_realized, df_unrealized
+)
+
+dividend_data = get_dividend_history()
+
+def create_fee_waterfall():
+ """Create fee breakdown waterfall chart"""
+ fig = go.Figure(go.Waterfall(
+ orientation="v",
+ measure=["absolute", "relative", "relative", "relative", "total"],
+ x=["Management Fee", "Admin Fee", "12b-1 Fee", "Other", "Total Expense"],
+ y=[0.10, 0.02, 0.00, 0.02, 0],
+ connector={"line": {"color": "rgb(63, 63, 63)"}},
+ decreasing={"marker": {"color": CHART_COLORS['secondary']}},
+ increasing={"marker": {"color": CHART_COLORS['danger']}},
+ totals={"marker": {"color": CHART_COLORS['primary']}},
+ text=["+0.10%", "+0.02%", "+0.00%", "+0.02%", "0.14%"],
+ textposition="outside",
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Expense Ratio Breakdown', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ yaxis={'title': 'Percentage', 'ticksuffix': '%'},
+ showlegend=False,
+ )
+
+ return fig
+
+def create_cost_impact_chart(initial=10000, years=30):
+ """Show cost impact over time"""
+ year_range = list(range(1, years + 1))
+
+ fund_values = [initial * (1.07 - 0.0014) ** y for y in year_range]
+ avg_values = [initial * (1.07 - 0.0099) ** y for y in year_range]
+
+ fig = go.Figure()
+
+ fig.add_trace(go.Scatter(
+ x=year_range,
+ y=avg_values,
+ name='Category Avg (0.99%)',
+ line={'color': CHART_COLORS['gray'], 'width': 2},
+ ))
+
+ fig.add_trace(go.Scatter(
+ x=year_range,
+ y=fund_values,
+ name='This Fund (0.14%)',
+ line={'color': CHART_COLORS['primary'], 'width': 2},
+ fill='tonexty',
+ fillcolor='rgba(34, 139, 230, 0.1)',
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Long-Term Cost Impact (7% annual return)', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ xaxis={'title': 'Years'},
+ yaxis={'title': 'Portfolio Value', 'tickprefix': '$', 'tickformat': ','},
+ legend={'orientation': 'h', 'y': -0.15},
+ )
+
+ return fig
+
+def create_dividend_calendar():
+ """Create dividend payment calendar visualization"""
+ months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+ dividends = [0, 0, 0.96, 0, 0, 0.96, 0, 0, 1.13, 0, 0, 1.13]
+
+ fig = go.Figure()
+
+ fig.add_trace(go.Bar(
+ x=months,
+ y=dividends,
+ marker_color=[CHART_COLORS['primary'] if d > 0 else CHART_COLORS['gray'] for d in dividends],
+ text=[f'${d:.2f}' if d > 0 else '' for d in dividends],
+ textposition='outside',
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Dividend Payment Calendar', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ yaxis={'title': 'Dividend per Share', 'tickprefix': '$'},
+ xaxis={'title': 'Month'},
+ )
+
+ return fig
+
+layout = dmc.Stack([
+ # Page Header
+ dmc.Group([
+ dmc.Stack([
+ dmc.Title("Fees & Distributions", order=2),
+ dmc.Text("Expense analysis, dividend history, and capital gains", c="dimmed"),
+ ], gap=4),
+ dmc.Group([
+ ], gap="sm"),
+ ], justify="space-between", mb="lg"),
+
+ # Fee Calculator Section
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Fee Impact Calculator", fw=600, size="lg"),
+ dmc.Text("Adjust investment amount and time horizon to see the impact of fees", size="sm", c="dimmed"),
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Stack([
+ dmc.Text("Investment Amount", size="sm", fw=500),
+ dmc.NumberInput(
+ id="investment-amount",
+ value=10000,
+ min=1000,
+ max=1000000,
+ step=1000,
+ prefix="$",
+ thousandSeparator=",",
+ w="100%",
+ ),
+ ], gap="xs"),
+ ], span={"base": 12, "sm": 6, "md": 3}),
+ dmc.GridCol([
+ dmc.Stack([
+ dmc.Text("Time Horizon (Years)", size="sm", fw=500),
+ dmc.Slider(
+ id="time-horizon",
+ value=10,
+ min=1,
+ max=30,
+ step=1,
+ marks=[
+ {"value": 1, "label": "1"},
+ {"value": 10, "label": "10"},
+ {"value": 20, "label": "20"},
+ {"value": 30, "label": "30"},
+ ],
+ mt="md",
+ ),
+ dmc.Space(h=20),
+ ], gap="xs"),
+ ], span={"base": 12, "sm": 6, "md": 5}),
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Stack([
+ dmc.Text("Your Savings", size="xs", c="dimmed", tt="uppercase", fw=500),
+ dmc.Text("$1,913", size="28px", fw=700, c="teal", id="savings-amount"),
+ dmc.Text("vs category average", size="xs", c="dimmed"),
+ ], gap=2, align="center"),
+ dmc.Divider(),
+ dmc.Group([
+ dmc.Stack([
+ dmc.Text("This Fund", size="xs", c="dimmed"),
+ dmc.Text("$19,672", size="lg", fw=600, c="teal", id="final-value-fund"),
+ ], gap=2, align="center"),
+ dmc.Divider(orientation="vertical", h=40),
+ dmc.Stack([
+ dmc.Text("Category Avg", size="xs", c="dimmed"),
+ dmc.Text("$17,759", size="lg", fw=600, c="gray", id="final-value-avg"),
+ ], gap=2, align="center"),
+ ], justify="center", gap="xl"),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ bg="var(--mantine-color-gray-0)",
+ style={"border": "1px dashed var(--mantine-color-gray-4)"},
+ ),
+ ], span={"base": 12, "md": 4}),
+ ], gutter="md", align="center"),
+ ], gap="md"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+
+ # Fee Highlight Cards
+ dmc.SimpleGrid([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Expense Ratio", size="sm", c="dimmed"),
+ dmc.Group([
+ dmc.Text("0.14%", size="xl", fw=700, c="green"),
+ dmc.Badge("85% below avg", color="green", size="sm"),
+ ], gap="sm"),
+ dmc.Text("Category average: 0.99%", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Distribution Yield", size="sm", c="dimmed"),
+ dmc.Text("1.77%", size="xl", fw=700),
+ dmc.Text("Annual yield based on distributions", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("SEC Yield", size="sm", c="dimmed"),
+ dmc.Text("1.77%", size="xl", fw=700),
+ dmc.Text("30-day SEC yield", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Annual Fee", size="sm", c="dimmed"),
+ dmc.Text("$14", size="xl", fw=700, c="green"),
+ dmc.Text("Per $10,000 invested", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ ], cols={"base": 2, "md": 4}, spacing="md"),
+
+ # Fee Charts Row
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dcc.Graph(
+ id="fee-comparison-chart",
+ figure=create_fee_comparison_chart(),
+ config={"displayModeBar": False},
+ style={"height": "350px"}
+ ),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dcc.Graph(
+ figure=create_fee_waterfall(),
+ config={"displayModeBar": False},
+ style={"height": "350px"}
+ ),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+ ], gutter="md"),
+
+ # Long-term Cost Impact
+ dmc.Paper(
+ dcc.Graph(
+ id="cost-impact-chart",
+ figure=create_cost_impact_chart(),
+ config={"displayModeBar": False},
+ style={"height": "350px"}
+ ),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+
+ # Distributions Section
+ dmc.Title("Distributions", order=3, mt="lg"),
+
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dcc.Graph(
+ figure=create_dividend_calendar(),
+ config={"displayModeBar": False},
+ style={"height": "300px"}
+ ),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Recent Distributions", fw=600, size="lg"),
+ create_data_table(dividend_data.head(5)),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+ ], gutter="md"),
+
+ # Capital Gains Section
+ dmc.Title("Capital Gains", order=3, mt="lg"),
+
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Realized Gains", fw=600, size="lg"),
+ create_data_table(df_realized),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Unrealized Appreciation", fw=600, size="lg"),
+ create_data_table(df_unrealized),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+ ], gutter="md"),
+
+], gap="md")
diff --git a/investments-dashboard/pages/performance.py b/investments-dashboard/pages/performance.py
new file mode 100644
index 0000000..28ccb3c
--- /dev/null
+++ b/investments-dashboard/pages/performance.py
@@ -0,0 +1,364 @@
+import dash_mantine_components as dmc
+from dash import dcc, html
+from dash_iconify import DashIconify
+import plotly.graph_objects as go
+
+from components.charts import create_performance_line_chart, CHART_COLORS, CHART_LAYOUT
+from utils.data_loader import (
+ get_time_series_data, get_returns_data,
+ df_current_prices, df_avg_returns, df_after_tax, df_recent_returns
+)
+
+ts_data = get_time_series_data()
+returns_data = get_returns_data()
+
+def create_returns_table(df):
+ """Create properly formatted returns table from raw CSV data"""
+ data = df.values.tolist()
+
+ if len(data) < 2:
+ return dmc.Text("No data available", c="dimmed")
+
+ headers = [str(h).replace("'-", "").strip() or "Fund" for h in data[0]]
+ rows_data = data[1:]
+
+ header = dmc.TableThead(
+ dmc.TableTr([
+ dmc.TableTh(col, style={'fontWeight': 600, 'fontSize': '13px'}) for col in headers
+ ])
+ )
+
+ rows = []
+ for row in rows_data:
+ cells = []
+ for i, val in enumerate(row):
+ val_str = str(val).replace("'-", "—").strip()
+ style = {'fontSize': '13px'}
+
+ if '%' in val_str and val_str not in ['—', '']:
+ try:
+ num = float(val_str.replace('%', ''))
+ style['color'] = '#40c057' if num > 0 else '#fa5252' if num < 0 else None
+ style['fontWeight'] = 500
+ except:
+ pass
+
+ if i == 0:
+ style['fontWeight'] = 500
+
+ cells.append(dmc.TableTd(val_str if val_str else "—", style=style))
+ rows.append(dmc.TableTr(cells))
+
+ body = dmc.TableTbody(rows)
+
+ return dmc.ScrollArea(
+ dmc.Table(
+ [header, body],
+ striped=True,
+ highlightOnHover=True,
+ withTableBorder=True,
+ withColumnBorders=False,
+ verticalSpacing="xs",
+ ),
+ type="auto"
+ )
+
+def create_drawdown_chart(df):
+ """Calculate and plot drawdown"""
+ prices = df['Calibre Index Fund'].values
+ peak = prices[0]
+ drawdowns = []
+
+ for price in prices:
+ if price > peak:
+ peak = price
+ drawdown = (price - peak) / peak * 100
+ drawdowns.append(drawdown)
+
+ fig = go.Figure()
+ fig.add_trace(go.Scatter(
+ x=df['Date'],
+ y=drawdowns,
+ fill='tozeroy',
+ line={'color': CHART_COLORS['danger'], 'width': 1},
+ fillcolor='rgba(250, 82, 82, 0.2)',
+ name='Drawdown',
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Drawdown Analysis', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'ticksuffix': '%'},
+ showlegend=False,
+ )
+ return fig
+
+initial_total_return = ((ts_data['Calibre Index Fund'].iloc[-1] - ts_data['Calibre Index Fund'].iloc[0]) / ts_data['Calibre Index Fund'].iloc[0] * 100)
+
+layout = dmc.Stack([
+ # Page Header
+ dmc.Stack([
+ dmc.Group([
+ dmc.Stack([
+ dmc.Title("Price Performance", order=2),
+ dmc.Text("Historical prices, returns analysis, and benchmark comparison", c="dimmed"),
+ ], gap=4),
+ ], justify="space-between"),
+
+ # Filter Row
+ dmc.Paper(
+ dmc.Group([
+ dmc.Group([
+ dmc.Text("Period", size="xs", fw=500, c="dimmed"),
+ dmc.SegmentedControl(
+ id="performance-period",
+ data=["1M", "3M", "6M", "1Y", "3Y", "5Y", "All"],
+ value="All",
+ size="xs",
+ ),
+ ], gap=6),
+ dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}),
+ dmc.Group([
+ dmc.Text("Benchmarks", size="xs", fw=500, c="dimmed"),
+ dmc.MultiSelect(
+ id="benchmark-selector",
+ data=[
+ {"value": "calibre", "label": "Calibre Index Fund"},
+ {"value": "msci", "label": "MSCI EAFE Index"},
+ {"value": "sp500", "label": "S&P 500"},
+ ],
+ value=["calibre", "msci", "sp500"],
+ w=220,
+ clearable=True,
+ size="xs",
+ ),
+ ], gap=6),
+ dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}),
+ dmc.Group([
+ dmc.Text("Display", size="xs", fw=500, c="dimmed"),
+ dmc.Switch(
+ id="normalize-toggle",
+ label="Normalize",
+ checked=True,
+ size="xs",
+ ),
+ dmc.Switch(
+ id="log-scale-toggle",
+ label="Log Scale",
+ checked=False,
+ size="xs",
+ ),
+ ], gap=8),
+ dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}),
+ dmc.Group([
+ dmc.Text("Overlay", size="xs", fw=500, c="dimmed"),
+ dmc.Select(
+ id="ma-selector",
+ data=[
+ {"value": "none", "label": "No MA"},
+ {"value": "20", "label": "20-day"},
+ {"value": "50", "label": "50-day"},
+ {"value": "200", "label": "200-day"},
+ ],
+ value="none",
+ w=100,
+ size="xs",
+ ),
+ ], gap=6),
+ ], gap="md", align="center"),
+ p="sm",
+ radius="md",
+ withBorder=True,
+ ),
+ ], gap="sm", mb="md"),
+
+ # 1. Stats Cards Row (TOP)
+ dmc.SimpleGrid([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Period High", size="sm", c="dimmed"),
+ dmc.Text(
+ f"${ts_data['Calibre Index Fund'].max():.2f}",
+ size="xl", fw=700, c="green",
+ id="period-high-value"
+ ),
+ dmc.Text(
+ ts_data.loc[ts_data['Calibre Index Fund'].idxmax(), 'Date'].strftime('%Y-%m-%d'),
+ size="xs", c="dimmed",
+ id="period-high-date"
+ ),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Period Low", size="sm", c="dimmed"),
+ dmc.Text(
+ f"${ts_data['Calibre Index Fund'].min():.2f}",
+ size="xl", fw=700, c="red",
+ id="period-low-value"
+ ),
+ dmc.Text(
+ ts_data.loc[ts_data['Calibre Index Fund'].idxmin(), 'Date'].strftime('%Y-%m-%d'),
+ size="xs", c="dimmed",
+ id="period-low-date"
+ ),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Current Price", size="sm", c="dimmed"),
+ dmc.Text(
+ f"${ts_data['Calibre Index Fund'].iloc[-1]:.2f}",
+ size="xl", fw=700,
+ id="current-price-value"
+ ),
+ dmc.Text("Latest available", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Total Return", size="sm", c="dimmed"),
+ dmc.Text(
+ f"{initial_total_return:.1f}%",
+ size="xl", fw=700,
+ c="green" if initial_total_return > 0 else "red",
+ id="total-return-value"
+ ),
+ dmc.Text("For selected period", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ ], cols={"base": 2, "md": 4}, spacing="md"),
+
+ # 2. Performance Metrics Row (SECOND)
+ dmc.SimpleGrid([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Volatility (Ann.)", size="sm", c="dimmed"),
+ dmc.Text("0.0%", size="xl", fw=700, id="perf-volatility"),
+ dmc.Text("Std deviation of returns", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Max Drawdown", size="sm", c="dimmed"),
+ dmc.Text("0.0%", size="xl", fw=700, c="red", id="perf-max-drawdown"),
+ dmc.Text("Worst peak-to-trough", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Sharpe Ratio", size="sm", c="dimmed"),
+ dmc.Text("0.00", size="xl", fw=700, id="perf-sharpe"),
+ dmc.Text("Risk-adjusted return", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Best / Worst Day", size="sm", c="dimmed"),
+ dmc.Group([
+ dmc.Text("+0.0%", size="lg", fw=700, c="green", id="perf-best-day"),
+ dmc.Text("/", size="lg", c="dimmed"),
+ dmc.Text("-0.0%", size="lg", fw=700, c="red", id="perf-worst-day"),
+ ], gap=4),
+ dmc.Text("Single-day extremes", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ ], cols={"base": 2, "md": 4}, spacing="md"),
+
+ # 3. Returns Tables and Analysis Charts Row (THIRD)
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Tabs([
+ dmc.TabsList([
+ dmc.TabsTab("Average Returns", value="avg"),
+ dmc.TabsTab("After Tax", value="tax"),
+ dmc.TabsTab("Recent Returns", value="recent"),
+ ]),
+ dmc.TabsPanel(create_returns_table(df_avg_returns), value="avg", pt="md"),
+ dmc.TabsPanel(create_returns_table(df_after_tax), value="tax", pt="md"),
+ dmc.TabsPanel(create_returns_table(df_recent_returns), value="recent", pt="md"),
+ ], value="avg"),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Tabs([
+ dmc.TabsList([
+ dmc.TabsTab("Drawdown", value="drawdown"),
+ dmc.TabsTab("Rolling Returns", value="rolling"),
+ ]),
+ dmc.TabsPanel(
+ dcc.Graph(
+ id="drawdown-chart",
+ figure=create_drawdown_chart(ts_data),
+ config={"displayModeBar": False},
+ style={"height": "300px"}
+ ),
+ value="drawdown", pt="md"
+ ),
+ dmc.TabsPanel(
+ dcc.Graph(
+ id="rolling-returns-chart",
+ figure=go.Figure(),
+ config={"displayModeBar": False},
+ style={"height": "300px"}
+ ),
+ value="rolling", pt="md"
+ ),
+ ], value="drawdown", id="analysis-tabs"),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+ ], gutter="md"),
+
+ # 4. Main Performance Chart (BOTTOM)
+ dmc.Paper(
+ dmc.Stack([
+ dcc.Graph(
+ id="performance-chart",
+ figure=create_performance_line_chart(ts_data),
+ config={"displayModeBar": False},
+ style={"height": "400px"}
+ ),
+ ]),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+
+], gap="md")
diff --git a/investments-dashboard/pages/portfolio.py b/investments-dashboard/pages/portfolio.py
new file mode 100644
index 0000000..557f38e
--- /dev/null
+++ b/investments-dashboard/pages/portfolio.py
@@ -0,0 +1,414 @@
+import dash_mantine_components as dmc
+from dash_iconify import DashIconify
+from dash import dcc, html
+import plotly.graph_objects as go
+import plotly.express as px
+
+from components.charts import create_sector_donut_chart, CHART_COLORS, CHART_LAYOUT
+from components.tables import create_data_table
+from utils.data_loader import get_sector_allocation, df_equity_char, df_equity_diver
+
+sector_data = get_sector_allocation()
+
+def create_style_box():
+ """Create 3x3 investment style box"""
+ fig = go.Figure()
+
+ labels = [
+ ['Large Value', 'Large Blend', 'Large Growth'],
+ ['Mid Value', 'Mid Blend', 'Mid Growth'],
+ ['Small Value', 'Small Blend', 'Small Growth']
+ ]
+
+ for i in range(3):
+ for j in range(3):
+ color = '#228be6' if (i == 0 and j == 1) else '#f1f3f5'
+ opacity = 1 if (i == 0 and j == 1) else 0.5
+
+ fig.add_shape(
+ type="rect",
+ x0=j, x1=j+1, y0=2-i, y1=3-i,
+ fillcolor=color,
+ opacity=opacity,
+ line={'color': '#dee2e6', 'width': 1},
+ )
+
+ fig.add_annotation(
+ x=j+0.5, y=2.5-i,
+ text=labels[i][j],
+ showarrow=False,
+ font={'size': 10, 'color': '#fff' if (i == 0 and j == 1) else '#495057'},
+ )
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Investment Style', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ xaxis={'visible': False, 'range': [-0.1, 3.1]},
+ yaxis={'visible': False, 'range': [-0.1, 3.1]},
+ height=300,
+ )
+
+ return fig
+
+def create_sector_comparison_bar():
+ """Create horizontal bar chart comparing fund vs benchmark sectors"""
+ fig = go.Figure()
+
+ fig.add_trace(go.Bar(
+ y=sector_data['Sector'],
+ x=sector_data['Fund'],
+ name='Fund',
+ orientation='h',
+ marker_color=CHART_COLORS['primary'],
+ ))
+
+ fig.add_trace(go.Bar(
+ y=sector_data['Sector'],
+ x=sector_data['Benchmark'],
+ name='Benchmark',
+ orientation='h',
+ marker_color=CHART_COLORS['gray'],
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Sector Allocation vs Benchmark', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ barmode='group',
+ bargap=0.3,
+ legend={'orientation': 'h', 'y': -0.15},
+ xaxis={'title': 'Allocation %', 'ticksuffix': '%'},
+ yaxis={'title': ''},
+ height=450,
+ )
+
+ return fig
+
+def create_risk_return_scatter():
+ """Create risk/return scatter plot"""
+ funds = ['500 Index Fund', 'MSCI EAFE', 'Growth Fund', 'Value Fund', 'Bond Fund']
+ returns = [16.94, 14.2, 19.5, 12.3, 5.2]
+ risk = [15.2, 18.5, 22.1, 14.8, 6.3]
+ sizes = [100, 80, 60, 70, 50]
+
+ fig = go.Figure()
+
+ fig.add_trace(go.Scatter(
+ x=risk,
+ y=returns,
+ mode='markers+text',
+ marker={'size': sizes, 'color': px.colors.qualitative.Set2[:5], 'opacity': 0.7},
+ text=funds,
+ textposition='top center',
+ hovertemplate='%{text}
Risk: %{x:.1f}%
Return: %{y:.1f}%'
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Risk vs Return', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ xaxis={'title': 'Risk (Std Dev %)', 'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)'},
+ yaxis={'title': 'Return %', 'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)'},
+ height=350,
+ )
+
+ return fig
+
+def create_donut_with_click():
+ """Create donut chart configured for click events"""
+ colors = px.colors.qualitative.Set3[:len(sector_data)]
+
+ fig = go.Figure(go.Pie(
+ labels=sector_data['Sector'],
+ values=sector_data['Fund'],
+ hole=0.6,
+ marker={'colors': colors},
+ textinfo='percent',
+ textposition='outside',
+ hovertemplate='%{label}
%{value:.1f}%'
+ ))
+
+ fig.update_layout(
+ **CHART_LAYOUT,
+ title={'text': 'Sector Allocation (Click to highlight)', 'x': 0, 'font': {'size': 16, 'weight': 600}},
+ showlegend=True,
+ legend={'orientation': 'v', 'x': 1.05, 'y': 0.5},
+ annotations=[{
+ 'text': 'Sectors',
+ 'x': 0.5, 'y': 0.5,
+ 'font': {'size': 14, 'weight': 600},
+ 'showarrow': False
+ }]
+ )
+
+ return fig
+
+# Allocation View Content
+allocation_view = html.Div([
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dcc.Graph(
+ id="sector-donut",
+ figure=create_donut_with_click(),
+ config={"displayModeBar": False},
+ style={"height": "400px"}
+ ),
+ dmc.Text("Click on a sector to see details", size="sm", c="dimmed", ta="center", id="sector-detail-text"),
+ ]),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+
+ dmc.GridCol([
+ dmc.Stack([
+ dmc.Paper(
+ dcc.Graph(
+ figure=create_style_box(),
+ config={"displayModeBar": False},
+ ),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Portfolio Style Summary", fw=600),
+ dmc.Group([
+ dmc.Badge("Large Cap", color="blue", size="lg"),
+ dmc.Badge("Blend", color="gray", size="lg"),
+ dmc.Badge("Domestic", color="green", size="lg"),
+ ]),
+ dmc.Text(
+ "This fund tracks the S&P 500 Index, providing broad exposure to large-cap U.S. equities across value, blend, and growth styles.",
+ size="sm", c="dimmed", mt="xs"
+ ),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ ),
+ ], gap="md"),
+ ], span={"base": 12, "md": 6}),
+ ], gutter="md"),
+
+ dmc.Paper(
+ dcc.Graph(
+ id="sector-bar-chart",
+ figure=create_sector_comparison_bar(),
+ config={"displayModeBar": False},
+ ),
+ p="md",
+ radius="md",
+ withBorder=True,
+ mt="md",
+ ),
+], id="allocation-view")
+
+# Characteristics View Content
+characteristics_view = html.Div([
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Equity Characteristics", fw=600, size="lg"),
+ create_data_table(df_equity_char),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Sector Diversification", fw=600, size="lg"),
+ create_data_table(df_equity_diver),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+ ], gutter="md"),
+
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Key Metrics Comparison", fw=600, size="lg"),
+ dmc.SimpleGrid([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("P/E Ratio", size="sm", c="dimmed"),
+ dmc.Text("21.4", size="xl", fw=700),
+ dmc.Text("vs 22.1 benchmark", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md", radius="sm", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("P/B Ratio", size="sm", c="dimmed"),
+ dmc.Text("3.2", size="xl", fw=700),
+ dmc.Text("vs 3.4 benchmark", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md", radius="sm", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Dividend Yield", size="sm", c="dimmed"),
+ dmc.Text("1.8%", size="xl", fw=700),
+ dmc.Text("vs 1.7% benchmark", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md", radius="sm", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Earnings Growth", size="sm", c="dimmed"),
+ dmc.Text("12.5%", size="xl", fw=700),
+ dmc.Text("5-year average", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md", radius="sm", withBorder=True,
+ ),
+ ], cols={"base": 2, "md": 4}, spacing="md"),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ mt="md",
+ ),
+], id="characteristics-view", style={"display": "none"})
+
+# Risk Analysis View Content
+risk_view = html.Div([
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dcc.Graph(
+ figure=create_risk_return_scatter(),
+ config={"displayModeBar": False},
+ style={"height": "400px"}
+ ),
+ p="md",
+ radius="md",
+ withBorder=True,
+ )
+ ], span={"base": 12, "md": 6}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Risk Metrics", fw=600, size="lg"),
+ dmc.Stack([
+ dmc.Group([
+ dmc.Text("Standard Deviation", size="sm", w=150),
+ dmc.Progress(value=65, color="blue", size="lg", style={"flex": 1}),
+ dmc.Text("15.2%", size="sm", fw=500, w=60),
+ ], gap="sm"),
+ dmc.Group([
+ dmc.Text("Beta", size="sm", w=150),
+ dmc.Progress(value=100, color="green", size="lg", style={"flex": 1}),
+ dmc.Text("1.00", size="sm", fw=500, w=60),
+ ], gap="sm"),
+ dmc.Group([
+ dmc.Text("Sharpe Ratio", size="sm", w=150),
+ dmc.Progress(value=70, color="teal", size="lg", style={"flex": 1}),
+ dmc.Text("0.85", size="sm", fw=500, w=60),
+ ], gap="sm"),
+ dmc.Group([
+ dmc.Text("Sortino Ratio", size="sm", w=150),
+ dmc.Progress(value=75, color="cyan", size="lg", style={"flex": 1}),
+ dmc.Text("1.12", size="sm", fw=500, w=60),
+ ], gap="sm"),
+ dmc.Group([
+ dmc.Text("Max Drawdown", size="sm", w=150),
+ dmc.Progress(value=35, color="red", size="lg", style={"flex": 1}),
+ dmc.Text("-33.8%", size="sm", fw=500, w=60),
+ ], gap="sm"),
+ dmc.Group([
+ dmc.Text("Tracking Error", size="sm", w=150),
+ dmc.Progress(value=10, color="gray", size="lg", style={"flex": 1}),
+ dmc.Text("0.04%", size="sm", fw=500, w=60),
+ ], gap="sm"),
+ ], gap="md", mt="md"),
+ ], gap="sm"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ h="100%",
+ )
+ ], span={"base": 12, "md": 6}),
+ ], gutter="md"),
+
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Risk Analysis Summary", fw=600, size="lg"),
+ dmc.Alert(
+ "This fund closely tracks its benchmark (S&P 500) with minimal tracking error. The risk profile is consistent with broad market exposure.",
+ title="Low Tracking Error",
+ color="blue",
+ ),
+ dmc.SimpleGrid([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Upside Capture", size="sm", c="dimmed"),
+ dmc.Text("99.8%", size="xl", fw=700, c="green"),
+ ], gap=4),
+ p="md", radius="sm", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Downside Capture", size="sm", c="dimmed"),
+ dmc.Text("100.2%", size="xl", fw=700, c="red"),
+ ], gap=4),
+ p="md", radius="sm", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Information Ratio", size="sm", c="dimmed"),
+ dmc.Text("-0.12", size="xl", fw=700),
+ ], gap=4),
+ p="md", radius="sm", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("R-Squared", size="sm", c="dimmed"),
+ dmc.Text("99.9%", size="xl", fw=700, c="green"),
+ ], gap=4),
+ p="md", radius="sm", withBorder=True,
+ ),
+ ], cols={"base": 2, "md": 4}, spacing="md"),
+ ], gap="md"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ mt="md",
+ ),
+], id="risk-view", style={"display": "none"})
+
+layout = dmc.Stack([
+ # Page Header
+ dmc.Group([
+ dmc.Stack([
+ dmc.Title("Portfolio Analysis", order=2),
+ dmc.Text("Asset allocation, sector breakdown, and portfolio characteristics", c="dimmed"),
+ ], gap=4),
+ dmc.Group([
+ dmc.SegmentedControl(
+ id="portfolio-view",
+ data=[
+ {"value": "allocation", "label": "Allocation"},
+ {"value": "characteristics", "label": "Characteristics"},
+ {"value": "risk", "label": "Risk Analysis"},
+ ],
+ value="allocation",
+ ),
+ ], gap="sm"),
+ ], justify="space-between", mb="lg"),
+
+ # View Containers
+ allocation_view,
+ characteristics_view,
+ risk_view,
+
+], gap="md")
diff --git a/investments-dashboard/requirements.txt b/investments-dashboard/requirements.txt
new file mode 100644
index 0000000..634cddf
--- /dev/null
+++ b/investments-dashboard/requirements.txt
@@ -0,0 +1,10 @@
+dash[fastapi]==4.2.0
+dash-mantine-components>=0.14.0
+dash-iconify>=0.1.2
+pandas>=2.0.0
+plotly>=5.18.0
+uvicorn[standard]
+reportlab>=4.0.0
+kaleido==0.2.1
+PyPDF2>=3.0.0
+Pillow>=10.0.0
diff --git a/investments-dashboard/scripts/dash-callbacks-intro.md b/investments-dashboard/scripts/dash-callbacks-intro.md
new file mode 100644
index 0000000..a6e7bca
--- /dev/null
+++ b/investments-dashboard/scripts/dash-callbacks-intro.md
@@ -0,0 +1,102 @@
+# Video Script: Basic Dash Callbacks — Dash Fundamentals Chapter 2
+**Target length:** Under 5 minutes
+**Format:** Screen recording with voiceover, code running live
+**Narration word count:** ~510 words (~4 min at 130 wpm + visual pauses)
+
+---
+
+## Beat 1 — Hook `[0:00–0:20]`
+
+**[VISUAL]** Open on the gapminder scatter plot with the year slider. Drag the slider — the chart animates smoothly through decades of data.
+
+**[NARRATION]**
+> "In the last chapter, we built a Dash layout. It looked great — but it didn't do anything. This is what happens when you add callbacks. One slider, one chart, fully connected. Let me show you how it works."
+
+---
+
+## Beat 2 — The Why: Reactive Programming `[0:20–0:55]`
+
+**[VISUAL]** Stay on the gapminder app, or cut to a simple spreadsheet visual.
+
+**[NARRATION]**
+> "The mental model here is a spreadsheet. When you change a cell, every cell that depends on it updates automatically. You don't call a function — the dependency is declared, and the system handles the rest.
+>
+> Dash works exactly the same way. You declare: when this input changes, call this function and put the result in that output. Dash handles the wiring. This is reactive programming — and it's the entire foundation of how Dash apps become interactive."
+
+---
+
+## Beat 3 — Anatomy of a Callback `[0:55–2:10]`
+
+**[VISUAL]** Open the simple text input example in the editor. Highlight each section as you talk through it.
+
+**[NARRATION]**
+> "Let's start with the simplest possible example. A text box and a div — typing in the box updates the div.
+>
+> The layout is what you already know: a `dcc.Input` with an `id`, and an empty `html.Div` with an `id`. No value set on the div — we'll let the callback populate it.
+>
+> Now the callback. The `@callback` decorator is where the wiring happens. `Output` is what you want to update — the `children` property of `my-output`. `Input` is what triggers it — the `value` property of `my-input`.
+>
+> The function underneath receives the current value of the input and returns whatever should go in the output. That's it.
+>
+> A few things worth noting: the `id` in the decorator must match exactly the `id` in your layout. And the decorator has to sit directly above the function — no blank lines between them."
+
+**[VISUAL]** Run the app, type in the text box, show the div updating live.
+
+---
+
+## Beat 4 — Real Demo: Slider → Graph `[2:10–3:05]`
+
+**[VISUAL]** Open the gapminder `app.py`. Highlight the `@callback` and then the function body.
+
+**[NARRATION]**
+> "Now let's look at a real example. The `dcc.Slider` has an `id` of `year-slider`, and its `value` property is the input. The `dcc.Graph` is the output — specifically its `figure` property.
+>
+> Whenever the slider moves, Dash calls `update_figure` with the selected year. The function filters the dataframe down to that year, builds a new Plotly scatter plot, and returns it. Dash puts it in the graph.
+>
+> Notice `fig.update_layout(transition_duration=500)` — that's what gives the smooth animation between years. One line."
+
+---
+
+## Beat 5 — Multiple Inputs `[3:05–3:30]`
+
+**[VISUAL]** Show the multi-input example's `@callback` decorator — 5 inputs listed.
+
+**[NARRATION]**
+> "You're not limited to one input. This example drives a chart from two dropdowns, two radio buttons, and a slider — five inputs, one output.
+>
+> The pattern is the same: just list more `Input` items in the decorator. The callback receives them as positional arguments, in the same order. Any one of them changing triggers the function."
+
+---
+
+## Beat 6 — State `[3:30–4:15]`
+
+**[VISUAL]** Open the State / button example. Show both the `Input` and `State` lines in the decorator.
+
+**[NARRATION]**
+> "Now let's talk about `State`. Sometimes you want to read a value without that value triggering the callback. Classic example: a form with a Submit button.
+>
+> Here, the two text inputs are `State` — Dash reads their values, but typing in them does nothing. The `html.Button` is the `Input` — clicking it fires the callback. Dash passes all the `State` values into the function automatically.
+>
+> The rule is simple: `Input` triggers, `State` reads. Everything else about the function is the same."
+
+---
+
+## Beat 7 — Summary + CTA `[4:15–4:30]`
+
+**[VISUAL]** Quick cut back to the gapminder app with the slider moving.
+
+**[NARRATION]**
+> "Callbacks are the engine of every Dash app. Declare your inputs and outputs, write a Python function, and Dash handles the rest. One input or five, one output or many — the pattern doesn't change.
+>
+> Chapter 3 goes deeper: clicking on charts to drive other charts. Interactive graphing. Link's in the description."
+
+---
+
+## Production Notes
+- Beat 1: actually drag the slider on camera — the animation is the hook
+- Beat 3: slow down here — this is the first time the viewer sees a decorator. Hover over `Output` then `Input` as you name them
+- Beat 3 live demo: type something in the text box slowly, pause so the viewer sees the div react
+- Beat 4: pause after showing `transition_duration=500` — it's a satisfying "one line does this" moment
+- Beat 5: you don't need to run this app — just show the decorator in the editor. The point is the pattern, not the demo
+- Beat 6: live demo here is useful — type in the text boxes, show nothing happens, then click Submit, show it fires
+- Outro card: link to [Dash Fundamentals Part 3: Interactive Graphing](https://dash.plotly.com/docs/interactive-graphing)
diff --git a/investments-dashboard/scripts/dash-interactive-graphing-intro.md b/investments-dashboard/scripts/dash-interactive-graphing-intro.md
new file mode 100644
index 0000000..6cb3006
--- /dev/null
+++ b/investments-dashboard/scripts/dash-interactive-graphing-intro.md
@@ -0,0 +1,90 @@
+# Video Script: Interactive Visualizations — Dash Fundamentals Chapter 3
+**Target length:** Under 5 minutes
+**Format:** Screen recording with voiceover, code running live
+**Narration word count:** ~490 words (~3:45–4:00 at 130 wpm + visual pauses)
+
+---
+
+## Beat 1 — Hook `[0:00–0:20]`
+
+**[VISUAL]** World indicators app running — scatter plot on the left, two time series on the right. Slowly move the mouse over different country dots. The time series update in real time with each hover.
+
+**[NARRATION]**
+> "In the last chapter, callbacks reacted to controls — dropdowns, sliders, buttons. This chapter goes further. Here, the chart itself is the input. Hover over a country, and the graphs on the right update instantly. Let me show you how this works."
+
+---
+
+## Beat 2 — The Why: Charts as Inputs `[0:20–0:50]`
+
+**[VISUAL]** Stay on the world indicators app, or briefly show a traditional BI tool for contrast.
+
+**[NARRATION]**
+> "Most charting tools are one-way: data goes in, chart comes out. Dash flips this. Every interaction a user has with a chart — hovering over a point, clicking it, drawing a selection box, zooming — all of that is data you can feed into a callback.
+>
+> This is how you build crossfiltered dashboards and linked charts. Not with a specialized tool — just callbacks."
+
+---
+
+## Beat 3 — The 4 Interactive Properties `[0:50–1:40]`
+
+**[VISUAL]** Show the debug app running. Hover over points, click points, use the lasso tool, zoom — watch the JSON panels update on screen.
+
+**[NARRATION]**
+> "The `dcc.Graph` component has four properties that update through user interaction: `hoverData`, `clickData`, `selectedData`, and `relayoutData`.
+>
+> This debug app prints them live so you can see exactly what you're working with. Hover over a point — `hoverData` gets the coordinates, the point index, and any custom data you attached. Click — same thing in `clickData`. Draw a selection — `selectedData` gives you every point inside the box. Zoom or pan — `relayoutData` captures the new axis ranges.
+>
+> Any of these can be an `Input` in a callback."
+
+---
+
+## Beat 4 — Hover → Time Series `[1:40–3:05]`
+
+**[VISUAL]** Open the world indicators `app.py`. Highlight the scatter callback first, then the `update_x_timeseries` callback.
+
+**[NARRATION]**
+> "Let's look at the hover example. The scatter plot on the left has `id='crossfilter-indicator-scatter'`. The two time series have their own IDs.
+>
+> The key line is here — `hoverData` of the scatter is an `Input`. Whenever the mouse moves to a new point, this callback fires.
+>
+> Now, how does the callback know which country was hovered? That's what `customdata` is for. When building the scatter, we attach the country name to each point with `fig.update_traces(customdata=...)`. Then inside the callback, we pull it out with `hoverData['points'][0]['customdata']`.
+>
+> From there it's just pandas filtering and returning a new figure — the same pattern as Chapter 2, just with hover as the trigger instead of a slider."
+
+**[VISUAL]** Show the `create_time_series` helper function briefly.
+
+> "The `create_time_series` function is a reusable helper — the kind of thing you build once and call from multiple callbacks. Clean Python."
+
+---
+
+## Beat 5 — Crossfilter Pattern `[3:05–3:45]`
+
+**[VISUAL]** Switch to the 3-chart crossfilter app running. Use the lasso tool to select a cluster of points in one chart. Show the other two charts dim the unselected points and update the dashed selection rectangle.
+
+**[NARRATION]**
+> "Here's the crossfilter pattern. Three scatter plots, each with `selectedData` as an input to a shared callback. Select a region in any chart, and all three update — the selected points stay highlighted, everything else fades.
+>
+> The callback takes the intersection of all three selections and rerenders all three figures. The charts are both inputs and outputs at the same time.
+>
+> You don't need a BI tool for this. It's a Python function."
+
+---
+
+## Beat 6 — Summary + CTA `[3:45–4:00]`
+
+**[VISUAL]** Quick cut back to the hover → time series demo.
+
+**[NARRATION]**
+> "Dash charts expose hover, click, selection, and zoom as callback inputs. Same decorator, same Python function — you just use the chart as the trigger instead of a control.
+>
+> Chapter 4 covers something that comes up quickly in real apps: sharing data between callbacks without running the same query twice. Link's in the description."
+
+---
+
+## Production Notes
+- Beat 1: move the mouse slowly and deliberately over 3–4 countries — let the time series settle between moves so the update is clear
+- Beat 3: use the debug app for this beat — it's the best way to show what `hoverData` actually contains; pause on the hover JSON so viewers can read it
+- Beat 4: hover over the `customdata` line in the code and also the `hoverData['points'][0]['customdata']` extraction — this is the non-obvious part
+- Beat 5: start the crossfilter demo with no selection (all bright), then lasso select — the visual contrast of highlighted vs dimmed is the whole story
+- Beat 5: don't walk through the crossfilter code — the running demo is enough; the docs page has the full code for reference
+- Outro card: link to [Dash Fundamentals Part 4: Sharing Data Between Callbacks](https://dash.plotly.com/docs/sharing-data-between-callbacks)
diff --git a/investments-dashboard/scripts/dash-layout-intro.md b/investments-dashboard/scripts/dash-layout-intro.md
new file mode 100644
index 0000000..2ab130e
--- /dev/null
+++ b/investments-dashboard/scripts/dash-layout-intro.md
@@ -0,0 +1,108 @@
+# Video Script: Dash Layout — Dash Fundamentals Chapter 1
+**Target length:** Under 5 minutes
+**Format:** Screen recording with voiceover, code running live
+**Narration word count:** ~515 words (~4 min at 130 wpm + visual pauses)
+
+---
+
+## Beat 1 — Hook `[0:00–0:20]`
+
+**[VISUAL]** Open on the finished bar chart app already running at `localhost:8050` — fruits grouped by city, interactive, polished.
+
+**[NARRATION]**
+> "This is a Dash app. Interactive, browser-based, deployable anywhere — and we just built it in about 20 lines of Python. No JavaScript. No HTML files. No CSS from scratch. Let me show you how."
+
+---
+
+## Beat 2 — The Why `[0:20–0:55]`
+
+**[VISUAL]** Briefly show a terminal with pandas output, or a static matplotlib plot — the kind of thing you'd share as a screenshot.
+
+**[NARRATION]**
+> "If you work with data in Python, you've probably hit this wall. You've got a great analysis — a dataframe, a Plotly chart — but getting it in front of someone else means emailing a screenshot or sending a CSV and hoping they run the same environment.
+>
+> Building a proper web app means learning a frontend framework, and suddenly you're context-switching between Python and JavaScript.
+>
+> Dash is the bridge. You stay in Python, and Dash handles the web layer."
+
+---
+
+## Beat 3 — Your First App `[0:55–2:00]`
+
+**[VISUAL]** Open `app.py` in the editor — the bar chart example. Highlight each section as you mention it.
+
+**[NARRATION]**
+> "Let's look at what we're actually writing. Three things happen here.
+>
+> First, we create data — just a standard pandas DataFrame.
+>
+> Then we create a Plotly figure with `px.bar`. Standard Plotly Express.
+>
+> And then comes the Dash part: `app.layout`. This is where you describe what your app looks like — a tree of Python component objects.
+>
+> `html.Div` is a wrapper. `html.H1` is a heading. `dcc.Graph` takes our Plotly figure and renders it as an interactive chart in the browser.
+>
+> Run it with `python app.py`, open localhost:8050, and there it is."
+
+**[VISUAL]** Terminal running, browser opens to the app.
+
+> "Notice `debug=True` — that turns on hot reload. Change the title, save the file — your browser updates instantly. No restart needed."
+
+---
+
+## Beat 4 — Styling with HTML Components `[2:00–2:50]`
+
+**[VISUAL]** Switch to the dark-mode styled app. Show the `style={}` dict in the editor.
+
+**[NARRATION]**
+> "Now let's customize it. Every `dash.html` component maps to an HTML tag, and you control it entirely through Python keyword arguments.
+>
+> The `style` property works like inline HTML styles — except it's a Python dictionary. Keys are camelCase: `textAlign` instead of `text-align`, `backgroundColor` instead of `background-color`. And `class` becomes `className`.
+>
+> That's it. Every HTML attribute you know works the same way, just in Python syntax."
+
+---
+
+## Beat 5 — Core Components `[2:50–3:40]`
+
+**[VISUAL]** Show the components showcase app — dropdowns, sliders, radio items, checkboxes all visible.
+
+**[NARRATION]**
+> "Beyond HTML wrappers, Dash gives you `dash.dcc` — the Dash Core Components. Dropdowns, sliders, radio buttons, text inputs, graphs — all ready to go.
+>
+> These aren't plain HTML. They're React components under the hood, which is why they're interactive out of the box.
+>
+> Everything is declarative. Every option is a keyword argument. And if you ever want to know what's available, just run `help(dcc.Dropdown)` in your Python console — it lists every parameter with a description."
+
+---
+
+## Beat 6 — Reusable Components `[3:40–4:10]`
+
+**[VISUAL]** Show the `generate_table()` function from the table example.
+
+**[NARRATION]**
+> "Here's something that doesn't get talked about enough. Because your layout is Python, you can write functions that generate UI.
+>
+> This function takes a pandas DataFrame and returns a fully-formed HTML table component — no template language, no Jinja, no string interpolation. Just Python.
+>
+> That's the real unlock here: you can compose, loop, and abstract your UI the same way you write any other Python code."
+
+---
+
+## Beat 7 — Summary + CTA `[4:10–4:30]`
+
+**[VISUAL]** Quick cut back to the running bar chart app.
+
+**[NARRATION]**
+> "So: a Dash layout is a tree of Python components. `dash.html` gives you HTML tags. `dash.dcc` gives you interactive components. And because it's all Python, you can compose it like any other code.
+>
+> This is chapter one. The app looks good — but it doesn't do anything yet. In part two, we wire up callbacks to make it actually interactive. Link's in the description."
+
+---
+
+## Production Notes
+- Keep a brisk pace through code — don't read every line, just call out what matters
+- For Beat 3, hover or highlight `app.layout`, `html.Div`, `dcc.Graph` as each is mentioned
+- Hot reload demo in Beat 3: actually make a live edit on screen — change `'Hello Dash'` to something, save, show the browser update
+- Beat 5: interact with the dropdowns and slider briefly to show they work before the narration
+- Outro card: link to [Dash Fundamentals Part 2: Basic Callbacks](https://dash.plotly.com/docs/basic-callbacks)
diff --git a/investments-dashboard/utils/__init__.py b/investments-dashboard/utils/__init__.py
new file mode 100644
index 0000000..dab3080
--- /dev/null
+++ b/investments-dashboard/utils/__init__.py
@@ -0,0 +1 @@
+from .data_loader import *
diff --git a/investments-dashboard/utils/data_loader.py b/investments-dashboard/utils/data_loader.py
new file mode 100644
index 0000000..b09a915
--- /dev/null
+++ b/investments-dashboard/utils/data_loader.py
@@ -0,0 +1,135 @@
+import pandas as pd
+import pathlib
+
+PATH = pathlib.Path(__file__).parent.parent
+DATA_PATH = PATH.joinpath("data").resolve()
+
+def load_csv(filename):
+ return pd.read_csv(DATA_PATH.joinpath(filename))
+
+# Fund data
+df_fund_facts = load_csv("df_fund_facts.csv")
+df_price_perf = load_csv("df_price_perf.csv")
+
+# Price data
+df_current_prices = load_csv("df_current_prices.csv")
+df_hist_prices = load_csv("df_hist_prices.csv")
+df_graph = load_csv("df_graph.csv")
+
+# Returns data
+df_avg_returns = load_csv("df_avg_returns.csv")
+df_after_tax = load_csv("df_after_tax.csv")
+df_recent_returns = load_csv("df_recent_returns.csv")
+
+# Portfolio data
+df_equity_char = load_csv("df_equity_char.csv")
+df_equity_diver = load_csv("df_equity_diver.csv")
+
+# Fees data
+df_expenses = load_csv("df_expenses.csv")
+df_minimums = load_csv("df_minimums.csv")
+
+# Distribution data
+df_dividend = load_csv("df_dividend.csv")
+df_realized = load_csv("df_realized.csv")
+df_unrealized = load_csv("df_unrealized.csv")
+
+def get_time_series_data():
+ """Process df_graph for time series charts"""
+ df = df_graph.copy()
+ df['Date'] = pd.to_datetime(df['Date'])
+ return df
+
+def get_sector_allocation():
+ """Process sector diversification data for charts"""
+ df = df_equity_diver.copy()
+ df.columns = ['Sector', 'Fund', 'Benchmark']
+ df = df.iloc[1:] # Skip header row
+ df['Fund'] = df['Fund'].str.replace('%', '').astype(float)
+ df['Benchmark'] = df['Benchmark'].apply(lambda x: 0 if x == '—' else float(str(x).replace('%', '')))
+ return df
+
+def get_returns_data():
+ """Process average returns for comparison charts"""
+ df = df_avg_returns.copy()
+ df.columns = ['Entity', '1Y', '3Y', '5Y', '10Y', 'Since_Inception']
+ df = df.iloc[1:] # Skip header
+ for col in ['1Y', '3Y', '5Y', '10Y']:
+ df[col] = df[col].str.replace('%', '').astype(float)
+ return df
+
+def get_dividend_history():
+ """Process dividend data"""
+ df = df_dividend.copy()
+ df.columns = ['Type', 'Amount', 'Record_Date', 'Reinvest_Date',
+ 'Payable_Date', 'Reinvest_Price', 'Dist_Yield', 'SEC_Yield']
+ df = df.iloc[1:] # Skip header
+ return df
+
+def get_fund_metrics():
+ """Extract key fund metrics for KPI cards"""
+ facts = dict(zip(df_fund_facts['label'], df_fund_facts['value']))
+
+ ts = get_time_series_data()
+ latest_price = ts['Calibre Index Fund'].iloc[-1]
+ first_price = ts['Calibre Index Fund'].iloc[0]
+ ytd_return = ((latest_price - first_price) / first_price) * 100
+
+ returns = get_returns_data()
+ fund_returns = returns[returns['Entity'].str.contains('500 Index Fund', na=False)].iloc[0]
+
+ return {
+ 'nav': latest_price,
+ 'ytd_return': ytd_return,
+ 'expense_ratio': facts.get('Expense ratio as of 04/27/2017', '0.14%'),
+ 'category': facts.get('Category', 'Large Blend'),
+ 'asset_class': facts.get('Asset Class', 'Domestic Stock'),
+ 'min_investment': facts.get('Minimum investment', '$3,000'),
+ '1y_return': fund_returns['1Y'],
+ '3y_return': fund_returns['3Y'],
+ '5y_return': fund_returns['5Y'],
+ }
+
+def calculate_risk_metrics(fund_id, period="1Y"):
+ """Calculate risk metrics (volatility, beta, sharpe, alpha) for a fund and period"""
+ ts = get_time_series_data()
+
+ fund_col = 'Calibre Index Fund'
+ benchmark_col = '"S&P 500 Index, y"'
+
+ period_days = {"1Y": 252, "3Y": 756, "5Y": 1260, "10Y": 2520, "All": len(ts)}
+ lookback = min(period_days.get(period, 252), len(ts) - 1)
+
+ data = ts[fund_col].iloc[-lookback:]
+ benchmark = ts[benchmark_col].iloc[-lookback:]
+
+ returns = data.pct_change().dropna()
+ bench_returns = benchmark.pct_change().dropna()
+
+ volatility = returns.std() * (252 ** 0.5) * 100
+
+ covariance = returns.cov(bench_returns)
+ bench_variance = bench_returns.var()
+ beta = covariance / bench_variance if bench_variance > 0 else 1.0
+
+ excess_return = returns.mean() * 252 - 0.02
+ sharpe = excess_return / (returns.std() * (252 ** 0.5)) if returns.std() > 0 else 0
+
+ alpha = (returns.mean() * 252) - (0.02 + beta * (bench_returns.mean() * 252 - 0.02))
+
+ volatility_pct = min(max(volatility / 40 * 100, 10), 100)
+ beta_pct = min(max(beta * 50, 10), 100)
+ sharpe_pct = min(max((sharpe + 1) / 3 * 100, 10), 100)
+ alpha_pct = min(max((alpha * 100 + 5) / 10 * 100, 10), 100)
+
+ return {
+ 'volatility': volatility,
+ 'volatility_level': "Low" if volatility < 10 else "Medium" if volatility < 20 else "High",
+ 'volatility_pct': volatility_pct,
+ 'beta': beta,
+ 'beta_pct': beta_pct,
+ 'sharpe': sharpe,
+ 'sharpe_pct': sharpe_pct,
+ 'alpha': alpha * 100,
+ 'alpha_pct': alpha_pct,
+ }
diff --git a/investments-dashboard/utils/pdf_export.py b/investments-dashboard/utils/pdf_export.py
new file mode 100644
index 0000000..58373c0
--- /dev/null
+++ b/investments-dashboard/utils/pdf_export.py
@@ -0,0 +1,85 @@
+import copy
+import io
+from datetime import datetime
+
+import plotly.io as pio
+from PIL import Image as PILImage, ImageDraw
+from reportlab.lib import colors
+from reportlab.lib.pagesizes import A4, landscape, portrait
+from reportlab.lib.units import inch
+from reportlab.lib.utils import ImageReader
+from reportlab.pdfgen import canvas
+from PyPDF2 import PdfWriter, PdfReader
+
+
+def figure_to_image_bytes(figure, width=1000, height=600):
+ try:
+ fig = copy.deepcopy(figure)
+ if isinstance(fig, dict):
+ fig.setdefault('layout', {})
+ fig['layout']['paper_bgcolor'] = 'white'
+ fig['layout']['plot_bgcolor'] = 'white'
+ return pio.to_image(fig, format="png", width=width, height=height)
+ except Exception as e:
+ img = PILImage.new("RGB", (width, height), color=(220, 220, 220))
+ draw = ImageDraw.Draw(img)
+ draw.text((width // 2 - 100, height // 2), f"Render failed: {e}", fill="black")
+ buf = io.BytesIO()
+ img.save(buf, format="PNG")
+ return buf.getvalue()
+
+
+def create_pdf_report(figures, titles=None, report_title="Financial Report"):
+ if titles is None:
+ titles = [f"Chart {i + 1}" for i in range(len(figures))]
+
+ portrait_w, portrait_h = portrait(A4)
+ landscape_w, landscape_h = landscape(A4)
+
+ out = io.BytesIO()
+ writer = PdfWriter()
+
+ # Title page
+ p_buf = io.BytesIO()
+ cp = canvas.Canvas(p_buf, pagesize=portrait(A4))
+ cp.setFillColor(colors.HexColor("#2563eb"))
+ cp.rect(0, portrait_h - 2 * inch, portrait_w, 2 * inch, fill=1, stroke=0)
+ cp.setFillColor(colors.white)
+ cp.setFont("Helvetica-Bold", 28)
+ cp.drawCentredString(portrait_w / 2, portrait_h - 1.2 * inch, report_title)
+ cp.setFont("Helvetica", 14)
+ cp.drawCentredString(
+ portrait_w / 2,
+ portrait_h - 1.8 * inch,
+ f"Generated on {datetime.now().strftime('%B %d, %Y')}",
+ )
+ cp.setFillColor(colors.HexColor("#666666"))
+ cp.setFont("Helvetica", 10)
+ cp.drawCentredString(portrait_w / 2, 0.5 * inch, "Confidential — not for redistribution")
+ cp.save()
+ p_buf.seek(0)
+ writer.add_page(PdfReader(p_buf).pages[0])
+
+ # One landscape page per figure
+ for figure, chart_title in zip(figures, titles):
+ fig_img = figure_to_image_bytes(figure)
+ l_buf = io.BytesIO()
+ cl = canvas.Canvas(l_buf, pagesize=landscape(A4))
+ cl.setFillColor(colors.HexColor("#2563eb"))
+ cl.setFont("Helvetica-Bold", 20)
+ cl.drawString(1 * inch, landscape_h - 0.8 * inch, chart_title)
+ img_reader = ImageReader(io.BytesIO(fig_img))
+ chart_w, chart_h = 10 * inch, 6 * inch
+ x = (landscape_w - chart_w) / 2
+ y = (landscape_h - chart_h) / 2 - 0.5 * inch
+ cl.drawImage(img_reader, x, y, width=chart_w, height=chart_h)
+ cl.setFillColor(colors.HexColor("#666666"))
+ cl.setFont("Helvetica", 8)
+ cl.drawCentredString(landscape_w / 2, 0.5 * inch, "CONFIDENTIAL")
+ cl.save()
+ l_buf.seek(0)
+ writer.add_page(PdfReader(l_buf).pages[0])
+
+ writer.write(out)
+ out.seek(0)
+ return out.getvalue()
diff --git a/medical-imaging-demo/.gitignore b/medical-imaging-demo/.gitignore
new file mode 100644
index 0000000..b9c0379
--- /dev/null
+++ b/medical-imaging-demo/.gitignore
@@ -0,0 +1,7 @@
+
+# Dolt database files (added by bd init)
+.dolt/
+*.db
+
+# AgentOps session artifacts
+.agents/
diff --git a/medical-imaging-demo/Procfile b/medical-imaging-demo/Procfile
new file mode 100644
index 0000000..673048e
--- /dev/null
+++ b/medical-imaging-demo/Procfile
@@ -0,0 +1 @@
+web: uvicorn app:server --host 0.0.0.0 --port 8000
diff --git a/medical-imaging-demo/README.md b/medical-imaging-demo/README.md
new file mode 100644
index 0000000..ad12595
--- /dev/null
+++ b/medical-imaging-demo/README.md
@@ -0,0 +1,69 @@
+# VitalSight — Clinical Intelligence Platform
+
+A Plotly Dash demonstration of clinical data visualization, built to mirror the architecture of `dash-financial-report-v2`.
+
+> **IMPORTANT:** All patient data is **synthetic and de-identified**. X-ray images are algorithmically generated grayscale placeholders. This application is for demonstration purposes only and is not intended for clinical use.
+
+## Features
+
+- **Clinical Dashboard** — Census KPIs + live ICU vitals streaming via WebSocket (mirrors the financial app's live stock feed)
+- **Patient Vitals** — Multi-vital time-series with normal-range bands, moving averages, and period selectors
+- **Cohort Explorer** — Crossfilter linked-brushing across 3 biomarker scatter plots (port of the crossfilter demo)
+- **Imaging Workstation** — Interactive X-ray annotation (draw rectangles, lines, circles), window/level controls, AI-assist suggested findings, and radiology report PDF export
+
+## Setup
+
+```bash
+python -m venv venv
+source venv/bin/activate
+pip install -r requirements.txt
+
+# Generate synthetic data and X-ray images
+python scripts/generate_data.py
+python scripts/generate_xrays.py
+
+# Run the app
+python app.py
+# or for production
+uvicorn app:server --host 0.0.0.0 --port 8000
+```
+
+App runs at http://localhost:8050 (debug) or http://localhost:8000 (uvicorn).
+
+## Project Structure
+
+```
+medical-demo-app/
+├── app.py Main entry point
+├── pages/ One layout module per page
+│ ├── dashboard.py
+│ ├── vitals.py
+│ ├── cohort.py
+│ └── imaging.py
+├── callbacks/ One callback module per page
+│ ├── dashboard.py Includes live vitals WebSocket
+│ ├── vitals.py
+│ ├── cohort.py
+│ ├── imaging.py
+│ └── export_all.py PDF export
+├── components/ Reusable Plotly/Mantine components
+│ ├── charts.py
+│ ├── kpi_cards.py
+│ ├── tables.py
+│ └── imaging.py
+├── utils/
+│ ├── data_loader.py
+│ └── pdf_export.py
+├── data/ Generated CSVs (run generate_data.py)
+├── assets/
+│ ├── styles.css
+│ └── xrays/ Generated X-ray PNGs (run generate_xrays.py)
+└── scripts/
+ ├── generate_data.py
+ └── generate_xrays.py
+```
+
+## Attribution
+
+X-ray image generation is inspired by the NIH ChestX-ray14 dataset structure (CC0 Public Domain).
+NIH Clinical Center: https://nihcc.app.box.com/v/ChestXray-NIHCC
diff --git a/medical-imaging-demo/app.py b/medical-imaging-demo/app.py
new file mode 100644
index 0000000..e1ade1f
--- /dev/null
+++ b/medical-imaging-demo/app.py
@@ -0,0 +1,209 @@
+import dash
+from dash import html, dcc, Input, Output, callback, ctx
+import dash_mantine_components as dmc
+from dash_iconify import DashIconify
+
+from pages import cohort, imaging
+from callbacks import (
+ cohort as cohort_callbacks,
+ imaging as imaging_callbacks,
+ export_all as export_all_callbacks,
+)
+
+app = dash.Dash(
+ __name__,
+ backend="fastapi",
+ suppress_callback_exceptions=True,
+ external_stylesheets=dmc.styles.ALL,
+ title="Medical Imaging Demo",
+)
+server = app.server
+
+
+# ── Header ─────────────────────────────────────────────────────────────────────
+# (label, href, nav_id, leftSection)
+NAV_LINKS = [
+ ("Imaging Workstation", "/imaging", "nav-imaging",
+ DashIconify(icon="tabler:x-ray", width=15)),
+ ("Cohort Explorer", "/cohort", "nav-cohort", None),
+]
+
+_NAV_BTN_STYLES = {
+ "root": {
+ "paddingLeft": 14, "paddingRight": 18,
+ "fontWeight": 500, "height": 34,
+ "fontSize": "13px",
+ },
+}
+
+
+
+def create_header():
+ brand = dmc.Group([
+ html.Img(src="/assets/DE-logo.png", height=36,
+ style={"opacity": "0.92"}),
+ html.Div(style={
+ "width": "1px", "height": "20px",
+ "backgroundColor": "#d1d5db",
+ "flexShrink": 0,
+ }),
+ dmc.Title("Medical Imaging Demo", order=3,
+ style={"color": "#1e2433", "letterSpacing": "-0.5px",
+ "fontSize": "16px", "fontWeight": 600}),
+ ], gap=10, wrap="nowrap", align="center")
+
+ nav_center = dmc.Group([
+ dcc.Link(
+ dmc.Button(
+ label,
+ id=nav_id,
+ leftSection=left,
+ variant="subtle",
+ color="navy",
+ size="sm",
+ radius="md",
+ styles=_NAV_BTN_STYLES,
+ ),
+ href=href,
+ style={"textDecoration": "none"},
+ )
+ for label, href, nav_id, left in NAV_LINKS
+ ], gap=4, wrap="nowrap")
+
+ actions = dmc.Group([
+ html.Div(
+ dmc.Group([
+ DashIconify(icon="tabler:building-hospital", width=12,
+ color="#6b7280"),
+ dmc.Text("General Hospital", size="xs", fw=500,
+ style={"color": "#6b7280", "letterSpacing": "0.01em"}),
+ html.Div(style={
+ "width": "3px", "height": "3px",
+ "borderRadius": "50%",
+ "backgroundColor": "#c2c6cc",
+ "flexShrink": 0,
+ }),
+ dmc.Text("325 beds", size="xs",
+ style={"color": "#6b7280"}),
+ html.Div(style={
+ "width": "3px", "height": "3px",
+ "borderRadius": "50%",
+ "backgroundColor": "#c2c6cc",
+ "flexShrink": 0,
+ }),
+ dmc.Text("ICU 25", size="xs", fw=600,
+ style={"color": "#1e3a8a"}),
+ ], gap=6, wrap="nowrap"),
+ style={
+ "display": "flex", "alignItems": "center",
+ "padding": "4px 12px",
+ "borderRadius": "20px",
+ "backgroundColor": "#eef0f2",
+ "border": "1px solid #e1e3e7",
+ },
+ ),
+ dmc.Tooltip(
+ label="Hide toolbar", withArrow=True,
+ children=dmc.ActionIcon(
+ DashIconify(icon="tabler:layout-navbar-collapse", width=18),
+ id="header-collapse-btn", variant="subtle", color="navy",
+ size="lg",
+ ),
+ ),
+ ], gap="sm", wrap="nowrap", justify="flex-end")
+
+ # Three-column grid: brand | nav (centered) | actions
+ return html.Div(
+ [brand, nav_center, actions],
+ style={
+ "display": "grid",
+ "gridTemplateColumns": "1fr auto 1fr",
+ "alignItems": "center",
+ "height": "100%",
+ "padding": "0 24px",
+ "backgroundColor": "#fcfcfb",
+ "borderBottom": "1px solid #e1e3e7",
+ },
+ )
+
+
+# Floating button (overlays the page) to restore the header once collapsed.
+_EXPAND_STYLE = {"position": "fixed", "top": "10px", "right": "14px",
+ "zIndex": 3000, "display": "none"}
+
+
+# ── App layout ─────────────────────────────────────────────────────────────────
+app.layout = dmc.MantineProvider(
+ id="mantine-provider",
+ forceColorScheme="light",
+ theme={
+ "primaryColor": "cyan",
+ # Register the imaging "navy" ramp app-wide so the shared header's
+ # navy-colored controls resolve (cohort accents stay on cyan).
+ "colors": {"navy": imaging.NAVY_RAMP},
+ "fontFamily": "Inter, -apple-system, BlinkMacSystemFont, sans-serif",
+ },
+ children=[
+ dcc.Location(id="url", refresh=False),
+ dcc.Download(id="download-pdf-all"),
+ html.Div(id="pdf-status-all", style={"display": "none"}),
+ dmc.AppShell(
+ [
+ dmc.AppShellHeader(create_header()),
+ dmc.AppShellMain(
+ html.Div(id="page-content", style={"width": "100%"}),
+ ),
+ ],
+ id="app-shell",
+ header={"height": 64},
+ padding=0,
+ ),
+ dmc.Tooltip(
+ label="Show toolbar", withArrow=True,
+ children=dmc.ActionIcon(
+ DashIconify(icon="tabler:layout-navbar-expand", width=18),
+ id="header-expand-btn", variant="filled", color="navy",
+ size="lg", style=_EXPAND_STYLE,
+ ),
+ ),
+ ]
+)
+
+
+# ── Routing ────────────────────────────────────────────────────────────────────
+@callback(
+ Output("page-content", "children"),
+ Input("url", "pathname"),
+)
+def display_page(pathname):
+ # Imaging Workstation is the landing page ("/" and "/imaging").
+ if pathname == "/cohort":
+ return cohort.layout
+ return imaging.layout
+
+
+@callback(
+ [Output(nav_id, "variant") for _, _, nav_id, _ in NAV_LINKS],
+ Input("url", "pathname"),
+)
+def update_nav_active(pathname):
+ hrefs = [href for _, href, _, _ in NAV_LINKS]
+ active = pathname if pathname in hrefs else "/imaging"
+ return ["filled" if active == h else "subtle" for h in hrefs]
+
+
+@callback(
+ Output("app-shell", "header"),
+ Output("header-expand-btn", "style"),
+ Input("header-collapse-btn", "n_clicks"),
+ Input("header-expand-btn", "n_clicks"),
+ prevent_initial_call=True,
+)
+def toggle_header(_collapse, _expand):
+ collapsed = ctx.triggered_id == "header-collapse-btn"
+ return ({"height": 64, "collapsed": collapsed},
+ {**_EXPAND_STYLE, "display": "flex" if collapsed else "none"})
+
+
+if __name__ == "__main__":
+ app.run(debug=True, port=8051)
diff --git a/medical-imaging-demo/assets/DE-logo.png b/medical-imaging-demo/assets/DE-logo.png
new file mode 100644
index 0000000..a037590
Binary files /dev/null and b/medical-imaging-demo/assets/DE-logo.png differ
diff --git a/medical-imaging-demo/assets/logo.svg b/medical-imaging-demo/assets/logo.svg
new file mode 100644
index 0000000..1992a54
--- /dev/null
+++ b/medical-imaging-demo/assets/logo.svg
@@ -0,0 +1,9 @@
+
diff --git a/medical-imaging-demo/assets/styles.css b/medical-imaging-demo/assets/styles.css
new file mode 100644
index 0000000..84b5927
--- /dev/null
+++ b/medical-imaging-demo/assets/styles.css
@@ -0,0 +1,86 @@
+/* VitalSight — Clinical Intelligence Platform */
+
+body {
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+}
+
+/* Light app shell header (cool off-white) */
+.mantine-AppShell-header {
+ background-color: #fcfcfb !important;
+ border-bottom: 1px solid #e1e3e7 !important;
+}
+
+/* Nav button states on light header */
+.mantine-AppShell-header .mantine-Button-root[data-variant="subtle"] {
+ color: #6b7280;
+}
+.mantine-AppShell-header .mantine-Button-root[data-variant="subtle"]:hover {
+ background-color: #eef0f2;
+ color: #1e2433;
+}
+.mantine-AppShell-header .mantine-Button-root[data-variant="filled"] {
+ color: #1e3a8a;
+ background-color: rgba(30, 58, 138, 0.1);
+}
+
+/* Scrollbars */
+::-webkit-scrollbar { width: 7px; height: 7px; }
+::-webkit-scrollbar-track { background: rgba(0,0,0,0.04); border-radius: 4px; }
+::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.18); border-radius: 4px; }
+::-webkit-scrollbar-thumb:hover { background: rgba(0,0,0,0.28); }
+
+/* Modebar */
+.js-plotly-plot .plotly .modebar { top: 4px !important; right: 4px !important; }
+.js-plotly-plot .plotly .modebar-btn { font-size: 13px !important; }
+
+/* Table */
+.mantine-Table-table { font-size: 0.85rem; }
+.mantine-Table-th { background-color: rgba(0,0,0,0.02); }
+
+/* NavLink active */
+.mantine-NavLink-root[data-active="true"] { font-weight: 600; }
+
+/* Paper hover */
+.mantine-Paper-root { transition: box-shadow 0.18s ease; }
+.mantine-Paper-root:hover { box-shadow: 0 2px 10px rgba(0,0,0,0.07); }
+
+/* Pulse animation for live indicator */
+@keyframes pulse {
+ 0%, 100% { opacity: 1; transform: scale(1); }
+ 50% { opacity: 0.35; transform: scale(0.85); }
+}
+
+/* Fade-in for KPI cards */
+@keyframes fadeInUp {
+ from { opacity: 0; transform: translateY(8px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* Imaging study cards */
+.study-card:hover { border-color: #1e3a8a !important; }
+
+/* Print styles */
+@media print {
+ .mantine-AppShell-header,
+ .mantine-AppShell-navbar,
+ .mantine-Button-root,
+ .mantine-Select-root,
+ .mantine-MultiSelect-root { display: none !important; }
+ .mantine-Paper-root {
+ break-inside: avoid;
+ box-shadow: none !important;
+ border: 1px solid #e2e8f0 !important;
+ }
+}
+
+/* Responsive */
+@media (max-width: 768px) {
+ .mantine-AppShell-navbar { display: none; }
+ .mantine-Container-root { padding: 0.5rem; }
+}
+
+/* Progress bar background */
+.mantine-Progress-root { background-color: rgba(0,0,0,0.05); }
+
+/* Badge */
+.mantine-Badge-root { text-transform: none; }
diff --git a/medical-imaging-demo/assets/xrays/xray_01.png b/medical-imaging-demo/assets/xrays/xray_01.png
new file mode 100644
index 0000000..219e225
Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_01.png differ
diff --git a/medical-imaging-demo/assets/xrays/xray_02.png b/medical-imaging-demo/assets/xrays/xray_02.png
new file mode 100644
index 0000000..3e27cb5
Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_02.png differ
diff --git a/medical-imaging-demo/assets/xrays/xray_03.png b/medical-imaging-demo/assets/xrays/xray_03.png
new file mode 100644
index 0000000..6b428d9
Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_03.png differ
diff --git a/medical-imaging-demo/assets/xrays/xray_04.png b/medical-imaging-demo/assets/xrays/xray_04.png
new file mode 100644
index 0000000..56406b6
Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_04.png differ
diff --git a/medical-imaging-demo/assets/xrays/xray_05.png b/medical-imaging-demo/assets/xrays/xray_05.png
new file mode 100644
index 0000000..a4a7f9d
Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_05.png differ
diff --git a/medical-imaging-demo/assets/xrays/xray_06.png b/medical-imaging-demo/assets/xrays/xray_06.png
new file mode 100644
index 0000000..b10d0fb
Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_06.png differ
diff --git a/medical-imaging-demo/assets/xrays/xray_07.png b/medical-imaging-demo/assets/xrays/xray_07.png
new file mode 100644
index 0000000..5e173eb
Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_07.png differ
diff --git a/medical-imaging-demo/assets/xrays/xray_08.png b/medical-imaging-demo/assets/xrays/xray_08.png
new file mode 100644
index 0000000..5988131
Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_08.png differ
diff --git a/medical-imaging-demo/callbacks/__init__.py b/medical-imaging-demo/callbacks/__init__.py
new file mode 100644
index 0000000..ab79d22
--- /dev/null
+++ b/medical-imaging-demo/callbacks/__init__.py
@@ -0,0 +1,3 @@
+from . import cohort
+from . import imaging
+from . import export_all
diff --git a/medical-imaging-demo/callbacks/cohort.py b/medical-imaging-demo/callbacks/cohort.py
new file mode 100644
index 0000000..6aeea74
--- /dev/null
+++ b/medical-imaging-demo/callbacks/cohort.py
@@ -0,0 +1,95 @@
+import numpy as np
+from dash import callback, Input, Output, html, no_update
+import dash_mantine_components as dmc
+
+from components.charts import create_crossfilter_scatter, create_vitals_chart
+from components.tables import create_patient_table
+from utils.data_loader import get_cohort, get_vitals
+
+df = get_cohort()
+N = len(df)
+
+
+@callback(
+ Output("cf-scatter1", "figure"),
+ Output("cf-scatter2", "figure"),
+ Output("cf-scatter3", "figure"),
+ Output("cf-summary-grid", "children"),
+ Output("cf-patient-table", "children"),
+ Input("cf-scatter1", "selectedData"),
+ Input("cf-scatter2", "selectedData"),
+ Input("cf-scatter3", "selectedData"),
+)
+def update_crossfilter(sel1, sel2, sel3):
+ selected = df.index.tolist()
+ for sel in [sel1, sel2, sel3]:
+ if sel and sel.get("points"):
+ pts = np.array([
+ p["customdata"] if "customdata" in p else p["pointIndex"]
+ for p in sel["points"]
+ ])
+ selected = list(np.intersect1d(selected, pts))
+
+ fig1 = create_crossfilter_scatter(df, "age", "bmi", selected)
+ fig2 = create_crossfilter_scatter(df, "systolic_bp","ldl", selected)
+ fig3 = create_crossfilter_scatter(df, "hba1c", "egfr", selected)
+
+ sub = df.iloc[selected] if selected else df.iloc[[]]
+ n = len(sub)
+
+ # Summary cards
+ def _metric(label, val):
+ return dmc.Paper(
+ dmc.Stack([
+ dmc.Text(label, size="xs", c="dimmed"),
+ dmc.Text(str(val), size="lg", fw=700),
+ ], gap=2),
+ p="sm", radius="sm", withBorder=True,
+ )
+
+ cards = [
+ _metric("Selected", n),
+ _metric("Avg Age", f"{sub['age'].mean():.0f}" if n else "—"),
+ _metric("Avg BMI", f"{sub['bmi'].mean():.1f}" if n else "—"),
+ _metric("Avg SysBP", f"{sub['systolic_bp'].mean():.0f}" if n else "—"),
+ _metric("Avg HbA1c", f"{sub['hba1c'].mean():.1f}" if n else "—"),
+ _metric("High Risk", f"{(sub['risk_level']=='High').sum()}" if n else "—"),
+ ]
+
+ # Patient table (capped at 50 for display)
+ if n == 0:
+ table = dmc.Text("No patients match current selection.", size="sm", c="dimmed", ta="center")
+ else:
+ table = create_patient_table(
+ sub.head(50),
+ cols=["patient_id","age","gender","bmi","systolic_bp",
+ "hba1c","egfr","diagnosis","risk_level"],
+ )
+
+ return fig1, fig2, fig3, cards, table
+
+
+@callback(
+ Output("crossfilter-view", "style"),
+ Output("overview-view", "style"),
+ Input("cohort-view", "value"),
+)
+def switch_cohort_view(view):
+ show, hide = {}, {"display": "none"}
+ return [show if v == view else hide for v in ("crossfilter", "overview")]
+
+
+@callback(
+ Output("cohort-vitals-trend-chart", "figure"),
+ Input("cohort-vitals-patient", "value"),
+ Input("cohort-vitals-period", "value"),
+ Input("cohort-vitals-select", "value"),
+ Input("cohort-vitals-ref-toggle", "checked"),
+ Input("cohort-vitals-ma", "value"),
+)
+def update_cohort_vitals(patient_id, period, vitals, show_ref, ma):
+ vitals = vitals or ["HR", "SpO2"]
+ df = get_vitals(patient_id, period)
+ if df.empty:
+ return {}
+ return create_vitals_chart(df, vitals, show_reference=show_ref, ma_days=ma or "none")
diff --git a/medical-imaging-demo/callbacks/dashboard.py b/medical-imaging-demo/callbacks/dashboard.py
new file mode 100644
index 0000000..2386a8a
--- /dev/null
+++ b/medical-imaging-demo/callbacks/dashboard.py
@@ -0,0 +1,106 @@
+import asyncio
+import random
+
+from dash import callback, ctx, Input, Output, set_props
+
+from components.charts import create_admissions_chart, create_ecg_sparkline
+from utils.data_loader import get_admissions_data
+
+# ── ICU patient state ─────────────────────────────────────────────────────────
+ICU_BASE = {
+ "PT1001": {"hr": 72.0, "spo2": 98.5, "sbp": 118.0, "dbp": 76.0, "rr": 14.0},
+ "PT1002": {"hr": 92.0, "spo2": 96.8, "sbp": 148.0, "dbp": 90.0, "rr": 18.0},
+ "PT1003": {"hr": 88.0, "spo2": 93.5, "sbp": 108.0, "dbp": 68.0, "rr": 21.0},
+ "PT1004": {"hr": 78.0, "spo2": 99.1, "sbp": 168.0, "dbp": 97.0, "rr": 16.0},
+ "PT1005": {"hr": 66.0, "spo2": 98.9, "sbp": 125.0, "dbp": 80.0, "rr": 13.0},
+}
+PIDS = list(ICU_BASE.keys())
+
+
+def _hr_color(hr):
+ return "#22c55e" if 60 <= hr <= 100 else "#f59e0b" if 50 <= hr <= 120 else "#ef4444"
+
+def _spo2_color(s):
+ return "#22c55e" if s >= 95 else "#f59e0b" if s >= 90 else "#ef4444"
+
+def _bp_color(sbp):
+ return "#22c55e" if sbp <= 140 else "#f59e0b" if sbp <= 160 else "#ef4444"
+
+
+# ── Toggle streaming ──────────────────────────────────────────────────────────
+@callback(
+ Output("live-streaming", "data"),
+ Input("icu-live-toggle", "checked"),
+)
+def toggle_streaming(checked):
+ return checked
+
+
+# ── Admissions chart update ───────────────────────────────────────────────────
+@callback(
+ Output("admissions-chart", "figure"),
+ Input("dashboard-dept", "value"),
+ Input("dashboard-period", "value"),
+)
+def update_admissions(dept, period):
+ df = get_admissions_data(department=dept, period=period)
+ return create_admissions_chart(df, department=dept)
+
+
+# ── Persistent WebSocket: stream ICU vitals ───────────────────────────────────
+@callback(persistent=True)
+async def stream_patient_vitals():
+ ws = ctx.websocket
+
+ vitals = {pid: dict(v) for pid, v in ICU_BASE.items()}
+ history = {pid: [vitals[pid]["hr"]] for pid in PIDS}
+
+ while not ws.is_shutdown:
+ streaming = await ws.get_prop("live-streaming", "data")
+
+ if streaming:
+ for pid in PIDS:
+ v = vitals[pid]
+ base = ICU_BASE[pid]
+
+ # Mean-reverting Ornstein–Uhlenbeck drift
+ v["hr"] = max(40, min(200, round(v["hr"] + 0.15*(base["hr"] -v["hr"]) + random.gauss(0, 1.2), 1)))
+ v["spo2"]= max(85, min(100, round(v["spo2"]+ 0.20*(base["spo2"]-v["spo2"])+ random.gauss(0, 0.25), 1)))
+ v["sbp"] = max(70, min(220, round(v["sbp"] + 0.10*(base["sbp"]-v["sbp"]) + random.gauss(0, 2.0), 1)))
+ v["dbp"] = max(40, min(130, round(v["dbp"] + 0.10*(base["dbp"]-v["dbp"]) + random.gauss(0, 1.5), 1)))
+ v["rr"] = max(8, min(40, round(v["rr"] + 0.15*(base["rr"] -v["rr"]) + random.gauss(0, 0.4), 1)))
+
+ history[pid].append(v["hr"])
+ if len(history[pid]) > 40:
+ history[pid] = history[pid][-40:]
+
+ set_props(f"live-hr-{pid}", {
+ "children": f"{v['hr']:.0f}",
+ "style": {"fontFamily": "monospace", "fontWeight": 700,
+ "color": _hr_color(v["hr"])},
+ })
+ set_props(f"live-spo2-{pid}", {
+ "children": f"{v['spo2']:.1f}%",
+ "style": {"fontFamily": "monospace", "fontWeight": 700,
+ "color": _spo2_color(v["spo2"])},
+ })
+ set_props(f"live-bp-{pid}", {
+ "children": f"{int(v['sbp'])}/{int(v['dbp'])}",
+ "style": {"fontFamily": "monospace", "fontWeight": 700,
+ "color": _bp_color(v["sbp"])},
+ })
+ set_props(f"live-rr-{pid}", {
+ "children": f"{v['rr']:.0f}",
+ "style": {"fontFamily": "monospace", "fontWeight": 700,
+ "color": "#94a3b8"},
+ })
+
+ # ECG sparkline for selected patient
+ selected = await ws.get_prop("ecg-patient-select", "value")
+ if selected and selected in history and len(history[selected]) > 1:
+ fig = create_ecg_sparkline(history[selected], selected)
+ set_props("ecg-sparkline-chart", {"figure": fig})
+
+ await asyncio.sleep(1)
+ else:
+ await asyncio.sleep(0.5)
diff --git a/medical-imaging-demo/callbacks/export_all.py b/medical-imaging-demo/callbacks/export_all.py
new file mode 100644
index 0000000..fb0b64a
--- /dev/null
+++ b/medical-imaging-demo/callbacks/export_all.py
@@ -0,0 +1,33 @@
+from datetime import datetime
+
+from dash import callback, Input, Output, State, dcc
+
+from utils.pdf_export import create_radiology_report
+from utils.data_loader import get_study, get_patient
+from components.imaging import annotation_to_finding_dict
+
+
+@callback(
+ Output("download-radiology-pdf", "data"),
+ Input("export-radiology-btn", "n_clicks"),
+ State("xray-graph", "figure"),
+ State("xray-annotations", "data"),
+ State("current-study-id", "data"),
+ prevent_initial_call=True,
+)
+def export_radiology_report(n_clicks, xray_figure, annotations, study_id):
+ if not n_clicks:
+ return None
+
+ study = get_study(study_id) if study_id else {}
+ patient = get_patient(study.get("patient_id", "")) if study else {}
+ findings = [annotation_to_finding_dict(a) for a in (annotations or [])]
+
+ pdf_bytes = create_radiology_report(
+ xray_figure = xray_figure,
+ findings = findings,
+ patient_info = patient,
+ study_info = study,
+ )
+ fname = f"radiology_report_{study_id}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf"
+ return dcc.send_bytes(pdf_bytes, fname)
diff --git a/medical-imaging-demo/callbacks/imaging.py b/medical-imaging-demo/callbacks/imaging.py
new file mode 100644
index 0000000..dfb0410
--- /dev/null
+++ b/medical-imaging-demo/callbacks/imaging.py
@@ -0,0 +1,192 @@
+from dash import callback, ctx, Input, Output, State, ALL, no_update, Patch
+
+from components.imaging import (load_xray_b64, create_xray_figure,
+ get_ai_shapes, XRAY_DIR, _make_shape,
+ newshape_for, severity_color)
+from components.tables import create_findings_table
+from utils.data_loader import get_studies, get_study
+from pages.imaging import (_patient_banner_content, _image_overlays,
+ _status_bar, _pending_tag,
+ BG_INSET, BORDER, ACCENT,
+ CARD_ACTIVE_BG, CARD_ACTIVE_SHADOW)
+
+df_studies = get_studies()
+STUDY_IDS = df_studies["study_id"].tolist()
+
+
+# ── Select study via thumbnail buttons ────────────────────────────────────────
+@callback(
+ Output("current-study-id", "data"),
+ Input({"type": "study-thumb", "index": ALL}, "n_clicks"),
+ prevent_initial_call=True,
+)
+def select_study(n_clicks_list):
+ if not ctx.triggered_id or not any(n_clicks_list):
+ return no_update
+ # Don't clear annotations — update_xray loads this study's saved set.
+ return ctx.triggered_id["index"]
+
+
+# ── Highlight the active study card ───────────────────────────────────────────
+_INACTIVE_STYLE = {
+ "width": "100%", "padding": "10px 12px",
+ "backgroundColor": BG_INSET,
+ "border": f"1px solid {BORDER}",
+ "borderRadius": "8px", "textAlign": "left",
+ "transition": "border-color 0.15s ease, background-color 0.15s ease",
+}
+_ACTIVE_STYLE = {
+ **_INACTIVE_STYLE,
+ "backgroundColor": CARD_ACTIVE_BG,
+ "border": f"1px solid {ACCENT}",
+ "boxShadow": CARD_ACTIVE_SHADOW,
+}
+
+@callback(
+ Output({"type": "study-thumb", "index": ALL}, "style"),
+ Input("current-study-id", "data"),
+ State({"type": "study-thumb", "index": ALL}, "id"),
+)
+def highlight_active_study(active_id, ids):
+ return [_ACTIVE_STYLE if i["index"] == active_id else _INACTIVE_STYLE
+ for i in ids]
+
+
+# ── Main imaging callback ─────────────────────────────────────────────────────
+@callback(
+ Output("xray-graph", "figure"),
+ Output("xray-annotations", "data"),
+ Output("annotations-store", "data"),
+ Output("findings-table-container","children"),
+ Output("findings-count", "children"),
+ Input("xray-graph", "relayoutData"),
+ Input("current-study-id", "data"),
+ Input("window-slider", "value"),
+ Input("level-slider", "value"),
+ Input("invert-toggle", "checked"),
+ Input("reset-annotations-btn", "n_clicks"),
+ Input("draw-mode-select", "value"),
+ State("xray-annotations", "data"),
+ State("annotations-store", "data"),
+ State("finding-label-select", "value"),
+ State("severity-select", "value"),
+ State("annotation-note", "value"),
+ prevent_initial_call=True,
+)
+def update_xray(relayout, study_id, window, level, invert,
+ reset_clicks, draw_mode,
+ stored, by_study, label, severity, note):
+ triggered = ctx.triggered_id
+ stored = stored or []
+ by_study = dict(by_study or {})
+ study = get_study(study_id) if study_id else {}
+ key = study_id or ""
+
+ drawing_event = False
+
+ if triggered == "reset-annotations-btn":
+ stored = []
+
+ elif triggered == "current-study-id":
+ # Switched study — load this study's saved annotations (persisted),
+ # do NOT clear. New studies start empty.
+ stored = list(by_study.get(key, []))
+
+ elif triggered == "xray-graph" and relayout:
+ if "shapes" in relayout:
+ drawing_event = True
+ raw_shapes = relayout["shapes"]
+ n_raw = len(raw_shapes)
+ n_stored = len(stored)
+ if n_raw > n_stored:
+ new_raw = raw_shapes[-1]
+ sev = severity or "Medium"
+ color = severity_color(sev)
+ width = 3 if sev == "High" else 2
+ stored = stored + [{
+ **new_raw,
+ "line": {"color": color, "width": width},
+ "_label": label or "Unspecified",
+ "_severity": sev,
+ "_note": note or "",
+ }]
+ elif n_raw < n_stored:
+ stored = stored[:n_raw]
+ elif n_raw == n_stored and n_raw > 0:
+ updated = []
+ for raw, old in zip(raw_shapes, stored):
+ updated.append({**raw,
+ "_label": old.get("_label", "Unspecified"),
+ "_severity": old.get("_severity", "Medium"),
+ "_note": old.get("_note", "")})
+ stored = updated
+ else:
+ # Pan/zoom relayout — nothing to update
+ return (no_update,) * 5
+
+ # Persist this study's annotations into the keyed store
+ by_study[key] = stored
+ findings_table = create_findings_table(stored)
+ count = str(len(stored))
+
+ if drawing_event:
+ # Shape already rendered on canvas; skip figure rebuild to avoid flicker
+ return no_update, stored, by_study, findings_table, count
+
+ img_path = XRAY_DIR / study.get("image_file", "xray_01.png")
+ img_b64 = load_xray_b64(img_path,
+ window=float(window or 220),
+ level =float(level or 128),
+ invert=bool(invert))
+ fig = create_xray_figure(img_b64, shapes=stored)
+ fig.update_layout(dragmode=draw_mode or "drawrect",
+ newshape=newshape_for(severity))
+
+ return fig, stored, by_study, findings_table, count
+
+
+# ── Live annotation styling: severity drives the pen colour ───────────────────
+@callback(
+ Output("xray-graph", "figure", allow_duplicate=True),
+ Output("pending-annotation", "children"),
+ Input("severity-select", "value"),
+ Input("finding-label-select","value"),
+ Input("annotation-note", "value"),
+ prevent_initial_call=True,
+)
+def update_pen_style(severity, finding, note):
+ """Update the next-shape style + pending badge as the user changes controls.
+
+ Uses a Patch so the X-ray image is not reloaded on every keystroke.
+ """
+ patch = Patch()
+ patch["layout"]["newshape"] = newshape_for(severity)
+ return patch, _pending_tag(finding, severity, note)
+
+
+# ── Patient banner follows the selected study ─────────────────────────────────
+@callback(
+ Output("patient-banner", "children"),
+ Input("current-study-id", "data"),
+)
+def update_patient_banner(study_id):
+ if not study_id:
+ return no_update
+ return _patient_banner_content(get_study(study_id))
+
+
+# ── Image chrome: DICOM corner overlays + status bar ──────────────────────────
+@callback(
+ Output("image-overlays", "children"),
+ Output("image-status-bar", "children"),
+ Input("current-study-id", "data"),
+ Input("window-slider", "value"),
+ Input("level-slider", "value"),
+ Input("invert-toggle", "checked"),
+ Input("draw-mode-select", "value"),
+)
+def update_image_chrome(study_id, window, level, invert, draw_mode):
+ study = get_study(study_id) if study_id else {}
+ overlays = _image_overlays(study, window, level, invert)
+ status = _status_bar(draw_mode, window, level, invert)
+ return overlays, status
diff --git a/medical-imaging-demo/callbacks/vitals.py b/medical-imaging-demo/callbacks/vitals.py
new file mode 100644
index 0000000..992d0a2
--- /dev/null
+++ b/medical-imaging-demo/callbacks/vitals.py
@@ -0,0 +1,74 @@
+from dash import callback, Input, Output
+import dash_mantine_components as dmc
+
+from components.charts import (create_vitals_chart, create_vitals_variability,
+ VITAL_RANGES)
+from utils.data_loader import get_vitals
+
+UNITS = {"HR": "bpm", "SpO2": "%", "Temp": "°C",
+ "SysBP": "mmHg", "DiaBP": "mmHg", "RR": "/min"}
+
+
+@callback(
+ Output("vitals-trend-chart", "figure"),
+ Output("vitals-var-chart", "figure"),
+ Output("stat-current-hr", "children"),
+ Output("stat-high-hr", "children"),
+ Output("stat-low-hr", "children"),
+ Output("stat-current-spo2", "children"),
+ Output("stat-abnormal", "children"),
+ Output("vitals-summary-grid","children"),
+ Input("vitals-patient-select","value"),
+ Input("vitals-period", "value"),
+ Input("vitals-select", "value"),
+ Input("vitals-ref-toggle", "checked"),
+ Input("vitals-ma-select", "value"),
+)
+def update_vitals(patient_id, period, vitals, show_ref, ma):
+ vitals = vitals or ["HR", "SpO2"]
+ df = get_vitals(patient_id, period)
+
+ if df.empty:
+ empty = dmc.Text("No data", c="dimmed")
+ return empty, empty, "—", "—", "—", "—", "—", []
+
+ trend_fig = create_vitals_chart(df, vitals, show_reference=show_ref, ma_days=ma or "none")
+ var_fig = create_vitals_variability(df, vitals)
+
+ # Stat cards
+ hr_cur = f"{df['HR'].iloc[-1]:.0f} bpm" if "HR" in df.columns else "—"
+ hr_hi = f"{df['HR'].max():.0f}" if "HR" in df.columns else "—"
+ hr_lo = f"{df['HR'].min():.0f}" if "HR" in df.columns else "—"
+ spo_cur = f"{df['SpO2'].iloc[-1]:.1f}%" if "SpO2" in df.columns else "—"
+
+ # Count readings outside reference range
+ abnormal = 0
+ for v in vitals:
+ if v in df.columns and v in VITAL_RANGES:
+ lo, hi = VITAL_RANGES[v]
+ abnormal += int(((df[v] < lo) | (df[v] > hi)).sum())
+ abn_str = str(abnormal)
+
+ # Summary grid: one mini-card per vital
+ cards = []
+ for v in vitals:
+ if v not in df.columns:
+ continue
+ col = df[v]
+ lo_r, hi_r = VITAL_RANGES.get(v, (None, None))
+ current_val = col.iloc[-1]
+ in_range = (lo_r is None or lo_r <= current_val <= hi_r)
+ badge_color = "teal" if in_range else "red"
+ cards.append(dmc.Paper(
+ dmc.Stack([
+ dmc.Group([
+ dmc.Text(v, size="xs", fw=600),
+ dmc.Badge("OK" if in_range else "!", color=badge_color, size="xs"),
+ ], justify="space-between"),
+ dmc.Text(f"{current_val:.1f} {UNITS.get(v,'')}", size="sm", fw=700),
+ dmc.Text(f"↓{col.min():.1f} ↑{col.max():.1f}", size="xs", c="dimmed"),
+ ], gap=2),
+ p="xs", radius="sm", withBorder=True,
+ ))
+
+ return trend_fig, var_fig, hr_cur, hr_hi, hr_lo, spo_cur, abn_str, cards
diff --git a/medical-imaging-demo/components/__init__.py b/medical-imaging-demo/components/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/medical-imaging-demo/components/charts.py b/medical-imaging-demo/components/charts.py
new file mode 100644
index 0000000..eab4fff
--- /dev/null
+++ b/medical-imaging-demo/components/charts.py
@@ -0,0 +1,287 @@
+import plotly.graph_objects as go
+import plotly.express as px
+import pandas as pd
+import numpy as np
+
+COLORS = {
+ "primary": "#0d9488", # teal
+ "secondary": "#2563eb", # blue
+ "danger": "#ef4444",
+ "warning": "#f59e0b",
+ "success": "#22c55e",
+ "gray": "#94a3b8",
+ "purple": "#8b5cf6",
+}
+
+NAVY = "#1e3a8a" # deep navy accent (matches app theme highlight)
+
+VITAL_COLORS = {
+ "HR": "#ef4444",
+ "SpO2": "#2563eb",
+ "Temp": "#f59e0b",
+ "SysBP": "#8b5cf6",
+ "DiaBP": "#a78bfa",
+ "RR": "#22c55e",
+}
+
+VITAL_RANGES = {
+ "HR": (60, 100),
+ "SpO2": (95, 100),
+ "Temp": (36.1, 37.8),
+ "SysBP": (90, 130),
+ "DiaBP": (60, 90),
+ "RR": (12, 20),
+}
+
+BASE_LAYOUT = {
+ "paper_bgcolor": "rgba(0,0,0,0)",
+ "plot_bgcolor": "rgba(0,0,0,0)",
+ "font": {"family": "Inter, sans-serif"},
+ "margin": {"l": 48, "r": 24, "t": 48, "b": 40},
+ "hovermode": "x unified",
+ "hoverlabel": {
+ "bgcolor": "white",
+ "bordercolor": "#e2e8f0",
+ "font": {"family": "Inter, sans-serif", "size": 12},
+ },
+}
+
+
+# ── Admissions area chart ─────────────────────────────────────────────────────
+def create_admissions_chart(df: pd.DataFrame, department: str = "All") -> go.Figure:
+ df = df.copy()
+ df["date"] = pd.to_datetime(df["date"])
+
+ if department == "All":
+ agg = df.groupby("date")["admissions"].sum().reset_index()
+ fig = go.Figure(go.Scatter(
+ x=agg["date"], y=agg["admissions"],
+ fill="tozeroy",
+ line={"color": COLORS["primary"], "width": 2},
+ fillcolor="rgba(13,148,136,0.15)",
+ name="Total Admissions",
+ hovertemplate="%{y} admissions",
+ ))
+ else:
+ sub = df[df["department"] == department]
+ fig = go.Figure(go.Scatter(
+ x=sub["date"], y=sub["admissions"],
+ fill="tozeroy",
+ line={"color": COLORS["secondary"], "width": 2},
+ fillcolor="rgba(37,99,235,0.12)",
+ name=department,
+ hovertemplate="%{y} admissions",
+ ))
+
+ fig.update_layout(
+ **BASE_LAYOUT,
+ title={"text": "Daily Admissions", "x": 0, "font": {"size": 15, "weight": 600}},
+ xaxis={"showgrid": False},
+ yaxis={"showgrid": True, "gridcolor": "rgba(0,0,0,0.05)", "title": "Patients"},
+ showlegend=False,
+ )
+ return fig
+
+
+# ── Vitals time-series with reference bands ───────────────────────────────────
+def create_vitals_chart(df: pd.DataFrame, vitals: list,
+ show_reference: bool = True,
+ ma_days: str = "none") -> go.Figure:
+ fig = go.Figure()
+ df = df.copy()
+ df["timestamp"] = pd.to_datetime(df["timestamp"])
+
+ ma_window = {"20": 20, "50": 50, "none": None}.get(ma_days)
+
+ for v in vitals:
+ if v not in df.columns:
+ continue
+ color = VITAL_COLORS.get(v, COLORS["primary"])
+ series = df[v]
+ if ma_window:
+ series = series.rolling(ma_window, min_periods=1).mean()
+
+ fig.add_trace(go.Scatter(
+ x=df["timestamp"], y=series,
+ name=v, line={"color": color, "width": 1.8},
+ hovertemplate=f"{v}: %{{y}}",
+ ))
+
+ if show_reference and v in VITAL_RANGES:
+ lo, hi = VITAL_RANGES[v]
+ fig.add_hrect(y0=lo, y1=hi, fillcolor=color,
+ opacity=0.06, layer="below", line_width=0)
+
+ fig.update_layout(
+ **{**BASE_LAYOUT, "margin": {"l": 48, "r": 24, "t": 16, "b": 40}},
+ legend={"orientation": "h", "y": -0.18},
+ xaxis={
+ "showgrid": True, "gridcolor": "rgba(0,0,0,0.04)",
+ "rangeslider": {"visible": False},
+ },
+ yaxis={"showgrid": True, "gridcolor": "rgba(0,0,0,0.04)"},
+ )
+ return fig
+
+
+# ── Vitals variability (box plot per vital) ───────────────────────────────────
+def create_vitals_variability(df: pd.DataFrame, vitals: list) -> go.Figure:
+ fig = go.Figure()
+ for v in vitals:
+ if v not in df.columns:
+ continue
+ fig.add_trace(go.Box(
+ y=df[v], name=v,
+ marker_color=VITAL_COLORS.get(v, COLORS["primary"]),
+ boxmean="sd",
+ ))
+ fig.update_layout(
+ **BASE_LAYOUT,
+ title={"text": "Vital Sign Distribution", "x": 0,
+ "font": {"size": 15, "weight": 600}},
+ yaxis={"showgrid": True, "gridcolor": "rgba(0,0,0,0.04)"},
+ showlegend=False,
+ )
+ return fig
+
+
+# ── ECG-style HR sparkline ────────────────────────────────────────────────────
+def create_ecg_sparkline(hr_history: list, patient_id: str = "") -> go.Figure:
+ fig = go.Figure(go.Scatter(
+ y=hr_history,
+ mode="lines",
+ line={"color": COLORS["success"], "width": 2},
+ hovertemplate="%{y} bpm",
+ ))
+ fig.update_layout(
+ paper_bgcolor="rgba(0,0,0,0)",
+ plot_bgcolor="rgba(0,0,0,0)",
+ font={"family": "Inter, sans-serif"},
+ margin={"l": 0, "r": 0, "t": 12, "b": 0},
+ xaxis={"visible": False},
+ yaxis={"visible": False, "range": [35, 165]},
+ showlegend=False,
+ title={"text": patient_id, "x": 0, "font": {"size": 12, "weight": 600}},
+ )
+ return fig
+
+
+# ── Diagnosis donut (cohort demographics) ─────────────────────────────────────
+def create_diagnosis_donut(df: pd.DataFrame) -> go.Figure:
+ counts = df["diagnosis"].value_counts().reset_index()
+ counts.columns = ["diagnosis", "count"]
+ fig = go.Figure(go.Pie(
+ labels=counts["diagnosis"],
+ values=counts["count"],
+ hole=0.58,
+ textinfo="percent",
+ textposition="outside",
+ marker={"colors": px.colors.qualitative.Pastel[:len(counts)]},
+ hovertemplate="%{label}
%{value} patients (%{percent})",
+ ))
+ fig.update_layout(
+ **BASE_LAYOUT,
+ title={"text": "Diagnosis Distribution", "x": 0,
+ "font": {"size": 15, "weight": 600}},
+ legend={"orientation": "v", "x": 1.02, "y": 0.5},
+ annotations=[{"text": "Cohort", "x": 0.5, "y": 0.5,
+ "font": {"size": 13, "weight": 600}, "showarrow": False}],
+ )
+ return fig
+
+
+# ── Age-sex bar chart (cohort demographics) ───────────────────────────────────
+def create_age_sex_chart(df: pd.DataFrame) -> go.Figure:
+ bins = [20, 30, 40, 50, 60, 70, 80, 90]
+ labels = ["20-29","30-39","40-49","50-59","60-69","70-79","80+"]
+ df = df.copy()
+ df["age_group"] = pd.cut(df["age"], bins=bins, labels=labels, right=False)
+ grp = df.groupby(["age_group", "gender"], observed=True).size().reset_index(name="count")
+ fig = go.Figure()
+ for gender, color in [("M", COLORS["secondary"]), ("F", COLORS["primary"])]:
+ sub = grp[grp["gender"] == gender]
+ fig.add_trace(go.Bar(
+ x=sub["age_group"].astype(str), y=sub["count"],
+ name="Male" if gender == "M" else "Female",
+ marker_color=color,
+ ))
+ fig.update_layout(
+ **BASE_LAYOUT,
+ title={"text": "Age & Sex Distribution", "x": 0,
+ "font": {"size": 15, "weight": 600}},
+ barmode="group",
+ xaxis={"title": "Age Group"},
+ yaxis={"title": "Patients", "showgrid": True, "gridcolor": "rgba(0,0,0,0.04)"},
+ legend={"orientation": "h", "y": -0.18},
+ )
+ return fig
+
+
+# ── Risk stratification bar chart ─────────────────────────────────────────────
+def create_risk_strat_chart(df: pd.DataFrame) -> go.Figure:
+ risk_diag = df.groupby(["diagnosis", "risk_level"]).size().reset_index(name="count")
+ color_map = {"High": COLORS["danger"], "Medium": COLORS["warning"], "Low": COLORS["success"]}
+ fig = go.Figure()
+ for level in ["High", "Medium", "Low"]:
+ sub = risk_diag[risk_diag["risk_level"] == level]
+ fig.add_trace(go.Bar(
+ x=sub["diagnosis"], y=sub["count"],
+ name=level, marker_color=color_map[level],
+ ))
+ fig.update_layout(
+ **BASE_LAYOUT,
+ title={"text": "Risk Stratification by Diagnosis", "x": 0,
+ "font": {"size": 15, "weight": 600}},
+ barmode="stack",
+ xaxis={"tickangle": -30},
+ yaxis={"title": "Patients"},
+ legend={"orientation": "h", "y": -0.22},
+ )
+ return fig
+
+
+# ── Crossfilter scatter ───────────────────────────────────────────────────────
+SCATTER_LIGHT = {
+ "paper_bgcolor": "rgba(0,0,0,0)",
+ "plot_bgcolor": "rgba(0,0,0,0)",
+ "font": {"family": "Inter, sans-serif", "color": "#1e2433"},
+ "margin": {"l": 40, "r": 16, "t": 40, "b": 36},
+ "hovermode": False,
+ "newselection_mode": "gradual",
+}
+
+def create_crossfilter_scatter(df: pd.DataFrame, x_col: str, y_col: str,
+ selected_ids=None) -> go.Figure:
+ all_ids = df.index.tolist()
+ if selected_ids is None:
+ selected_ids = all_ids
+
+ risk_colors = {"High": "#ef4444", "Medium": "#f59e0b", "Low": "#22c55e"}
+ marker_colors = [risk_colors.get(r, "#94a3b8") for r in df["risk_level"]]
+
+ fig = px.scatter(df, x=x_col, y=y_col, template="plotly_white")
+ fig.update_traces(
+ selectedpoints=selected_ids,
+ customdata=df.index,
+ mode="markers",
+ marker={
+ "color": marker_colors,
+ "size": 8,
+ "opacity": 0.9,
+ "line": {"width": 0.6, "color": "#ffffff"},
+ },
+ unselected={"marker": {"opacity": 0.15, "color": "#cbd5e1"}},
+ selected={"marker": {"opacity": 1.0, "size": 9}},
+ )
+ grid = {"showgrid": True, "gridcolor": "rgba(0,0,0,0.06)",
+ "zeroline": False, "linecolor": "rgba(0,0,0,0.12)"}
+ fig.update_layout(
+ **SCATTER_LIGHT,
+ dragmode="select",
+ activeselection={"fillcolor": "rgba(30,58,138,0.08)"},
+ xaxis={**grid, "title": x_col},
+ yaxis={**grid, "title": y_col},
+ title={"text": f"{x_col} vs {y_col}",
+ "font": {"size": 13, "color": NAVY, "weight": 600}},
+ )
+ return fig
diff --git a/medical-imaging-demo/components/imaging.py b/medical-imaging-demo/components/imaging.py
new file mode 100644
index 0000000..c393d23
--- /dev/null
+++ b/medical-imaging-demo/components/imaging.py
@@ -0,0 +1,172 @@
+"""X-ray figure builder and annotation helpers."""
+import base64
+import io
+import pathlib
+
+import numpy as np
+import plotly.graph_objects as go
+from PIL import Image, ImageEnhance, ImageOps
+
+XRAY_DIR = pathlib.Path(__file__).parent.parent / "assets" / "xrays"
+
+# Approximate bounding boxes (in 512×512 space) for each finding type
+FINDING_AI_BOXES = {
+ "Cardiomegaly": {"x0": 155, "y0": 192, "x1": 345, "y1": 368, "color": "#f59e0b"},
+ "Pleural Effusion":{"x0": 308, "y0": 295, "x1": 460, "y1": 425, "color": "#3b82f6"},
+ "Pneumothorax": {"x0": 18, "y0": 40, "x1": 178, "y1": 260, "color": "#ef4444"},
+ "Nodule": {"x0": 345, "y0": 135, "x1": 400, "y1": 195, "color": "#8b5cf6"},
+ "Mass": {"x0": 315, "y0": 155, "x1": 430, "y1": 285, "color": "#8b5cf6"},
+ "Atelectasis": {"x0": 155, "y0": 295, "x1": 380, "y1": 340, "color": "#f97316"},
+ "Pneumonia": {"x0": 310, "y0": 258, "x1": 460, "y1": 360, "color": "#eab308"},
+ "Consolidation": {"x0": 300, "y0": 250, "x1": 465, "y1": 370, "color": "#eab308"},
+ "Infiltration": {"x0": 145, "y0": 230, "x1": 310, "y1": 340, "color": "#eab308"},
+ "Cardiomegaly": {"x0": 155, "y0": 192, "x1": 345, "y1": 368, "color": "#f59e0b"},
+}
+
+IMG_W = IMG_H = 512
+
+# Severity → annotation colour (Low=green, Medium=amber, High=red)
+# Darkened one step for legibility on the light cream theme.
+SEVERITY_COLORS = {"Low": "#16a34a", "Medium": "#d97706", "High": "#dc2626"}
+
+
+def severity_color(severity: str) -> str:
+ """Hex colour for a severity level, defaulting to Medium amber."""
+ return SEVERITY_COLORS.get(severity or "Medium", SEVERITY_COLORS["Medium"])
+
+
+def newshape_for(severity: str) -> dict:
+ """Plotly `newshape` style for the next-drawn shape, keyed by severity.
+
+ High findings draw with a thicker line so urgency reads at a glance.
+ """
+ color = severity_color(severity)
+ width = 3 if severity == "High" else 2
+ return {
+ "line": {"color": color, "width": width},
+ "fillcolor": f"rgba({_hex_to_rgb(color)},0.08)",
+ }
+
+
+def load_xray_b64(image_path: pathlib.Path,
+ window: float = 255,
+ level: float = 128,
+ invert: bool = False) -> str:
+ """Load grayscale X-ray PNG, apply window/level, return data-URI."""
+ try:
+ img = Image.open(image_path).convert("L").resize((IMG_W, IMG_H), Image.LANCZOS)
+ except Exception:
+ img = Image.new("L", (IMG_W, IMG_H), 60)
+
+ arr = np.array(img, dtype=np.float32)
+ lo = max(0.0, level - window / 2)
+ hi = min(255.0, level + window / 2)
+ if hi > lo:
+ arr = (arr - lo) / (hi - lo) * 255.0
+ arr = np.clip(arr, 0, 255).astype(np.uint8)
+ img = Image.fromarray(arr, mode="L")
+
+ if invert:
+ img = ImageOps.invert(img)
+
+ buf = io.BytesIO()
+ img.save(buf, format="PNG")
+ b64 = base64.b64encode(buf.getvalue()).decode()
+ return f"data:image/png;base64,{b64}"
+
+
+def create_xray_figure(img_b64: str, shapes: list = None) -> go.Figure:
+ """Build a Plotly figure that shows an X-ray with drawing tools."""
+ fig = go.Figure()
+
+ fig.add_layout_image(
+ source=img_b64,
+ xref="x", yref="y",
+ x=0, y=IMG_H,
+ xanchor="left", yanchor="top",
+ sizex=IMG_W, sizey=IMG_H,
+ sizing="stretch",
+ layer="below",
+ )
+
+ fig.update_layout(
+ xaxis=dict(range=[0, IMG_W], showgrid=False, zeroline=False,
+ showticklabels=False, fixedrange=False),
+ yaxis=dict(range=[0, IMG_H], showgrid=False, zeroline=False,
+ showticklabels=False, scaleanchor="x", fixedrange=False),
+ plot_bgcolor="#e7e9ec",
+ paper_bgcolor="#eef0f2",
+ margin=dict(l=0, r=0, t=0, b=0),
+ dragmode="drawrect",
+ newshape=dict(
+ line={"color": "#1e3a8a", "width": 2},
+ fillcolor="rgba(30,58,138,0.08)",
+ ),
+ modebar=dict(
+ bgcolor="#eef0f2",
+ color="#6b7280",
+ activecolor="#1e3a8a",
+ ),
+ )
+
+ if shapes:
+ fig.layout.shapes = [_make_shape(s) for s in shapes]
+
+ return fig
+
+
+def _make_shape(s: dict) -> dict:
+ """Convert stored annotation dict to Plotly layout shape dict."""
+ line = s.get("line") if isinstance(s.get("line"), dict) else {}
+ color = line.get("color", "#1e3a8a")
+ width = line.get("width", 2)
+ return {
+ "type": s.get("type", "rect"),
+ "x0": s.get("x0", 0),
+ "y0": s.get("y0", 0),
+ "x1": s.get("x1", 10),
+ "y1": s.get("y1", 10),
+ "line": {"color": color, "width": width},
+ "fillcolor": f"rgba({_hex_to_rgb(color)},0.09)",
+ }
+
+
+def _hex_to_rgb(hex_color: str) -> str:
+ h = hex_color.lstrip("#")
+ if len(h) == 6:
+ r, g, b = int(h[0:2],16), int(h[2:4],16), int(h[4:6],16)
+ return f"{r},{g},{b}"
+ return "30,58,138"
+
+
+def get_ai_shapes(finding_labels_str: str) -> list:
+ """Return a list of stored annotation dicts from finding-label string."""
+ shapes = []
+ for f in finding_labels_str.split("|"):
+ f = f.strip()
+ box = FINDING_AI_BOXES.get(f)
+ if box:
+ shapes.append({
+ "type": "rect",
+ "x0": box["x0"], "y0": IMG_H - box["y1"],
+ "x1": box["x1"], "y1": IMG_H - box["y0"],
+ "line": {"color": box["color"], "width": 2},
+ "fillcolor": "rgba(0,0,0,0)",
+ "_label": f,
+ "_severity": "Medium",
+ "_note": "AI suggested",
+ })
+ return shapes
+
+
+def annotation_to_finding_dict(ann: dict) -> dict:
+ """Convert stored annotation to finding dict for PDF export."""
+ x0, y0 = ann.get("x0", 0), ann.get("y0", 0)
+ x1, y1 = ann.get("x1", 0), ann.get("y1", 0)
+ return {
+ "label": ann.get("_label", "Unspecified"),
+ "location": f"({int(x0)},{int(y0)})→({int(x1)},{int(y1)})",
+ "shape_type": ann.get("type", "rect"),
+ "severity": ann.get("_severity", "—"),
+ "note": ann.get("_note", ""),
+ }
diff --git a/medical-imaging-demo/components/kpi_cards.py b/medical-imaging-demo/components/kpi_cards.py
new file mode 100644
index 0000000..57ef2a5
--- /dev/null
+++ b/medical-imaging-demo/components/kpi_cards.py
@@ -0,0 +1,61 @@
+import dash_mantine_components as dmc
+from dash_iconify import DashIconify
+
+
+def create_kpi_card(id_prefix, title, value, trend=None,
+ trend_positive=True, subtitle=None, icon=None,
+ alert_color=None):
+ """Clinical KPI card, optionally coloured for alert state."""
+ trend_color = "teal" if trend_positive else "red"
+ border_color = {"red": "#ef4444", "yellow": "#f59e0b", "green": "#22c55e"}.get(alert_color)
+ style = {"minWidth": "200px"}
+ if border_color:
+ style["borderLeft"] = f"4px solid {border_color}"
+
+ return dmc.Paper(
+ dmc.Stack([
+ dmc.Group([
+ dmc.Text(title, size="sm", c="dimmed", fw=500, id=f"{id_prefix}-title"),
+ DashIconify(icon=icon, width=20, color="gray") if icon else None,
+ ], justify="space-between"),
+ dmc.Group([
+ dmc.Text(value, size="xl", fw=700, id=f"{id_prefix}-value"),
+ dmc.Text(
+ trend or "",
+ size="sm",
+ c=trend_color,
+ fw=500,
+ id=f"{id_prefix}-trend",
+ style={"display": "block" if trend else "none"},
+ ),
+ ], justify="space-between", mt="xs"),
+ dmc.Text(subtitle, size="xs", c="dimmed", mt=4,
+ id=f"{id_prefix}-subtitle") if subtitle else None,
+ ], gap="xs"),
+ p="md",
+ radius="md",
+ withBorder=True,
+ style=style,
+ )
+
+
+def create_stat_card(label, value, description=None, value_color=None):
+ return dmc.Paper(
+ dmc.Stack([
+ dmc.Text(label, size="xs", c="dimmed", tt="uppercase", fw=600),
+ dmc.Text(value, size="lg", fw=600, c=value_color or "default"),
+ dmc.Text(description, size="xs", c="dimmed") if description else None,
+ ], gap=4),
+ p="sm",
+ radius="sm",
+ withBorder=True,
+ )
+
+
+def create_risk_row(id_prefix, label, value, progress_value, color):
+ return dmc.Group([
+ dmc.Text(label, size="sm", w=120),
+ dmc.Progress(value=progress_value, color=color, size="lg",
+ style={"flex": 1}, id=f"{id_prefix}-bar"),
+ dmc.Text(value, size="sm", fw=500, w=55, id=f"{id_prefix}-value"),
+ ], gap="sm")
diff --git a/medical-imaging-demo/components/tables.py b/medical-imaging-demo/components/tables.py
new file mode 100644
index 0000000..311f44f
--- /dev/null
+++ b/medical-imaging-demo/components/tables.py
@@ -0,0 +1,110 @@
+import dash_mantine_components as dmc
+import pandas as pd
+
+
+def create_data_table(df: pd.DataFrame, title: str = None,
+ striped: bool = True, highlight_flags: bool = False):
+ """Generic Mantine table from a DataFrame."""
+ cols = df.columns.tolist()
+ header = dmc.TableThead(
+ dmc.TableTr([dmc.TableTh(c, style={"fontWeight": 600}) for c in cols])
+ )
+ rows = []
+ for _, row in df.iterrows():
+ cells = []
+ for col, val in zip(cols, row):
+ style = {}
+ val_str = str(val) if not pd.isna(val) else "—"
+ if highlight_flags and col == "flag":
+ color = {"H": "#ef4444", "L": "#3b82f6"}.get(val_str, "#22c55e")
+ style["color"] = color
+ style["fontWeight"] = 600
+ cells.append(dmc.TableTd(val_str, style=style))
+ rows.append(dmc.TableTr(cells))
+ body = dmc.TableTbody(rows)
+ table = dmc.Table(
+ [header, body],
+ striped=striped,
+ highlightOnHover=True,
+ withTableBorder=True,
+ withColumnBorders=True,
+ )
+ if title:
+ return dmc.Stack([
+ dmc.Text(title, fw=600, size="lg"),
+ dmc.ScrollArea(table, type="auto"),
+ ], gap="sm")
+ return dmc.ScrollArea(table, type="auto")
+
+
+def create_findings_table(annotations: list):
+ """Build a findings table from a list of annotation dicts."""
+ if not annotations:
+ return dmc.Text("No annotations yet. Draw on the X-ray to add findings.",
+ size="sm", c="dimmed", ta="center", py="md")
+
+ headers = ["#", "Finding", "Severity", "Location (px)", "Size (px²)", "Note"]
+ header = dmc.TableThead(
+ dmc.TableTr([dmc.TableTh(h, style={"fontWeight": 600, "fontSize": "12px"})
+ for h in headers])
+ )
+
+ sev_color = {"High": "#ef4444", "Medium": "#f59e0b", "Low": "#22c55e"}
+ rows = []
+ for i, ann in enumerate(annotations, 1):
+ x0 = ann.get("x0", 0)
+ y0 = ann.get("y0", 0)
+ x1 = ann.get("x1", 0)
+ y1 = ann.get("y1", 0)
+ area = abs((x1 - x0) * (y1 - y0))
+ sev = ann.get("_severity", "—")
+ rows.append(dmc.TableTr([
+ dmc.TableTd(str(i), style={"fontSize": "12px"}),
+ dmc.TableTd(ann.get("_label", "Unspecified"),
+ style={"fontWeight": 500, "fontSize": "12px"}),
+ dmc.TableTd(
+ dmc.Badge(sev, color={"High":"red","Medium":"yellow","Low":"teal"}.get(sev,"gray"),
+ size="sm"),
+ ),
+ dmc.TableTd(f"({int(x0)},{int(y0)})→({int(x1)},{int(y1)})",
+ style={"fontFamily": "monospace", "fontSize": "11px"}),
+ dmc.TableTd(f"{int(area):,}", style={"fontSize": "12px"}),
+ dmc.TableTd(ann.get("_note", ""), style={"fontSize": "12px"}),
+ ]))
+
+ return dmc.ScrollArea(
+ dmc.Table([header, dmc.TableTbody(rows)],
+ striped=True, highlightOnHover=True,
+ withTableBorder=True, withColumnBorders=False,
+ verticalSpacing="xs"),
+ type="auto",
+ )
+
+
+def create_patient_table(df: pd.DataFrame, cols=None):
+ """Patient roster table with coloured risk badges."""
+ if cols is None:
+ cols = ["patient_id", "name", "age", "gender", "diagnosis", "ward", "risk_score"]
+ df = df[cols].copy()
+ header = dmc.TableThead(
+ dmc.TableTr([dmc.TableTh(c.replace("_"," ").title(),
+ style={"fontWeight": 600, "fontSize": "12px"})
+ for c in cols])
+ )
+ rows = []
+ for _, row in df.iterrows():
+ cells = []
+ for col in cols:
+ val = row[col]
+ if col == "risk_score":
+ color = "red" if val > 70 else "yellow" if val > 40 else "teal"
+ cells.append(dmc.TableTd(
+ dmc.Badge(f"{val:.0f}", color=color, size="sm")))
+ else:
+ cells.append(dmc.TableTd(str(val), style={"fontSize": "12px"}))
+ rows.append(dmc.TableTr(cells))
+ return dmc.ScrollArea(
+ dmc.Table([header, dmc.TableTbody(rows)],
+ striped=True, highlightOnHover=True, withTableBorder=True),
+ type="auto", h=280,
+ )
diff --git a/medical-imaging-demo/data/admissions.csv b/medical-imaging-demo/data/admissions.csv
new file mode 100644
index 0000000..bfaba6c
--- /dev/null
+++ b/medical-imaging-demo/data/admissions.csv
@@ -0,0 +1,211 @@
+date,department,admissions
+2026-05-17,Cardiology,6
+2026-05-17,Pulmonology,5
+2026-05-17,Neurology,6
+2026-05-17,General Medicine,16
+2026-05-17,Surgery,8
+2026-05-17,Nephrology,4
+2026-05-17,Oncology,2
+2026-05-18,Cardiology,11
+2026-05-18,Pulmonology,6
+2026-05-18,Neurology,7
+2026-05-18,General Medicine,20
+2026-05-18,Surgery,11
+2026-05-18,Nephrology,3
+2026-05-18,Oncology,2
+2026-05-19,Cardiology,12
+2026-05-19,Pulmonology,3
+2026-05-19,Neurology,0
+2026-05-19,General Medicine,22
+2026-05-19,Surgery,8
+2026-05-19,Nephrology,5
+2026-05-19,Oncology,4
+2026-05-20,Cardiology,14
+2026-05-20,Pulmonology,7
+2026-05-20,Neurology,5
+2026-05-20,General Medicine,18
+2026-05-20,Surgery,11
+2026-05-20,Nephrology,6
+2026-05-20,Oncology,6
+2026-05-21,Cardiology,9
+2026-05-21,Pulmonology,12
+2026-05-21,Neurology,5
+2026-05-21,General Medicine,19
+2026-05-21,Surgery,10
+2026-05-21,Nephrology,3
+2026-05-21,Oncology,3
+2026-05-22,Cardiology,14
+2026-05-22,Pulmonology,10
+2026-05-22,Neurology,6
+2026-05-22,General Medicine,22
+2026-05-22,Surgery,10
+2026-05-22,Nephrology,4
+2026-05-22,Oncology,2
+2026-05-23,Cardiology,7
+2026-05-23,Pulmonology,4
+2026-05-23,Neurology,7
+2026-05-23,General Medicine,16
+2026-05-23,Surgery,10
+2026-05-23,Nephrology,4
+2026-05-23,Oncology,1
+2026-05-24,Cardiology,10
+2026-05-24,Pulmonology,8
+2026-05-24,Neurology,5
+2026-05-24,General Medicine,12
+2026-05-24,Surgery,4
+2026-05-24,Nephrology,5
+2026-05-24,Oncology,2
+2026-05-25,Cardiology,12
+2026-05-25,Pulmonology,6
+2026-05-25,Neurology,6
+2026-05-25,General Medicine,17
+2026-05-25,Surgery,10
+2026-05-25,Nephrology,6
+2026-05-25,Oncology,5
+2026-05-26,Cardiology,9
+2026-05-26,Pulmonology,8
+2026-05-26,Neurology,4
+2026-05-26,General Medicine,23
+2026-05-26,Surgery,11
+2026-05-26,Nephrology,5
+2026-05-26,Oncology,8
+2026-05-27,Cardiology,10
+2026-05-27,Pulmonology,7
+2026-05-27,Neurology,7
+2026-05-27,General Medicine,24
+2026-05-27,Surgery,12
+2026-05-27,Nephrology,6
+2026-05-27,Oncology,2
+2026-05-28,Cardiology,10
+2026-05-28,Pulmonology,9
+2026-05-28,Neurology,3
+2026-05-28,General Medicine,20
+2026-05-28,Surgery,11
+2026-05-28,Nephrology,2
+2026-05-28,Oncology,5
+2026-05-29,Cardiology,13
+2026-05-29,Pulmonology,7
+2026-05-29,Neurology,5
+2026-05-29,General Medicine,16
+2026-05-29,Surgery,9
+2026-05-29,Nephrology,1
+2026-05-29,Oncology,2
+2026-05-30,Cardiology,8
+2026-05-30,Pulmonology,3
+2026-05-30,Neurology,2
+2026-05-30,General Medicine,12
+2026-05-30,Surgery,9
+2026-05-30,Nephrology,3
+2026-05-30,Oncology,5
+2026-05-31,Cardiology,8
+2026-05-31,Pulmonology,5
+2026-05-31,Neurology,3
+2026-05-31,General Medicine,9
+2026-05-31,Surgery,8
+2026-05-31,Nephrology,3
+2026-05-31,Oncology,3
+2026-06-01,Cardiology,7
+2026-06-01,Pulmonology,7
+2026-06-01,Neurology,5
+2026-06-01,General Medicine,20
+2026-06-01,Surgery,9
+2026-06-01,Nephrology,4
+2026-06-01,Oncology,5
+2026-06-02,Cardiology,14
+2026-06-02,Pulmonology,7
+2026-06-02,Neurology,3
+2026-06-02,General Medicine,17
+2026-06-02,Surgery,10
+2026-06-02,Nephrology,7
+2026-06-02,Oncology,0
+2026-06-03,Cardiology,9
+2026-06-03,Pulmonology,7
+2026-06-03,Neurology,1
+2026-06-03,General Medicine,19
+2026-06-03,Surgery,10
+2026-06-03,Nephrology,5
+2026-06-03,Oncology,3
+2026-06-04,Cardiology,11
+2026-06-04,Pulmonology,5
+2026-06-04,Neurology,2
+2026-06-04,General Medicine,19
+2026-06-04,Surgery,10
+2026-06-04,Nephrology,5
+2026-06-04,Oncology,6
+2026-06-05,Cardiology,12
+2026-06-05,Pulmonology,9
+2026-06-05,Neurology,6
+2026-06-05,General Medicine,23
+2026-06-05,Surgery,9
+2026-06-05,Nephrology,6
+2026-06-05,Oncology,4
+2026-06-06,Cardiology,10
+2026-06-06,Pulmonology,6
+2026-06-06,Neurology,4
+2026-06-06,General Medicine,15
+2026-06-06,Surgery,8
+2026-06-06,Nephrology,5
+2026-06-06,Oncology,5
+2026-06-07,Cardiology,9
+2026-06-07,Pulmonology,3
+2026-06-07,Neurology,4
+2026-06-07,General Medicine,14
+2026-06-07,Surgery,6
+2026-06-07,Nephrology,3
+2026-06-07,Oncology,1
+2026-06-08,Cardiology,7
+2026-06-08,Pulmonology,10
+2026-06-08,Neurology,5
+2026-06-08,General Medicine,16
+2026-06-08,Surgery,10
+2026-06-08,Nephrology,6
+2026-06-08,Oncology,3
+2026-06-09,Cardiology,9
+2026-06-09,Pulmonology,5
+2026-06-09,Neurology,10
+2026-06-09,General Medicine,17
+2026-06-09,Surgery,6
+2026-06-09,Nephrology,4
+2026-06-09,Oncology,5
+2026-06-10,Cardiology,15
+2026-06-10,Pulmonology,7
+2026-06-10,Neurology,5
+2026-06-10,General Medicine,17
+2026-06-10,Surgery,12
+2026-06-10,Nephrology,4
+2026-06-10,Oncology,3
+2026-06-11,Cardiology,12
+2026-06-11,Pulmonology,8
+2026-06-11,Neurology,5
+2026-06-11,General Medicine,22
+2026-06-11,Surgery,6
+2026-06-11,Nephrology,5
+2026-06-11,Oncology,4
+2026-06-12,Cardiology,11
+2026-06-12,Pulmonology,9
+2026-06-12,Neurology,7
+2026-06-12,General Medicine,22
+2026-06-12,Surgery,9
+2026-06-12,Nephrology,4
+2026-06-12,Oncology,5
+2026-06-13,Cardiology,8
+2026-06-13,Pulmonology,2
+2026-06-13,Neurology,6
+2026-06-13,General Medicine,11
+2026-06-13,Surgery,8
+2026-06-13,Nephrology,8
+2026-06-13,Oncology,4
+2026-06-14,Cardiology,7
+2026-06-14,Pulmonology,5
+2026-06-14,Neurology,5
+2026-06-14,General Medicine,14
+2026-06-14,Surgery,9
+2026-06-14,Nephrology,6
+2026-06-14,Oncology,5
+2026-06-15,Cardiology,9
+2026-06-15,Pulmonology,8
+2026-06-15,Neurology,6
+2026-06-15,General Medicine,23
+2026-06-15,Surgery,10
+2026-06-15,Nephrology,3
+2026-06-15,Oncology,4
diff --git a/medical-imaging-demo/data/cohort.csv b/medical-imaging-demo/data/cohort.csv
new file mode 100644
index 0000000..51b12e7
--- /dev/null
+++ b/medical-imaging-demo/data/cohort.csv
@@ -0,0 +1,201 @@
+patient_id,age,gender,bmi,systolic_bp,ldl,hba1c,egfr,diagnosis,risk_level
+CO2001,46,F,25.9,167.0,161.8,8.3,87.7,CAD,High
+CO2002,46,M,24.0,146.0,114.1,6.9,67.9,CKD,Low
+CO2003,32,M,20.3,189.0,112.1,8.3,55.8,Asthma,High
+CO2004,52,M,30.2,167.0,81.4,6.0,73.5,CKD,Medium
+CO2005,76,F,33.3,105.0,56.4,6.8,72.2,Heart Failure,Low
+CO2006,26,M,29.4,115.0,141.2,6.1,65.8,Asthma,Low
+CO2007,59,M,16.0,149.0,122.4,10.4,72.2,Type 2 Diabetes,Medium
+CO2008,50,F,31.2,133.0,71.1,6.3,21.1,CKD,Medium
+CO2009,32,M,29.7,142.0,89.7,5.6,42.6,CKD,Medium
+CO2010,49,M,32.0,93.0,54.6,5.9,53.5,Heart Failure,Low
+CO2011,68,M,31.8,151.0,154.2,9.2,72.9,CKD,Medium
+CO2012,57,F,26.9,131.0,119.0,8.3,78.6,Type 2 Diabetes,Medium
+CO2013,55,F,16.0,134.0,124.1,7.3,43.1,Type 2 Diabetes,Medium
+CO2014,50,M,29.5,115.0,166.2,4.5,85.6,Heart Failure,Low
+CO2015,84,F,20.7,114.0,148.7,6.1,48.0,Hypertension,Low
+CO2016,23,M,24.2,132.0,40.0,7.1,5.0,Obesity,Medium
+CO2017,24,M,34.5,201.0,81.8,7.6,78.5,Hyperlipidemia,Medium
+CO2018,36,M,16.0,110.0,132.6,7.1,61.4,Atrial Fibrillation,Low
+CO2019,76,F,24.4,120.0,113.0,7.8,77.0,Hyperlipidemia,Low
+CO2020,59,F,20.8,120.0,139.9,5.8,67.6,Hyperlipidemia,Low
+CO2021,25,F,33.9,108.0,192.7,8.7,15.6,CAD,High
+CO2022,52,F,28.6,126.0,162.8,5.0,69.6,Hyperlipidemia,Low
+CO2023,84,M,42.4,125.0,150.1,4.5,25.2,Type 2 Diabetes,Medium
+CO2024,82,M,25.7,110.0,95.4,6.4,86.7,Hyperlipidemia,Low
+CO2025,22,F,25.6,124.0,102.0,7.3,38.6,Asthma,Medium
+CO2026,46,M,26.2,160.0,147.0,7.0,31.8,Atrial Fibrillation,Medium
+CO2027,48,F,30.0,103.0,171.0,7.6,62.8,Type 2 Diabetes,Low
+CO2028,37,F,29.0,133.0,50.5,7.4,98.1,CKD,Low
+CO2029,36,F,34.9,145.0,72.1,7.3,85.4,COPD,Low
+CO2030,63,F,30.2,182.0,144.1,8.0,102.9,Hyperlipidemia,Medium
+CO2031,81,F,33.4,124.0,70.2,6.6,42.8,COPD,Medium
+CO2032,30,M,20.0,171.0,126.7,7.5,65.5,Heart Failure,Medium
+CO2033,80,M,28.1,122.0,119.7,9.9,49.3,Heart Failure,Medium
+CO2034,34,F,33.2,136.0,112.0,8.8,51.7,CAD,Medium
+CO2035,61,F,25.5,144.0,81.3,8.4,38.1,Atrial Fibrillation,High
+CO2036,51,M,26.7,117.0,143.2,5.3,111.1,Asthma,Low
+CO2037,74,M,27.6,107.0,93.4,5.2,98.2,CKD,Low
+CO2038,53,F,26.3,124.0,107.1,6.0,70.7,CKD,Low
+CO2039,26,F,28.0,108.0,139.5,6.9,50.2,CKD,Low
+CO2040,50,F,20.5,128.0,103.8,6.0,84.3,Asthma,Low
+CO2041,59,M,28.6,138.0,70.8,8.3,51.1,Heart Failure,Medium
+CO2042,20,F,17.1,135.0,95.8,7.6,45.3,Atrial Fibrillation,Low
+CO2043,35,M,24.5,166.0,133.0,4.5,33.4,Atrial Fibrillation,High
+CO2044,52,F,25.7,147.0,91.0,6.3,60.0,Type 2 Diabetes,Low
+CO2045,62,M,33.4,106.0,124.9,6.5,18.9,Atrial Fibrillation,Medium
+CO2046,48,F,39.7,138.0,156.9,6.6,65.7,CAD,Low
+CO2047,45,F,34.5,161.0,52.5,6.1,127.1,Obesity,Medium
+CO2048,53,F,30.3,148.0,153.1,9.5,59.4,Obesity,Medium
+CO2049,71,M,19.8,145.0,60.7,4.5,73.6,COPD,Low
+CO2050,50,M,28.6,131.0,118.0,6.8,70.3,Hypertension,Low
+CO2051,33,F,26.5,92.0,141.4,7.6,120.3,Hypertension,Low
+CO2052,76,F,23.4,80.0,118.8,5.5,47.6,Heart Failure,Low
+CO2053,55,M,25.9,91.0,126.8,4.5,60.5,CKD,Low
+CO2054,60,M,24.8,115.0,169.0,6.5,47.9,Obesity,Low
+CO2055,67,M,31.3,204.0,113.6,8.6,94.2,Type 2 Diabetes,High
+CO2056,80,F,23.5,126.0,161.9,7.0,31.9,CKD,Medium
+CO2057,36,F,21.1,132.0,58.8,4.6,96.2,Hypertension,Low
+CO2058,72,F,20.8,153.0,83.0,4.5,67.9,CKD,Low
+CO2059,58,M,26.9,124.0,138.2,8.8,60.8,Asthma,Medium
+CO2060,50,F,16.0,140.0,40.0,7.1,47.9,COPD,Low
+CO2061,36,M,29.4,135.0,64.8,8.0,75.3,CAD,Medium
+CO2062,50,M,28.2,107.0,87.7,6.8,100.1,CKD,Low
+CO2063,54,F,30.6,104.0,132.6,6.9,111.6,Hyperlipidemia,Low
+CO2064,23,M,34.1,120.0,96.5,6.8,53.1,Atrial Fibrillation,Low
+CO2065,42,F,38.8,155.0,95.0,4.5,67.0,Hyperlipidemia,Low
+CO2066,52,M,22.1,165.0,134.2,7.1,71.6,Obesity,Medium
+CO2067,28,M,19.9,149.0,139.3,6.7,64.6,CAD,Low
+CO2068,74,F,28.2,134.0,134.2,7.4,65.1,Type 2 Diabetes,Low
+CO2069,65,M,28.3,99.0,92.8,6.9,48.9,Type 2 Diabetes,Low
+CO2070,60,F,29.3,133.0,143.4,8.2,86.0,Atrial Fibrillation,Medium
+CO2071,34,M,16.0,156.0,108.7,5.0,79.3,Asthma,Low
+CO2072,55,M,27.3,80.0,144.6,8.2,77.6,Type 2 Diabetes,Medium
+CO2073,32,F,21.0,123.0,119.5,7.6,79.8,Hyperlipidemia,Low
+CO2074,58,F,32.7,99.0,105.7,7.7,60.5,CAD,Low
+CO2075,28,F,26.8,94.0,74.9,6.0,55.5,COPD,Low
+CO2076,46,F,26.6,121.0,106.2,6.1,68.5,Hypertension,Low
+CO2077,83,F,22.6,152.0,45.0,6.5,70.4,CAD,Low
+CO2078,23,M,30.4,125.0,84.4,8.1,89.2,Obesity,Medium
+CO2079,77,F,31.9,119.0,157.6,7.4,69.5,COPD,Low
+CO2080,71,M,21.7,146.0,95.9,7.4,114.3,CKD,Low
+CO2081,36,M,24.9,139.0,164.4,8.8,69.1,Obesity,Medium
+CO2082,45,M,17.9,138.0,61.6,5.2,75.9,Type 2 Diabetes,Low
+CO2083,55,M,34.2,127.0,82.3,6.7,93.7,Heart Failure,Low
+CO2084,48,F,27.0,150.0,89.7,8.0,70.6,Type 2 Diabetes,Low
+CO2085,70,M,31.6,130.0,130.6,7.9,81.0,Obesity,Low
+CO2086,74,F,22.1,147.0,98.0,6.7,57.5,Hyperlipidemia,Low
+CO2087,30,M,23.1,132.0,129.1,5.6,38.1,Hypertension,Medium
+CO2088,50,F,16.0,144.0,103.5,6.5,59.8,Hyperlipidemia,Low
+CO2089,38,F,29.4,148.0,152.4,7.6,33.5,Heart Failure,Medium
+CO2090,75,M,28.1,109.0,97.4,8.1,81.1,Heart Failure,Medium
+CO2091,26,F,26.1,90.0,181.4,6.0,57.5,Asthma,Low
+CO2092,40,F,25.5,135.0,87.3,6.2,64.3,CKD,Low
+CO2093,84,F,30.4,133.0,79.0,8.1,76.8,COPD,Medium
+CO2094,75,F,27.8,162.0,103.6,4.9,57.2,Type 2 Diabetes,Medium
+CO2095,42,M,36.2,123.0,40.0,5.4,31.0,Heart Failure,Medium
+CO2096,31,M,33.2,150.0,181.9,4.9,22.3,COPD,Medium
+CO2097,76,F,38.3,143.0,161.8,10.8,65.1,Hypertension,High
+CO2098,45,M,24.6,176.0,187.4,6.8,118.8,Asthma,Medium
+CO2099,54,M,36.9,80.0,113.9,6.4,90.9,Type 2 Diabetes,Low
+CO2100,74,F,25.4,140.0,109.2,4.5,69.2,CKD,Low
+CO2101,74,F,33.5,139.0,150.7,4.8,83.2,Type 2 Diabetes,Low
+CO2102,44,F,24.3,99.0,169.7,5.3,80.7,COPD,Low
+CO2103,64,F,29.5,117.0,162.1,6.2,23.4,Hyperlipidemia,Medium
+CO2104,62,F,30.9,102.0,99.3,9.2,110.2,Obesity,Medium
+CO2105,50,F,38.4,132.0,149.1,4.5,29.0,Hypertension,Medium
+CO2106,51,F,23.8,117.0,142.6,5.3,110.0,CKD,Low
+CO2107,43,M,35.4,154.0,105.0,5.6,88.3,COPD,Low
+CO2108,22,M,31.5,178.0,83.8,8.0,70.3,CKD,High
+CO2109,53,F,34.3,114.0,68.6,6.1,95.8,Hypertension,Low
+CO2110,42,F,38.9,159.0,106.7,8.2,40.0,COPD,High
+CO2111,42,F,31.1,122.0,152.4,8.5,49.0,Obesity,Medium
+CO2112,75,F,25.0,148.0,149.6,5.7,31.2,CKD,Medium
+CO2113,57,F,31.5,108.0,87.9,8.1,79.7,Hyperlipidemia,Medium
+CO2114,56,F,29.8,190.0,117.5,6.9,88.5,Asthma,Medium
+CO2115,21,M,28.2,92.0,148.9,5.4,69.7,Heart Failure,Low
+CO2116,26,M,30.1,157.0,79.2,5.4,92.5,CKD,Low
+CO2117,68,M,25.3,143.0,141.9,8.2,89.8,Hyperlipidemia,Medium
+CO2118,40,M,35.1,124.0,139.9,7.7,90.9,Hyperlipidemia,Low
+CO2119,56,M,28.2,127.0,146.8,5.1,44.0,CKD,Medium
+CO2120,63,F,37.1,147.0,67.8,5.9,100.7,Hypertension,Low
+CO2121,79,M,28.9,122.0,79.9,7.3,80.0,Type 2 Diabetes,Low
+CO2122,25,F,28.1,184.0,146.3,6.4,46.8,Heart Failure,Medium
+CO2123,28,M,22.2,108.0,69.0,8.4,64.0,Hypertension,Medium
+CO2124,64,F,27.5,130.0,155.2,5.9,98.0,Hypertension,Low
+CO2125,75,M,16.0,120.0,49.6,4.5,98.6,Hypertension,Low
+CO2126,38,F,17.2,136.0,65.6,5.4,85.8,Hyperlipidemia,Low
+CO2127,74,M,29.0,124.0,161.7,5.1,37.1,Heart Failure,Medium
+CO2128,62,M,27.2,130.0,82.4,6.4,103.5,Atrial Fibrillation,Low
+CO2129,37,F,25.6,178.0,55.9,6.1,72.5,Obesity,Medium
+CO2130,53,M,27.1,141.0,85.6,5.9,93.3,CKD,Low
+CO2131,22,F,30.5,145.0,99.0,6.7,54.7,Heart Failure,Low
+CO2132,38,F,36.4,146.0,133.1,6.5,51.7,Heart Failure,Low
+CO2133,35,F,38.1,161.0,68.8,8.7,34.4,Heart Failure,High
+CO2134,43,F,25.5,137.0,93.5,4.5,24.6,Hypertension,Medium
+CO2135,80,M,16.6,143.0,89.2,4.5,101.8,Obesity,Low
+CO2136,69,F,23.0,80.0,128.0,8.5,27.8,Hypertension,High
+CO2137,55,F,33.0,85.0,117.4,7.8,50.3,Heart Failure,Low
+CO2138,43,F,24.3,136.0,116.1,4.9,70.0,COPD,Low
+CO2139,29,F,29.4,125.0,171.4,8.0,58.9,Hyperlipidemia,Low
+CO2140,72,F,25.9,118.0,113.3,8.4,59.8,Type 2 Diabetes,Medium
+CO2141,47,M,22.1,143.0,97.7,8.2,114.7,COPD,Medium
+CO2142,58,F,24.5,106.0,113.0,8.6,55.3,CKD,Medium
+CO2143,63,M,33.4,144.0,139.9,7.4,45.9,Hyperlipidemia,Low
+CO2144,63,F,29.4,132.0,174.8,4.9,59.1,CKD,Low
+CO2145,28,F,31.2,155.0,176.9,4.5,46.9,Hyperlipidemia,Low
+CO2146,62,M,21.1,139.0,115.4,7.1,62.3,Asthma,Low
+CO2147,74,F,29.3,94.0,114.0,4.5,113.2,Hypertension,Low
+CO2148,40,F,24.7,135.0,142.9,8.9,69.6,Atrial Fibrillation,Medium
+CO2149,62,F,26.0,150.0,158.3,9.5,42.0,Hypertension,High
+CO2150,69,M,36.5,120.0,178.2,5.4,105.2,CAD,Medium
+CO2151,78,F,29.2,145.0,52.6,7.1,39.6,Type 2 Diabetes,Medium
+CO2152,32,M,28.2,126.0,120.6,7.7,85.4,Heart Failure,Low
+CO2153,33,F,34.6,115.0,71.4,6.4,29.0,Atrial Fibrillation,Medium
+CO2154,44,F,33.9,122.0,226.6,8.8,67.2,Hyperlipidemia,Medium
+CO2155,24,F,34.8,173.0,102.5,6.5,88.1,Heart Failure,Medium
+CO2156,40,F,37.4,112.0,132.6,8.5,68.3,COPD,Medium
+CO2157,36,M,16.0,144.0,49.9,5.0,46.1,CAD,Low
+CO2158,82,F,34.2,130.0,175.7,8.2,58.8,Heart Failure,Medium
+CO2159,42,M,27.5,125.0,139.8,5.9,75.7,Hyperlipidemia,Low
+CO2160,46,M,22.0,110.0,134.5,4.5,63.4,Obesity,Low
+CO2161,58,F,22.9,150.0,172.1,4.7,106.5,Hypertension,Low
+CO2162,54,F,26.0,136.0,52.1,6.7,81.7,Atrial Fibrillation,Low
+CO2163,57,M,23.5,179.0,87.9,5.7,62.8,Type 2 Diabetes,Medium
+CO2164,23,M,27.4,126.0,61.4,5.8,79.3,Heart Failure,Low
+CO2165,31,M,18.9,92.0,127.8,8.8,130.0,Obesity,Medium
+CO2166,84,M,25.0,110.0,149.5,8.2,88.7,COPD,Medium
+CO2167,74,F,28.8,122.0,144.3,8.1,63.0,CAD,Medium
+CO2168,50,M,33.6,132.0,53.1,7.4,86.2,Asthma,Low
+CO2169,27,F,16.0,126.0,40.8,6.6,68.1,Heart Failure,Low
+CO2170,49,F,23.2,147.0,115.1,7.4,68.2,Obesity,Low
+CO2171,25,F,31.8,118.0,112.9,5.5,50.0,CKD,Low
+CO2172,34,M,39.2,143.0,148.9,7.0,55.0,Obesity,Low
+CO2173,82,F,21.5,91.0,163.0,6.7,45.5,COPD,Low
+CO2174,21,M,30.8,154.0,124.3,5.5,114.5,Heart Failure,Low
+CO2175,34,M,25.7,101.0,98.7,9.1,73.7,COPD,Medium
+CO2176,62,F,23.9,145.0,135.3,8.9,97.6,Obesity,Medium
+CO2177,44,F,22.3,136.0,138.4,4.5,88.5,Hypertension,Low
+CO2178,32,M,27.9,106.0,40.0,6.4,63.4,Heart Failure,Low
+CO2179,33,M,28.8,139.0,84.7,4.5,62.8,COPD,Low
+CO2180,34,F,26.1,119.0,109.4,8.9,88.2,Type 2 Diabetes,Medium
+CO2181,70,M,25.1,109.0,140.4,4.5,42.7,CKD,Medium
+CO2182,53,M,25.0,132.0,100.9,7.9,72.6,Heart Failure,Low
+CO2183,66,F,19.0,110.0,181.2,5.1,87.0,Heart Failure,Low
+CO2184,75,F,27.3,146.0,107.0,7.7,103.4,Type 2 Diabetes,Low
+CO2185,28,M,34.7,177.0,120.6,5.6,70.8,Asthma,Medium
+CO2186,38,F,30.9,126.0,128.5,6.5,46.7,Obesity,Low
+CO2187,82,F,21.4,153.0,115.1,7.2,63.4,Obesity,Low
+CO2188,31,M,26.0,127.0,150.3,7.7,71.3,Hyperlipidemia,Low
+CO2189,35,F,33.9,151.0,89.2,7.2,91.1,CAD,Low
+CO2190,31,M,30.0,116.0,114.9,6.2,108.1,Heart Failure,Low
+CO2191,37,M,33.6,112.0,105.7,10.2,54.5,Heart Failure,Medium
+CO2192,53,M,23.3,80.0,154.7,4.8,70.3,Obesity,Low
+CO2193,65,M,40.6,123.0,126.9,6.9,82.0,CKD,Low
+CO2194,73,F,35.3,149.0,94.7,5.9,77.3,Hypertension,Low
+CO2195,20,M,41.7,123.0,74.9,6.3,53.7,Heart Failure,Low
+CO2196,55,M,28.1,145.0,106.8,7.7,64.2,Obesity,Low
+CO2197,82,F,38.9,138.0,106.9,5.4,30.5,Asthma,Medium
+CO2198,70,M,38.4,141.0,88.6,6.6,38.4,Obesity,Medium
+CO2199,81,F,21.2,134.0,163.7,6.7,122.1,Hypertension,Low
+CO2200,52,F,41.7,183.0,80.8,6.3,27.2,CKD,High
diff --git a/medical-imaging-demo/data/labs.csv b/medical-imaging-demo/data/labs.csv
new file mode 100644
index 0000000..c9a9491
--- /dev/null
+++ b/medical-imaging-demo/data/labs.csv
@@ -0,0 +1,201 @@
+patient_id,date,test,value,unit,reference_low,reference_high,flag
+PT1001,2026-06-15,WBC,11.298,10³/µL,4.5,11.0,H
+PT1001,2026-06-15,Hemoglobin,14.334,g/dL,12.0,17.5,N
+PT1001,2026-06-15,Platelets,222.4,10³/µL,150.0,400.0,N
+PT1001,2026-06-15,Sodium,140.412,mEq/L,136.0,145.0,N
+PT1001,2026-06-15,Potassium,3.957,mEq/L,3.5,5.0,N
+PT1001,2026-06-15,Creatinine,1.149,mg/dL,0.7,1.3,N
+PT1001,2026-06-15,BUN,12.525,mg/dL,7.0,25.0,N
+PT1001,2026-06-15,Glucose,96.633,mg/dL,70.0,100.0,N
+PT1001,2026-06-15,Lactate,1.473,mmol/L,0.5,2.0,N
+PT1001,2026-06-15,Troponin,0.028,ng/mL,0.0,0.04,N
+PT1002,2026-06-15,WBC,9.094,10³/µL,4.5,11.0,N
+PT1002,2026-06-15,Hemoglobin,16.156,g/dL,12.0,17.5,N
+PT1002,2026-06-15,Platelets,251.797,10³/µL,150.0,400.0,N
+PT1002,2026-06-15,Sodium,137.859,mEq/L,136.0,145.0,N
+PT1002,2026-06-15,Potassium,4.036,mEq/L,3.5,5.0,N
+PT1002,2026-06-15,Creatinine,1.167,mg/dL,0.7,1.3,N
+PT1002,2026-06-15,BUN,6.461,mg/dL,7.0,25.0,L
+PT1002,2026-06-15,Glucose,67.004,mg/dL,70.0,100.0,L
+PT1002,2026-06-15,Lactate,1.351,mmol/L,0.5,2.0,N
+PT1002,2026-06-15,Troponin,0.03,ng/mL,0.0,0.04,N
+PT1003,2026-06-15,WBC,9.661,10³/µL,4.5,11.0,N
+PT1003,2026-06-15,Hemoglobin,13.181,g/dL,12.0,17.5,N
+PT1003,2026-06-15,Platelets,186.533,10³/µL,150.0,400.0,N
+PT1003,2026-06-15,Sodium,138.647,mEq/L,136.0,145.0,N
+PT1003,2026-06-15,Potassium,4.073,mEq/L,3.5,5.0,N
+PT1003,2026-06-15,Creatinine,0.94,mg/dL,0.7,1.3,N
+PT1003,2026-06-15,BUN,16.654,mg/dL,7.0,25.0,N
+PT1003,2026-06-15,Glucose,97.651,mg/dL,70.0,100.0,N
+PT1003,2026-06-15,Lactate,1.223,mmol/L,0.5,2.0,N
+PT1003,2026-06-15,Troponin,0.031,ng/mL,0.0,0.04,N
+PT1004,2026-06-15,WBC,9.027,10³/µL,4.5,11.0,N
+PT1004,2026-06-15,Hemoglobin,13.578,g/dL,12.0,17.5,N
+PT1004,2026-06-15,Platelets,323.232,10³/µL,150.0,400.0,N
+PT1004,2026-06-15,Sodium,142.051,mEq/L,136.0,145.0,N
+PT1004,2026-06-15,Potassium,4.25,mEq/L,3.5,5.0,N
+PT1004,2026-06-15,Creatinine,1.031,mg/dL,0.7,1.3,N
+PT1004,2026-06-15,BUN,15.688,mg/dL,7.0,25.0,N
+PT1004,2026-06-15,Glucose,75.172,mg/dL,70.0,100.0,N
+PT1004,2026-06-15,Lactate,2.315,mmol/L,0.5,2.0,H
+PT1004,2026-06-15,Troponin,0.033,ng/mL,0.0,0.04,N
+PT1005,2026-06-15,WBC,8.778,10³/µL,4.5,11.0,N
+PT1005,2026-06-15,Hemoglobin,14.081,g/dL,12.0,17.5,N
+PT1005,2026-06-15,Platelets,268.115,10³/µL,150.0,400.0,N
+PT1005,2026-06-15,Sodium,137.337,mEq/L,136.0,145.0,N
+PT1005,2026-06-15,Potassium,4.461,mEq/L,3.5,5.0,N
+PT1005,2026-06-15,Creatinine,1.061,mg/dL,0.7,1.3,N
+PT1005,2026-06-15,BUN,14.885,mg/dL,7.0,25.0,N
+PT1005,2026-06-15,Glucose,85.269,mg/dL,70.0,100.0,N
+PT1005,2026-06-15,Lactate,1.116,mmol/L,0.5,2.0,N
+PT1005,2026-06-15,Troponin,0.014,ng/mL,0.0,0.04,N
+PT1006,2026-06-15,WBC,6.236,10³/µL,4.5,11.0,N
+PT1006,2026-06-15,Hemoglobin,13.066,g/dL,12.0,17.5,N
+PT1006,2026-06-15,Platelets,222.357,10³/µL,150.0,400.0,N
+PT1006,2026-06-15,Sodium,138.812,mEq/L,136.0,145.0,N
+PT1006,2026-06-15,Potassium,4.74,mEq/L,3.5,5.0,N
+PT1006,2026-06-15,Creatinine,0.889,mg/dL,0.7,1.3,N
+PT1006,2026-06-15,BUN,5.016,mg/dL,7.0,25.0,L
+PT1006,2026-06-15,Glucose,87.625,mg/dL,70.0,100.0,N
+PT1006,2026-06-15,Lactate,1.531,mmol/L,0.5,2.0,N
+PT1006,2026-06-15,Troponin,0.032,ng/mL,0.0,0.04,N
+PT1007,2026-06-15,WBC,8.074,10³/µL,4.5,11.0,N
+PT1007,2026-06-15,Hemoglobin,12.869,g/dL,12.0,17.5,N
+PT1007,2026-06-15,Platelets,215.08,10³/µL,150.0,400.0,N
+PT1007,2026-06-15,Sodium,142.12,mEq/L,136.0,145.0,N
+PT1007,2026-06-15,Potassium,4.907,mEq/L,3.5,5.0,N
+PT1007,2026-06-15,Creatinine,0.794,mg/dL,0.7,1.3,N
+PT1007,2026-06-15,BUN,17.144,mg/dL,7.0,25.0,N
+PT1007,2026-06-15,Glucose,80.006,mg/dL,70.0,100.0,N
+PT1007,2026-06-15,Lactate,0.879,mmol/L,0.5,2.0,N
+PT1007,2026-06-15,Troponin,0.02,ng/mL,0.0,0.04,N
+PT1008,2026-06-15,WBC,7.489,10³/µL,4.5,11.0,N
+PT1008,2026-06-15,Hemoglobin,11.409,g/dL,12.0,17.5,L
+PT1008,2026-06-15,Platelets,290.119,10³/µL,150.0,400.0,N
+PT1008,2026-06-15,Sodium,141.386,mEq/L,136.0,145.0,N
+PT1008,2026-06-15,Potassium,4.586,mEq/L,3.5,5.0,N
+PT1008,2026-06-15,Creatinine,0.897,mg/dL,0.7,1.3,N
+PT1008,2026-06-15,BUN,7.426,mg/dL,7.0,25.0,N
+PT1008,2026-06-15,Glucose,81.208,mg/dL,70.0,100.0,N
+PT1008,2026-06-15,Lactate,1.568,mmol/L,0.5,2.0,N
+PT1008,2026-06-15,Troponin,0.019,ng/mL,0.0,0.04,N
+PT1009,2026-06-15,WBC,9.406,10³/µL,4.5,11.0,N
+PT1009,2026-06-15,Hemoglobin,12.604,g/dL,12.0,17.5,N
+PT1009,2026-06-15,Platelets,335.907,10³/µL,150.0,400.0,N
+PT1009,2026-06-15,Sodium,141.172,mEq/L,136.0,145.0,N
+PT1009,2026-06-15,Potassium,4.09,mEq/L,3.5,5.0,N
+PT1009,2026-06-15,Creatinine,1.193,mg/dL,0.7,1.3,N
+PT1009,2026-06-15,BUN,17.296,mg/dL,7.0,25.0,N
+PT1009,2026-06-15,Glucose,76.142,mg/dL,70.0,100.0,N
+PT1009,2026-06-15,Lactate,1.692,mmol/L,0.5,2.0,N
+PT1009,2026-06-15,Troponin,0.017,ng/mL,0.0,0.04,N
+PT1010,2026-06-15,WBC,7.822,10³/µL,4.5,11.0,N
+PT1010,2026-06-15,Hemoglobin,13.326,g/dL,12.0,17.5,N
+PT1010,2026-06-15,Platelets,271.124,10³/µL,150.0,400.0,N
+PT1010,2026-06-15,Sodium,137.946,mEq/L,136.0,145.0,N
+PT1010,2026-06-15,Potassium,4.173,mEq/L,3.5,5.0,N
+PT1010,2026-06-15,Creatinine,1.006,mg/dL,0.7,1.3,N
+PT1010,2026-06-15,BUN,19.271,mg/dL,7.0,25.0,N
+PT1010,2026-06-15,Glucose,72.341,mg/dL,70.0,100.0,N
+PT1010,2026-06-15,Lactate,1.701,mmol/L,0.5,2.0,N
+PT1010,2026-06-15,Troponin,0.032,ng/mL,0.0,0.04,N
+PT1011,2026-06-15,WBC,7.381,10³/µL,4.5,11.0,N
+PT1011,2026-06-15,Hemoglobin,14.963,g/dL,12.0,17.5,N
+PT1011,2026-06-15,Platelets,297.989,10³/µL,150.0,400.0,N
+PT1011,2026-06-15,Sodium,140.725,mEq/L,136.0,145.0,N
+PT1011,2026-06-15,Potassium,4.522,mEq/L,3.5,5.0,N
+PT1011,2026-06-15,Creatinine,0.93,mg/dL,0.7,1.3,N
+PT1011,2026-06-15,BUN,11.895,mg/dL,7.0,25.0,N
+PT1011,2026-06-15,Glucose,88.854,mg/dL,70.0,100.0,N
+PT1011,2026-06-15,Lactate,0.563,mmol/L,0.5,2.0,N
+PT1011,2026-06-15,Troponin,0.027,ng/mL,0.0,0.04,N
+PT1012,2026-06-15,WBC,9.159,10³/µL,4.5,11.0,N
+PT1012,2026-06-15,Hemoglobin,13.459,g/dL,12.0,17.5,N
+PT1012,2026-06-15,Platelets,381.657,10³/µL,150.0,400.0,N
+PT1012,2026-06-15,Sodium,139.552,mEq/L,136.0,145.0,N
+PT1012,2026-06-15,Potassium,4.053,mEq/L,3.5,5.0,N
+PT1012,2026-06-15,Creatinine,0.882,mg/dL,0.7,1.3,N
+PT1012,2026-06-15,BUN,18.42,mg/dL,7.0,25.0,N
+PT1012,2026-06-15,Glucose,81.478,mg/dL,70.0,100.0,N
+PT1012,2026-06-15,Lactate,0.603,mmol/L,0.5,2.0,N
+PT1012,2026-06-15,Troponin,0.024,ng/mL,0.0,0.04,N
+PT1013,2026-06-15,WBC,7.182,10³/µL,4.5,11.0,N
+PT1013,2026-06-15,Hemoglobin,16.542,g/dL,12.0,17.5,N
+PT1013,2026-06-15,Platelets,298.158,10³/µL,150.0,400.0,N
+PT1013,2026-06-15,Sodium,141.219,mEq/L,136.0,145.0,N
+PT1013,2026-06-15,Potassium,4.707,mEq/L,3.5,5.0,N
+PT1013,2026-06-15,Creatinine,1.029,mg/dL,0.7,1.3,N
+PT1013,2026-06-15,BUN,20.224,mg/dL,7.0,25.0,N
+PT1013,2026-06-15,Glucose,79.151,mg/dL,70.0,100.0,N
+PT1013,2026-06-15,Lactate,1.991,mmol/L,0.5,2.0,N
+PT1013,2026-06-15,Troponin,0.023,ng/mL,0.0,0.04,N
+PT1014,2026-06-15,WBC,5.407,10³/µL,4.5,11.0,N
+PT1014,2026-06-15,Hemoglobin,14.977,g/dL,12.0,17.5,N
+PT1014,2026-06-15,Platelets,289.0,10³/µL,150.0,400.0,N
+PT1014,2026-06-15,Sodium,140.837,mEq/L,136.0,145.0,N
+PT1014,2026-06-15,Potassium,3.215,mEq/L,3.5,5.0,L
+PT1014,2026-06-15,Creatinine,0.901,mg/dL,0.7,1.3,N
+PT1014,2026-06-15,BUN,8.533,mg/dL,7.0,25.0,N
+PT1014,2026-06-15,Glucose,72.685,mg/dL,70.0,100.0,N
+PT1014,2026-06-15,Lactate,1.325,mmol/L,0.5,2.0,N
+PT1014,2026-06-15,Troponin,0.013,ng/mL,0.0,0.04,N
+PT1015,2026-06-15,WBC,7.041,10³/µL,4.5,11.0,N
+PT1015,2026-06-15,Hemoglobin,13.273,g/dL,12.0,17.5,N
+PT1015,2026-06-15,Platelets,378.448,10³/µL,150.0,400.0,N
+PT1015,2026-06-15,Sodium,140.608,mEq/L,136.0,145.0,N
+PT1015,2026-06-15,Potassium,3.565,mEq/L,3.5,5.0,N
+PT1015,2026-06-15,Creatinine,1.116,mg/dL,0.7,1.3,N
+PT1015,2026-06-15,BUN,14.15,mg/dL,7.0,25.0,N
+PT1015,2026-06-15,Glucose,95.743,mg/dL,70.0,100.0,N
+PT1015,2026-06-15,Lactate,1.246,mmol/L,0.5,2.0,N
+PT1015,2026-06-15,Troponin,0.012,ng/mL,0.0,0.04,N
+PT1016,2026-06-15,WBC,6.693,10³/µL,4.5,11.0,N
+PT1016,2026-06-15,Hemoglobin,14.086,g/dL,12.0,17.5,N
+PT1016,2026-06-15,Platelets,311.732,10³/µL,150.0,400.0,N
+PT1016,2026-06-15,Sodium,138.38,mEq/L,136.0,145.0,N
+PT1016,2026-06-15,Potassium,4.81,mEq/L,3.5,5.0,N
+PT1016,2026-06-15,Creatinine,1.066,mg/dL,0.7,1.3,N
+PT1016,2026-06-15,BUN,17.212,mg/dL,7.0,25.0,N
+PT1016,2026-06-15,Glucose,85.657,mg/dL,70.0,100.0,N
+PT1016,2026-06-15,Lactate,1.241,mmol/L,0.5,2.0,N
+PT1016,2026-06-15,Troponin,0.005,ng/mL,0.0,0.04,N
+PT1017,2026-06-15,WBC,8.32,10³/µL,4.5,11.0,N
+PT1017,2026-06-15,Hemoglobin,17.927,g/dL,12.0,17.5,H
+PT1017,2026-06-15,Platelets,326.887,10³/µL,150.0,400.0,N
+PT1017,2026-06-15,Sodium,141.684,mEq/L,136.0,145.0,N
+PT1017,2026-06-15,Potassium,3.559,mEq/L,3.5,5.0,N
+PT1017,2026-06-15,Creatinine,1.196,mg/dL,0.7,1.3,N
+PT1017,2026-06-15,BUN,20.334,mg/dL,7.0,25.0,N
+PT1017,2026-06-15,Glucose,95.507,mg/dL,70.0,100.0,N
+PT1017,2026-06-15,Lactate,0.843,mmol/L,0.5,2.0,N
+PT1017,2026-06-15,Troponin,0.015,ng/mL,0.0,0.04,N
+PT1018,2026-06-15,WBC,4.853,10³/µL,4.5,11.0,N
+PT1018,2026-06-15,Hemoglobin,12.159,g/dL,12.0,17.5,N
+PT1018,2026-06-15,Platelets,231.731,10³/µL,150.0,400.0,N
+PT1018,2026-06-15,Sodium,141.763,mEq/L,136.0,145.0,N
+PT1018,2026-06-15,Potassium,4.063,mEq/L,3.5,5.0,N
+PT1018,2026-06-15,Creatinine,0.88,mg/dL,0.7,1.3,N
+PT1018,2026-06-15,BUN,17.833,mg/dL,7.0,25.0,N
+PT1018,2026-06-15,Glucose,55.821,mg/dL,70.0,100.0,L
+PT1018,2026-06-15,Lactate,1.006,mmol/L,0.5,2.0,N
+PT1018,2026-06-15,Troponin,0.024,ng/mL,0.0,0.04,N
+PT1019,2026-06-15,WBC,6.963,10³/µL,4.5,11.0,N
+PT1019,2026-06-15,Hemoglobin,16.894,g/dL,12.0,17.5,N
+PT1019,2026-06-15,Platelets,225.403,10³/µL,150.0,400.0,N
+PT1019,2026-06-15,Sodium,138.901,mEq/L,136.0,145.0,N
+PT1019,2026-06-15,Potassium,3.806,mEq/L,3.5,5.0,N
+PT1019,2026-06-15,Creatinine,0.864,mg/dL,0.7,1.3,N
+PT1019,2026-06-15,BUN,17.496,mg/dL,7.0,25.0,N
+PT1019,2026-06-15,Glucose,92.273,mg/dL,70.0,100.0,N
+PT1019,2026-06-15,Lactate,2.22,mmol/L,0.5,2.0,H
+PT1019,2026-06-15,Troponin,0.027,ng/mL,0.0,0.04,N
+PT1020,2026-06-15,WBC,5.453,10³/µL,4.5,11.0,N
+PT1020,2026-06-15,Hemoglobin,16.799,g/dL,12.0,17.5,N
+PT1020,2026-06-15,Platelets,311.535,10³/µL,150.0,400.0,N
+PT1020,2026-06-15,Sodium,140.577,mEq/L,136.0,145.0,N
+PT1020,2026-06-15,Potassium,4.73,mEq/L,3.5,5.0,N
+PT1020,2026-06-15,Creatinine,1.426,mg/dL,0.7,1.3,H
+PT1020,2026-06-15,BUN,14.979,mg/dL,7.0,25.0,N
+PT1020,2026-06-15,Glucose,77.503,mg/dL,70.0,100.0,N
+PT1020,2026-06-15,Lactate,1.847,mmol/L,0.5,2.0,N
+PT1020,2026-06-15,Troponin,0.052,ng/mL,0.0,0.04,H
diff --git a/medical-imaging-demo/data/patients.csv b/medical-imaging-demo/data/patients.csv
new file mode 100644
index 0000000..888ce80
--- /dev/null
+++ b/medical-imaging-demo/data/patients.csv
@@ -0,0 +1,61 @@
+patient_id,name,age,gender,diagnosis,ward,department,admitted_date,los_days,risk_score,sepsis_risk,fall_risk,readmit_risk,deterioration_risk,is_icu
+PT1001,Mark White,82,M,Trauma,ICU,Pulmonology,2026-06-03,7,41.6,7.3,47.3,11.1,36.9,True
+PT1002,Robert Jones,72,M,Acute MI,MICU,Cardiology,2026-06-07,2,12.5,4.9,17.3,52.1,13.3,True
+PT1003,Matthew Nelson,61,M,Cellulitis,CCU,Pulmonology,2026-06-15,5,32.5,6.9,8.2,33.6,21.8,True
+PT1004,Daniel Allen,83,F,Acute MI,ICU,Neurology,2026-06-12,8,55.2,15.0,28.8,73.9,14.1,True
+PT1005,Charles Hall,49,F,Pulmonary Embolism,MICU,Surgery,2026-06-14,9,34.7,7.7,16.5,14.2,43.2,True
+PT1006,Nancy Wilson,73,M,Atrial Fibrillation,MICU,Cardiology,2026-06-10,4,51.9,11.3,33.3,44.5,29.2,True
+PT1007,Jessica Harris,80,F,Cellulitis,Step-Down,Neurology,2026-06-04,12,6.9,3.2,14.6,54.3,2.0,False
+PT1008,Anthony Allen,30,M,COPD Exacerbation,ED Obs,Neurology,2026-06-03,4,26.9,20.5,44.1,9.6,24.6,False
+PT1009,Charles Hall,43,F,Atrial Fibrillation,ICU,Nephrology,2026-06-06,13,40.6,22.7,60.2,24.5,24.2,True
+PT1010,Robert Thompson,46,F,Respiratory Failure,Step-Down,Nephrology,2026-06-10,3,17.8,4.3,32.0,43.7,11.7,False
+PT1011,Jessica Jackson,36,F,Sepsis,General Med,Pulmonology,2026-06-07,6,25.1,13.2,2.4,31.6,30.6,False
+PT1012,Betty Walker,83,M,Respiratory Failure,Step-Down,Cardiology,2026-06-12,5,4.1,21.5,66.6,23.8,25.6,False
+PT1013,Karen Moore,40,F,Pneumonia,ED Obs,Surgery,2026-06-13,4,25.4,32.5,18.1,43.5,14.1,False
+PT1014,Barbara Scott,55,M,GI Bleed,Step-Down,Oncology,2026-06-04,10,34.1,21.5,15.7,23.4,9.6,False
+PT1015,Sandra Lewis,34,M,COPD Exacerbation,ED Obs,Cardiology,2026-06-04,12,43.5,36.4,22.3,19.5,11.5,False
+PT1016,Betty Anderson,38,M,Stroke,General Med,Oncology,2026-06-14,13,32.2,1.9,15.9,58.2,4.0,False
+PT1017,Sarah Baker,79,F,Diabetic Ketoacidosis,Step-Down,Surgery,2026-06-15,9,28.4,5.9,3.0,21.6,12.0,False
+PT1018,Robert Harris,78,M,Diabetic Ketoacidosis,General Med,Pulmonology,2026-06-08,6,67.1,0.8,15.8,11.5,1.9,False
+PT1019,Daniel King,54,F,Pneumonia,ICU,Pulmonology,2026-06-15,1,55.3,6.6,15.7,43.5,9.5,True
+PT1020,James Martin,53,F,Diabetic Ketoacidosis,CCU,Oncology,2026-06-08,7,15.8,10.7,11.7,39.3,1.0,True
+PT1021,Jennifer Smith,51,M,Pulmonary Embolism,Step-Down,Neurology,2026-06-01,5,14.4,1.5,53.8,60.3,30.0,False
+PT1022,Charles Young,42,M,Sepsis,General Med,General Medicine,2026-06-10,13,32.0,5.5,13.4,37.5,14.2,False
+PT1023,Betty Jackson,80,F,COPD Exacerbation,General Med,Oncology,2026-06-03,7,56.2,1.8,21.8,41.9,21.1,False
+PT1024,Charles Moore,62,M,Stroke,General Med,General Medicine,2026-06-10,2,45.9,24.6,32.7,53.7,0.7,False
+PT1025,Patricia Young,41,M,Diabetic Ketoacidosis,ED Obs,Oncology,2026-06-01,10,22.0,38.2,32.9,67.0,16.9,False
+PT1026,Mary Anderson,56,M,UTI,ED Obs,Nephrology,2026-06-12,13,35.8,20.1,38.3,5.9,9.0,False
+PT1027,Susan Walker,72,M,COPD Exacerbation,Step-Down,Nephrology,2026-06-06,3,4.9,11.2,22.8,32.2,33.1,False
+PT1028,Nancy White,50,F,Acute MI,MICU,Surgery,2026-06-15,4,31.4,1.7,19.4,12.8,34.3,True
+PT1029,Margaret Scott,30,F,COPD Exacerbation,MICU,Surgery,2026-06-14,8,25.5,6.4,3.4,22.5,8.6,True
+PT1030,Anthony Young,75,F,GI Bleed,ICU,Oncology,2026-06-04,6,11.5,18.2,17.1,28.2,22.7,True
+PT1031,Charles Thompson,22,F,COPD Exacerbation,General Med,Oncology,2026-06-02,2,2.6,13.0,32.7,15.8,24.7,False
+PT1032,Charles Smith,29,F,COPD Exacerbation,General Med,Nephrology,2026-06-08,14,14.0,22.0,40.0,12.8,1.9,False
+PT1033,Mary Walker,65,M,Heart Failure,General Med,Pulmonology,2026-06-06,12,41.5,35.7,7.7,5.2,8.2,False
+PT1034,Jennifer Green,61,F,Diabetic Ketoacidosis,ED Obs,Surgery,2026-06-09,5,9.1,23.8,25.3,8.7,20.0,False
+PT1035,Karen Young,83,M,Cellulitis,ICU,Neurology,2026-06-02,9,19.4,39.2,25.4,3.4,3.8,True
+PT1036,Christopher Martin,46,F,GI Bleed,General Med,General Medicine,2026-06-15,11,37.4,19.5,39.6,6.9,3.3,False
+PT1037,Thomas Brown,46,M,Sepsis,Step-Down,Cardiology,2026-06-13,10,16.4,21.8,26.9,16.3,20.7,False
+PT1038,Joseph Martin,89,F,Hypertensive Crisis,ICU,Pulmonology,2026-06-05,13,33.2,14.2,19.3,22.3,11.6,True
+PT1039,Karen Scott,82,M,Pulmonary Embolism,General Med,Neurology,2026-06-02,2,40.7,4.7,39.7,29.9,47.3,False
+PT1040,Betty Thompson,58,F,Cellulitis,General Med,General Medicine,2026-06-05,13,52.6,3.7,8.6,27.2,18.1,False
+PT1041,William Thomas,79,M,COPD Exacerbation,MICU,Oncology,2026-06-07,10,36.8,5.9,39.0,21.8,42.5,True
+PT1042,Margaret White,58,M,Stroke,Step-Down,General Medicine,2026-06-04,4,38.6,3.1,7.7,19.8,23.4,False
+PT1043,Mark Taylor,53,F,Respiratory Failure,General Med,Nephrology,2026-06-04,6,7.3,10.3,44.2,63.9,5.5,False
+PT1044,Karen Jackson,36,M,Atrial Fibrillation,ED Obs,Nephrology,2026-06-07,1,36.7,3.3,23.7,15.0,30.0,False
+PT1045,Elizabeth Wright,67,F,Respiratory Failure,MICU,Nephrology,2026-06-06,12,35.8,14.6,20.6,27.3,14.8,True
+PT1046,Michael Wilson,29,F,Sepsis,ED Obs,General Medicine,2026-06-14,4,39.2,22.2,64.2,6.9,20.4,False
+PT1047,Joseph Smith,28,F,Pneumonia,ICU,Nephrology,2026-06-05,10,59.8,9.7,69.1,14.8,3.3,True
+PT1048,Elizabeth Jackson,23,M,Acute MI,MICU,Surgery,2026-06-06,13,17.9,7.4,19.3,40.0,37.4,True
+PT1049,Elizabeth Nelson,22,M,Heart Failure,General Med,Neurology,2026-06-12,1,58.1,1.4,23.8,58.7,21.7,False
+PT1050,Sarah King,64,F,Sepsis,Step-Down,Cardiology,2026-06-02,13,9.6,35.5,7.8,34.5,10.0,False
+PT1051,Christopher Harris,90,M,Pulmonary Embolism,General Med,Nephrology,2026-06-12,2,44.6,17.8,32.4,48.9,7.4,False
+PT1052,Thomas Martin,56,F,Stroke,General Med,Pulmonology,2026-06-11,3,45.8,20.2,35.1,71.2,32.0,False
+PT1053,Joseph Wright,57,M,COPD Exacerbation,ICU,Oncology,2026-06-04,5,8.9,21.1,35.0,33.2,6.6,True
+PT1054,Elizabeth King,66,F,Respiratory Failure,General Med,Neurology,2026-06-13,7,18.8,20.6,19.2,27.9,28.6,False
+PT1055,Elizabeth Johnson,54,M,Acute MI,CCU,Cardiology,2026-06-06,5,7.7,42.8,66.1,44.4,42.9,True
+PT1056,Patricia Thomas,70,F,Sepsis,Step-Down,General Medicine,2026-06-05,12,8.4,21.0,19.0,34.9,4.4,False
+PT1057,Jessica Anderson,38,F,Diabetic Ketoacidosis,General Med,General Medicine,2026-06-03,14,18.1,27.8,22.1,48.3,6.1,False
+PT1058,Daniel Scott,89,F,Trauma,Step-Down,Nephrology,2026-06-03,6,36.3,11.2,28.7,15.5,14.9,False
+PT1059,Mark Lewis,24,M,GI Bleed,General Med,Nephrology,2026-06-09,13,33.6,36.6,22.7,13.0,17.2,False
+PT1060,Charles Miller,37,F,Pneumonia,Step-Down,General Medicine,2026-06-04,7,26.8,5.8,47.1,51.5,4.8,False
diff --git a/medical-imaging-demo/data/studies.csv b/medical-imaging-demo/data/studies.csv
new file mode 100644
index 0000000..9dd92e8
--- /dev/null
+++ b/medical-imaging-demo/data/studies.csv
@@ -0,0 +1,9 @@
+study_id,patient_id,patient_name,age,gender,view_position,finding_labels,study_date,accession,image_file,referrer
+ST0001,PT1001,Mark White,45,M,PA,No Finding,2026-06-15,ACC515886,xray_01.png,Dr. Smith
+ST0002,PT1002,Robert Jones,67,F,PA,Cardiomegaly,2026-06-15,ACC382218,xray_02.png,Dr. Baker
+ST0003,PT1003,Matthew Nelson,72,M,AP,Pleural Effusion|Cardiomegaly,2026-06-15,ACC381137,xray_03.png,Dr. Williams
+ST0004,PT1004,Daniel Allen,58,F,PA,Pneumonia|Consolidation,2026-06-15,ACC526207,xray_04.png,Dr. Baker
+ST0005,PT1005,Charles Hall,81,M,AP,Atelectasis,2026-06-15,ACC802856,xray_05.png,Dr. King
+ST0006,PT1006,Nancy Wilson,63,F,PA,Nodule,2026-06-15,ACC224291,xray_06.png,Dr. King
+ST0007,PT1007,Jessica Harris,34,M,AP,Pneumothorax,2026-06-15,ACC124300,xray_07.png,Dr. Wilson
+ST0008,PT1008,Anthony Allen,69,F,PA,Mass,2026-06-15,ACC206818,xray_08.png,Dr. Harris
diff --git a/medical-imaging-demo/data/vitals.csv b/medical-imaging-demo/data/vitals.csv
new file mode 100644
index 0000000..c6a7082
--- /dev/null
+++ b/medical-imaging-demo/data/vitals.csv
@@ -0,0 +1,2305 @@
+patient_id,timestamp,HR,SpO2,Temp,SysBP,DiaBP,RR
+PT1001,2026-06-14 00:00:00,70.7,98.9,37.4,119.6,76.7,13.5
+PT1001,2026-06-14 00:15:00,70.2,98.6,37.1,120.6,74.6,13.2
+PT1001,2026-06-14 00:30:00,72.8,98.5,37.2,119.7,75.7,12.7
+PT1001,2026-06-14 00:45:00,74.3,98.4,37.0,121.7,76.1,12.4
+PT1001,2026-06-14 01:00:00,73.8,98.4,36.4,122.1,77.0,12.6
+PT1001,2026-06-14 01:15:00,73.7,98.0,37.1,121.5,76.8,13.0
+PT1001,2026-06-14 01:30:00,74.0,98.2,37.1,124.0,76.7,13.1
+PT1001,2026-06-14 01:45:00,73.3,98.0,37.5,119.4,75.0,12.4
+PT1001,2026-06-14 02:00:00,73.5,98.0,37.2,118.0,75.1,12.0
+PT1001,2026-06-14 02:15:00,73.8,97.8,36.9,116.2,76.5,12.0
+PT1001,2026-06-14 02:30:00,73.4,97.5,37.8,116.1,77.8,12.0
+PT1001,2026-06-14 02:45:00,73.9,97.6,36.5,114.3,77.4,11.7
+PT1001,2026-06-14 03:00:00,75.0,97.4,37.0,112.7,77.7,11.9
+PT1001,2026-06-14 03:15:00,75.0,97.6,36.7,112.0,78.2,11.2
+PT1001,2026-06-14 03:30:00,75.7,97.3,36.9,112.5,78.0,11.1
+PT1001,2026-06-14 03:45:00,76.8,97.8,36.7,113.1,78.4,10.8
+PT1001,2026-06-14 04:00:00,76.7,97.5,36.8,109.6,79.7,11.1
+PT1001,2026-06-14 04:15:00,77.0,97.8,37.5,110.0,77.9,11.0
+PT1001,2026-06-14 04:30:00,77.3,97.9,37.2,110.6,76.6,10.8
+PT1001,2026-06-14 04:45:00,78.2,98.2,36.8,108.9,77.2,11.3
+PT1001,2026-06-14 05:00:00,80.0,98.6,37.3,114.2,77.6,11.4
+PT1001,2026-06-14 05:15:00,80.9,98.9,36.8,115.7,77.4,11.8
+PT1001,2026-06-14 05:30:00,80.9,99.3,37.2,113.2,76.4,12.1
+PT1001,2026-06-14 05:45:00,79.8,99.2,37.6,110.9,77.9,12.0
+PT1001,2026-06-14 06:00:00,79.8,99.1,37.9,110.3,77.5,12.1
+PT1001,2026-06-14 06:15:00,79.4,99.0,37.2,110.4,79.1,11.5
+PT1001,2026-06-14 06:30:00,78.4,99.2,37.2,109.4,75.7,11.6
+PT1001,2026-06-14 06:45:00,77.6,99.0,36.8,106.8,76.8,12.0
+PT1001,2026-06-14 07:00:00,77.0,99.0,37.2,111.3,77.7,11.6
+PT1001,2026-06-14 07:15:00,75.3,99.2,36.9,114.7,80.2,11.9
+PT1001,2026-06-14 07:30:00,73.7,98.8,37.4,109.1,81.2,11.9
+PT1001,2026-06-14 07:45:00,75.4,98.8,37.3,109.3,80.5,11.7
+PT1001,2026-06-14 08:00:00,75.2,98.7,37.1,109.3,81.9,11.5
+PT1001,2026-06-14 08:15:00,75.5,99.0,37.4,108.8,80.8,11.3
+PT1001,2026-06-14 08:30:00,77.9,98.7,37.3,106.6,80.5,11.3
+PT1001,2026-06-14 08:45:00,76.8,98.4,37.2,106.9,80.1,11.7
+PT1001,2026-06-14 09:00:00,77.4,98.4,36.7,111.6,78.9,11.9
+PT1001,2026-06-14 09:15:00,76.1,98.3,37.2,114.9,79.3,11.7
+PT1001,2026-06-14 09:30:00,76.1,98.1,37.8,112.1,81.4,11.8
+PT1001,2026-06-14 09:45:00,77.2,98.3,36.8,111.2,79.8,11.7
+PT1001,2026-06-14 10:00:00,78.0,98.7,37.0,110.7,81.2,11.4
+PT1001,2026-06-14 10:15:00,77.0,98.2,37.3,110.6,81.4,11.8
+PT1001,2026-06-14 10:30:00,77.9,97.9,37.6,111.5,83.8,12.0
+PT1001,2026-06-14 10:45:00,80.3,97.8,36.9,110.2,82.6,11.4
+PT1001,2026-06-14 11:00:00,81.7,97.3,36.9,108.1,82.4,11.0
+PT1001,2026-06-14 11:15:00,81.1,97.2,37.4,106.6,81.2,11.4
+PT1001,2026-06-14 11:30:00,79.4,96.6,36.6,108.7,79.4,11.5
+PT1001,2026-06-14 11:45:00,80.9,97.2,37.3,109.1,79.2,11.4
+PT1001,2026-06-14 12:00:00,81.5,97.5,36.8,107.9,79.8,11.1
+PT1001,2026-06-14 12:15:00,81.4,97.2,36.9,110.2,78.5,11.3
+PT1001,2026-06-14 12:30:00,81.7,97.1,37.2,107.7,79.2,11.2
+PT1001,2026-06-14 12:45:00,81.1,96.8,37.1,109.9,80.3,11.0
+PT1001,2026-06-14 13:00:00,82.4,96.7,37.4,109.2,80.7,10.8
+PT1001,2026-06-14 13:15:00,82.1,96.5,37.6,110.5,78.9,11.6
+PT1001,2026-06-14 13:30:00,82.7,96.6,36.8,111.2,78.2,11.7
+PT1001,2026-06-14 13:45:00,83.2,96.8,37.5,110.5,77.3,11.2
+PT1001,2026-06-14 14:00:00,82.5,96.8,37.0,111.1,77.7,11.5
+PT1001,2026-06-14 14:15:00,81.1,96.5,37.5,109.9,76.3,11.4
+PT1001,2026-06-14 14:30:00,80.6,96.4,37.3,109.9,75.7,11.4
+PT1001,2026-06-14 14:45:00,81.6,96.7,36.9,114.0,76.6,12.3
+PT1001,2026-06-14 15:00:00,84.1,96.6,37.1,113.4,76.4,12.2
+PT1001,2026-06-14 15:15:00,83.3,96.8,37.0,112.3,77.4,12.8
+PT1001,2026-06-14 15:30:00,84.2,96.9,36.6,116.8,76.6,13.1
+PT1001,2026-06-14 15:45:00,83.6,97.0,37.1,119.6,74.8,13.4
+PT1001,2026-06-14 16:00:00,81.7,97.1,36.8,123.0,73.1,13.4
+PT1001,2026-06-14 16:15:00,81.1,97.4,37.0,122.5,75.2,13.8
+PT1001,2026-06-14 16:30:00,80.4,97.2,36.9,120.6,75.7,13.8
+PT1001,2026-06-14 16:45:00,78.5,97.3,36.3,119.7,75.4,13.9
+PT1001,2026-06-14 17:00:00,76.7,97.8,37.8,118.7,71.6,13.3
+PT1001,2026-06-14 17:15:00,75.8,98.1,36.4,118.9,70.9,13.7
+PT1001,2026-06-14 17:30:00,74.1,98.0,37.1,116.2,70.0,14.0
+PT1001,2026-06-14 17:45:00,75.6,98.1,37.5,118.2,70.0,13.8
+PT1001,2026-06-14 18:00:00,74.8,98.2,37.4,119.8,71.2,13.3
+PT1001,2026-06-14 18:15:00,73.6,98.4,37.3,120.8,72.4,12.8
+PT1001,2026-06-14 18:30:00,74.9,98.4,36.6,119.2,73.8,12.9
+PT1001,2026-06-14 18:45:00,73.8,98.3,37.2,122.2,75.8,13.4
+PT1001,2026-06-14 19:00:00,74.9,98.0,37.2,122.2,76.5,13.0
+PT1001,2026-06-14 19:15:00,76.9,98.1,37.0,124.1,72.8,13.6
+PT1001,2026-06-14 19:30:00,75.9,98.1,36.9,121.1,74.4,13.5
+PT1001,2026-06-14 19:45:00,75.7,98.4,36.8,121.3,72.3,13.6
+PT1001,2026-06-14 20:00:00,73.1,98.7,37.5,122.3,72.2,13.5
+PT1001,2026-06-14 20:15:00,76.8,98.9,36.4,120.2,71.9,13.7
+PT1001,2026-06-14 20:30:00,77.2,99.0,37.6,122.9,73.8,13.7
+PT1001,2026-06-14 20:45:00,79.6,99.0,36.8,123.7,71.1,13.1
+PT1001,2026-06-14 21:00:00,79.0,98.7,37.0,123.6,70.5,13.6
+PT1001,2026-06-14 21:15:00,76.3,98.7,36.8,123.6,69.2,13.6
+PT1001,2026-06-14 21:30:00,76.6,99.4,37.0,120.0,68.4,13.3
+PT1001,2026-06-14 21:45:00,77.8,99.5,36.8,121.7,68.5,12.8
+PT1001,2026-06-14 22:00:00,78.7,99.6,36.9,124.2,68.9,12.3
+PT1001,2026-06-14 22:15:00,79.3,99.7,37.0,125.9,67.3,11.8
+PT1001,2026-06-14 22:30:00,81.0,99.5,37.6,126.8,68.0,12.2
+PT1001,2026-06-14 22:45:00,82.9,99.4,37.0,122.6,67.0,12.2
+PT1001,2026-06-14 23:00:00,85.2,99.4,36.5,123.9,67.3,12.0
+PT1001,2026-06-14 23:15:00,85.0,100.0,37.3,121.4,64.6,12.8
+PT1001,2026-06-14 23:30:00,85.2,100.0,37.7,119.8,64.4,13.2
+PT1001,2026-06-14 23:45:00,83.7,100.0,36.7,120.5,64.7,13.2
+PT1001,2026-06-15 00:00:00,84.8,99.8,37.1,118.4,66.0,13.5
+PT1001,2026-06-15 00:15:00,86.0,100.0,37.2,121.0,65.2,13.9
+PT1001,2026-06-15 00:30:00,88.0,100.0,37.2,120.3,64.3,14.0
+PT1001,2026-06-15 00:45:00,88.5,100.0,36.8,121.6,64.0,13.6
+PT1001,2026-06-15 01:00:00,89.6,100.0,36.9,117.9,65.6,14.4
+PT1001,2026-06-15 01:15:00,89.9,99.9,37.4,119.2,63.9,14.4
+PT1001,2026-06-15 01:30:00,91.3,100.0,37.0,118.5,61.5,14.1
+PT1001,2026-06-15 01:45:00,90.4,100.0,37.0,117.8,61.7,14.5
+PT1001,2026-06-15 02:00:00,88.6,99.8,37.5,119.0,62.7,14.7
+PT1001,2026-06-15 02:15:00,88.3,100.0,36.9,120.6,59.0,15.4
+PT1001,2026-06-15 02:30:00,87.0,100.0,37.3,117.1,57.9,16.1
+PT1001,2026-06-15 02:45:00,87.9,99.8,37.4,114.1,59.0,16.4
+PT1001,2026-06-15 03:00:00,88.1,99.6,37.0,118.9,59.7,16.4
+PT1001,2026-06-15 03:15:00,88.2,99.8,37.1,119.3,61.0,16.4
+PT1001,2026-06-15 03:30:00,88.9,100.0,37.1,119.0,59.9,16.6
+PT1001,2026-06-15 03:45:00,88.1,99.8,36.9,119.8,60.7,16.4
+PT1001,2026-06-15 04:00:00,87.0,99.9,36.4,118.2,64.0,16.2
+PT1001,2026-06-15 04:15:00,86.9,99.8,37.0,120.4,64.5,15.9
+PT1001,2026-06-15 04:30:00,87.3,99.3,37.2,123.1,63.2,16.5
+PT1001,2026-06-15 04:45:00,87.9,99.6,37.2,124.2,64.2,16.4
+PT1001,2026-06-15 05:00:00,87.1,99.5,37.1,128.2,63.0,16.5
+PT1001,2026-06-15 05:15:00,86.7,99.6,36.8,129.3,61.6,16.5
+PT1001,2026-06-15 05:30:00,87.6,99.6,37.4,129.5,62.6,16.4
+PT1001,2026-06-15 05:45:00,86.4,100.0,37.0,128.4,60.1,16.3
+PT1001,2026-06-15 06:00:00,85.9,100.0,36.8,130.6,59.8,16.0
+PT1001,2026-06-15 06:15:00,85.2,99.5,37.3,129.2,61.7,15.7
+PT1001,2026-06-15 06:30:00,83.7,100.0,37.2,132.8,62.6,16.5
+PT1001,2026-06-15 06:45:00,84.6,100.0,37.0,133.2,60.2,16.8
+PT1001,2026-06-15 07:00:00,84.0,100.0,36.9,134.3,60.4,17.0
+PT1001,2026-06-15 07:15:00,83.9,100.0,37.4,137.9,63.6,17.2
+PT1001,2026-06-15 07:30:00,86.2,99.8,36.8,139.1,64.8,17.8
+PT1001,2026-06-15 07:45:00,85.0,99.8,37.1,139.9,66.5,18.0
+PT1001,2026-06-15 08:00:00,85.5,99.9,37.2,143.4,66.7,17.8
+PT1001,2026-06-15 08:15:00,85.6,99.5,37.4,143.3,66.6,17.6
+PT1001,2026-06-15 08:30:00,84.6,99.6,36.7,143.0,66.7,17.8
+PT1001,2026-06-15 08:45:00,84.8,100.0,37.2,139.9,66.6,18.2
+PT1001,2026-06-15 09:00:00,85.6,99.4,37.1,141.1,65.5,18.4
+PT1001,2026-06-15 09:15:00,88.2,99.5,37.3,140.9,63.2,18.4
+PT1001,2026-06-15 09:30:00,88.1,99.4,37.5,139.8,64.0,18.7
+PT1001,2026-06-15 09:45:00,86.8,99.5,37.2,139.5,63.9,18.9
+PT1001,2026-06-15 10:00:00,87.3,99.3,37.2,138.0,66.1,18.8
+PT1001,2026-06-15 10:15:00,88.5,99.4,37.0,139.1,67.5,17.9
+PT1001,2026-06-15 10:30:00,89.0,99.7,37.4,139.2,66.2,17.6
+PT1001,2026-06-15 10:45:00,88.7,99.7,36.9,140.5,61.9,18.4
+PT1001,2026-06-15 11:00:00,88.9,99.3,37.4,139.6,63.7,17.6
+PT1001,2026-06-15 11:15:00,88.5,99.4,37.0,140.9,64.4,17.3
+PT1001,2026-06-15 11:30:00,86.6,99.5,37.0,144.3,61.6,17.0
+PT1001,2026-06-15 11:45:00,86.8,99.7,37.3,144.0,61.2,17.4
+PT1001,2026-06-15 12:00:00,87.3,99.7,37.3,146.0,60.2,17.1
+PT1001,2026-06-15 12:15:00,85.3,99.8,37.1,145.4,58.1,16.7
+PT1001,2026-06-15 12:30:00,86.5,99.6,36.9,147.8,58.2,17.3
+PT1001,2026-06-15 12:45:00,86.3,99.7,37.8,147.4,59.6,16.4
+PT1001,2026-06-15 13:00:00,87.3,99.6,37.4,146.3,58.3,16.6
+PT1001,2026-06-15 13:15:00,87.0,99.9,37.3,144.5,56.7,17.4
+PT1001,2026-06-15 13:30:00,88.6,99.7,37.3,142.7,56.1,17.0
+PT1001,2026-06-15 13:45:00,87.6,99.4,37.1,143.0,54.2,16.3
+PT1001,2026-06-15 14:00:00,85.5,99.6,37.1,140.2,50.8,16.2
+PT1001,2026-06-15 14:15:00,86.0,99.6,36.7,138.0,51.9,16.6
+PT1001,2026-06-15 14:30:00,85.7,99.5,37.3,138.5,51.6,16.6
+PT1001,2026-06-15 14:45:00,84.3,99.7,37.0,140.8,54.1,15.7
+PT1001,2026-06-15 15:00:00,81.9,99.1,37.2,141.1,53.5,15.8
+PT1001,2026-06-15 15:15:00,83.3,99.1,36.4,146.9,53.9,16.6
+PT1001,2026-06-15 15:30:00,84.9,99.1,37.3,143.0,54.6,16.4
+PT1001,2026-06-15 15:45:00,86.0,98.7,37.0,145.0,54.6,17.0
+PT1001,2026-06-15 16:00:00,85.4,98.7,36.7,145.2,53.6,16.8
+PT1001,2026-06-15 16:15:00,84.8,98.9,36.7,145.0,55.1,16.7
+PT1001,2026-06-15 16:30:00,85.5,98.7,37.1,144.5,56.9,16.2
+PT1001,2026-06-15 16:45:00,85.4,98.9,37.2,146.2,57.3,16.1
+PT1001,2026-06-15 17:00:00,86.9,98.9,36.7,145.7,57.9,16.1
+PT1001,2026-06-15 17:15:00,87.1,98.5,37.2,146.4,56.7,16.1
+PT1001,2026-06-15 17:30:00,90.0,98.7,37.2,149.2,59.5,16.3
+PT1001,2026-06-15 17:45:00,88.6,98.7,37.1,147.7,58.9,17.1
+PT1001,2026-06-15 18:00:00,87.5,99.0,37.7,149.6,60.4,16.3
+PT1001,2026-06-15 18:15:00,86.7,99.2,36.7,154.7,63.7,15.9
+PT1001,2026-06-15 18:30:00,88.4,99.2,37.3,153.7,64.6,15.8
+PT1001,2026-06-15 18:45:00,88.4,99.4,37.3,151.9,66.7,16.1
+PT1001,2026-06-15 19:00:00,86.9,99.8,37.2,151.8,67.8,16.0
+PT1001,2026-06-15 19:15:00,87.2,99.1,36.8,153.0,70.8,16.2
+PT1001,2026-06-15 19:30:00,87.9,99.4,37.0,154.0,70.7,16.1
+PT1001,2026-06-15 19:45:00,88.7,99.0,36.7,153.3,73.1,16.7
+PT1001,2026-06-15 20:00:00,87.2,99.0,37.0,155.1,70.3,16.7
+PT1001,2026-06-15 20:15:00,88.8,98.5,37.3,155.3,69.7,17.3
+PT1001,2026-06-15 20:30:00,88.0,98.8,37.4,154.5,71.2,17.2
+PT1001,2026-06-15 20:45:00,88.4,99.6,37.1,154.4,71.8,17.0
+PT1001,2026-06-15 21:00:00,85.1,99.7,36.9,157.1,72.4,16.5
+PT1001,2026-06-15 21:15:00,82.1,99.9,37.5,155.1,72.4,16.4
+PT1001,2026-06-15 21:30:00,82.2,100.0,37.7,156.1,74.4,16.3
+PT1001,2026-06-15 21:45:00,79.7,100.0,37.3,154.4,73.7,16.6
+PT1001,2026-06-15 22:00:00,80.4,99.6,37.3,157.3,72.3,16.3
+PT1001,2026-06-15 22:15:00,80.0,99.7,36.9,153.0,72.7,16.3
+PT1001,2026-06-15 22:30:00,77.5,99.7,37.6,152.9,72.2,15.6
+PT1001,2026-06-15 22:45:00,76.7,99.6,37.1,148.1,74.6,15.4
+PT1001,2026-06-15 23:00:00,78.0,99.4,37.6,150.0,71.5,15.6
+PT1001,2026-06-15 23:15:00,77.3,99.7,36.8,153.7,71.1,15.5
+PT1001,2026-06-15 23:30:00,76.7,99.5,37.2,151.9,72.9,15.2
+PT1001,2026-06-15 23:45:00,76.7,99.9,37.5,150.9,73.5,15.5
+PT1001,2026-06-16 00:00:00,76.0,99.7,37.1,148.8,76.8,16.1
+PT1001,2026-06-16 00:15:00,78.3,99.7,37.2,150.2,76.8,16.2
+PT1001,2026-06-16 00:30:00,77.8,99.9,36.8,151.7,78.4,16.3
+PT1001,2026-06-16 00:45:00,79.8,99.9,37.4,152.4,79.3,16.5
+PT1001,2026-06-16 01:00:00,81.1,99.8,37.0,155.6,78.9,16.6
+PT1001,2026-06-16 01:15:00,80.2,100.0,37.0,161.9,78.4,17.1
+PT1001,2026-06-16 01:30:00,80.2,100.0,37.3,159.7,76.4,17.1
+PT1001,2026-06-16 01:45:00,80.7,100.0,36.9,159.8,77.6,15.9
+PT1001,2026-06-16 02:00:00,80.5,100.0,37.0,162.8,76.2,16.5
+PT1001,2026-06-16 02:15:00,80.3,100.0,37.0,162.4,77.9,16.3
+PT1001,2026-06-16 02:30:00,81.5,99.8,37.5,162.9,75.4,17.1
+PT1001,2026-06-16 02:45:00,84.8,100.0,37.6,160.6,76.4,16.7
+PT1001,2026-06-16 03:00:00,83.4,99.7,36.7,157.4,75.7,16.4
+PT1001,2026-06-16 03:15:00,85.7,99.8,36.9,158.2,78.1,16.5
+PT1001,2026-06-16 03:30:00,83.6,99.6,37.4,161.2,76.2,16.7
+PT1001,2026-06-16 03:45:00,83.9,99.7,36.8,162.5,76.7,17.3
+PT1001,2026-06-16 04:00:00,84.1,99.3,37.6,158.4,76.6,17.5
+PT1001,2026-06-16 04:15:00,87.0,99.6,37.1,159.8,76.9,16.9
+PT1001,2026-06-16 04:30:00,88.5,99.8,37.2,157.3,77.8,17.1
+PT1001,2026-06-16 04:45:00,88.3,100.0,37.0,158.7,76.8,17.3
+PT1001,2026-06-16 05:00:00,86.5,99.8,37.0,155.5,78.3,17.4
+PT1001,2026-06-16 05:15:00,88.1,99.8,36.9,152.7,77.6,18.1
+PT1001,2026-06-16 05:30:00,88.4,100.0,36.8,153.9,81.3,17.6
+PT1001,2026-06-16 05:45:00,86.9,99.9,37.1,156.1,79.8,18.1
+PT1001,2026-06-16 06:00:00,85.5,99.5,37.5,153.0,78.8,18.0
+PT1001,2026-06-16 06:15:00,86.4,99.3,37.0,153.8,81.2,18.8
+PT1001,2026-06-16 06:30:00,87.4,99.6,37.0,150.8,80.5,19.6
+PT1001,2026-06-16 06:45:00,83.9,99.6,37.4,153.0,80.5,19.9
+PT1001,2026-06-16 07:00:00,83.4,99.4,37.1,153.4,80.7,20.0
+PT1001,2026-06-16 07:15:00,82.4,99.6,37.1,154.6,78.7,19.8
+PT1001,2026-06-16 07:30:00,81.7,99.8,36.5,154.4,79.0,19.6
+PT1001,2026-06-16 07:45:00,79.2,99.9,37.2,155.0,79.7,19.7
+PT1001,2026-06-16 08:00:00,80.3,100.0,37.2,157.0,79.9,19.6
+PT1001,2026-06-16 08:15:00,79.3,99.9,36.7,157.4,80.2,19.5
+PT1001,2026-06-16 08:30:00,80.0,100.0,36.8,160.7,80.8,19.5
+PT1001,2026-06-16 08:45:00,81.8,100.0,37.3,161.1,80.4,19.4
+PT1001,2026-06-16 09:00:00,80.5,100.0,36.5,163.9,79.9,19.1
+PT1001,2026-06-16 09:15:00,79.0,100.0,37.0,164.5,80.7,18.3
+PT1001,2026-06-16 09:30:00,80.6,100.0,37.2,162.0,80.5,18.0
+PT1001,2026-06-16 09:45:00,80.5,100.0,36.7,159.5,79.8,18.4
+PT1001,2026-06-16 10:00:00,79.3,100.0,37.3,160.1,79.1,18.3
+PT1001,2026-06-16 10:15:00,80.3,99.7,36.8,160.8,81.3,18.3
+PT1001,2026-06-16 10:30:00,78.9,99.7,36.8,162.9,81.3,18.4
+PT1001,2026-06-16 10:45:00,80.0,99.4,37.2,161.9,82.2,17.5
+PT1001,2026-06-16 11:00:00,78.7,99.4,37.7,161.2,85.4,17.4
+PT1001,2026-06-16 11:15:00,79.4,99.2,36.9,161.9,84.9,17.5
+PT1001,2026-06-16 11:30:00,81.4,99.4,37.4,161.9,87.5,17.5
+PT1001,2026-06-16 11:45:00,81.4,99.5,36.9,161.8,87.7,17.6
+PT1001,2026-06-16 12:00:00,80.9,99.4,37.4,162.2,87.6,18.1
+PT1001,2026-06-16 12:15:00,80.6,99.8,36.9,166.0,84.6,18.4
+PT1001,2026-06-16 12:30:00,81.5,100.0,37.1,164.2,81.8,18.8
+PT1001,2026-06-16 12:45:00,79.5,100.0,36.9,165.5,82.8,19.3
+PT1001,2026-06-16 13:00:00,79.6,99.7,36.9,164.2,83.4,18.6
+PT1001,2026-06-16 13:15:00,78.4,99.7,37.5,165.4,84.5,19.0
+PT1001,2026-06-16 13:30:00,79.1,100.0,37.0,165.6,84.2,19.3
+PT1001,2026-06-16 13:45:00,81.3,100.0,37.3,167.1,84.4,19.1
+PT1001,2026-06-16 14:00:00,79.9,100.0,37.3,166.8,84.9,18.8
+PT1001,2026-06-16 14:15:00,79.3,100.0,37.6,168.3,83.9,18.3
+PT1001,2026-06-16 14:30:00,79.1,100.0,37.1,169.3,82.0,18.5
+PT1001,2026-06-16 14:45:00,78.3,99.7,36.7,170.5,83.7,18.6
+PT1001,2026-06-16 15:00:00,77.0,99.6,36.6,173.6,83.3,18.4
+PT1001,2026-06-16 15:15:00,76.1,99.3,37.6,171.6,83.5,18.2
+PT1001,2026-06-16 15:30:00,77.4,99.1,36.4,169.8,85.6,18.9
+PT1001,2026-06-16 15:45:00,77.5,99.1,36.5,171.1,88.5,18.7
+PT1001,2026-06-16 16:00:00,78.2,99.4,37.4,170.5,87.4,18.5
+PT1001,2026-06-16 16:15:00,77.6,99.5,37.0,170.5,87.3,18.8
+PT1001,2026-06-16 16:30:00,77.1,99.7,37.4,168.5,86.0,18.3
+PT1001,2026-06-16 16:45:00,76.9,99.3,37.0,170.2,85.2,17.9
+PT1001,2026-06-16 17:00:00,78.6,99.2,37.5,171.4,86.3,18.1
+PT1001,2026-06-16 17:15:00,77.8,99.0,37.1,169.3,86.1,17.7
+PT1001,2026-06-16 17:30:00,77.8,99.2,36.8,169.8,85.4,17.9
+PT1001,2026-06-16 17:45:00,77.8,99.3,37.4,170.1,86.1,17.6
+PT1001,2026-06-16 18:00:00,79.9,98.9,37.7,167.7,86.1,17.5
+PT1001,2026-06-16 18:15:00,80.1,99.2,36.9,163.6,87.3,17.3
+PT1001,2026-06-16 18:30:00,79.8,98.9,37.4,164.5,87.6,17.4
+PT1001,2026-06-16 18:45:00,81.6,98.8,37.2,165.4,88.1,17.5
+PT1001,2026-06-16 19:00:00,83.4,98.7,37.1,162.4,87.0,17.8
+PT1001,2026-06-16 19:15:00,82.8,98.4,37.0,162.8,88.0,17.9
+PT1001,2026-06-16 19:30:00,82.9,98.4,37.0,163.2,86.2,18.0
+PT1001,2026-06-16 19:45:00,84.1,98.5,37.5,164.9,85.8,17.9
+PT1001,2026-06-16 20:00:00,84.6,98.3,37.7,166.7,85.0,18.0
+PT1001,2026-06-16 20:15:00,82.8,98.2,36.6,167.5,86.1,17.5
+PT1001,2026-06-16 20:30:00,84.1,98.1,37.1,165.9,88.4,17.5
+PT1001,2026-06-16 20:45:00,83.8,97.8,37.1,167.3,89.0,17.6
+PT1001,2026-06-16 21:00:00,83.4,98.0,37.2,167.0,88.9,17.8
+PT1001,2026-06-16 21:15:00,85.3,97.6,37.0,167.6,87.9,17.4
+PT1001,2026-06-16 21:30:00,85.3,97.6,36.8,164.6,87.1,17.5
+PT1001,2026-06-16 21:45:00,83.9,97.0,37.0,163.3,85.4,17.2
+PT1001,2026-06-16 22:00:00,83.1,96.7,37.0,159.0,85.8,17.5
+PT1001,2026-06-16 22:15:00,82.7,96.8,36.6,162.2,83.5,17.3
+PT1001,2026-06-16 22:30:00,83.1,96.7,37.3,162.6,83.7,17.7
+PT1001,2026-06-16 22:45:00,84.1,96.5,37.2,165.0,82.6,17.4
+PT1001,2026-06-16 23:00:00,84.4,96.2,37.5,164.6,84.8,16.8
+PT1001,2026-06-16 23:15:00,84.0,95.6,37.1,161.9,83.4,16.6
+PT1001,2026-06-16 23:30:00,80.7,95.7,37.4,159.8,85.5,16.5
+PT1001,2026-06-16 23:45:00,82.0,96.0,37.3,158.6,84.6,16.4
+PT1002,2026-06-14 00:00:00,91.4,96.8,37.1,148.5,88.6,17.6
+PT1002,2026-06-14 00:15:00,91.4,96.9,36.8,149.9,87.0,17.3
+PT1002,2026-06-14 00:30:00,93.1,96.8,37.6,149.9,87.1,17.0
+PT1002,2026-06-14 00:45:00,93.5,96.9,36.9,147.7,85.3,16.9
+PT1002,2026-06-14 01:00:00,92.3,96.8,36.8,147.3,85.6,16.7
+PT1002,2026-06-14 01:15:00,91.1,97.1,37.1,144.8,86.1,16.9
+PT1002,2026-06-14 01:30:00,93.2,97.2,37.3,148.5,85.1,16.6
+PT1002,2026-06-14 01:45:00,92.9,97.6,37.1,149.1,83.6,15.9
+PT1002,2026-06-14 02:00:00,92.8,97.7,36.7,151.6,85.2,15.7
+PT1002,2026-06-14 02:15:00,91.3,97.5,37.2,150.8,85.6,15.4
+PT1002,2026-06-14 02:30:00,91.7,97.5,37.2,148.6,86.3,16.2
+PT1002,2026-06-14 02:45:00,88.2,97.8,36.6,147.2,89.7,16.3
+PT1002,2026-06-14 03:00:00,85.7,98.2,37.1,149.4,93.1,16.3
+PT1002,2026-06-14 03:15:00,85.3,98.0,36.6,148.6,93.4,15.9
+PT1002,2026-06-14 03:30:00,85.5,97.8,37.3,142.1,94.2,15.5
+PT1002,2026-06-14 03:45:00,86.3,97.9,37.3,147.1,94.0,15.4
+PT1002,2026-06-14 04:00:00,86.3,98.2,36.8,144.6,92.1,15.7
+PT1002,2026-06-14 04:15:00,87.1,98.3,36.8,143.2,92.7,15.2
+PT1002,2026-06-14 04:30:00,86.8,98.3,37.6,142.6,93.3,15.3
+PT1002,2026-06-14 04:45:00,86.7,98.6,37.0,144.4,96.8,15.3
+PT1002,2026-06-14 05:00:00,88.2,98.6,37.2,147.0,97.9,14.4
+PT1002,2026-06-14 05:15:00,88.6,98.7,37.2,146.7,95.5,14.8
+PT1002,2026-06-14 05:30:00,90.0,98.3,37.0,147.7,95.1,14.9
+PT1002,2026-06-14 05:45:00,90.6,98.2,37.1,145.6,95.2,14.8
+PT1002,2026-06-14 06:00:00,86.8,98.4,37.3,145.0,93.2,15.1
+PT1002,2026-06-14 06:15:00,86.4,98.1,37.0,145.4,93.4,15.5
+PT1002,2026-06-14 06:30:00,87.9,98.0,37.1,142.7,91.7,15.5
+PT1002,2026-06-14 06:45:00,88.3,97.9,37.1,144.6,91.3,14.7
+PT1002,2026-06-14 07:00:00,85.9,98.0,37.4,146.7,89.8,15.3
+PT1002,2026-06-14 07:15:00,87.4,98.0,37.1,144.7,91.0,15.0
+PT1002,2026-06-14 07:30:00,87.2,98.3,36.9,146.2,90.9,14.2
+PT1002,2026-06-14 07:45:00,88.1,98.4,36.8,143.2,88.2,14.3
+PT1002,2026-06-14 08:00:00,87.0,98.5,37.1,145.6,87.1,14.3
+PT1002,2026-06-14 08:15:00,86.8,98.5,37.6,147.1,86.0,13.7
+PT1002,2026-06-14 08:30:00,88.1,98.2,37.2,147.4,87.6,14.0
+PT1002,2026-06-14 08:45:00,87.9,98.7,37.1,147.8,86.8,14.3
+PT1002,2026-06-14 09:00:00,88.4,98.7,37.5,148.8,85.3,13.7
+PT1002,2026-06-14 09:15:00,88.7,98.9,36.9,145.3,86.9,13.5
+PT1002,2026-06-14 09:30:00,88.6,98.6,37.6,145.3,86.7,14.0
+PT1002,2026-06-14 09:45:00,90.4,98.1,36.9,143.4,83.3,13.5
+PT1002,2026-06-14 10:00:00,90.9,97.9,36.8,142.4,83.6,12.8
+PT1002,2026-06-14 10:15:00,90.3,97.9,36.9,142.6,85.8,13.2
+PT1002,2026-06-14 10:30:00,90.0,97.8,37.4,141.6,86.2,12.4
+PT1002,2026-06-14 10:45:00,92.1,97.7,37.0,141.0,86.5,12.8
+PT1002,2026-06-14 11:00:00,93.2,97.8,36.7,145.7,86.0,12.0
+PT1002,2026-06-14 11:15:00,93.2,98.1,36.8,144.4,85.6,12.3
+PT1002,2026-06-14 11:30:00,92.5,97.8,37.1,146.8,87.9,11.7
+PT1002,2026-06-14 11:45:00,94.1,97.9,37.2,145.8,85.6,12.1
+PT1002,2026-06-14 12:00:00,92.4,98.2,37.6,142.6,85.3,12.0
+PT1002,2026-06-14 12:15:00,92.1,98.1,36.9,139.9,84.3,11.7
+PT1002,2026-06-14 12:30:00,92.1,97.5,37.0,136.8,84.2,11.7
+PT1002,2026-06-14 12:45:00,92.0,97.4,36.9,136.8,84.8,11.9
+PT1002,2026-06-14 13:00:00,93.1,97.4,36.8,139.3,87.0,11.3
+PT1002,2026-06-14 13:15:00,94.1,97.0,37.1,142.1,86.4,11.6
+PT1002,2026-06-14 13:30:00,92.4,97.3,36.3,147.6,85.7,11.4
+PT1002,2026-06-14 13:45:00,94.0,97.5,37.3,144.1,82.6,10.7
+PT1002,2026-06-14 14:00:00,94.9,97.2,37.4,145.1,82.8,10.5
+PT1002,2026-06-14 14:15:00,93.4,97.5,37.0,143.7,85.5,10.1
+PT1002,2026-06-14 14:30:00,93.5,97.5,37.1,144.7,83.6,10.1
+PT1002,2026-06-14 14:45:00,92.9,97.6,37.0,142.0,83.1,9.8
+PT1002,2026-06-14 15:00:00,94.6,98.0,37.1,144.5,82.4,10.2
+PT1002,2026-06-14 15:15:00,94.6,98.0,37.0,148.0,84.4,10.5
+PT1002,2026-06-14 15:30:00,94.7,98.1,37.2,147.0,85.8,10.1
+PT1002,2026-06-14 15:45:00,91.9,98.0,36.9,151.1,87.4,10.7
+PT1002,2026-06-14 16:00:00,92.0,98.3,36.8,152.4,88.2,11.4
+PT1002,2026-06-14 16:15:00,91.8,97.8,37.3,150.2,89.8,11.0
+PT1002,2026-06-14 16:30:00,93.8,97.8,36.9,151.3,90.9,10.5
+PT1002,2026-06-14 16:45:00,92.6,97.6,36.8,152.7,90.0,10.5
+PT1002,2026-06-14 17:00:00,94.1,97.5,37.0,155.7,90.1,9.9
+PT1002,2026-06-14 17:15:00,92.8,97.6,36.9,155.2,90.3,9.8
+PT1002,2026-06-14 17:30:00,91.6,97.8,36.9,154.9,89.8,9.7
+PT1002,2026-06-14 17:45:00,91.2,97.9,37.0,152.8,88.5,10.2
+PT1002,2026-06-14 18:00:00,90.6,97.6,36.6,154.5,86.9,10.2
+PT1002,2026-06-14 18:15:00,91.6,97.8,36.9,155.5,84.6,10.6
+PT1002,2026-06-14 18:30:00,90.2,97.7,37.7,154.7,83.9,11.1
+PT1002,2026-06-14 18:45:00,88.5,97.6,37.4,155.0,83.3,11.2
+PT1002,2026-06-14 19:00:00,89.4,97.7,37.0,158.3,80.9,11.8
+PT1002,2026-06-14 19:15:00,90.4,97.5,37.4,156.5,81.9,11.1
+PT1002,2026-06-14 19:30:00,91.9,97.5,37.2,156.7,80.6,11.3
+PT1002,2026-06-14 19:45:00,90.8,97.4,37.3,156.4,80.1,10.8
+PT1002,2026-06-14 20:00:00,90.5,97.4,37.5,155.3,80.8,10.9
+PT1002,2026-06-14 20:15:00,91.1,97.3,37.0,153.8,82.1,10.8
+PT1002,2026-06-14 20:30:00,90.9,97.2,36.9,153.5,85.0,10.3
+PT1002,2026-06-14 20:45:00,92.6,97.1,37.3,152.6,86.5,9.8
+PT1002,2026-06-14 21:00:00,92.6,97.3,36.9,153.5,85.6,10.2
+PT1002,2026-06-14 21:15:00,93.1,97.6,37.0,156.2,85.2,10.4
+PT1002,2026-06-14 21:30:00,96.1,97.8,37.2,156.4,85.6,10.5
+PT1002,2026-06-14 21:45:00,95.8,97.6,36.9,156.1,83.9,10.8
+PT1002,2026-06-14 22:00:00,94.5,97.6,37.0,155.8,84.3,10.6
+PT1002,2026-06-14 22:15:00,95.3,97.8,37.2,157.0,84.4,10.7
+PT1002,2026-06-14 22:30:00,94.5,98.2,37.3,159.7,85.5,10.5
+PT1002,2026-06-14 22:45:00,95.7,97.8,37.5,163.1,82.9,10.8
+PT1002,2026-06-14 23:00:00,95.5,97.8,36.9,164.4,85.7,10.7
+PT1002,2026-06-14 23:15:00,95.0,97.4,37.4,166.2,84.9,10.6
+PT1002,2026-06-14 23:30:00,94.5,97.6,37.1,164.1,86.4,10.7
+PT1002,2026-06-14 23:45:00,94.7,97.3,36.9,164.3,86.2,10.2
+PT1002,2026-06-15 00:00:00,94.5,97.1,36.4,159.5,87.8,10.2
+PT1002,2026-06-15 00:15:00,97.1,97.4,37.2,158.8,86.5,10.3
+PT1002,2026-06-15 00:30:00,97.7,97.2,36.9,161.0,85.8,10.6
+PT1002,2026-06-15 00:45:00,100.8,97.4,37.3,166.8,87.0,10.4
+PT1002,2026-06-15 01:00:00,101.9,97.5,36.8,168.0,88.2,10.0
+PT1002,2026-06-15 01:15:00,100.9,97.5,37.2,167.6,86.7,10.3
+PT1002,2026-06-15 01:30:00,101.0,97.4,36.9,166.8,85.5,10.7
+PT1002,2026-06-15 01:45:00,101.2,97.8,37.2,166.2,86.9,10.9
+PT1002,2026-06-15 02:00:00,101.7,97.8,36.9,166.2,86.1,10.9
+PT1002,2026-06-15 02:15:00,102.9,97.4,37.4,167.2,86.6,11.0
+PT1002,2026-06-15 02:30:00,102.5,97.4,36.7,163.8,86.0,11.3
+PT1002,2026-06-15 02:45:00,102.6,97.3,37.2,163.5,85.0,10.8
+PT1002,2026-06-15 03:00:00,102.5,97.4,37.5,165.1,86.9,10.9
+PT1002,2026-06-15 03:15:00,101.3,97.7,36.8,166.0,87.2,11.1
+PT1002,2026-06-15 03:30:00,99.8,98.1,36.7,165.7,87.0,10.6
+PT1002,2026-06-15 03:45:00,99.6,98.0,37.0,165.7,87.1,11.6
+PT1002,2026-06-15 04:00:00,101.5,98.4,37.2,167.2,86.7,11.1
+PT1002,2026-06-15 04:15:00,102.7,98.8,36.9,165.3,86.4,10.7
+PT1002,2026-06-15 04:30:00,103.4,98.6,37.2,163.7,87.6,10.9
+PT1002,2026-06-15 04:45:00,102.6,99.0,36.4,163.7,91.1,11.0
+PT1002,2026-06-15 05:00:00,99.7,99.1,37.6,166.3,90.0,11.8
+PT1002,2026-06-15 05:15:00,99.9,99.2,37.2,168.1,92.8,12.1
+PT1002,2026-06-15 05:30:00,100.7,99.3,37.2,169.9,90.4,12.2
+PT1002,2026-06-15 05:45:00,100.5,99.5,37.6,173.8,90.6,12.5
+PT1002,2026-06-15 06:00:00,100.7,99.3,37.2,175.0,87.3,11.5
+PT1002,2026-06-15 06:15:00,97.8,98.9,37.4,174.3,86.3,11.5
+PT1002,2026-06-15 06:30:00,98.1,98.7,36.6,177.0,84.1,11.6
+PT1002,2026-06-15 06:45:00,98.4,98.6,36.9,179.1,85.2,11.3
+PT1002,2026-06-15 07:00:00,97.9,99.1,36.6,182.4,83.7,11.7
+PT1002,2026-06-15 07:15:00,97.4,98.9,37.1,184.5,81.8,11.8
+PT1002,2026-06-15 07:30:00,97.1,99.3,36.6,188.0,81.6,11.7
+PT1002,2026-06-15 07:45:00,97.1,99.7,37.0,187.8,82.7,11.1
+PT1002,2026-06-15 08:00:00,97.6,99.8,37.4,189.4,81.8,10.4
+PT1002,2026-06-15 08:15:00,96.5,99.9,36.9,190.3,79.3,10.9
+PT1002,2026-06-15 08:30:00,96.5,99.8,37.8,193.6,81.3,10.1
+PT1002,2026-06-15 08:45:00,95.7,100.0,37.0,193.1,80.8,10.0
+PT1002,2026-06-15 09:00:00,98.7,100.0,37.6,192.4,80.9,9.6
+PT1002,2026-06-15 09:15:00,96.9,99.8,37.6,194.3,81.0,9.9
+PT1002,2026-06-15 09:30:00,98.1,99.8,37.1,198.5,80.0,9.8
+PT1002,2026-06-15 09:45:00,97.9,99.5,37.7,195.3,80.7,9.6
+PT1002,2026-06-15 10:00:00,97.8,99.5,36.9,197.5,81.3,9.5
+PT1002,2026-06-15 10:15:00,102.2,99.5,37.7,199.7,79.7,9.3
+PT1002,2026-06-15 10:30:00,103.8,99.6,36.8,198.9,79.4,9.0
+PT1002,2026-06-15 10:45:00,104.8,99.8,37.0,200.4,78.9,9.1
+PT1002,2026-06-15 11:00:00,103.9,100.0,37.1,200.6,79.6,9.4
+PT1002,2026-06-15 11:15:00,104.1,99.7,37.1,198.8,78.2,9.7
+PT1002,2026-06-15 11:30:00,103.0,99.8,37.3,199.9,77.2,9.7
+PT1002,2026-06-15 11:45:00,101.9,100.0,37.2,200.5,75.7,9.8
+PT1002,2026-06-15 12:00:00,101.1,99.8,36.9,198.5,75.0,9.8
+PT1002,2026-06-15 12:15:00,99.3,99.6,37.4,197.7,76.2,10.0
+PT1002,2026-06-15 12:30:00,98.4,99.7,37.0,192.8,76.9,10.2
+PT1002,2026-06-15 12:45:00,98.7,99.3,37.0,191.2,78.0,10.4
+PT1002,2026-06-15 13:00:00,99.6,99.3,36.7,190.2,77.7,10.3
+PT1002,2026-06-15 13:15:00,101.1,99.1,37.3,188.6,75.4,9.2
+PT1002,2026-06-15 13:30:00,102.0,99.4,37.0,188.3,75.0,9.0
+PT1002,2026-06-15 13:45:00,103.3,99.4,36.5,189.0,74.3,9.5
+PT1002,2026-06-15 14:00:00,101.8,99.5,37.4,192.5,74.0,9.2
+PT1002,2026-06-15 14:15:00,102.1,99.8,37.0,189.9,75.8,8.6
+PT1002,2026-06-15 14:30:00,102.6,99.8,37.5,192.1,73.0,8.6
+PT1002,2026-06-15 14:45:00,102.6,99.5,36.8,194.1,72.1,8.3
+PT1002,2026-06-15 15:00:00,102.3,99.5,36.8,191.5,70.5,8.0
+PT1002,2026-06-15 15:15:00,102.3,99.6,37.2,192.0,70.8,8.7
+PT1002,2026-06-15 15:30:00,103.2,99.5,36.7,193.9,70.1,8.9
+PT1002,2026-06-15 15:45:00,103.3,99.2,37.7,195.7,71.4,8.7
+PT1002,2026-06-15 16:00:00,102.9,98.8,36.7,194.2,69.9,8.8
+PT1002,2026-06-15 16:15:00,102.2,98.9,37.0,194.5,69.8,8.9
+PT1002,2026-06-15 16:30:00,100.2,98.8,36.9,195.4,69.6,9.0
+PT1002,2026-06-15 16:45:00,101.4,98.1,37.0,195.7,71.7,9.6
+PT1002,2026-06-15 17:00:00,99.8,98.5,36.7,195.6,71.4,9.3
+PT1002,2026-06-15 17:15:00,100.4,98.6,36.7,196.0,70.3,8.8
+PT1002,2026-06-15 17:30:00,99.7,98.4,37.4,192.6,71.2,8.3
+PT1002,2026-06-15 17:45:00,100.1,98.4,37.0,195.9,69.3,8.7
+PT1002,2026-06-15 18:00:00,103.2,98.3,36.9,194.8,70.0,8.6
+PT1002,2026-06-15 18:15:00,101.9,98.7,37.4,192.5,70.3,9.0
+PT1002,2026-06-15 18:30:00,101.2,98.6,37.1,191.7,68.0,9.2
+PT1002,2026-06-15 18:45:00,102.8,98.4,36.4,193.9,69.7,9.2
+PT1002,2026-06-15 19:00:00,102.2,98.9,37.0,194.5,70.8,9.2
+PT1002,2026-06-15 19:15:00,99.9,99.0,37.0,196.6,69.3,9.1
+PT1002,2026-06-15 19:30:00,100.4,98.9,37.2,198.5,69.4,8.1
+PT1002,2026-06-15 19:45:00,101.5,98.6,37.4,199.3,72.2,8.2
+PT1002,2026-06-15 20:00:00,100.9,98.6,36.6,198.9,71.6,8.1
+PT1002,2026-06-15 20:15:00,100.5,98.9,37.1,197.0,70.0,8.1
+PT1002,2026-06-15 20:30:00,100.9,98.9,37.1,197.1,69.5,8.0
+PT1002,2026-06-15 20:45:00,101.7,99.0,37.5,193.6,69.9,8.0
+PT1002,2026-06-15 21:00:00,102.1,99.2,37.4,193.7,69.8,8.6
+PT1002,2026-06-15 21:15:00,102.2,99.1,37.3,190.2,70.3,8.5
+PT1002,2026-06-15 21:30:00,103.1,99.4,36.9,190.9,68.7,8.0
+PT1002,2026-06-15 21:45:00,104.7,99.9,37.4,190.4,66.5,8.0
+PT1002,2026-06-15 22:00:00,103.9,100.0,37.3,190.8,67.6,8.7
+PT1002,2026-06-15 22:15:00,104.0,100.0,37.2,191.5,66.4,9.0
+PT1002,2026-06-15 22:30:00,103.6,99.9,36.8,190.9,65.6,8.9
+PT1002,2026-06-15 22:45:00,104.0,99.9,37.5,191.6,65.5,8.8
+PT1002,2026-06-15 23:00:00,104.0,100.0,36.9,189.6,66.4,8.5
+PT1002,2026-06-15 23:15:00,103.5,99.9,37.2,188.6,68.2,8.5
+PT1002,2026-06-15 23:30:00,102.9,100.0,37.2,189.4,67.7,8.0
+PT1002,2026-06-15 23:45:00,103.5,99.7,36.9,188.8,68.5,8.0
+PT1002,2026-06-16 00:00:00,103.9,100.0,37.0,193.1,71.5,8.1
+PT1002,2026-06-16 00:15:00,104.9,99.8,37.2,191.6,71.0,8.0
+PT1002,2026-06-16 00:30:00,104.2,99.9,37.5,194.8,71.2,8.6
+PT1002,2026-06-16 00:45:00,104.8,99.8,37.2,196.9,70.8,8.6
+PT1002,2026-06-16 01:00:00,104.7,99.6,36.6,193.8,72.3,8.8
+PT1002,2026-06-16 01:15:00,103.8,99.6,37.3,194.7,70.0,8.8
+PT1002,2026-06-16 01:30:00,103.3,99.6,36.8,193.7,71.3,8.5
+PT1002,2026-06-16 01:45:00,103.3,99.3,36.7,189.5,73.0,8.1
+PT1002,2026-06-16 02:00:00,102.2,99.0,37.3,189.2,71.3,8.3
+PT1002,2026-06-16 02:15:00,100.7,98.9,37.4,188.2,71.1,8.7
+PT1002,2026-06-16 02:30:00,103.6,98.3,37.6,186.3,73.8,8.0
+PT1002,2026-06-16 02:45:00,103.7,98.3,37.1,183.8,73.1,8.7
+PT1002,2026-06-16 03:00:00,103.1,98.4,37.1,183.4,73.6,8.4
+PT1002,2026-06-16 03:15:00,102.3,98.0,37.4,184.4,71.8,8.3
+PT1002,2026-06-16 03:30:00,100.5,98.1,37.1,183.8,70.3,9.1
+PT1002,2026-06-16 03:45:00,99.7,97.9,37.1,185.5,69.4,9.4
+PT1002,2026-06-16 04:00:00,101.0,97.6,37.0,183.7,69.0,9.3
+PT1002,2026-06-16 04:15:00,104.2,98.2,36.8,184.3,69.6,9.2
+PT1002,2026-06-16 04:30:00,103.9,98.3,37.0,186.9,71.1,8.6
+PT1002,2026-06-16 04:45:00,102.1,98.6,37.9,186.1,71.0,8.8
+PT1002,2026-06-16 05:00:00,102.3,98.6,37.6,183.6,73.2,8.7
+PT1002,2026-06-16 05:15:00,103.6,98.4,37.1,180.8,73.6,8.5
+PT1002,2026-06-16 05:30:00,104.8,98.0,36.7,181.4,74.8,8.8
+PT1002,2026-06-16 05:45:00,105.2,98.3,36.9,182.1,74.6,9.3
+PT1002,2026-06-16 06:00:00,103.3,98.2,37.4,183.1,76.2,9.5
+PT1002,2026-06-16 06:15:00,104.5,98.2,37.2,182.8,78.1,9.0
+PT1002,2026-06-16 06:30:00,103.6,98.4,36.8,182.8,78.1,9.7
+PT1002,2026-06-16 06:45:00,103.8,98.4,36.7,183.9,81.0,9.5
+PT1002,2026-06-16 07:00:00,102.8,98.3,37.6,184.0,81.2,10.2
+PT1002,2026-06-16 07:15:00,104.3,98.9,37.3,185.6,82.8,10.5
+PT1002,2026-06-16 07:30:00,104.7,98.8,37.1,183.1,82.6,10.7
+PT1002,2026-06-16 07:45:00,103.4,98.8,37.3,182.7,82.6,10.9
+PT1002,2026-06-16 08:00:00,102.7,99.0,37.4,185.0,83.0,11.2
+PT1002,2026-06-16 08:15:00,101.3,99.3,36.5,183.4,82.0,11.3
+PT1002,2026-06-16 08:30:00,101.5,99.5,37.2,180.1,83.6,11.0
+PT1002,2026-06-16 08:45:00,100.8,99.6,37.0,182.1,84.6,11.0
+PT1002,2026-06-16 09:00:00,100.7,99.8,37.1,183.5,85.4,10.5
+PT1002,2026-06-16 09:15:00,99.9,99.9,36.5,182.0,86.1,10.4
+PT1002,2026-06-16 09:30:00,100.9,99.9,37.0,184.5,83.6,10.2
+PT1002,2026-06-16 09:45:00,101.2,99.5,37.1,185.6,86.5,10.4
+PT1002,2026-06-16 10:00:00,99.5,99.3,37.3,185.5,85.7,10.8
+PT1002,2026-06-16 10:15:00,102.7,99.1,37.3,185.6,83.6,10.0
+PT1002,2026-06-16 10:30:00,103.3,98.9,37.0,185.8,82.7,9.8
+PT1002,2026-06-16 10:45:00,102.1,98.7,37.0,184.4,83.3,8.6
+PT1002,2026-06-16 11:00:00,100.8,98.4,36.8,183.3,83.3,8.6
+PT1002,2026-06-16 11:15:00,101.6,98.2,36.9,181.9,83.7,8.7
+PT1002,2026-06-16 11:30:00,98.0,97.9,37.0,182.2,84.7,8.7
+PT1002,2026-06-16 11:45:00,100.7,97.8,37.3,183.4,82.7,8.2
+PT1002,2026-06-16 12:00:00,101.9,97.7,37.1,179.7,82.5,8.3
+PT1002,2026-06-16 12:15:00,101.2,97.7,37.1,178.2,80.8,8.6
+PT1002,2026-06-16 12:30:00,101.0,97.6,37.3,177.9,81.0,9.3
+PT1002,2026-06-16 12:45:00,100.1,97.4,37.2,176.2,80.7,9.0
+PT1002,2026-06-16 13:00:00,96.9,97.5,36.9,176.8,82.6,9.3
+PT1002,2026-06-16 13:15:00,97.8,97.5,37.1,172.9,82.9,9.1
+PT1002,2026-06-16 13:30:00,99.8,97.5,36.8,170.9,84.3,9.2
+PT1002,2026-06-16 13:45:00,97.8,97.3,36.7,172.6,83.9,9.2
+PT1002,2026-06-16 14:00:00,98.8,96.8,37.3,171.3,84.5,8.8
+PT1002,2026-06-16 14:15:00,97.7,96.5,37.4,173.8,84.7,9.0
+PT1002,2026-06-16 14:30:00,94.6,96.6,37.0,172.3,83.8,9.2
+PT1002,2026-06-16 14:45:00,95.3,96.6,36.9,172.6,83.1,8.8
+PT1002,2026-06-16 15:00:00,95.1,97.1,37.0,175.6,82.1,8.8
+PT1002,2026-06-16 15:15:00,95.3,97.1,37.0,176.6,77.7,8.9
+PT1002,2026-06-16 15:30:00,94.4,97.3,36.8,179.6,78.8,8.7
+PT1002,2026-06-16 15:45:00,90.8,97.4,36.7,180.7,78.6,9.1
+PT1002,2026-06-16 16:00:00,90.6,97.3,37.0,180.5,80.4,9.0
+PT1002,2026-06-16 16:15:00,89.5,97.6,37.2,177.7,79.5,9.7
+PT1002,2026-06-16 16:30:00,89.5,97.6,37.2,175.8,79.4,9.6
+PT1002,2026-06-16 16:45:00,87.7,97.7,37.2,177.8,79.1,9.8
+PT1002,2026-06-16 17:00:00,87.0,97.5,37.5,176.0,79.6,9.8
+PT1002,2026-06-16 17:15:00,87.9,97.7,37.1,176.5,78.1,10.0
+PT1002,2026-06-16 17:30:00,86.6,98.0,36.9,178.7,76.4,9.7
+PT1002,2026-06-16 17:45:00,87.3,98.1,37.2,178.8,76.8,9.2
+PT1002,2026-06-16 18:00:00,87.3,97.9,36.6,175.7,76.8,9.3
+PT1002,2026-06-16 18:15:00,87.3,97.9,37.2,174.6,77.4,9.3
+PT1002,2026-06-16 18:30:00,88.0,98.1,36.9,176.6,77.9,9.1
+PT1002,2026-06-16 18:45:00,86.7,98.1,36.9,179.3,77.4,9.3
+PT1002,2026-06-16 19:00:00,87.0,98.4,37.3,180.7,75.0,9.5
+PT1002,2026-06-16 19:15:00,87.2,98.6,37.4,179.0,75.1,9.9
+PT1002,2026-06-16 19:30:00,87.9,98.3,37.1,176.9,75.3,10.0
+PT1002,2026-06-16 19:45:00,86.9,98.4,37.0,177.1,75.7,10.2
+PT1002,2026-06-16 20:00:00,86.4,98.7,36.9,175.6,75.0,10.7
+PT1002,2026-06-16 20:15:00,86.3,98.6,37.2,172.0,74.8,10.3
+PT1002,2026-06-16 20:30:00,87.6,98.0,37.5,171.2,75.5,9.5
+PT1002,2026-06-16 20:45:00,88.1,98.3,37.7,170.1,74.9,9.4
+PT1002,2026-06-16 21:00:00,89.7,98.3,37.2,170.6,75.8,10.4
+PT1002,2026-06-16 21:15:00,89.8,98.2,36.7,171.1,74.9,10.5
+PT1002,2026-06-16 21:30:00,89.5,98.4,37.4,171.8,74.2,10.5
+PT1002,2026-06-16 21:45:00,88.0,98.1,37.4,170.0,74.2,9.9
+PT1002,2026-06-16 22:00:00,87.0,98.1,37.4,168.8,74.1,9.3
+PT1002,2026-06-16 22:15:00,85.8,97.9,37.2,173.6,75.0,9.7
+PT1002,2026-06-16 22:30:00,85.3,97.5,36.6,173.0,73.5,9.3
+PT1002,2026-06-16 22:45:00,85.5,97.9,36.2,174.1,73.3,9.3
+PT1002,2026-06-16 23:00:00,85.0,97.6,37.1,174.3,72.9,8.9
+PT1002,2026-06-16 23:15:00,85.2,97.9,36.8,175.7,73.3,8.5
+PT1002,2026-06-16 23:30:00,85.9,97.9,37.5,176.2,74.7,8.0
+PT1002,2026-06-16 23:45:00,87.1,97.4,37.3,180.9,75.2,8.0
+PT1003,2026-06-14 00:00:00,86.8,93.6,37.3,106.4,71.0,21.0
+PT1003,2026-06-14 00:15:00,85.9,93.8,37.7,106.4,68.9,20.9
+PT1003,2026-06-14 00:30:00,86.9,93.7,36.5,102.6,67.7,20.4
+PT1003,2026-06-14 00:45:00,87.9,93.8,36.7,106.2,66.2,20.4
+PT1003,2026-06-14 01:00:00,87.2,93.7,37.4,105.5,66.2,20.8
+PT1003,2026-06-14 01:15:00,86.2,93.7,37.3,107.1,67.8,20.5
+PT1003,2026-06-14 01:30:00,86.7,93.4,37.0,108.7,68.0,19.8
+PT1003,2026-06-14 01:45:00,86.7,93.3,37.0,111.1,69.9,19.6
+PT1003,2026-06-14 02:00:00,86.6,93.2,37.1,110.0,64.4,20.3
+PT1003,2026-06-14 02:15:00,86.3,93.3,36.5,109.8,63.7,19.9
+PT1003,2026-06-14 02:30:00,84.7,93.0,36.3,111.1,64.8,19.6
+PT1003,2026-06-14 02:45:00,84.8,92.9,36.8,110.2,66.2,19.6
+PT1003,2026-06-14 03:00:00,83.3,92.9,36.7,108.4,66.1,20.1
+PT1003,2026-06-14 03:15:00,83.5,93.1,37.2,108.2,67.2,19.9
+PT1003,2026-06-14 03:30:00,84.0,93.0,37.4,112.2,68.1,20.5
+PT1003,2026-06-14 03:45:00,84.4,93.3,36.8,112.6,67.0,20.5
+PT1003,2026-06-14 04:00:00,81.9,93.1,37.4,112.7,68.6,20.1
+PT1003,2026-06-14 04:15:00,80.5,92.9,37.2,115.6,68.6,20.1
+PT1003,2026-06-14 04:30:00,79.1,92.8,37.6,115.6,70.5,19.4
+PT1003,2026-06-14 04:45:00,79.0,92.5,36.9,113.0,70.9,18.8
+PT1003,2026-06-14 05:00:00,78.7,92.8,36.6,115.1,69.9,18.8
+PT1003,2026-06-14 05:15:00,76.3,92.5,36.7,117.3,71.1,18.9
+PT1003,2026-06-14 05:30:00,75.5,92.3,37.2,117.0,70.8,18.5
+PT1003,2026-06-14 05:45:00,75.9,92.1,37.2,117.6,72.5,19.1
+PT1003,2026-06-14 06:00:00,76.5,92.1,37.0,119.7,70.8,19.5
+PT1003,2026-06-14 06:15:00,78.3,92.2,37.2,119.5,70.5,19.7
+PT1003,2026-06-14 06:30:00,77.9,92.2,37.3,121.3,68.4,20.0
+PT1003,2026-06-14 06:45:00,79.4,92.1,37.2,121.3,68.8,20.2
+PT1003,2026-06-14 07:00:00,77.9,92.1,37.4,125.3,69.7,20.9
+PT1003,2026-06-14 07:15:00,79.6,92.2,37.3,126.4,70.1,20.9
+PT1003,2026-06-14 07:30:00,79.0,92.7,37.0,124.5,71.3,21.5
+PT1003,2026-06-14 07:45:00,77.7,93.0,37.6,124.9,72.5,21.4
+PT1003,2026-06-14 08:00:00,75.2,93.1,37.0,127.6,72.7,21.5
+PT1003,2026-06-14 08:15:00,75.3,92.7,36.9,126.2,71.5,21.8
+PT1003,2026-06-14 08:30:00,74.8,92.6,37.3,124.7,71.9,22.0
+PT1003,2026-06-14 08:45:00,75.6,92.7,36.8,124.0,71.3,21.6
+PT1003,2026-06-14 09:00:00,75.9,92.6,37.3,127.0,71.2,22.2
+PT1003,2026-06-14 09:15:00,75.0,92.6,36.8,123.6,71.5,21.9
+PT1003,2026-06-14 09:30:00,76.9,92.8,37.0,125.6,72.7,21.4
+PT1003,2026-06-14 09:45:00,76.6,92.4,37.9,124.5,71.9,21.5
+PT1003,2026-06-14 10:00:00,76.6,92.4,37.7,124.0,73.0,21.1
+PT1003,2026-06-14 10:15:00,76.5,92.3,37.5,125.9,71.6,21.3
+PT1003,2026-06-14 10:30:00,76.3,92.9,37.6,127.2,72.6,21.9
+PT1003,2026-06-14 10:45:00,76.6,93.1,37.1,130.0,70.9,21.2
+PT1003,2026-06-14 11:00:00,74.6,93.0,36.8,130.7,70.5,21.1
+PT1003,2026-06-14 11:15:00,75.6,92.7,37.1,126.4,70.2,21.5
+PT1003,2026-06-14 11:30:00,74.3,92.7,37.2,127.3,70.3,21.4
+PT1003,2026-06-14 11:45:00,72.3,92.5,37.2,124.7,72.3,21.7
+PT1003,2026-06-14 12:00:00,70.6,92.7,37.3,127.5,73.2,21.7
+PT1003,2026-06-14 12:15:00,71.0,93.0,37.0,129.3,72.8,21.4
+PT1003,2026-06-14 12:30:00,71.7,92.9,37.1,127.8,72.8,21.9
+PT1003,2026-06-14 12:45:00,71.5,93.0,37.2,128.0,69.9,22.1
+PT1003,2026-06-14 13:00:00,71.6,93.2,36.9,130.4,71.1,21.8
+PT1003,2026-06-14 13:15:00,73.0,92.8,37.2,130.1,71.8,21.1
+PT1003,2026-06-14 13:30:00,74.2,92.4,37.1,133.4,70.3,21.3
+PT1003,2026-06-14 13:45:00,74.4,92.1,36.7,135.9,70.8,22.0
+PT1003,2026-06-14 14:00:00,74.2,92.1,37.7,136.0,71.8,21.9
+PT1003,2026-06-14 14:15:00,74.4,91.4,36.8,136.2,73.7,21.5
+PT1003,2026-06-14 14:30:00,73.4,91.2,36.4,135.3,75.0,22.1
+PT1003,2026-06-14 14:45:00,73.0,91.2,36.3,135.7,77.9,21.3
+PT1003,2026-06-14 15:00:00,75.6,91.4,36.9,134.5,78.1,21.4
+PT1003,2026-06-14 15:15:00,75.8,91.5,36.7,138.5,79.6,22.1
+PT1003,2026-06-14 15:30:00,75.5,91.6,37.0,134.7,81.4,22.4
+PT1003,2026-06-14 15:45:00,75.3,91.9,37.3,133.1,83.3,22.3
+PT1003,2026-06-14 16:00:00,75.5,92.5,36.8,131.3,82.4,21.7
+PT1003,2026-06-14 16:15:00,76.4,92.9,37.4,133.0,82.4,21.3
+PT1003,2026-06-14 16:30:00,75.3,92.6,37.7,132.4,79.4,20.8
+PT1003,2026-06-14 16:45:00,73.5,92.3,36.5,132.5,79.6,20.7
+PT1003,2026-06-14 17:00:00,74.6,92.2,37.5,135.0,78.6,21.1
+PT1003,2026-06-14 17:15:00,74.1,92.4,37.3,132.3,79.0,21.6
+PT1003,2026-06-14 17:30:00,77.0,92.6,36.6,131.6,83.2,22.2
+PT1003,2026-06-14 17:45:00,76.2,92.3,36.6,132.9,84.1,22.4
+PT1003,2026-06-14 18:00:00,75.4,92.3,36.6,129.2,82.8,23.0
+PT1003,2026-06-14 18:15:00,77.3,92.5,36.9,128.6,81.8,23.3
+PT1003,2026-06-14 18:30:00,76.4,92.5,37.2,124.4,79.7,23.2
+PT1003,2026-06-14 18:45:00,75.5,92.5,37.2,121.2,81.0,23.3
+PT1003,2026-06-14 19:00:00,76.2,92.5,37.1,120.2,82.7,23.3
+PT1003,2026-06-14 19:15:00,76.2,92.5,36.8,119.8,83.4,23.0
+PT1003,2026-06-14 19:30:00,76.9,92.5,37.3,121.8,84.0,22.7
+PT1003,2026-06-14 19:45:00,78.4,92.6,36.9,123.1,83.8,23.1
+PT1003,2026-06-14 20:00:00,78.9,93.3,37.1,124.2,83.1,23.0
+PT1003,2026-06-14 20:15:00,80.0,93.3,37.1,122.9,82.2,23.0
+PT1003,2026-06-14 20:30:00,80.5,93.5,37.1,128.3,80.0,23.3
+PT1003,2026-06-14 20:45:00,78.4,93.8,37.0,129.2,81.2,22.6
+PT1003,2026-06-14 21:00:00,77.1,94.4,37.2,131.5,80.1,22.0
+PT1003,2026-06-14 21:15:00,78.5,93.9,37.0,129.6,78.5,22.4
+PT1003,2026-06-14 21:30:00,78.1,94.0,37.5,127.9,76.3,22.9
+PT1003,2026-06-14 21:45:00,78.4,94.0,37.1,130.4,76.6,22.7
+PT1003,2026-06-14 22:00:00,80.1,94.0,37.3,129.0,76.8,23.0
+PT1003,2026-06-14 22:15:00,80.8,93.8,37.3,130.6,76.8,22.7
+PT1003,2026-06-14 22:30:00,80.3,93.4,36.8,128.6,76.5,22.9
+PT1003,2026-06-14 22:45:00,80.1,93.1,37.4,130.5,79.1,23.6
+PT1003,2026-06-14 23:00:00,81.1,92.6,36.3,130.9,78.4,23.9
+PT1003,2026-06-14 23:15:00,81.4,92.6,36.8,133.1,80.7,23.6
+PT1003,2026-06-14 23:30:00,81.7,93.0,37.2,133.3,78.8,23.3
+PT1003,2026-06-14 23:45:00,82.0,92.8,36.8,132.0,77.3,23.8
+PT1003,2026-06-15 00:00:00,81.5,92.7,36.7,128.8,76.0,24.3
+PT1003,2026-06-15 00:15:00,80.4,92.4,37.1,128.6,78.8,24.2
+PT1003,2026-06-15 00:30:00,79.5,92.4,37.5,131.1,79.1,25.1
+PT1003,2026-06-15 00:45:00,79.4,92.4,37.7,134.3,79.3,25.6
+PT1003,2026-06-15 01:00:00,79.2,92.5,36.7,136.3,80.4,25.9
+PT1003,2026-06-15 01:15:00,78.2,92.3,37.3,138.7,78.6,26.5
+PT1003,2026-06-15 01:30:00,79.7,92.1,37.2,138.9,79.0,26.6
+PT1003,2026-06-15 01:45:00,79.4,92.1,37.4,140.9,77.3,27.3
+PT1003,2026-06-15 02:00:00,78.3,92.2,37.1,142.7,75.4,27.3
+PT1003,2026-06-15 02:15:00,77.5,92.3,37.3,141.5,77.5,27.0
+PT1003,2026-06-15 02:30:00,75.6,92.2,36.9,141.6,77.2,26.9
+PT1003,2026-06-15 02:45:00,76.6,92.5,36.8,141.4,75.5,27.6
+PT1003,2026-06-15 03:00:00,74.9,92.0,37.3,141.6,75.2,28.0
+PT1003,2026-06-15 03:15:00,75.3,91.9,37.0,143.8,78.0,28.4
+PT1003,2026-06-15 03:30:00,76.3,91.8,37.1,141.6,76.7,28.3
+PT1003,2026-06-15 03:45:00,78.8,91.6,36.9,144.2,76.2,27.5
+PT1003,2026-06-15 04:00:00,80.3,91.7,36.8,145.1,78.2,27.0
+PT1003,2026-06-15 04:15:00,77.6,92.0,36.6,146.2,79.3,26.6
+PT1003,2026-06-15 04:30:00,76.1,91.7,37.2,149.3,80.8,26.4
+PT1003,2026-06-15 04:45:00,75.3,91.8,37.3,147.0,81.9,26.0
+PT1003,2026-06-15 05:00:00,74.9,91.6,37.3,150.2,82.2,25.9
+PT1003,2026-06-15 05:15:00,73.3,91.9,37.0,150.0,83.1,25.3
+PT1003,2026-06-15 05:30:00,73.4,92.2,37.5,151.3,82.5,25.4
+PT1003,2026-06-15 05:45:00,73.2,92.1,37.1,147.5,82.0,24.7
+PT1003,2026-06-15 06:00:00,74.5,91.6,36.9,150.0,81.6,24.7
+PT1003,2026-06-15 06:15:00,72.5,91.4,37.1,154.2,79.9,24.1
+PT1003,2026-06-15 06:30:00,72.5,91.3,37.2,154.2,80.9,23.8
+PT1003,2026-06-15 06:45:00,73.8,91.1,37.1,149.6,81.9,24.9
+PT1003,2026-06-15 07:00:00,74.1,91.0,37.4,152.8,81.8,24.8
+PT1003,2026-06-15 07:15:00,73.6,90.7,37.7,154.5,80.9,24.4
+PT1003,2026-06-15 07:30:00,73.5,90.9,37.2,154.6,79.5,24.7
+PT1003,2026-06-15 07:45:00,72.7,91.0,37.2,153.6,77.9,24.2
+PT1003,2026-06-15 08:00:00,72.3,91.4,36.7,153.5,76.7,24.2
+PT1003,2026-06-15 08:15:00,72.3,91.5,37.3,153.9,78.7,25.3
+PT1003,2026-06-15 08:30:00,73.8,92.1,37.4,151.9,78.9,25.1
+PT1003,2026-06-15 08:45:00,74.2,91.9,36.9,151.9,80.4,24.6
+PT1003,2026-06-15 09:00:00,73.1,92.0,36.8,154.4,77.4,24.6
+PT1003,2026-06-15 09:15:00,74.4,92.0,37.7,154.6,77.4,25.1
+PT1003,2026-06-15 09:30:00,73.1,91.7,37.4,155.3,76.2,25.4
+PT1003,2026-06-15 09:45:00,72.6,91.6,36.4,154.7,76.3,25.6
+PT1003,2026-06-15 10:00:00,71.5,91.5,36.7,153.1,72.1,24.8
+PT1003,2026-06-15 10:15:00,71.4,91.4,37.1,151.9,73.2,25.1
+PT1003,2026-06-15 10:30:00,71.6,91.2,37.3,150.4,70.7,25.0
+PT1003,2026-06-15 10:45:00,73.3,91.1,37.0,151.4,66.4,24.8
+PT1003,2026-06-15 11:00:00,75.2,91.2,37.6,152.4,67.1,24.9
+PT1003,2026-06-15 11:15:00,72.5,91.3,36.9,154.6,64.2,25.2
+PT1003,2026-06-15 11:30:00,72.7,91.1,37.2,156.5,63.8,25.5
+PT1003,2026-06-15 11:45:00,71.8,91.2,37.4,155.2,63.9,25.4
+PT1003,2026-06-15 12:00:00,72.6,91.2,36.9,153.8,62.0,25.5
+PT1003,2026-06-15 12:15:00,70.4,90.9,37.0,157.1,61.0,25.9
+PT1003,2026-06-15 12:30:00,72.0,91.2,36.9,155.4,58.0,25.1
+PT1003,2026-06-15 12:45:00,74.3,91.1,37.1,155.7,60.0,25.2
+PT1003,2026-06-15 13:00:00,75.1,91.2,37.4,155.5,58.9,25.2
+PT1003,2026-06-15 13:15:00,77.3,91.3,37.3,157.0,59.3,25.2
+PT1003,2026-06-15 13:30:00,78.8,91.1,37.4,154.1,58.5,25.3
+PT1003,2026-06-15 13:45:00,77.7,90.5,36.9,153.1,58.2,24.8
+PT1003,2026-06-15 14:00:00,78.8,90.5,37.0,153.8,57.7,24.5
+PT1003,2026-06-15 14:15:00,79.4,90.1,37.3,157.1,58.5,24.3
+PT1003,2026-06-15 14:30:00,80.9,90.1,37.1,156.7,60.8,25.1
+PT1003,2026-06-15 14:45:00,79.6,90.0,37.2,158.7,59.2,25.0
+PT1003,2026-06-15 15:00:00,78.5,90.3,36.8,160.1,62.2,25.4
+PT1003,2026-06-15 15:15:00,79.2,90.5,36.8,162.2,61.1,25.0
+PT1003,2026-06-15 15:30:00,81.2,90.7,36.8,160.6,61.3,25.0
+PT1003,2026-06-15 15:45:00,81.2,90.8,36.8,164.4,60.3,24.3
+PT1003,2026-06-15 16:00:00,80.2,90.7,37.1,162.3,61.5,23.8
+PT1003,2026-06-15 16:15:00,82.6,90.8,37.3,163.2,64.3,24.3
+PT1003,2026-06-15 16:30:00,82.3,90.8,37.2,163.1,63.7,24.4
+PT1003,2026-06-15 16:45:00,80.8,91.2,37.4,163.9,63.3,24.5
+PT1003,2026-06-15 17:00:00,79.1,91.2,36.7,161.5,67.3,24.6
+PT1003,2026-06-15 17:15:00,83.5,91.1,37.2,161.1,67.1,24.2
+PT1003,2026-06-15 17:30:00,80.8,91.4,37.0,158.9,66.5,24.5
+PT1003,2026-06-15 17:45:00,80.7,91.2,37.2,163.1,67.3,24.1
+PT1003,2026-06-15 18:00:00,79.3,91.6,37.0,163.5,65.8,24.4
+PT1003,2026-06-15 18:15:00,77.8,91.7,37.1,164.2,67.5,24.4
+PT1003,2026-06-15 18:30:00,78.1,92.1,37.2,163.5,68.2,24.6
+PT1003,2026-06-15 18:45:00,77.7,92.1,36.8,163.4,71.1,24.4
+PT1003,2026-06-15 19:00:00,77.7,92.1,37.1,163.7,70.5,24.5
+PT1003,2026-06-15 19:15:00,78.9,92.2,36.8,163.9,71.2,24.8
+PT1003,2026-06-15 19:30:00,77.4,92.6,37.0,165.4,70.9,24.8
+PT1003,2026-06-15 19:45:00,77.7,92.4,36.8,167.0,71.2,24.9
+PT1003,2026-06-15 20:00:00,78.4,92.1,37.2,165.7,71.3,25.9
+PT1003,2026-06-15 20:15:00,75.4,92.0,37.1,167.0,69.6,26.3
+PT1003,2026-06-15 20:30:00,76.6,91.9,37.1,165.7,70.5,26.3
+PT1003,2026-06-15 20:45:00,78.6,92.0,37.5,161.8,71.7,26.5
+PT1003,2026-06-15 21:00:00,77.5,92.1,37.0,162.0,70.2,26.9
+PT1003,2026-06-15 21:15:00,78.9,91.9,36.9,159.1,69.9,27.0
+PT1003,2026-06-15 21:30:00,75.3,92.0,37.0,159.8,70.9,26.9
+PT1003,2026-06-15 21:45:00,77.1,91.6,37.2,159.3,71.1,27.1
+PT1003,2026-06-15 22:00:00,76.0,91.9,37.2,159.3,68.6,27.2
+PT1003,2026-06-15 22:15:00,78.4,92.1,36.9,156.4,66.4,27.7
+PT1003,2026-06-15 22:30:00,76.6,92.3,37.5,155.4,67.8,27.3
+PT1003,2026-06-15 22:45:00,77.7,92.1,36.9,152.1,71.3,27.2
+PT1003,2026-06-15 23:00:00,79.5,92.4,36.7,154.5,71.2,28.0
+PT1003,2026-06-15 23:15:00,78.8,92.5,37.0,156.8,72.1,28.0
+PT1003,2026-06-15 23:30:00,80.3,92.7,36.9,155.1,70.8,27.7
+PT1003,2026-06-15 23:45:00,81.6,92.8,36.6,156.2,71.1,27.8
+PT1003,2026-06-16 00:00:00,82.5,92.7,37.3,156.1,70.4,27.9
+PT1003,2026-06-16 00:15:00,81.4,92.7,36.8,155.2,72.4,27.5
+PT1003,2026-06-16 00:30:00,81.0,92.5,37.4,154.8,71.6,27.5
+PT1003,2026-06-16 00:45:00,81.1,92.5,37.3,152.6,71.4,27.3
+PT1003,2026-06-16 01:00:00,80.2,92.3,37.2,153.3,74.3,27.2
+PT1003,2026-06-16 01:15:00,81.4,92.5,36.9,154.3,74.2,27.2
+PT1003,2026-06-16 01:30:00,82.0,92.6,37.4,155.7,73.5,27.5
+PT1003,2026-06-16 01:45:00,80.6,92.5,37.1,158.1,72.5,27.8
+PT1003,2026-06-16 02:00:00,81.0,92.5,37.5,159.6,70.9,27.4
+PT1003,2026-06-16 02:15:00,83.6,92.5,37.5,163.0,69.8,27.2
+PT1003,2026-06-16 02:30:00,84.5,92.9,37.5,164.0,68.3,27.3
+PT1003,2026-06-16 02:45:00,84.4,92.9,37.1,164.9,67.4,27.4
+PT1003,2026-06-16 03:00:00,83.8,93.1,37.0,166.2,66.9,27.4
+PT1003,2026-06-16 03:15:00,83.1,92.7,37.2,165.2,66.0,27.4
+PT1003,2026-06-16 03:30:00,82.1,92.8,37.3,163.3,65.8,27.2
+PT1003,2026-06-16 03:45:00,82.3,92.8,36.9,162.1,65.3,27.9
+PT1003,2026-06-16 04:00:00,82.9,92.7,37.3,163.0,66.5,27.8
+PT1003,2026-06-16 04:15:00,86.3,92.9,37.2,166.2,67.3,27.4
+PT1003,2026-06-16 04:30:00,85.9,92.7,37.9,166.1,67.0,27.0
+PT1003,2026-06-16 04:45:00,86.8,92.8,37.3,166.2,68.8,27.8
+PT1003,2026-06-16 05:00:00,87.0,93.2,37.0,166.5,69.5,28.2
+PT1003,2026-06-16 05:15:00,84.5,93.1,37.0,168.1,70.5,28.7
+PT1003,2026-06-16 05:30:00,86.4,93.1,36.8,169.3,71.9,28.2
+PT1003,2026-06-16 05:45:00,85.2,93.4,36.7,168.7,74.9,28.2
+PT1003,2026-06-16 06:00:00,84.4,93.4,37.4,169.7,73.5,28.4
+PT1003,2026-06-16 06:15:00,83.6,93.9,37.5,168.6,72.0,27.8
+PT1003,2026-06-16 06:30:00,83.7,93.8,36.5,165.7,71.4,28.8
+PT1003,2026-06-16 06:45:00,83.0,94.2,37.2,168.2,70.5,28.8
+PT1003,2026-06-16 07:00:00,83.1,94.7,36.5,168.9,72.2,28.9
+PT1003,2026-06-16 07:15:00,81.7,94.4,37.1,168.4,75.3,29.1
+PT1003,2026-06-16 07:30:00,83.3,94.1,37.4,167.4,74.4,29.2
+PT1003,2026-06-16 07:45:00,83.8,94.2,37.3,166.7,74.9,28.9
+PT1003,2026-06-16 08:00:00,83.3,93.9,37.3,166.7,72.0,29.5
+PT1003,2026-06-16 08:15:00,83.7,93.5,36.6,165.3,72.1,29.4
+PT1003,2026-06-16 08:30:00,82.1,93.4,36.9,162.8,74.1,29.6
+PT1003,2026-06-16 08:45:00,83.6,93.7,36.9,163.4,74.1,29.5
+PT1003,2026-06-16 09:00:00,82.0,94.0,37.0,162.3,74.1,29.1
+PT1003,2026-06-16 09:15:00,85.4,93.9,37.5,165.2,74.1,29.4
+PT1003,2026-06-16 09:30:00,85.8,93.8,36.7,164.8,73.8,30.1
+PT1003,2026-06-16 09:45:00,83.7,93.3,36.9,163.1,74.9,30.4
+PT1003,2026-06-16 10:00:00,83.6,93.1,37.0,161.0,75.7,30.8
+PT1003,2026-06-16 10:15:00,85.6,93.3,37.8,164.2,75.3,31.4
+PT1003,2026-06-16 10:30:00,85.1,93.3,36.9,162.3,73.6,31.0
+PT1003,2026-06-16 10:45:00,85.5,93.1,37.1,162.8,74.0,30.8
+PT1003,2026-06-16 11:00:00,84.9,93.0,36.8,161.2,74.1,30.6
+PT1003,2026-06-16 11:15:00,85.6,93.2,37.2,163.4,72.6,30.4
+PT1003,2026-06-16 11:30:00,85.0,93.3,37.3,164.4,73.3,30.9
+PT1003,2026-06-16 11:45:00,85.2,93.3,37.2,164.1,71.7,30.2
+PT1003,2026-06-16 12:00:00,86.7,93.2,37.4,167.3,71.4,29.5
+PT1003,2026-06-16 12:15:00,86.1,93.4,37.2,164.8,72.0,29.1
+PT1003,2026-06-16 12:30:00,87.1,93.6,37.4,164.9,70.0,29.4
+PT1003,2026-06-16 12:45:00,85.8,93.3,37.2,167.0,69.7,29.1
+PT1003,2026-06-16 13:00:00,85.1,93.4,36.4,166.2,69.2,29.5
+PT1003,2026-06-16 13:15:00,85.7,93.6,36.9,165.0,70.6,29.1
+PT1003,2026-06-16 13:30:00,84.8,93.9,37.3,161.5,73.0,29.0
+PT1003,2026-06-16 13:45:00,85.5,93.9,36.9,160.3,74.9,28.8
+PT1003,2026-06-16 14:00:00,86.5,93.9,37.2,163.0,74.8,28.6
+PT1003,2026-06-16 14:15:00,86.0,93.8,36.8,164.7,77.6,28.5
+PT1003,2026-06-16 14:30:00,85.8,93.9,36.8,165.2,79.3,28.7
+PT1003,2026-06-16 14:45:00,85.2,93.5,36.9,167.5,76.4,28.2
+PT1003,2026-06-16 15:00:00,85.9,93.4,36.7,166.7,75.8,28.3
+PT1003,2026-06-16 15:15:00,84.8,93.8,37.1,167.5,77.0,28.3
+PT1003,2026-06-16 15:30:00,85.4,94.0,36.4,169.2,76.8,28.7
+PT1003,2026-06-16 15:45:00,86.5,93.9,37.2,170.3,75.8,28.2
+PT1003,2026-06-16 16:00:00,84.7,93.8,37.0,168.7,75.6,28.5
+PT1003,2026-06-16 16:15:00,85.1,94.0,37.1,167.5,74.7,29.0
+PT1003,2026-06-16 16:30:00,85.7,94.1,36.5,165.1,73.5,29.2
+PT1003,2026-06-16 16:45:00,85.4,93.9,37.1,167.3,74.0,29.6
+PT1003,2026-06-16 17:00:00,85.3,93.8,36.8,166.3,78.1,30.0
+PT1003,2026-06-16 17:15:00,88.5,93.7,36.9,167.0,79.5,29.4
+PT1003,2026-06-16 17:30:00,90.5,93.7,37.6,169.0,78.8,29.3
+PT1003,2026-06-16 17:45:00,91.0,93.6,37.3,167.6,77.9,29.8
+PT1003,2026-06-16 18:00:00,89.6,93.6,37.4,167.5,78.4,29.6
+PT1003,2026-06-16 18:15:00,89.6,93.7,37.6,165.9,77.3,30.6
+PT1003,2026-06-16 18:30:00,89.5,94.1,37.3,168.3,76.3,30.3
+PT1003,2026-06-16 18:45:00,89.8,94.0,36.7,169.8,74.2,30.4
+PT1003,2026-06-16 19:00:00,88.3,93.8,37.2,170.5,73.2,29.9
+PT1003,2026-06-16 19:15:00,90.1,93.9,37.3,174.1,75.3,29.7
+PT1003,2026-06-16 19:30:00,90.0,94.2,37.2,173.9,74.1,30.3
+PT1003,2026-06-16 19:45:00,89.2,94.1,37.2,172.6,72.6,30.1
+PT1003,2026-06-16 20:00:00,89.3,94.0,37.1,175.5,69.6,30.2
+PT1003,2026-06-16 20:15:00,88.1,94.1,37.7,175.1,71.4,30.5
+PT1003,2026-06-16 20:30:00,87.5,94.4,37.3,172.8,71.3,30.4
+PT1003,2026-06-16 20:45:00,88.2,94.2,37.1,174.1,70.7,30.0
+PT1003,2026-06-16 21:00:00,86.4,94.4,37.6,174.0,70.7,30.0
+PT1003,2026-06-16 21:15:00,88.3,94.7,37.2,173.8,69.0,30.0
+PT1003,2026-06-16 21:30:00,89.2,94.8,37.3,171.8,68.2,29.7
+PT1003,2026-06-16 21:45:00,89.9,95.0,37.1,172.4,65.1,29.0
+PT1003,2026-06-16 22:00:00,90.0,95.3,37.1,172.5,63.6,29.3
+PT1003,2026-06-16 22:15:00,89.5,94.9,37.3,172.7,64.0,28.9
+PT1003,2026-06-16 22:30:00,90.3,94.9,36.9,172.7,65.4,29.1
+PT1003,2026-06-16 22:45:00,90.1,95.0,37.5,168.6,64.0,29.3
+PT1003,2026-06-16 23:00:00,91.3,95.2,36.5,168.9,62.5,29.2
+PT1003,2026-06-16 23:15:00,92.8,95.0,36.7,167.8,64.0,28.6
+PT1003,2026-06-16 23:30:00,93.1,95.1,37.3,167.7,64.0,29.1
+PT1003,2026-06-16 23:45:00,93.7,95.3,37.5,167.1,67.2,28.2
+PT1004,2026-06-14 00:00:00,79.1,99.2,37.1,168.2,96.8,16.4
+PT1004,2026-06-14 00:15:00,78.2,99.4,36.8,171.3,93.9,17.4
+PT1004,2026-06-14 00:30:00,77.1,99.1,36.9,171.3,92.0,16.9
+PT1004,2026-06-14 00:45:00,77.2,99.1,37.0,173.8,93.8,17.3
+PT1004,2026-06-14 01:00:00,75.0,98.7,36.7,175.8,95.0,17.1
+PT1004,2026-06-14 01:15:00,73.8,98.7,37.0,176.2,96.6,16.9
+PT1004,2026-06-14 01:30:00,75.1,98.2,37.3,176.8,96.1,17.2
+PT1004,2026-06-14 01:45:00,74.3,98.1,37.5,172.2,97.2,17.3
+PT1004,2026-06-14 02:00:00,73.9,98.3,36.9,170.1,93.2,17.2
+PT1004,2026-06-14 02:15:00,72.6,98.5,37.1,172.5,93.3,17.2
+PT1004,2026-06-14 02:30:00,71.9,98.7,37.3,169.4,91.7,16.9
+PT1004,2026-06-14 02:45:00,71.5,99.0,37.0,171.0,90.5,17.1
+PT1004,2026-06-14 03:00:00,72.1,99.2,37.2,173.3,90.8,17.8
+PT1004,2026-06-14 03:15:00,72.3,99.1,37.2,172.0,91.5,17.8
+PT1004,2026-06-14 03:30:00,72.9,99.2,37.0,176.0,90.7,18.0
+PT1004,2026-06-14 03:45:00,70.0,99.2,37.2,174.2,90.6,18.0
+PT1004,2026-06-14 04:00:00,69.4,99.1,37.1,175.6,89.4,17.2
+PT1004,2026-06-14 04:15:00,70.7,99.2,37.0,175.9,91.2,17.7
+PT1004,2026-06-14 04:30:00,71.1,99.3,36.9,175.7,92.9,17.6
+PT1004,2026-06-14 04:45:00,68.0,99.1,37.3,173.1,92.9,17.1
+PT1004,2026-06-14 05:00:00,69.4,99.1,37.6,171.1,93.3,17.8
+PT1004,2026-06-14 05:15:00,67.7,98.7,36.9,167.7,91.6,17.9
+PT1004,2026-06-14 05:30:00,66.8,99.0,37.3,168.8,89.0,18.3
+PT1004,2026-06-14 05:45:00,67.5,98.9,36.8,168.4,86.1,18.7
+PT1004,2026-06-14 06:00:00,66.5,98.6,37.1,172.0,85.1,19.1
+PT1004,2026-06-14 06:15:00,65.5,98.4,37.0,170.8,85.0,19.3
+PT1004,2026-06-14 06:30:00,65.0,98.2,36.9,168.4,83.0,19.7
+PT1004,2026-06-14 06:45:00,64.5,98.0,37.2,167.7,83.6,19.5
+PT1004,2026-06-14 07:00:00,66.3,97.8,36.7,166.9,84.6,20.1
+PT1004,2026-06-14 07:15:00,64.3,97.8,37.1,166.7,85.6,20.3
+PT1004,2026-06-14 07:30:00,65.6,97.6,36.7,167.1,83.8,20.3
+PT1004,2026-06-14 07:45:00,64.4,98.1,37.8,163.4,83.5,20.6
+PT1004,2026-06-14 08:00:00,64.6,98.1,36.9,163.5,85.1,20.8
+PT1004,2026-06-14 08:15:00,66.0,98.0,37.1,160.3,82.7,20.7
+PT1004,2026-06-14 08:30:00,67.3,98.2,36.7,160.5,84.2,20.7
+PT1004,2026-06-14 08:45:00,65.5,98.5,37.2,156.0,83.9,21.9
+PT1004,2026-06-14 09:00:00,65.3,98.1,37.1,159.2,85.7,22.2
+PT1004,2026-06-14 09:15:00,66.1,98.1,37.3,157.3,87.1,22.2
+PT1004,2026-06-14 09:30:00,66.0,98.2,38.0,157.2,87.0,22.2
+PT1004,2026-06-14 09:45:00,67.0,98.8,37.6,157.2,86.5,21.8
+PT1004,2026-06-14 10:00:00,66.0,99.3,37.0,155.2,87.9,21.1
+PT1004,2026-06-14 10:15:00,66.1,99.2,36.5,154.9,87.6,21.4
+PT1004,2026-06-14 10:30:00,65.4,99.5,36.8,156.0,89.5,21.8
+PT1004,2026-06-14 10:45:00,66.3,99.5,37.3,160.5,90.7,22.0
+PT1004,2026-06-14 11:00:00,66.9,99.6,37.4,160.0,91.5,22.3
+PT1004,2026-06-14 11:15:00,68.1,100.0,36.8,162.2,92.5,21.9
+PT1004,2026-06-14 11:30:00,67.8,100.0,37.0,165.0,88.3,21.5
+PT1004,2026-06-14 11:45:00,66.7,99.8,37.5,164.0,86.9,21.2
+PT1004,2026-06-14 12:00:00,67.5,100.0,37.3,164.0,88.4,21.5
+PT1004,2026-06-14 12:15:00,66.8,99.8,36.9,166.1,87.6,21.0
+PT1004,2026-06-14 12:30:00,68.7,99.7,37.3,166.7,86.7,21.3
+PT1004,2026-06-14 12:45:00,66.9,99.8,37.7,163.4,85.9,21.3
+PT1004,2026-06-14 13:00:00,67.4,99.6,37.4,162.7,87.3,21.0
+PT1004,2026-06-14 13:15:00,66.8,99.3,37.1,161.8,84.8,20.1
+PT1004,2026-06-14 13:30:00,66.8,99.4,36.7,161.6,88.3,20.2
+PT1004,2026-06-14 13:45:00,65.5,99.4,37.1,160.7,86.5,20.2
+PT1004,2026-06-14 14:00:00,67.5,99.2,36.8,159.9,88.9,20.3
+PT1004,2026-06-14 14:15:00,66.7,98.9,36.7,160.0,90.4,20.9
+PT1004,2026-06-14 14:30:00,67.8,98.9,37.3,159.5,89.8,20.2
+PT1004,2026-06-14 14:45:00,66.2,98.7,37.5,160.3,87.1,19.6
+PT1004,2026-06-14 15:00:00,66.4,98.6,36.8,160.6,88.1,20.1
+PT1004,2026-06-14 15:15:00,65.3,98.7,37.0,161.9,86.1,19.7
+PT1004,2026-06-14 15:30:00,65.4,98.7,36.8,159.2,86.1,19.4
+PT1004,2026-06-14 15:45:00,65.4,98.7,36.6,160.8,84.8,19.5
+PT1004,2026-06-14 16:00:00,65.1,98.8,37.0,161.8,85.7,19.8
+PT1004,2026-06-14 16:15:00,65.8,99.3,37.0,160.9,87.7,20.2
+PT1004,2026-06-14 16:30:00,65.6,99.3,36.5,162.6,88.3,20.0
+PT1004,2026-06-14 16:45:00,66.5,98.8,37.2,159.8,87.7,19.5
+PT1004,2026-06-14 17:00:00,66.2,99.0,37.1,156.6,86.7,19.5
+PT1004,2026-06-14 17:15:00,67.1,98.8,37.2,155.7,87.5,18.6
+PT1004,2026-06-14 17:30:00,68.1,98.5,37.2,155.0,89.7,18.9
+PT1004,2026-06-14 17:45:00,69.3,98.9,37.0,155.1,89.1,19.3
+PT1004,2026-06-14 18:00:00,68.2,98.8,36.8,155.7,88.4,19.1
+PT1004,2026-06-14 18:15:00,70.0,98.7,37.3,154.3,87.5,19.5
+PT1004,2026-06-14 18:30:00,69.5,98.7,37.3,154.8,86.5,18.8
+PT1004,2026-06-14 18:45:00,68.7,98.8,36.9,155.5,86.6,18.7
+PT1004,2026-06-14 19:00:00,67.4,98.7,37.1,156.6,88.7,19.2
+PT1004,2026-06-14 19:15:00,69.1,98.6,36.6,154.0,91.5,19.4
+PT1004,2026-06-14 19:30:00,71.0,98.4,36.8,153.0,93.1,19.9
+PT1004,2026-06-14 19:45:00,72.8,98.6,36.6,151.4,92.7,20.5
+PT1004,2026-06-14 20:00:00,74.5,98.9,37.7,152.4,92.9,21.3
+PT1004,2026-06-14 20:15:00,73.8,99.0,37.4,156.1,91.7,21.4
+PT1004,2026-06-14 20:30:00,71.4,99.2,36.4,154.0,92.0,21.9
+PT1004,2026-06-14 20:45:00,72.4,99.7,36.6,152.9,92.9,22.4
+PT1004,2026-06-14 21:00:00,73.3,100.0,37.5,154.2,93.0,22.0
+PT1004,2026-06-14 21:15:00,73.4,99.8,37.1,153.5,93.6,21.4
+PT1004,2026-06-14 21:30:00,72.9,100.0,36.5,149.8,95.0,22.0
+PT1004,2026-06-14 21:45:00,70.9,100.0,37.2,148.0,99.6,21.2
+PT1004,2026-06-14 22:00:00,70.9,99.9,36.8,148.9,100.4,21.2
+PT1004,2026-06-14 22:15:00,72.2,100.0,36.9,149.1,101.3,21.5
+PT1004,2026-06-14 22:30:00,72.9,99.9,37.0,150.7,101.0,21.7
+PT1004,2026-06-14 22:45:00,73.7,99.6,37.2,150.8,102.5,21.9
+PT1004,2026-06-14 23:00:00,75.9,99.9,37.6,152.5,103.5,22.2
+PT1004,2026-06-14 23:15:00,75.4,100.0,37.2,153.2,102.9,22.2
+PT1004,2026-06-14 23:30:00,74.4,100.0,37.1,153.0,103.0,22.7
+PT1004,2026-06-14 23:45:00,76.3,99.9,37.4,150.8,102.6,21.6
+PT1004,2026-06-15 00:00:00,75.0,99.7,36.5,152.3,102.8,21.4
+PT1004,2026-06-15 00:15:00,76.6,99.9,37.4,156.4,101.9,20.8
+PT1004,2026-06-15 00:30:00,76.4,100.0,37.2,159.6,102.4,20.9
+PT1004,2026-06-15 00:45:00,74.4,100.0,37.1,162.0,103.2,20.3
+PT1004,2026-06-15 01:00:00,76.2,99.9,37.0,164.3,103.3,20.6
+PT1004,2026-06-15 01:15:00,76.3,100.0,36.9,162.2,103.7,19.5
+PT1004,2026-06-15 01:30:00,76.9,100.0,36.8,163.1,101.6,19.9
+PT1004,2026-06-15 01:45:00,77.7,99.7,37.0,161.6,100.2,20.0
+PT1004,2026-06-15 02:00:00,78.3,99.7,36.8,158.5,100.6,19.3
+PT1004,2026-06-15 02:15:00,77.9,99.6,37.8,155.2,102.7,19.9
+PT1004,2026-06-15 02:30:00,79.2,99.5,37.1,154.4,102.0,20.7
+PT1004,2026-06-15 02:45:00,80.7,99.8,37.1,154.8,99.8,20.7
+PT1004,2026-06-15 03:00:00,82.3,99.8,36.3,152.4,101.3,20.6
+PT1004,2026-06-15 03:15:00,82.6,99.9,37.2,150.7,101.0,20.9
+PT1004,2026-06-15 03:30:00,80.7,100.0,37.3,154.1,100.2,20.1
+PT1004,2026-06-15 03:45:00,79.9,100.0,37.0,158.5,97.9,19.8
+PT1004,2026-06-15 04:00:00,81.5,100.0,36.9,159.0,95.5,19.6
+PT1004,2026-06-15 04:15:00,82.3,100.0,37.0,156.9,94.2,19.5
+PT1004,2026-06-15 04:30:00,82.2,100.0,36.7,159.4,93.6,19.3
+PT1004,2026-06-15 04:45:00,81.9,100.0,37.3,155.9,93.1,19.7
+PT1004,2026-06-15 05:00:00,82.4,100.0,37.3,154.8,92.0,20.2
+PT1004,2026-06-15 05:15:00,81.5,99.5,37.2,153.3,92.9,20.0
+PT1004,2026-06-15 05:30:00,83.1,99.5,36.9,153.8,93.9,19.6
+PT1004,2026-06-15 05:45:00,84.0,99.5,37.2,154.1,93.9,19.9
+PT1004,2026-06-15 06:00:00,84.5,99.8,37.8,157.3,97.3,19.7
+PT1004,2026-06-15 06:15:00,83.1,100.0,36.8,156.0,97.2,19.7
+PT1004,2026-06-15 06:30:00,83.2,99.8,37.0,153.5,97.1,20.4
+PT1004,2026-06-15 06:45:00,84.3,99.6,37.2,151.0,97.8,21.1
+PT1004,2026-06-15 07:00:00,85.3,99.9,37.3,150.9,97.6,21.2
+PT1004,2026-06-15 07:15:00,83.6,100.0,36.8,150.9,96.4,21.2
+PT1004,2026-06-15 07:30:00,81.7,100.0,36.9,152.7,95.9,20.8
+PT1004,2026-06-15 07:45:00,82.4,100.0,37.1,154.2,97.8,20.4
+PT1004,2026-06-15 08:00:00,83.6,99.6,36.8,152.9,99.3,20.5
+PT1004,2026-06-15 08:15:00,81.6,100.0,37.4,148.8,100.2,20.3
+PT1004,2026-06-15 08:30:00,80.3,100.0,37.1,149.6,101.1,20.0
+PT1004,2026-06-15 08:45:00,80.2,100.0,37.3,150.4,101.9,20.2
+PT1004,2026-06-15 09:00:00,78.5,100.0,37.7,148.7,101.8,20.8
+PT1004,2026-06-15 09:15:00,79.5,99.9,36.7,148.9,102.1,20.9
+PT1004,2026-06-15 09:30:00,81.0,99.9,36.7,147.5,101.3,21.0
+PT1004,2026-06-15 09:45:00,82.0,100.0,36.7,150.6,101.4,20.6
+PT1004,2026-06-15 10:00:00,81.5,99.9,37.2,149.5,101.6,20.3
+PT1004,2026-06-15 10:15:00,80.9,100.0,37.2,148.8,103.5,20.6
+PT1004,2026-06-15 10:30:00,80.6,99.6,37.2,151.7,102.5,20.6
+PT1004,2026-06-15 10:45:00,80.4,100.0,37.0,149.2,105.1,20.9
+PT1004,2026-06-15 11:00:00,80.1,99.4,37.5,147.5,104.5,21.0
+PT1004,2026-06-15 11:15:00,82.5,99.5,36.9,147.9,103.8,20.3
+PT1004,2026-06-15 11:30:00,82.3,99.7,36.5,149.0,104.1,20.1
+PT1004,2026-06-15 11:45:00,79.9,99.3,37.3,148.4,105.6,20.4
+PT1004,2026-06-15 12:00:00,79.3,99.6,36.7,146.5,106.9,19.8
+PT1004,2026-06-15 12:15:00,81.3,99.5,37.0,145.2,108.6,20.3
+PT1004,2026-06-15 12:30:00,81.6,99.5,36.9,139.5,106.5,20.6
+PT1004,2026-06-15 12:45:00,82.2,99.6,37.1,142.0,104.4,20.8
+PT1004,2026-06-15 13:00:00,81.2,99.4,37.1,142.4,105.4,20.8
+PT1004,2026-06-15 13:15:00,80.6,99.3,37.3,140.8,104.6,21.1
+PT1004,2026-06-15 13:30:00,79.1,99.1,36.8,139.4,104.5,20.4
+PT1004,2026-06-15 13:45:00,77.4,99.2,37.0,139.3,103.8,20.0
+PT1004,2026-06-15 14:00:00,76.7,99.6,37.4,141.3,102.8,20.0
+PT1004,2026-06-15 14:15:00,75.9,99.2,37.2,137.7,104.7,20.0
+PT1004,2026-06-15 14:30:00,75.2,98.9,37.5,135.6,102.7,20.3
+PT1004,2026-06-15 14:45:00,75.3,98.5,37.1,136.6,104.6,20.7
+PT1004,2026-06-15 15:00:00,75.0,98.5,37.0,139.0,105.7,20.5
+PT1004,2026-06-15 15:15:00,74.5,98.3,36.9,141.7,104.5,20.7
+PT1004,2026-06-15 15:30:00,73.9,98.2,37.1,142.8,104.1,20.3
+PT1004,2026-06-15 15:45:00,73.0,98.6,37.3,142.3,103.1,21.1
+PT1004,2026-06-15 16:00:00,72.0,98.4,36.9,143.2,103.2,21.4
+PT1004,2026-06-15 16:15:00,72.8,97.9,37.1,142.9,102.3,21.2
+PT1004,2026-06-15 16:30:00,74.2,97.6,36.6,138.6,100.7,21.6
+PT1004,2026-06-15 16:45:00,73.6,97.8,37.0,138.4,102.4,20.8
+PT1004,2026-06-15 17:00:00,75.2,97.5,37.5,140.5,102.1,21.0
+PT1004,2026-06-15 17:15:00,75.7,97.4,36.7,141.6,101.1,21.1
+PT1004,2026-06-15 17:30:00,75.8,97.7,37.1,141.0,102.7,22.3
+PT1004,2026-06-15 17:45:00,76.5,97.8,36.9,141.5,103.9,22.2
+PT1004,2026-06-15 18:00:00,74.7,97.7,37.1,143.3,102.5,22.3
+PT1004,2026-06-15 18:15:00,74.0,97.3,37.4,146.0,103.2,23.4
+PT1004,2026-06-15 18:30:00,75.6,96.9,36.9,142.5,103.3,23.0
+PT1004,2026-06-15 18:45:00,78.6,97.2,36.9,140.6,99.8,22.5
+PT1004,2026-06-15 19:00:00,78.2,96.9,37.1,142.9,98.7,22.8
+PT1004,2026-06-15 19:15:00,79.4,96.8,37.7,141.0,97.8,22.6
+PT1004,2026-06-15 19:30:00,79.4,96.8,37.0,142.8,97.8,23.0
+PT1004,2026-06-15 19:45:00,78.9,96.6,37.2,146.5,97.7,22.5
+PT1004,2026-06-15 20:00:00,78.1,96.5,36.9,147.1,100.0,22.6
+PT1004,2026-06-15 20:15:00,77.5,96.7,36.6,143.2,98.4,22.7
+PT1004,2026-06-15 20:30:00,77.1,96.6,37.1,145.0,98.0,23.1
+PT1004,2026-06-15 20:45:00,79.2,96.2,37.5,148.2,97.4,23.7
+PT1004,2026-06-15 21:00:00,75.8,96.4,37.3,150.2,99.4,23.3
+PT1004,2026-06-15 21:15:00,76.1,96.5,37.2,152.2,101.1,23.0
+PT1004,2026-06-15 21:30:00,76.1,96.5,37.4,151.9,101.4,22.8
+PT1004,2026-06-15 21:45:00,77.7,96.3,37.5,154.5,100.2,23.1
+PT1004,2026-06-15 22:00:00,77.5,96.1,36.6,153.3,100.8,23.9
+PT1004,2026-06-15 22:15:00,77.7,96.1,37.5,152.4,100.6,23.7
+PT1004,2026-06-15 22:30:00,79.3,96.1,37.7,152.2,99.9,23.7
+PT1004,2026-06-15 22:45:00,79.1,95.9,37.1,151.4,101.0,23.4
+PT1004,2026-06-15 23:00:00,79.7,95.8,37.0,147.8,99.4,23.1
+PT1004,2026-06-15 23:15:00,79.8,96.0,36.6,145.4,100.4,23.0
+PT1004,2026-06-15 23:30:00,79.8,96.3,37.2,147.1,100.3,23.4
+PT1004,2026-06-15 23:45:00,80.9,95.9,37.2,144.6,101.4,24.0
+PT1004,2026-06-16 00:00:00,80.3,95.7,37.4,144.0,103.2,23.9
+PT1004,2026-06-16 00:15:00,81.1,96.2,36.8,144.4,103.2,24.3
+PT1004,2026-06-16 00:30:00,80.5,95.8,36.7,141.9,106.0,24.6
+PT1004,2026-06-16 00:45:00,82.0,95.6,36.9,143.2,107.0,25.3
+PT1004,2026-06-16 01:00:00,81.1,95.0,37.5,142.9,108.1,25.6
+PT1004,2026-06-16 01:15:00,81.4,95.1,36.7,143.1,109.1,25.2
+PT1004,2026-06-16 01:30:00,80.4,95.2,37.3,140.5,108.2,25.0
+PT1004,2026-06-16 01:45:00,81.2,95.2,36.9,141.4,108.9,24.8
+PT1004,2026-06-16 02:00:00,83.0,94.6,37.4,139.9,108.6,25.1
+PT1004,2026-06-16 02:15:00,85.2,94.6,36.7,139.8,109.1,24.9
+PT1004,2026-06-16 02:30:00,85.0,94.8,37.1,139.4,109.7,24.1
+PT1004,2026-06-16 02:45:00,84.5,94.5,37.4,140.7,112.5,24.5
+PT1004,2026-06-16 03:00:00,85.3,94.7,37.3,137.1,112.3,24.7
+PT1004,2026-06-16 03:15:00,86.8,94.5,37.1,138.3,110.7,24.6
+PT1004,2026-06-16 03:30:00,87.8,94.7,37.0,138.5,107.5,24.8
+PT1004,2026-06-16 03:45:00,89.4,95.0,37.3,136.7,108.4,25.0
+PT1004,2026-06-16 04:00:00,89.9,95.2,37.3,139.7,107.5,24.7
+PT1004,2026-06-16 04:15:00,87.5,95.4,37.6,140.6,104.0,24.4
+PT1004,2026-06-16 04:30:00,85.7,95.4,37.1,138.6,103.0,25.2
+PT1004,2026-06-16 04:45:00,86.3,95.4,37.1,135.6,101.2,25.7
+PT1004,2026-06-16 05:00:00,85.4,95.4,36.6,136.9,101.9,25.4
+PT1004,2026-06-16 05:15:00,84.8,95.7,36.9,138.6,102.5,25.3
+PT1004,2026-06-16 05:30:00,84.6,95.9,37.1,140.6,102.1,26.3
+PT1004,2026-06-16 05:45:00,84.2,96.3,37.5,136.5,102.8,26.3
+PT1004,2026-06-16 06:00:00,84.9,96.4,36.7,137.9,101.2,26.7
+PT1004,2026-06-16 06:15:00,85.3,96.4,36.9,134.3,101.3,26.8
+PT1004,2026-06-16 06:30:00,84.0,96.5,36.9,135.1,101.7,26.8
+PT1004,2026-06-16 06:45:00,86.7,96.5,37.0,133.3,101.8,26.7
+PT1004,2026-06-16 07:00:00,88.9,96.2,37.6,133.4,100.2,26.5
+PT1004,2026-06-16 07:15:00,89.2,96.3,37.2,131.5,99.5,27.2
+PT1004,2026-06-16 07:30:00,88.7,96.4,37.8,132.1,98.3,27.1
+PT1004,2026-06-16 07:45:00,89.1,96.0,37.0,133.1,100.2,26.7
+PT1004,2026-06-16 08:00:00,90.8,96.0,37.0,132.8,98.2,27.1
+PT1004,2026-06-16 08:15:00,88.2,95.7,37.8,131.7,96.6,26.8
+PT1004,2026-06-16 08:30:00,89.0,95.0,37.3,131.1,96.5,26.2
+PT1004,2026-06-16 08:45:00,86.5,95.3,36.7,133.9,100.0,25.5
+PT1004,2026-06-16 09:00:00,87.3,95.7,37.2,135.6,101.6,26.1
+PT1004,2026-06-16 09:15:00,86.9,95.3,37.1,135.0,101.4,25.7
+PT1004,2026-06-16 09:30:00,85.6,95.6,36.8,135.8,100.7,25.8
+PT1004,2026-06-16 09:45:00,84.4,95.5,36.7,135.4,100.9,25.9
+PT1004,2026-06-16 10:00:00,84.3,95.3,36.9,128.6,105.5,25.5
+PT1004,2026-06-16 10:15:00,82.6,95.1,37.0,128.2,107.6,25.5
+PT1004,2026-06-16 10:30:00,84.0,94.9,37.4,128.3,106.2,26.1
+PT1004,2026-06-16 10:45:00,83.8,94.9,37.4,128.2,106.0,25.5
+PT1004,2026-06-16 11:00:00,83.5,95.4,36.5,129.1,102.2,25.0
+PT1004,2026-06-16 11:15:00,81.9,95.0,37.1,129.6,101.7,25.3
+PT1004,2026-06-16 11:30:00,81.6,95.5,36.7,130.0,101.6,25.0
+PT1004,2026-06-16 11:45:00,82.5,95.7,37.3,133.1,102.3,24.8
+PT1004,2026-06-16 12:00:00,82.4,95.9,37.5,135.8,102.1,25.5
+PT1004,2026-06-16 12:15:00,82.4,96.1,37.3,136.4,102.1,26.3
+PT1004,2026-06-16 12:30:00,81.4,95.9,37.2,134.5,102.8,26.1
+PT1004,2026-06-16 12:45:00,82.5,96.4,36.7,133.8,100.7,26.8
+PT1004,2026-06-16 13:00:00,80.7,96.8,37.0,136.0,101.4,26.8
+PT1004,2026-06-16 13:15:00,79.9,96.8,36.5,135.9,99.4,26.5
+PT1004,2026-06-16 13:30:00,80.0,96.8,37.0,139.4,99.9,26.3
+PT1004,2026-06-16 13:45:00,80.5,96.9,36.9,140.6,100.5,26.2
+PT1004,2026-06-16 14:00:00,79.8,96.7,37.1,138.4,103.3,26.2
+PT1004,2026-06-16 14:15:00,79.2,96.8,36.9,140.8,104.4,26.6
+PT1004,2026-06-16 14:30:00,79.2,96.6,37.6,141.0,106.3,26.8
+PT1004,2026-06-16 14:45:00,78.8,96.5,37.2,142.1,106.4,26.9
+PT1004,2026-06-16 15:00:00,78.3,96.5,37.2,144.0,108.1,26.7
+PT1004,2026-06-16 15:15:00,80.0,96.4,36.8,142.7,109.2,26.9
+PT1004,2026-06-16 15:30:00,78.3,96.5,37.3,141.9,106.7,26.7
+PT1004,2026-06-16 15:45:00,78.2,96.9,37.0,137.7,108.7,26.5
+PT1004,2026-06-16 16:00:00,76.3,97.0,36.7,134.0,110.0,25.9
+PT1004,2026-06-16 16:15:00,74.9,96.8,37.1,135.9,112.2,25.7
+PT1004,2026-06-16 16:30:00,75.5,96.8,36.7,136.8,112.2,25.6
+PT1004,2026-06-16 16:45:00,75.7,97.0,37.6,135.3,109.3,25.5
+PT1004,2026-06-16 17:00:00,77.1,96.9,36.6,136.2,110.2,26.1
+PT1004,2026-06-16 17:15:00,75.9,96.4,36.7,134.8,111.8,25.8
+PT1004,2026-06-16 17:30:00,76.1,96.5,37.3,132.8,111.0,25.9
+PT1004,2026-06-16 17:45:00,75.4,96.3,37.3,136.6,110.6,26.0
+PT1004,2026-06-16 18:00:00,73.2,96.3,36.8,133.3,110.4,26.5
+PT1004,2026-06-16 18:15:00,71.3,96.8,36.7,131.0,108.2,27.2
+PT1004,2026-06-16 18:30:00,73.3,96.9,36.8,133.6,108.4,27.6
+PT1004,2026-06-16 18:45:00,72.6,96.3,36.6,135.5,109.1,27.2
+PT1004,2026-06-16 19:00:00,72.9,96.8,37.5,135.3,108.1,26.8
+PT1004,2026-06-16 19:15:00,72.0,96.7,36.9,137.3,109.0,26.7
+PT1004,2026-06-16 19:30:00,73.8,96.4,37.0,136.9,106.8,27.2
+PT1004,2026-06-16 19:45:00,73.0,96.6,36.7,134.1,107.7,27.0
+PT1004,2026-06-16 20:00:00,71.8,96.5,36.7,133.2,105.9,27.2
+PT1004,2026-06-16 20:15:00,69.0,96.9,37.2,133.6,108.9,26.7
+PT1004,2026-06-16 20:30:00,70.1,96.9,37.3,130.7,108.5,27.0
+PT1004,2026-06-16 20:45:00,70.2,97.1,37.2,132.4,107.8,26.4
+PT1004,2026-06-16 21:00:00,69.3,97.2,36.8,135.1,108.4,26.9
+PT1004,2026-06-16 21:15:00,70.7,97.6,36.9,135.2,111.9,26.6
+PT1004,2026-06-16 21:30:00,71.5,97.6,36.9,133.7,112.8,26.7
+PT1004,2026-06-16 21:45:00,71.7,97.8,36.9,132.5,113.6,26.4
+PT1004,2026-06-16 22:00:00,73.1,98.0,37.1,128.7,113.0,26.5
+PT1004,2026-06-16 22:15:00,73.9,98.0,37.3,128.5,112.8,27.0
+PT1004,2026-06-16 22:30:00,74.4,98.1,37.4,127.4,112.3,27.4
+PT1004,2026-06-16 22:45:00,73.6,98.1,36.8,128.4,113.0,27.6
+PT1004,2026-06-16 23:00:00,72.2,98.4,37.3,131.4,110.8,27.6
+PT1004,2026-06-16 23:15:00,69.6,98.1,37.5,131.2,109.9,27.7
+PT1004,2026-06-16 23:30:00,68.6,98.1,37.9,130.5,110.1,27.7
+PT1004,2026-06-16 23:45:00,70.5,97.7,36.7,128.7,108.9,27.2
+PT1005,2026-06-14 00:00:00,65.8,98.7,37.0,123.2,83.0,12.7
+PT1005,2026-06-14 00:15:00,66.7,98.6,37.0,120.9,82.6,13.5
+PT1005,2026-06-14 00:30:00,65.6,98.7,37.6,120.3,86.8,13.2
+PT1005,2026-06-14 00:45:00,67.0,98.6,37.0,120.3,85.2,13.0
+PT1005,2026-06-14 01:00:00,67.2,98.3,37.3,120.9,85.0,13.2
+PT1005,2026-06-14 01:15:00,66.9,98.4,37.2,120.7,86.1,13.3
+PT1005,2026-06-14 01:30:00,66.8,98.7,37.0,121.5,84.1,13.1
+PT1005,2026-06-14 01:45:00,66.8,98.8,37.4,119.6,84.0,13.0
+PT1005,2026-06-14 02:00:00,65.6,98.8,36.6,118.3,86.8,13.5
+PT1005,2026-06-14 02:15:00,64.6,99.0,37.4,119.2,87.5,13.6
+PT1005,2026-06-14 02:30:00,65.5,98.9,36.5,116.8,84.9,13.5
+PT1005,2026-06-14 02:45:00,65.8,98.8,36.6,120.7,85.4,13.5
+PT1005,2026-06-14 03:00:00,64.3,99.0,37.2,120.0,89.2,13.5
+PT1005,2026-06-14 03:15:00,62.8,99.2,37.1,118.2,90.0,13.8
+PT1005,2026-06-14 03:30:00,64.9,99.1,37.1,121.5,88.1,14.1
+PT1005,2026-06-14 03:45:00,64.0,98.7,37.3,121.0,87.6,14.2
+PT1005,2026-06-14 04:00:00,63.1,99.1,37.0,119.9,88.5,14.2
+PT1005,2026-06-14 04:15:00,63.1,98.9,37.0,119.2,86.5,14.0
+PT1005,2026-06-14 04:30:00,64.2,98.8,36.9,118.3,86.9,14.1
+PT1005,2026-06-14 04:45:00,64.7,98.7,37.0,117.1,86.1,14.5
+PT1005,2026-06-14 05:00:00,65.0,98.4,37.0,119.3,85.2,14.6
+PT1005,2026-06-14 05:15:00,65.4,98.5,37.1,119.0,82.4,15.0
+PT1005,2026-06-14 05:30:00,65.9,98.7,37.2,118.1,83.2,14.7
+PT1005,2026-06-14 05:45:00,65.9,98.6,37.2,118.2,81.6,14.9
+PT1005,2026-06-14 06:00:00,66.3,99.0,37.6,118.0,81.6,14.4
+PT1005,2026-06-14 06:15:00,64.5,99.0,37.4,116.8,81.7,13.9
+PT1005,2026-06-14 06:30:00,63.4,99.3,36.9,114.9,83.1,13.5
+PT1005,2026-06-14 06:45:00,63.4,99.1,37.1,113.2,81.9,13.7
+PT1005,2026-06-14 07:00:00,63.5,99.0,37.0,114.3,83.5,13.9
+PT1005,2026-06-14 07:15:00,62.0,98.5,37.5,114.1,80.5,13.8
+PT1005,2026-06-14 07:30:00,60.7,98.2,37.5,115.4,76.3,14.0
+PT1005,2026-06-14 07:45:00,59.6,98.0,36.8,116.6,74.5,14.3
+PT1005,2026-06-14 08:00:00,61.8,98.1,37.2,116.7,77.1,14.7
+PT1005,2026-06-14 08:15:00,59.6,98.0,36.8,118.9,75.1,14.4
+PT1005,2026-06-14 08:30:00,60.1,98.2,36.8,120.8,73.9,14.6
+PT1005,2026-06-14 08:45:00,59.9,98.3,37.5,122.9,70.6,14.6
+PT1005,2026-06-14 09:00:00,60.2,98.4,37.1,121.8,72.7,14.4
+PT1005,2026-06-14 09:15:00,59.6,98.4,37.2,124.6,71.3,14.4
+PT1005,2026-06-14 09:30:00,58.7,98.4,37.2,128.3,68.7,14.3
+PT1005,2026-06-14 09:45:00,58.3,99.1,37.2,129.4,67.1,13.3
+PT1005,2026-06-14 10:00:00,57.4,99.4,37.4,128.9,66.3,13.1
+PT1005,2026-06-14 10:15:00,58.0,99.9,37.3,128.4,67.6,13.5
+PT1005,2026-06-14 10:30:00,57.4,100.0,36.5,128.3,67.4,13.1
+PT1005,2026-06-14 10:45:00,58.9,100.0,37.3,125.6,68.5,13.6
+PT1005,2026-06-14 11:00:00,57.9,99.8,37.9,124.5,69.7,13.8
+PT1005,2026-06-14 11:15:00,56.0,99.8,37.5,120.6,70.6,14.3
+PT1005,2026-06-14 11:30:00,56.2,99.3,37.0,120.5,71.3,13.9
+PT1005,2026-06-14 11:45:00,54.8,99.2,36.9,122.3,72.3,13.3
+PT1005,2026-06-14 12:00:00,54.9,99.2,36.3,121.0,73.0,13.3
+PT1005,2026-06-14 12:15:00,54.3,99.1,37.2,122.4,74.1,12.6
+PT1005,2026-06-14 12:30:00,54.2,99.1,37.1,121.1,74.0,13.1
+PT1005,2026-06-14 12:45:00,54.2,99.0,36.7,123.2,72.1,12.8
+PT1005,2026-06-14 13:00:00,54.5,99.3,37.2,122.6,70.5,13.4
+PT1005,2026-06-14 13:15:00,54.9,99.2,37.0,123.9,70.8,13.2
+PT1005,2026-06-14 13:30:00,53.8,98.9,37.4,123.3,72.6,12.8
+PT1005,2026-06-14 13:45:00,52.9,98.5,36.6,124.4,75.0,12.5
+PT1005,2026-06-14 14:00:00,53.5,98.3,37.3,125.5,76.7,12.6
+PT1005,2026-06-14 14:15:00,54.5,98.5,37.2,125.6,77.9,12.7
+PT1005,2026-06-14 14:30:00,58.2,98.6,37.0,122.6,77.6,12.5
+PT1005,2026-06-14 14:45:00,59.4,98.8,36.9,122.4,75.5,12.6
+PT1005,2026-06-14 15:00:00,59.7,98.8,36.7,124.8,75.9,12.4
+PT1005,2026-06-14 15:15:00,59.7,98.8,36.9,124.3,77.1,11.8
+PT1005,2026-06-14 15:30:00,59.8,98.7,37.1,123.6,77.0,12.1
+PT1005,2026-06-14 15:45:00,57.4,98.5,37.4,124.6,78.2,12.4
+PT1005,2026-06-14 16:00:00,57.6,98.6,36.9,122.5,74.9,11.8
+PT1005,2026-06-14 16:15:00,56.0,98.5,37.1,121.6,76.3,11.5
+PT1005,2026-06-14 16:30:00,55.6,98.3,37.5,120.2,73.2,11.8
+PT1005,2026-06-14 16:45:00,55.3,98.3,37.2,119.6,72.0,12.0
+PT1005,2026-06-14 17:00:00,51.9,98.0,37.2,115.5,74.3,12.0
+PT1005,2026-06-14 17:15:00,51.5,98.3,37.2,117.2,74.0,12.7
+PT1005,2026-06-14 17:30:00,49.8,98.3,37.6,118.2,73.8,12.5
+PT1005,2026-06-14 17:45:00,48.5,97.6,37.0,121.5,72.0,12.4
+PT1005,2026-06-14 18:00:00,50.1,98.0,37.1,118.9,74.0,12.9
+PT1005,2026-06-14 18:15:00,51.3,98.3,36.6,118.4,73.8,13.1
+PT1005,2026-06-14 18:30:00,50.9,98.0,37.0,121.2,73.2,13.3
+PT1005,2026-06-14 18:45:00,50.6,98.0,37.0,119.8,72.9,13.2
+PT1005,2026-06-14 19:00:00,51.2,97.9,37.3,123.0,73.9,12.6
+PT1005,2026-06-14 19:15:00,50.4,98.0,36.7,121.5,70.6,12.6
+PT1005,2026-06-14 19:30:00,51.0,98.0,36.9,120.3,73.3,12.1
+PT1005,2026-06-14 19:45:00,49.7,98.5,36.9,123.0,71.2,11.8
+PT1005,2026-06-14 20:00:00,49.2,98.3,36.6,121.8,72.7,12.6
+PT1005,2026-06-14 20:15:00,48.0,98.3,37.3,118.6,73.0,12.8
+PT1005,2026-06-14 20:30:00,48.7,98.2,37.6,118.3,71.3,13.0
+PT1005,2026-06-14 20:45:00,49.3,98.0,37.3,120.3,74.8,13.1
+PT1005,2026-06-14 21:00:00,50.2,97.6,37.3,119.4,74.1,13.4
+PT1005,2026-06-14 21:15:00,50.2,97.5,36.8,116.1,74.0,13.0
+PT1005,2026-06-14 21:30:00,51.4,97.7,37.4,115.1,71.7,12.7
+PT1005,2026-06-14 21:45:00,52.0,97.6,37.7,115.2,68.6,11.8
+PT1005,2026-06-14 22:00:00,52.7,97.6,36.8,114.4,65.9,12.2
+PT1005,2026-06-14 22:15:00,53.6,97.6,37.2,114.3,64.0,11.7
+PT1005,2026-06-14 22:30:00,53.7,97.7,37.0,114.9,61.1,12.1
+PT1005,2026-06-14 22:45:00,55.2,97.2,36.9,116.0,61.9,11.5
+PT1005,2026-06-14 23:00:00,54.0,97.4,37.3,116.6,64.3,11.6
+PT1005,2026-06-14 23:15:00,55.5,97.5,37.3,115.9,63.4,11.6
+PT1005,2026-06-14 23:30:00,54.6,97.7,37.1,116.5,61.6,11.8
+PT1005,2026-06-14 23:45:00,54.0,97.7,36.6,115.5,61.9,11.8
+PT1005,2026-06-15 00:00:00,53.9,97.6,36.9,116.8,63.3,11.6
+PT1005,2026-06-15 00:15:00,51.9,97.4,37.2,116.1,61.2,11.9
+PT1005,2026-06-15 00:30:00,51.9,97.4,37.0,116.7,62.2,12.2
+PT1005,2026-06-15 00:45:00,51.8,97.5,37.2,116.4,63.5,12.7
+PT1005,2026-06-15 01:00:00,50.7,97.6,36.9,117.1,62.0,12.9
+PT1005,2026-06-15 01:15:00,51.7,97.8,36.7,117.6,62.1,12.0
+PT1005,2026-06-15 01:30:00,51.6,98.1,37.1,118.7,64.8,12.1
+PT1005,2026-06-15 01:45:00,53.4,98.1,36.9,116.7,65.3,12.5
+PT1005,2026-06-15 02:00:00,54.2,98.1,37.1,117.6,65.7,12.3
+PT1005,2026-06-15 02:15:00,53.8,98.1,37.2,115.9,64.8,12.2
+PT1005,2026-06-15 02:30:00,52.2,98.1,37.2,114.5,64.2,11.9
+PT1005,2026-06-15 02:45:00,52.1,98.3,37.0,115.3,61.9,11.5
+PT1005,2026-06-15 03:00:00,52.1,98.1,37.2,117.9,63.2,10.9
+PT1005,2026-06-15 03:15:00,52.1,98.4,37.2,114.8,66.3,10.5
+PT1005,2026-06-15 03:30:00,51.4,98.3,37.0,111.4,68.1,10.4
+PT1005,2026-06-15 03:45:00,54.3,98.5,37.3,110.1,67.2,10.5
+PT1005,2026-06-15 04:00:00,56.4,98.1,37.0,111.5,68.5,10.2
+PT1005,2026-06-15 04:15:00,54.5,98.0,36.8,112.0,70.9,10.9
+PT1005,2026-06-15 04:30:00,56.3,97.5,37.1,110.8,70.4,11.0
+PT1005,2026-06-15 04:45:00,56.8,97.5,37.4,112.8,71.5,10.9
+PT1005,2026-06-15 05:00:00,59.4,97.3,36.9,116.1,70.6,11.4
+PT1005,2026-06-15 05:15:00,60.3,97.4,36.7,112.5,73.5,11.1
+PT1005,2026-06-15 05:30:00,59.6,98.0,36.8,110.0,73.8,10.6
+PT1005,2026-06-15 05:45:00,57.7,98.1,37.4,109.7,72.1,11.0
+PT1005,2026-06-15 06:00:00,58.2,98.4,36.6,109.0,72.5,10.8
+PT1005,2026-06-15 06:15:00,58.5,98.4,37.0,108.9,73.1,11.4
+PT1005,2026-06-15 06:30:00,57.4,98.4,36.8,108.7,74.6,11.4
+PT1005,2026-06-15 06:45:00,58.4,98.5,37.0,108.9,76.0,11.9
+PT1005,2026-06-15 07:00:00,57.4,98.5,37.1,110.0,75.8,11.5
+PT1005,2026-06-15 07:15:00,55.0,98.5,37.0,111.7,77.2,10.0
+PT1005,2026-06-15 07:30:00,55.7,98.2,37.6,110.9,79.0,9.8
+PT1005,2026-06-15 07:45:00,54.9,98.5,36.7,111.0,77.7,10.4
+PT1005,2026-06-15 08:00:00,54.0,98.6,36.7,111.1,78.1,10.2
+PT1005,2026-06-15 08:15:00,53.3,99.0,36.9,108.5,80.6,10.3
+PT1005,2026-06-15 08:30:00,50.9,98.5,37.6,107.8,79.9,10.4
+PT1005,2026-06-15 08:45:00,51.7,98.5,36.9,110.2,80.1,11.0
+PT1005,2026-06-15 09:00:00,50.4,98.0,37.4,110.0,78.2,10.5
+PT1005,2026-06-15 09:15:00,48.4,98.0,36.9,109.8,78.4,11.1
+PT1005,2026-06-15 09:30:00,50.1,97.6,37.1,111.1,80.6,9.5
+PT1005,2026-06-15 09:45:00,50.1,97.6,37.1,114.5,79.4,9.0
+PT1005,2026-06-15 10:00:00,51.5,97.8,37.3,114.6,79.1,8.2
+PT1005,2026-06-15 10:15:00,52.4,97.6,37.0,113.7,77.5,8.5
+PT1005,2026-06-15 10:30:00,52.3,97.7,37.2,114.3,78.4,8.6
+PT1005,2026-06-15 10:45:00,52.6,97.9,37.0,115.3,76.5,8.4
+PT1005,2026-06-15 11:00:00,53.2,98.3,37.5,113.7,77.8,8.1
+PT1005,2026-06-15 11:15:00,55.6,97.8,36.6,113.1,74.3,8.0
+PT1005,2026-06-15 11:30:00,56.4,98.0,37.1,114.7,75.2,8.2
+PT1005,2026-06-15 11:45:00,56.3,98.2,36.7,114.7,76.0,8.0
+PT1005,2026-06-15 12:00:00,57.5,98.0,37.0,111.9,77.0,8.0
+PT1005,2026-06-15 12:15:00,59.3,98.4,37.4,111.5,78.1,8.0
+PT1005,2026-06-15 12:30:00,58.1,98.0,37.3,107.9,75.3,8.4
+PT1005,2026-06-15 12:45:00,57.2,98.2,37.1,106.8,75.8,8.2
+PT1005,2026-06-15 13:00:00,56.1,98.1,36.6,107.8,76.8,8.1
+PT1005,2026-06-15 13:15:00,59.1,98.1,37.5,108.5,74.9,8.6
+PT1005,2026-06-15 13:30:00,57.1,98.0,36.7,108.1,78.5,9.1
+PT1005,2026-06-15 13:45:00,56.3,97.8,37.3,108.9,80.9,9.2
+PT1005,2026-06-15 14:00:00,55.6,98.0,37.1,107.9,78.4,9.4
+PT1005,2026-06-15 14:15:00,54.3,98.4,37.6,106.4,79.3,9.2
+PT1005,2026-06-15 14:30:00,54.1,98.0,37.3,108.0,81.6,9.0
+PT1005,2026-06-15 14:45:00,54.3,97.9,37.2,109.7,80.4,9.1
+PT1005,2026-06-15 15:00:00,54.6,97.7,37.5,113.8,82.3,9.4
+PT1005,2026-06-15 15:15:00,54.7,97.6,36.9,111.6,81.3,9.0
+PT1005,2026-06-15 15:30:00,55.1,97.8,37.4,113.4,79.5,9.3
+PT1005,2026-06-15 15:45:00,54.9,98.1,36.9,115.1,77.6,10.2
+PT1005,2026-06-15 16:00:00,56.1,98.4,36.7,112.7,77.9,10.6
+PT1005,2026-06-15 16:15:00,56.3,98.6,37.5,114.8,77.3,11.2
+PT1005,2026-06-15 16:30:00,56.6,98.5,37.1,112.5,77.8,11.8
+PT1005,2026-06-15 16:45:00,55.6,98.7,37.0,112.8,78.6,11.5
+PT1005,2026-06-15 17:00:00,55.0,98.8,37.2,112.1,79.5,11.3
+PT1005,2026-06-15 17:15:00,55.9,98.9,37.2,114.0,78.8,11.6
+PT1005,2026-06-15 17:30:00,55.0,98.4,37.0,110.6,75.5,11.7
+PT1005,2026-06-15 17:45:00,55.2,98.4,37.1,111.8,76.4,11.8
+PT1005,2026-06-15 18:00:00,55.4,98.7,37.4,107.8,75.4,12.1
+PT1005,2026-06-15 18:15:00,56.0,98.7,37.5,111.5,75.7,12.1
+PT1005,2026-06-15 18:30:00,56.6,98.9,36.4,113.6,75.1,12.8
+PT1005,2026-06-15 18:45:00,54.2,98.7,37.1,112.7,75.6,12.6
+PT1005,2026-06-15 19:00:00,54.1,99.2,36.9,111.1,73.1,13.0
+PT1005,2026-06-15 19:15:00,54.0,99.1,37.5,112.6,71.0,11.9
+PT1005,2026-06-15 19:30:00,54.4,99.3,37.3,115.1,69.7,11.9
+PT1005,2026-06-15 19:45:00,54.3,99.3,37.3,114.7,71.3,11.8
+PT1005,2026-06-15 20:00:00,54.8,99.0,37.4,115.3,69.0,12.0
+PT1005,2026-06-15 20:15:00,56.2,98.8,36.5,114.2,69.4,11.8
+PT1005,2026-06-15 20:30:00,55.6,98.8,37.3,116.4,72.0,11.8
+PT1005,2026-06-15 20:45:00,56.8,98.3,37.3,114.3,72.1,12.4
+PT1005,2026-06-15 21:00:00,57.2,98.3,36.9,115.2,71.2,12.1
+PT1005,2026-06-15 21:15:00,58.9,98.1,37.2,114.4,71.9,11.8
+PT1005,2026-06-15 21:30:00,59.2,97.9,37.2,113.9,70.5,12.3
+PT1005,2026-06-15 21:45:00,58.0,98.0,36.8,114.2,67.1,12.9
+PT1005,2026-06-15 22:00:00,60.5,98.2,37.0,112.0,66.7,13.2
+PT1005,2026-06-15 22:15:00,61.9,98.1,36.8,111.8,68.1,13.5
+PT1005,2026-06-15 22:30:00,62.5,98.1,37.0,110.0,66.0,12.7
+PT1005,2026-06-15 22:45:00,62.4,98.2,36.9,111.6,65.4,12.7
+PT1005,2026-06-15 23:00:00,62.6,98.5,37.5,111.8,67.1,13.1
+PT1005,2026-06-15 23:15:00,62.7,98.4,36.9,113.1,66.6,13.3
+PT1005,2026-06-15 23:30:00,61.8,98.7,37.1,111.0,68.1,13.5
+PT1005,2026-06-15 23:45:00,59.5,99.0,36.9,109.2,69.5,13.3
+PT1005,2026-06-16 00:00:00,60.3,99.2,37.1,106.9,71.7,13.2
+PT1005,2026-06-16 00:15:00,60.0,98.9,37.4,108.3,72.1,12.8
+PT1005,2026-06-16 00:30:00,60.1,98.9,36.7,111.9,69.7,12.2
+PT1005,2026-06-16 00:45:00,60.6,98.8,37.7,111.3,68.3,12.9
+PT1005,2026-06-16 01:00:00,61.7,98.4,37.4,110.4,69.5,12.8
+PT1005,2026-06-16 01:15:00,63.2,98.9,36.5,109.1,69.7,12.7
+PT1005,2026-06-16 01:30:00,64.1,99.1,37.3,108.0,67.3,12.5
+PT1005,2026-06-16 01:45:00,65.7,98.9,36.7,110.2,68.2,12.7
+PT1005,2026-06-16 02:00:00,64.2,98.7,37.3,109.5,70.9,12.4
+PT1005,2026-06-16 02:15:00,63.6,98.8,37.0,109.4,71.2,12.6
+PT1005,2026-06-16 02:30:00,64.1,99.1,37.0,107.9,72.9,12.5
+PT1005,2026-06-16 02:45:00,64.9,99.0,37.2,108.5,73.3,11.6
+PT1005,2026-06-16 03:00:00,63.2,98.7,36.8,109.3,74.1,12.1
+PT1005,2026-06-16 03:15:00,62.3,98.8,37.6,111.7,74.4,11.8
+PT1005,2026-06-16 03:30:00,62.0,98.7,36.9,108.8,75.5,12.1
+PT1005,2026-06-16 03:45:00,64.2,98.6,37.3,110.1,75.8,11.3
+PT1005,2026-06-16 04:00:00,64.7,98.2,36.6,113.1,76.5,11.8
+PT1005,2026-06-16 04:15:00,64.2,98.5,36.5,110.0,75.9,11.9
+PT1005,2026-06-16 04:30:00,62.6,98.8,37.8,110.1,77.7,12.0
+PT1005,2026-06-16 04:45:00,63.2,99.1,37.3,109.6,78.0,12.3
+PT1005,2026-06-16 05:00:00,63.2,99.1,37.2,110.6,78.7,11.9
+PT1005,2026-06-16 05:15:00,63.6,98.9,37.1,112.5,79.4,12.8
+PT1005,2026-06-16 05:30:00,64.9,99.0,36.8,116.3,77.9,12.6
+PT1005,2026-06-16 05:45:00,64.8,98.7,37.3,113.2,74.7,11.7
+PT1005,2026-06-16 06:00:00,64.3,98.4,37.6,111.9,73.9,11.3
+PT1005,2026-06-16 06:15:00,66.0,98.8,36.8,112.3,74.3,11.1
+PT1005,2026-06-16 06:30:00,66.0,99.0,37.3,114.7,73.5,10.6
+PT1005,2026-06-16 06:45:00,63.9,99.0,37.0,114.9,73.0,10.0
+PT1005,2026-06-16 07:00:00,65.8,99.1,37.1,117.2,71.1,10.1
+PT1005,2026-06-16 07:15:00,66.0,99.3,37.4,117.5,69.3,10.3
+PT1005,2026-06-16 07:30:00,67.6,99.6,37.0,118.4,67.6,9.7
+PT1005,2026-06-16 07:45:00,68.6,99.8,37.3,119.0,67.6,10.5
+PT1005,2026-06-16 08:00:00,68.5,99.6,37.2,117.0,65.9,10.0
+PT1005,2026-06-16 08:15:00,68.5,99.6,36.9,118.4,68.6,9.7
+PT1005,2026-06-16 08:30:00,65.8,99.5,36.9,118.2,70.0,9.7
+PT1005,2026-06-16 08:45:00,66.1,99.7,37.3,114.9,71.5,10.2
+PT1005,2026-06-16 09:00:00,64.9,99.6,37.1,117.3,70.0,10.5
+PT1005,2026-06-16 09:15:00,65.1,99.4,37.1,118.0,70.4,9.9
+PT1005,2026-06-16 09:30:00,65.9,99.3,37.0,113.1,70.2,10.4
+PT1005,2026-06-16 09:45:00,67.6,99.1,37.2,110.7,70.2,10.1
+PT1005,2026-06-16 10:00:00,67.1,99.4,37.4,109.9,70.4,10.4
+PT1005,2026-06-16 10:15:00,68.9,99.4,37.2,109.1,67.5,11.2
+PT1005,2026-06-16 10:30:00,69.8,99.5,37.0,109.2,68.0,10.9
+PT1005,2026-06-16 10:45:00,68.6,99.9,36.7,110.3,71.0,11.9
+PT1005,2026-06-16 11:00:00,69.8,99.6,36.9,110.6,71.4,11.3
+PT1005,2026-06-16 11:15:00,70.2,99.6,36.7,108.6,70.4,10.7
+PT1005,2026-06-16 11:30:00,69.7,99.8,37.2,110.8,73.1,10.9
+PT1005,2026-06-16 11:45:00,70.3,100.0,37.4,107.6,76.0,10.1
+PT1005,2026-06-16 12:00:00,70.4,99.7,36.7,108.7,75.8,9.9
+PT1005,2026-06-16 12:15:00,68.6,99.5,36.8,107.9,74.0,9.9
+PT1005,2026-06-16 12:30:00,69.0,99.8,37.5,108.5,73.8,9.7
+PT1005,2026-06-16 12:45:00,68.8,100.0,36.9,106.1,74.3,10.2
+PT1005,2026-06-16 13:00:00,68.5,100.0,37.0,106.9,75.1,10.7
+PT1005,2026-06-16 13:15:00,70.2,99.6,36.7,109.0,76.8,10.4
+PT1005,2026-06-16 13:30:00,69.9,99.7,36.7,108.4,77.6,11.2
+PT1005,2026-06-16 13:45:00,67.5,99.6,37.1,107.0,76.9,11.7
+PT1005,2026-06-16 14:00:00,67.5,99.5,37.2,106.9,77.3,12.8
+PT1005,2026-06-16 14:15:00,68.9,99.6,37.3,102.9,76.4,12.9
+PT1005,2026-06-16 14:30:00,69.1,99.8,36.8,99.9,76.5,13.4
+PT1005,2026-06-16 14:45:00,70.4,100.0,37.0,97.5,77.0,13.5
+PT1005,2026-06-16 15:00:00,68.6,99.9,36.8,97.2,74.5,13.0
+PT1005,2026-06-16 15:15:00,67.3,100.0,37.4,99.0,74.0,13.3
+PT1005,2026-06-16 15:30:00,67.2,100.0,37.2,98.5,72.3,13.0
+PT1005,2026-06-16 15:45:00,67.0,100.0,37.1,94.8,69.8,12.4
+PT1005,2026-06-16 16:00:00,65.4,100.0,36.9,96.3,72.1,12.9
+PT1005,2026-06-16 16:15:00,63.4,99.8,36.9,98.2,71.5,12.9
+PT1005,2026-06-16 16:30:00,65.3,99.6,36.9,98.4,73.2,13.7
+PT1005,2026-06-16 16:45:00,66.4,99.4,37.3,101.1,75.8,13.3
+PT1005,2026-06-16 17:00:00,67.8,99.3,36.5,102.2,76.7,14.1
+PT1005,2026-06-16 17:15:00,67.7,99.0,36.8,102.2,75.5,14.0
+PT1005,2026-06-16 17:30:00,67.9,99.3,37.7,101.5,77.7,14.4
+PT1005,2026-06-16 17:45:00,68.4,99.3,37.1,98.3,76.5,14.3
+PT1005,2026-06-16 18:00:00,71.2,99.2,37.0,94.8,77.5,14.6
+PT1005,2026-06-16 18:15:00,73.7,98.7,37.8,97.3,77.0,14.2
+PT1005,2026-06-16 18:30:00,74.5,98.7,37.5,96.6,77.5,14.0
+PT1005,2026-06-16 18:45:00,74.6,98.9,37.6,97.1,78.8,14.6
+PT1005,2026-06-16 19:00:00,75.2,98.7,36.9,96.7,78.7,14.3
+PT1005,2026-06-16 19:15:00,75.3,98.5,37.2,94.4,76.2,14.5
+PT1005,2026-06-16 19:30:00,74.9,98.7,36.9,92.4,76.8,14.5
+PT1005,2026-06-16 19:45:00,74.2,98.6,36.9,92.9,77.6,14.4
+PT1005,2026-06-16 20:00:00,74.4,98.2,37.0,92.9,80.0,14.1
+PT1005,2026-06-16 20:15:00,75.6,98.4,37.2,93.1,79.9,13.6
+PT1005,2026-06-16 20:30:00,73.9,97.8,36.9,95.1,80.5,13.9
+PT1005,2026-06-16 20:45:00,74.4,97.7,36.9,94.4,81.9,13.9
+PT1005,2026-06-16 21:00:00,72.7,97.8,36.8,96.5,80.8,14.2
+PT1005,2026-06-16 21:15:00,73.6,97.8,36.9,97.1,79.7,14.3
+PT1005,2026-06-16 21:30:00,73.1,97.5,37.3,95.5,78.9,14.4
+PT1005,2026-06-16 21:45:00,72.3,97.4,36.6,98.9,79.1,14.2
+PT1005,2026-06-16 22:00:00,71.2,97.2,37.2,102.9,77.9,14.2
+PT1005,2026-06-16 22:15:00,72.5,97.2,36.9,101.8,77.0,14.4
+PT1005,2026-06-16 22:30:00,71.2,97.1,37.6,99.2,79.8,14.6
+PT1005,2026-06-16 22:45:00,71.7,97.5,36.8,99.9,80.9,13.8
+PT1005,2026-06-16 23:00:00,71.8,97.5,37.4,99.8,81.5,14.0
+PT1005,2026-06-16 23:15:00,72.5,97.8,37.5,102.2,81.8,14.8
+PT1005,2026-06-16 23:30:00,71.5,97.9,36.8,98.5,79.3,14.6
+PT1005,2026-06-16 23:45:00,70.9,98.0,36.8,101.0,81.0,14.8
+PT1006,2026-06-14 00:00:00,94.3,95.4,37.1,133.3,80.1,20.2
+PT1006,2026-06-14 00:15:00,94.1,95.6,37.2,135.5,82.8,19.9
+PT1006,2026-06-14 00:30:00,94.1,95.7,36.8,133.3,80.7,19.9
+PT1006,2026-06-14 00:45:00,95.2,95.3,37.6,130.4,80.0,19.3
+PT1006,2026-06-14 01:00:00,95.0,95.2,37.1,131.4,81.4,19.4
+PT1006,2026-06-14 01:15:00,93.8,95.3,37.2,134.2,81.0,19.0
+PT1006,2026-06-14 01:30:00,93.8,95.0,36.9,133.2,83.7,18.5
+PT1006,2026-06-14 01:45:00,92.7,94.8,37.2,132.3,84.4,19.0
+PT1006,2026-06-14 02:00:00,91.9,95.2,37.1,128.2,85.4,18.6
+PT1006,2026-06-14 02:15:00,92.6,94.8,37.9,128.4,85.7,19.2
+PT1006,2026-06-14 02:30:00,90.7,95.2,36.7,128.4,84.5,19.4
+PT1006,2026-06-14 02:45:00,89.3,94.7,37.6,129.5,85.0,19.0
+PT1006,2026-06-14 03:00:00,88.5,95.1,36.7,129.7,84.0,19.0
+PT1006,2026-06-14 03:15:00,88.8,95.1,36.7,130.8,85.3,19.0
+PT1006,2026-06-14 03:30:00,89.9,95.1,37.0,127.0,85.8,19.2
+PT1006,2026-06-14 03:45:00,89.7,94.9,37.6,127.8,86.0,18.8
+PT1006,2026-06-14 04:00:00,89.0,94.2,36.6,126.9,87.5,18.7
+PT1006,2026-06-14 04:15:00,87.8,94.0,37.1,125.7,87.1,18.9
+PT1006,2026-06-14 04:30:00,88.0,94.4,36.9,127.4,88.3,18.2
+PT1006,2026-06-14 04:45:00,86.1,94.2,37.3,129.0,87.7,18.6
+PT1006,2026-06-14 05:00:00,86.2,94.5,37.3,131.7,88.4,18.7
+PT1006,2026-06-14 05:15:00,84.6,94.5,37.4,131.7,87.8,18.4
+PT1006,2026-06-14 05:30:00,84.8,94.6,37.5,134.5,87.5,18.3
+PT1006,2026-06-14 05:45:00,83.1,94.6,37.3,133.1,88.0,18.5
+PT1006,2026-06-14 06:00:00,84.4,94.5,36.7,132.7,88.8,18.8
+PT1006,2026-06-14 06:15:00,84.8,94.4,36.8,132.9,88.2,18.6
+PT1006,2026-06-14 06:30:00,84.7,94.5,37.2,131.7,90.0,19.5
+PT1006,2026-06-14 06:45:00,84.7,94.3,37.5,132.4,92.2,20.3
+PT1006,2026-06-14 07:00:00,85.8,94.4,37.1,130.3,92.1,20.2
+PT1006,2026-06-14 07:15:00,84.9,94.6,37.2,129.8,91.6,19.9
+PT1006,2026-06-14 07:30:00,86.8,94.6,37.3,130.3,94.5,20.4
+PT1006,2026-06-14 07:45:00,87.5,94.4,36.8,128.9,94.7,20.5
+PT1006,2026-06-14 08:00:00,88.4,94.4,36.8,131.2,94.6,20.4
+PT1006,2026-06-14 08:15:00,87.4,94.7,36.7,131.7,95.2,21.1
+PT1006,2026-06-14 08:30:00,88.3,94.3,36.5,130.8,93.5,21.4
+PT1006,2026-06-14 08:45:00,88.0,94.0,37.0,129.1,92.4,21.9
+PT1006,2026-06-14 09:00:00,90.1,94.5,37.2,133.4,92.3,22.0
+PT1006,2026-06-14 09:15:00,89.7,94.6,37.0,131.5,89.5,22.3
+PT1006,2026-06-14 09:30:00,88.6,94.4,36.7,134.5,90.2,21.7
+PT1006,2026-06-14 09:45:00,88.2,94.5,37.1,132.9,89.9,21.8
+PT1006,2026-06-14 10:00:00,85.4,94.6,36.8,129.5,89.5,21.6
+PT1006,2026-06-14 10:15:00,86.5,94.3,36.9,128.4,90.8,21.3
+PT1006,2026-06-14 10:30:00,86.2,94.5,37.0,131.3,89.4,21.0
+PT1006,2026-06-14 10:45:00,86.5,94.3,37.3,132.7,88.1,20.2
+PT1006,2026-06-14 11:00:00,87.3,94.5,37.6,128.7,87.1,20.1
+PT1006,2026-06-14 11:15:00,87.2,94.2,37.3,129.3,89.0,20.6
+PT1006,2026-06-14 11:30:00,87.5,93.7,37.3,129.3,89.3,20.5
+PT1006,2026-06-14 11:45:00,87.3,93.6,37.4,131.4,88.7,20.5
+PT1006,2026-06-14 12:00:00,86.2,93.3,36.6,134.1,87.8,20.8
+PT1006,2026-06-14 12:15:00,83.2,93.4,36.7,133.9,88.3,21.6
+PT1006,2026-06-14 12:30:00,83.3,93.8,37.8,131.7,87.5,20.8
+PT1006,2026-06-14 12:45:00,80.7,94.0,36.9,129.1,85.9,21.3
+PT1006,2026-06-14 13:00:00,81.6,94.3,37.1,129.5,87.2,21.3
+PT1006,2026-06-14 13:15:00,80.9,94.8,36.9,130.9,88.0,21.6
+PT1006,2026-06-14 13:30:00,82.1,95.2,36.9,128.2,88.8,21.6
+PT1006,2026-06-14 13:45:00,80.8,95.5,37.1,128.6,88.5,21.9
+PT1006,2026-06-14 14:00:00,80.1,95.5,36.7,128.5,85.8,21.6
+PT1006,2026-06-14 14:15:00,78.1,95.6,37.0,127.2,87.4,20.9
+PT1006,2026-06-14 14:30:00,77.5,95.2,37.3,127.2,85.2,21.0
+PT1006,2026-06-14 14:45:00,77.9,95.3,36.9,129.3,85.1,20.6
+PT1006,2026-06-14 15:00:00,77.3,95.1,36.9,130.8,85.9,20.0
+PT1006,2026-06-14 15:15:00,76.1,95.1,37.0,133.0,86.6,19.7
+PT1006,2026-06-14 15:30:00,74.5,94.8,37.1,134.7,88.8,19.4
+PT1006,2026-06-14 15:45:00,75.5,94.4,37.0,132.6,91.7,19.0
+PT1006,2026-06-14 16:00:00,74.8,93.9,37.1,132.8,91.7,19.1
+PT1006,2026-06-14 16:15:00,74.4,93.8,36.8,131.8,90.2,18.8
+PT1006,2026-06-14 16:30:00,75.2,93.9,37.4,131.8,93.1,18.4
+PT1006,2026-06-14 16:45:00,75.0,93.9,36.8,133.2,92.4,18.0
+PT1006,2026-06-14 17:00:00,72.5,94.1,37.3,134.3,94.8,18.1
+PT1006,2026-06-14 17:15:00,72.5,94.2,37.0,136.5,95.1,17.9
+PT1006,2026-06-14 17:30:00,73.6,94.1,37.3,138.3,97.9,18.3
+PT1006,2026-06-14 17:45:00,74.1,93.9,37.0,136.5,96.6,18.5
+PT1006,2026-06-14 18:00:00,74.1,94.0,37.0,134.9,95.9,18.6
+PT1006,2026-06-14 18:15:00,74.0,93.7,36.8,134.5,98.3,18.5
+PT1006,2026-06-14 18:30:00,75.3,93.9,36.6,134.9,96.4,18.0
+PT1006,2026-06-14 18:45:00,75.9,94.1,37.0,135.8,99.3,17.8
+PT1006,2026-06-14 19:00:00,76.1,94.1,36.6,136.8,98.3,17.2
+PT1006,2026-06-14 19:15:00,76.8,94.0,36.8,134.5,97.4,18.0
+PT1006,2026-06-14 19:30:00,77.7,94.1,37.4,137.2,97.2,17.4
+PT1006,2026-06-14 19:45:00,77.5,94.4,37.2,138.8,98.7,18.4
+PT1006,2026-06-14 20:00:00,79.4,94.3,37.2,139.9,98.0,18.5
+PT1006,2026-06-14 20:15:00,77.0,94.2,37.4,140.4,94.6,18.5
+PT1006,2026-06-14 20:30:00,78.6,94.0,37.1,143.1,96.4,17.6
+PT1006,2026-06-14 20:45:00,79.0,94.3,36.6,143.7,98.5,17.3
+PT1006,2026-06-14 21:00:00,78.3,94.7,37.4,145.5,102.0,16.8
+PT1006,2026-06-14 21:15:00,79.3,94.7,37.3,147.1,102.2,16.9
+PT1006,2026-06-14 21:30:00,80.5,94.7,36.8,150.6,101.8,17.7
+PT1006,2026-06-14 21:45:00,79.4,94.5,36.9,152.5,100.6,18.3
+PT1006,2026-06-14 22:00:00,80.0,94.6,37.0,150.5,98.5,18.4
+PT1006,2026-06-14 22:15:00,80.6,94.3,37.4,149.8,98.3,17.4
+PT1006,2026-06-14 22:30:00,79.8,94.7,37.4,148.4,97.5,16.9
+PT1006,2026-06-14 22:45:00,80.4,95.0,36.9,148.0,97.4,16.3
+PT1006,2026-06-14 23:00:00,80.7,95.1,37.0,151.6,94.7,16.4
+PT1006,2026-06-14 23:15:00,80.9,95.2,37.0,151.3,93.0,15.8
+PT1006,2026-06-14 23:30:00,79.2,95.1,37.1,150.8,89.3,16.6
+PT1006,2026-06-14 23:45:00,76.4,95.2,36.8,150.3,87.3,16.7
+PT1006,2026-06-15 00:00:00,76.7,95.0,37.1,148.5,87.3,16.1
+PT1006,2026-06-15 00:15:00,77.6,95.3,36.8,150.7,89.3,15.9
+PT1006,2026-06-15 00:30:00,78.6,95.2,37.3,150.7,90.4,16.7
+PT1006,2026-06-15 00:45:00,79.0,94.9,37.0,153.1,91.0,16.6
+PT1006,2026-06-15 01:00:00,78.6,94.9,37.0,150.1,92.9,17.0
+PT1006,2026-06-15 01:15:00,78.2,94.9,36.7,150.4,92.4,17.4
+PT1006,2026-06-15 01:30:00,77.4,95.1,36.9,151.1,91.4,17.5
+PT1006,2026-06-15 01:45:00,77.1,95.4,37.0,153.0,91.8,17.1
+PT1006,2026-06-15 02:00:00,77.3,95.8,37.5,149.4,90.5,17.6
+PT1006,2026-06-15 02:15:00,77.3,96.1,37.5,147.9,88.3,17.9
+PT1006,2026-06-15 02:30:00,78.9,95.9,37.5,148.3,89.5,18.0
+PT1006,2026-06-15 02:45:00,78.5,95.9,37.4,148.8,90.8,17.9
+PT1006,2026-06-15 03:00:00,80.5,95.8,37.3,148.5,92.2,18.7
+PT1006,2026-06-15 03:15:00,79.7,95.8,37.0,150.4,91.0,18.3
+PT1006,2026-06-15 03:30:00,80.5,95.5,37.2,149.0,91.4,18.7
+PT1006,2026-06-15 03:45:00,81.1,95.7,37.1,152.2,93.6,17.9
+PT1006,2026-06-15 04:00:00,82.2,96.1,36.9,153.5,92.4,17.6
+PT1006,2026-06-15 04:15:00,82.7,96.0,36.7,147.4,90.6,17.4
+PT1006,2026-06-15 04:30:00,81.3,96.5,37.4,147.4,90.0,17.7
+PT1006,2026-06-15 04:45:00,84.0,96.9,37.0,148.2,87.7,17.3
+PT1006,2026-06-15 05:00:00,84.7,97.0,37.1,145.3,85.2,17.4
+PT1006,2026-06-15 05:15:00,84.5,97.1,37.7,147.8,85.7,17.0
+PT1006,2026-06-15 05:30:00,84.3,97.1,36.7,146.5,84.1,16.6
+PT1006,2026-06-15 05:45:00,80.8,97.0,37.5,148.7,82.6,17.6
+PT1006,2026-06-15 06:00:00,80.8,96.7,37.0,145.5,82.4,17.7
+PT1006,2026-06-15 06:15:00,82.2,97.1,37.1,146.4,83.2,17.5
+PT1006,2026-06-15 06:30:00,82.7,97.0,36.8,147.8,81.6,17.2
+PT1006,2026-06-15 06:45:00,82.0,96.9,36.7,149.8,81.7,16.7
+PT1006,2026-06-15 07:00:00,81.6,97.1,37.0,152.6,79.3,16.9
+PT1006,2026-06-15 07:15:00,81.2,96.9,37.4,152.2,77.7,16.8
+PT1006,2026-06-15 07:30:00,82.1,97.3,36.9,153.2,77.9,17.0
+PT1006,2026-06-15 07:45:00,79.6,97.5,36.8,149.6,79.6,17.3
+PT1006,2026-06-15 08:00:00,79.2,97.5,36.7,147.8,80.4,17.5
+PT1006,2026-06-15 08:15:00,78.3,97.5,37.0,150.1,81.4,16.6
+PT1006,2026-06-15 08:30:00,78.9,97.3,36.8,148.3,80.3,16.5
+PT1006,2026-06-15 08:45:00,79.8,97.0,37.3,146.2,79.7,17.1
+PT1006,2026-06-15 09:00:00,80.6,97.1,37.4,144.4,78.7,16.8
+PT1006,2026-06-15 09:15:00,81.0,96.7,37.4,147.3,78.2,17.0
+PT1006,2026-06-15 09:30:00,78.0,96.8,37.0,146.8,74.6,16.6
+PT1006,2026-06-15 09:45:00,79.1,96.7,37.3,147.1,74.0,17.0
+PT1006,2026-06-15 10:00:00,79.4,96.4,36.9,147.3,78.2,17.3
+PT1006,2026-06-15 10:15:00,81.7,96.2,37.2,148.7,78.1,17.4
+PT1006,2026-06-15 10:30:00,81.4,96.1,36.9,146.1,76.5,17.5
+PT1006,2026-06-15 10:45:00,80.4,96.8,36.9,151.1,77.3,17.8
+PT1006,2026-06-15 11:00:00,79.1,96.7,37.7,151.1,78.4,17.1
+PT1006,2026-06-15 11:15:00,79.4,96.3,36.8,151.4,77.0,16.7
+PT1006,2026-06-15 11:30:00,79.2,96.9,37.1,151.6,78.1,17.1
+PT1006,2026-06-15 11:45:00,77.9,96.5,37.2,150.8,79.8,17.4
+PT1006,2026-06-15 12:00:00,78.4,96.4,37.6,149.8,78.7,16.9
+PT1006,2026-06-15 12:15:00,78.7,96.3,37.0,153.5,81.7,17.9
+PT1006,2026-06-15 12:30:00,78.9,96.5,36.9,156.8,81.8,17.6
+PT1006,2026-06-15 12:45:00,80.4,96.6,37.5,156.4,81.4,17.5
+PT1006,2026-06-15 13:00:00,79.6,96.3,37.3,160.1,81.5,17.5
+PT1006,2026-06-15 13:15:00,78.5,96.5,37.2,159.3,83.2,16.8
+PT1006,2026-06-15 13:30:00,78.3,96.3,37.5,160.9,83.0,17.0
+PT1006,2026-06-15 13:45:00,79.3,96.0,37.0,159.8,83.6,17.3
+PT1006,2026-06-15 14:00:00,79.6,96.1,36.4,160.4,81.9,16.8
+PT1006,2026-06-15 14:15:00,79.8,95.7,37.4,164.7,82.9,16.3
+PT1006,2026-06-15 14:30:00,81.3,96.0,37.6,163.1,83.9,16.8
+PT1006,2026-06-15 14:45:00,79.5,96.0,37.4,161.4,86.7,17.0
+PT1006,2026-06-15 15:00:00,80.1,96.1,36.9,159.7,86.1,17.0
+PT1006,2026-06-15 15:15:00,79.2,96.0,36.9,158.5,86.1,16.8
+PT1006,2026-06-15 15:30:00,78.2,96.0,37.4,160.2,87.1,16.2
+PT1006,2026-06-15 15:45:00,79.0,96.2,37.6,162.4,86.0,16.1
+PT1006,2026-06-15 16:00:00,81.2,96.2,37.2,163.6,87.0,16.8
+PT1006,2026-06-15 16:15:00,79.8,96.1,37.8,169.9,85.2,16.8
+PT1006,2026-06-15 16:30:00,78.9,95.4,37.4,164.8,84.0,16.1
+PT1006,2026-06-15 16:45:00,79.3,94.8,37.5,161.6,85.8,16.2
+PT1006,2026-06-15 17:00:00,80.7,94.6,36.7,163.4,86.7,15.4
+PT1006,2026-06-15 17:15:00,83.7,94.3,37.1,164.2,86.4,15.5
+PT1006,2026-06-15 17:30:00,85.0,94.6,36.6,164.4,85.0,15.3
+PT1006,2026-06-15 17:45:00,84.6,94.1,36.7,164.9,85.5,15.7
+PT1006,2026-06-15 18:00:00,83.3,94.5,36.8,162.1,88.6,15.3
+PT1006,2026-06-15 18:15:00,84.3,94.7,37.1,165.4,85.7,15.5
+PT1006,2026-06-15 18:30:00,83.1,95.1,36.6,165.9,85.6,15.7
+PT1006,2026-06-15 18:45:00,81.7,95.0,36.8,166.5,87.5,15.3
+PT1006,2026-06-15 19:00:00,82.3,95.0,37.1,162.7,86.2,15.3
+PT1006,2026-06-15 19:15:00,82.5,94.7,37.0,162.4,87.6,14.1
+PT1006,2026-06-15 19:30:00,80.6,94.7,36.8,159.4,87.8,14.8
+PT1006,2026-06-15 19:45:00,79.6,94.6,36.9,160.0,86.2,14.6
+PT1006,2026-06-15 20:00:00,79.2,94.7,38.0,161.1,84.0,14.8
+PT1006,2026-06-15 20:15:00,81.1,94.5,37.0,161.4,84.0,14.9
+PT1006,2026-06-15 20:30:00,80.8,94.3,37.5,163.6,84.4,15.1
+PT1006,2026-06-15 20:45:00,82.4,94.6,37.0,166.0,86.8,14.7
+PT1006,2026-06-15 21:00:00,83.3,94.4,37.1,165.3,87.1,14.6
+PT1006,2026-06-15 21:15:00,82.0,94.4,36.9,165.5,89.5,14.5
+PT1006,2026-06-15 21:30:00,82.9,93.6,37.5,164.9,88.7,14.6
+PT1006,2026-06-15 21:45:00,84.8,93.6,37.2,161.8,88.0,14.4
+PT1006,2026-06-15 22:00:00,85.0,93.5,37.6,159.3,86.7,14.1
+PT1006,2026-06-15 22:15:00,84.1,93.5,37.4,161.2,87.0,13.6
+PT1006,2026-06-15 22:30:00,84.6,93.0,37.6,163.7,88.3,13.8
+PT1006,2026-06-15 22:45:00,85.6,93.3,36.6,165.8,89.4,13.0
+PT1006,2026-06-15 23:00:00,86.7,93.6,36.7,164.4,87.7,13.1
+PT1006,2026-06-15 23:15:00,86.5,93.5,37.1,163.9,90.6,12.9
+PT1006,2026-06-15 23:30:00,85.0,93.7,37.1,163.6,92.3,11.9
+PT1006,2026-06-15 23:45:00,85.2,94.0,37.1,162.3,93.5,11.7
+PT1006,2026-06-16 00:00:00,86.4,93.7,36.9,163.8,94.0,11.6
+PT1006,2026-06-16 00:15:00,83.9,93.7,37.4,163.1,95.0,11.8
+PT1006,2026-06-16 00:30:00,85.3,94.5,37.6,164.2,93.7,12.1
+PT1006,2026-06-16 00:45:00,85.9,94.0,37.2,165.3,92.7,11.6
+PT1006,2026-06-16 01:00:00,84.1,94.3,37.0,166.7,92.6,11.4
+PT1006,2026-06-16 01:15:00,83.0,94.2,37.4,161.0,92.7,11.4
+PT1006,2026-06-16 01:30:00,83.4,94.5,37.2,162.1,94.3,12.5
+PT1006,2026-06-16 01:45:00,83.6,94.8,37.1,161.2,94.1,12.6
+PT1006,2026-06-16 02:00:00,83.8,95.0,37.0,157.8,97.2,12.8
+PT1006,2026-06-16 02:15:00,85.8,95.1,37.1,158.1,96.8,13.4
+PT1006,2026-06-16 02:30:00,85.2,95.3,37.4,160.4,99.2,13.7
+PT1006,2026-06-16 02:45:00,84.9,95.6,37.0,161.9,100.0,13.0
+PT1006,2026-06-16 03:00:00,84.9,95.7,37.0,166.7,101.3,12.7
+PT1006,2026-06-16 03:15:00,86.6,95.6,36.9,168.7,101.5,12.6
+PT1006,2026-06-16 03:30:00,83.0,95.7,37.4,166.6,99.4,12.7
+PT1006,2026-06-16 03:45:00,81.0,95.9,37.0,164.8,100.4,13.0
+PT1006,2026-06-16 04:00:00,81.1,95.8,36.7,165.4,100.7,12.6
+PT1006,2026-06-16 04:15:00,82.4,95.9,36.8,167.1,99.7,12.3
+PT1006,2026-06-16 04:30:00,82.3,95.9,37.2,166.0,102.1,12.0
+PT1006,2026-06-16 04:45:00,81.3,95.8,37.2,165.8,100.8,12.1
+PT1006,2026-06-16 05:00:00,82.7,95.5,36.8,166.2,100.7,11.3
+PT1006,2026-06-16 05:15:00,83.3,95.2,36.5,166.0,97.6,11.3
+PT1006,2026-06-16 05:30:00,82.6,95.0,36.7,166.3,97.2,10.8
+PT1006,2026-06-16 05:45:00,80.7,95.1,36.6,166.6,98.2,10.6
+PT1006,2026-06-16 06:00:00,80.4,95.1,37.1,164.3,96.6,10.8
+PT1006,2026-06-16 06:15:00,81.9,95.5,37.2,161.3,95.9,10.8
+PT1006,2026-06-16 06:30:00,83.2,95.7,37.7,163.5,96.0,10.6
+PT1006,2026-06-16 06:45:00,83.4,95.6,36.9,161.4,96.3,11.0
+PT1006,2026-06-16 07:00:00,83.3,95.7,36.9,162.3,95.9,10.8
+PT1006,2026-06-16 07:15:00,82.0,95.5,37.2,160.8,93.6,11.2
+PT1006,2026-06-16 07:30:00,82.3,95.8,37.4,162.2,92.4,11.7
+PT1006,2026-06-16 07:45:00,81.0,96.1,36.9,161.3,93.9,11.5
+PT1006,2026-06-16 08:00:00,80.5,95.8,37.9,158.3,90.1,11.1
+PT1006,2026-06-16 08:15:00,81.2,96.3,37.2,157.7,89.4,11.8
+PT1006,2026-06-16 08:30:00,80.1,96.4,36.7,160.2,87.3,12.0
+PT1006,2026-06-16 08:45:00,81.6,96.5,37.0,161.4,87.0,11.3
+PT1006,2026-06-16 09:00:00,82.8,97.0,37.4,162.0,85.9,11.5
+PT1006,2026-06-16 09:15:00,83.0,97.0,37.6,162.4,86.0,11.6
+PT1006,2026-06-16 09:30:00,80.6,96.9,37.3,160.5,87.8,11.5
+PT1006,2026-06-16 09:45:00,82.4,96.6,37.0,159.5,89.8,11.1
+PT1006,2026-06-16 10:00:00,80.6,97.0,36.9,158.3,90.3,11.4
+PT1006,2026-06-16 10:15:00,78.4,96.9,37.0,157.9,90.2,11.3
+PT1006,2026-06-16 10:30:00,77.8,97.0,37.2,156.2,90.0,11.1
+PT1006,2026-06-16 10:45:00,79.2,97.2,36.7,158.8,89.5,11.0
+PT1006,2026-06-16 11:00:00,78.9,97.2,36.7,157.6,88.6,10.3
+PT1006,2026-06-16 11:15:00,79.0,97.2,37.5,158.5,88.2,10.4
+PT1006,2026-06-16 11:30:00,79.0,97.0,36.8,156.1,89.4,9.7
+PT1006,2026-06-16 11:45:00,79.6,96.5,36.8,154.9,89.6,9.5
+PT1006,2026-06-16 12:00:00,79.0,96.7,37.3,158.6,89.8,8.7
+PT1006,2026-06-16 12:15:00,78.6,96.4,37.1,157.0,88.7,8.2
+PT1006,2026-06-16 12:30:00,80.9,96.2,37.0,160.6,89.0,8.1
+PT1006,2026-06-16 12:45:00,80.0,96.2,36.6,161.6,85.4,9.1
+PT1006,2026-06-16 13:00:00,79.4,95.6,37.2,161.1,84.7,8.9
+PT1006,2026-06-16 13:15:00,79.2,95.7,37.0,158.6,84.8,8.7
+PT1006,2026-06-16 13:30:00,79.6,95.6,37.3,158.4,83.1,9.1
+PT1006,2026-06-16 13:45:00,79.8,95.5,37.4,158.2,84.7,9.4
+PT1006,2026-06-16 14:00:00,79.5,95.6,37.2,160.6,83.3,9.0
+PT1006,2026-06-16 14:15:00,78.1,95.2,36.7,162.9,85.3,8.5
+PT1006,2026-06-16 14:30:00,77.4,95.5,37.2,162.1,85.4,8.6
+PT1006,2026-06-16 14:45:00,79.2,95.3,36.7,161.9,85.8,8.6
+PT1006,2026-06-16 15:00:00,77.5,94.9,37.1,163.3,84.6,8.8
+PT1006,2026-06-16 15:15:00,76.5,94.7,37.0,163.6,84.7,9.0
+PT1006,2026-06-16 15:30:00,75.5,94.7,37.3,166.4,81.9,8.7
+PT1006,2026-06-16 15:45:00,75.9,94.9,37.4,165.6,79.4,9.4
+PT1006,2026-06-16 16:00:00,76.0,94.7,37.1,164.6,79.8,9.3
+PT1006,2026-06-16 16:15:00,78.0,94.9,37.2,162.3,79.9,9.0
+PT1006,2026-06-16 16:30:00,78.0,95.7,37.2,163.1,79.7,9.8
+PT1006,2026-06-16 16:45:00,76.3,95.6,37.1,164.3,80.4,10.2
+PT1006,2026-06-16 17:00:00,76.5,95.3,37.9,167.4,80.0,9.8
+PT1006,2026-06-16 17:15:00,78.6,95.2,37.2,163.6,78.9,10.4
+PT1006,2026-06-16 17:30:00,77.0,95.4,37.5,163.2,77.9,10.2
+PT1006,2026-06-16 17:45:00,77.8,95.0,37.0,164.0,78.1,10.0
+PT1006,2026-06-16 18:00:00,76.8,94.8,36.9,164.5,77.7,10.2
+PT1006,2026-06-16 18:15:00,77.8,95.1,36.9,164.5,78.4,10.5
+PT1006,2026-06-16 18:30:00,78.5,94.6,37.1,159.2,78.0,10.7
+PT1006,2026-06-16 18:45:00,79.5,94.3,37.3,161.0,80.4,10.4
+PT1006,2026-06-16 19:00:00,79.6,94.4,36.7,164.2,80.9,10.8
+PT1006,2026-06-16 19:15:00,80.6,94.8,37.2,162.4,80.4,11.0
+PT1006,2026-06-16 19:30:00,79.0,94.8,37.1,161.7,78.9,11.6
+PT1006,2026-06-16 19:45:00,80.3,94.6,37.0,162.9,80.5,11.5
+PT1006,2026-06-16 20:00:00,78.8,94.3,37.1,162.0,79.1,11.2
+PT1006,2026-06-16 20:15:00,79.2,94.6,37.0,160.4,79.1,11.0
+PT1006,2026-06-16 20:30:00,78.9,94.6,36.6,160.9,78.6,11.5
+PT1006,2026-06-16 20:45:00,80.2,94.5,36.8,160.6,78.6,11.8
+PT1006,2026-06-16 21:00:00,79.5,94.6,36.8,157.2,78.6,11.5
+PT1006,2026-06-16 21:15:00,77.6,94.8,36.8,157.5,77.5,11.4
+PT1006,2026-06-16 21:30:00,77.1,94.8,37.2,157.6,78.1,10.7
+PT1006,2026-06-16 21:45:00,75.1,94.9,37.3,157.2,79.8,10.4
+PT1006,2026-06-16 22:00:00,73.8,94.9,36.9,153.1,81.1,11.1
+PT1006,2026-06-16 22:15:00,74.0,95.0,37.8,150.0,80.0,10.8
+PT1006,2026-06-16 22:30:00,75.4,95.0,36.8,151.6,80.3,11.0
+PT1006,2026-06-16 22:45:00,77.1,94.8,37.1,150.1,81.2,11.1
+PT1006,2026-06-16 23:00:00,78.2,94.5,37.7,153.8,80.4,11.1
+PT1006,2026-06-16 23:15:00,77.5,94.7,37.3,153.4,79.2,10.9
+PT1006,2026-06-16 23:30:00,78.8,94.8,36.8,150.2,80.1,10.9
+PT1006,2026-06-16 23:45:00,79.3,95.1,37.2,150.2,81.5,11.1
+PT1007,2026-06-14 00:00:00,73.6,98.0,37.4,121.8,76.2,14.9
+PT1007,2026-06-14 00:15:00,74.1,97.8,37.4,121.1,75.4,14.1
+PT1007,2026-06-14 00:30:00,77.8,98.1,37.1,121.4,74.6,13.7
+PT1007,2026-06-14 00:45:00,79.0,97.9,37.1,126.5,72.5,13.8
+PT1007,2026-06-14 01:00:00,78.9,97.8,37.6,126.7,71.9,14.3
+PT1007,2026-06-14 01:15:00,78.5,97.3,37.3,127.3,72.3,14.4
+PT1007,2026-06-14 01:30:00,80.1,97.5,36.8,128.4,73.4,14.5
+PT1007,2026-06-14 01:45:00,81.8,97.6,36.7,126.5,71.7,14.1
+PT1007,2026-06-14 02:00:00,82.6,97.5,37.3,128.0,73.5,14.5
+PT1007,2026-06-14 02:15:00,82.9,97.5,37.1,127.8,74.4,14.1
+PT1007,2026-06-14 02:30:00,81.9,97.8,36.9,129.2,77.6,13.8
+PT1007,2026-06-14 02:45:00,82.0,97.6,37.4,130.3,77.5,13.6
+PT1007,2026-06-14 03:00:00,79.7,97.7,36.4,129.2,78.7,14.0
+PT1007,2026-06-14 03:15:00,79.4,97.8,36.7,124.5,79.1,13.8
+PT1007,2026-06-14 03:30:00,78.6,97.5,37.1,123.3,79.3,14.2
+PT1007,2026-06-14 03:45:00,79.9,97.3,36.6,123.7,82.5,13.5
+PT1007,2026-06-14 04:00:00,81.4,97.3,37.1,122.4,80.8,13.5
+PT1007,2026-06-14 04:15:00,81.5,97.1,36.8,121.8,79.9,13.8
+PT1007,2026-06-14 04:30:00,81.6,97.7,36.2,119.5,78.8,13.7
+PT1007,2026-06-14 04:45:00,79.8,97.8,37.0,119.1,80.4,13.7
+PT1007,2026-06-14 05:00:00,79.0,97.7,36.7,116.7,80.2,13.3
+PT1007,2026-06-14 05:15:00,78.2,97.8,37.1,117.0,81.2,12.9
+PT1007,2026-06-14 05:30:00,80.2,98.2,37.2,114.4,79.7,13.6
+PT1007,2026-06-14 05:45:00,79.9,98.1,37.1,114.9,80.0,13.4
+PT1007,2026-06-14 06:00:00,79.2,98.1,37.1,113.4,78.1,13.9
+PT1007,2026-06-14 06:15:00,81.2,97.7,36.8,110.5,78.8,13.9
+PT1007,2026-06-14 06:30:00,82.6,97.4,36.9,112.9,78.7,13.5
+PT1007,2026-06-14 06:45:00,84.2,97.4,37.0,114.9,80.8,13.5
+PT1007,2026-06-14 07:00:00,83.6,97.5,37.2,117.9,79.0,13.5
+PT1007,2026-06-14 07:15:00,81.4,97.2,36.5,116.5,80.1,13.9
+PT1007,2026-06-14 07:30:00,82.2,97.4,37.5,117.7,80.4,14.3
+PT1007,2026-06-14 07:45:00,80.2,97.4,37.2,117.2,79.5,14.1
+PT1007,2026-06-14 08:00:00,78.6,97.5,36.9,116.4,80.8,13.9
+PT1007,2026-06-14 08:15:00,77.4,97.4,37.2,114.8,81.5,14.3
+PT1007,2026-06-14 08:30:00,77.3,97.5,37.4,114.7,81.5,14.2
+PT1007,2026-06-14 08:45:00,74.2,97.0,36.9,116.8,81.2,14.5
+PT1007,2026-06-14 09:00:00,76.2,96.9,36.6,117.7,80.5,14.2
+PT1007,2026-06-14 09:15:00,77.1,97.0,37.1,117.9,78.8,14.7
+PT1007,2026-06-14 09:30:00,78.0,97.0,37.0,115.7,80.3,14.9
+PT1007,2026-06-14 09:45:00,78.5,97.3,37.3,117.0,77.8,14.3
+PT1007,2026-06-14 10:00:00,77.6,97.0,37.4,117.8,76.1,14.1
+PT1007,2026-06-14 10:15:00,75.8,96.7,36.9,114.5,74.9,14.2
+PT1007,2026-06-14 10:30:00,77.6,96.8,37.4,114.5,76.8,13.6
+PT1007,2026-06-14 10:45:00,77.3,96.7,37.1,115.7,76.1,13.7
+PT1007,2026-06-14 11:00:00,77.6,96.5,36.5,117.6,73.1,14.0
+PT1007,2026-06-14 11:15:00,76.7,96.7,36.8,113.6,73.3,13.4
+PT1007,2026-06-14 11:30:00,75.5,96.4,36.7,110.1,76.4,13.3
+PT1007,2026-06-14 11:45:00,74.8,96.4,37.5,109.3,74.5,13.0
+PT1007,2026-06-14 12:00:00,73.1,95.9,36.7,108.6,71.6,12.6
+PT1007,2026-06-14 12:15:00,71.6,95.9,36.8,109.1,70.4,12.6
+PT1007,2026-06-14 12:30:00,72.1,95.5,36.6,109.4,70.8,13.5
+PT1007,2026-06-14 12:45:00,75.3,95.7,37.3,113.1,72.1,13.1
+PT1007,2026-06-14 13:00:00,74.5,95.7,37.2,110.7,71.1,13.5
+PT1007,2026-06-14 13:15:00,75.7,95.4,37.2,107.0,72.8,13.9
+PT1007,2026-06-14 13:30:00,76.2,95.6,37.1,107.3,73.6,14.2
+PT1007,2026-06-14 13:45:00,75.8,95.7,36.6,111.9,72.3,14.1
+PT1007,2026-06-14 14:00:00,76.3,95.6,37.0,109.1,72.2,14.7
+PT1007,2026-06-14 14:15:00,76.0,96.0,37.4,109.1,70.4,14.9
+PT1007,2026-06-14 14:30:00,75.7,96.0,37.1,106.4,69.1,14.8
+PT1007,2026-06-14 14:45:00,75.0,95.9,37.4,106.2,67.6,14.7
+PT1007,2026-06-14 15:00:00,74.3,95.7,37.3,110.4,67.9,14.4
+PT1007,2026-06-14 15:15:00,74.6,95.6,37.3,110.3,67.5,14.8
+PT1007,2026-06-14 15:30:00,72.0,96.1,37.2,109.7,70.1,15.1
+PT1007,2026-06-14 15:45:00,71.9,96.8,37.1,109.1,69.1,14.8
+PT1007,2026-06-14 16:00:00,71.9,97.0,37.3,110.7,70.2,14.7
+PT1007,2026-06-14 16:15:00,72.8,97.0,37.2,111.2,71.4,14.8
+PT1007,2026-06-14 16:30:00,74.5,97.1,37.0,110.0,69.4,14.9
+PT1007,2026-06-14 16:45:00,75.5,97.5,36.9,107.9,68.0,14.9
+PT1007,2026-06-14 17:00:00,75.2,97.3,37.6,105.9,69.3,14.9
+PT1007,2026-06-14 17:15:00,75.7,97.7,36.9,104.5,68.2,15.8
+PT1007,2026-06-14 17:30:00,74.5,97.4,37.1,108.3,67.7,15.9
+PT1007,2026-06-14 17:45:00,73.6,97.3,37.5,110.0,65.9,16.2
+PT1007,2026-06-14 18:00:00,74.0,97.6,36.9,107.2,63.2,16.3
+PT1007,2026-06-14 18:15:00,75.0,97.6,36.9,107.5,63.3,16.4
+PT1007,2026-06-14 18:30:00,73.4,97.5,37.1,110.4,62.4,16.1
+PT1007,2026-06-14 18:45:00,72.0,97.8,36.8,108.3,61.9,17.1
+PT1007,2026-06-14 19:00:00,73.8,97.8,37.0,108.8,60.7,17.4
+PT1007,2026-06-14 19:15:00,72.4,98.2,37.3,108.0,57.9,17.3
+PT1007,2026-06-14 19:30:00,73.2,98.0,37.1,106.1,55.9,17.3
+PT1007,2026-06-14 19:45:00,74.0,98.0,37.1,105.7,55.5,17.4
+PT1007,2026-06-14 20:00:00,75.2,98.0,37.1,105.9,55.4,17.0
+PT1007,2026-06-14 20:15:00,74.4,98.1,36.2,105.5,57.9,16.5
+PT1007,2026-06-14 20:30:00,74.7,98.0,37.0,105.8,56.1,17.3
+PT1007,2026-06-14 20:45:00,73.8,98.4,37.1,107.5,58.1,17.2
+PT1007,2026-06-14 21:00:00,73.1,98.2,37.4,108.3,57.6,18.1
+PT1007,2026-06-14 21:15:00,75.4,97.7,36.6,112.1,54.0,17.6
+PT1007,2026-06-14 21:30:00,75.7,97.7,36.8,113.7,53.9,18.1
+PT1007,2026-06-14 21:45:00,77.2,97.7,37.1,118.4,55.2,18.0
+PT1007,2026-06-14 22:00:00,75.9,97.8,37.0,117.8,56.3,17.4
+PT1007,2026-06-14 22:15:00,74.5,97.5,37.7,119.0,58.0,16.5
+PT1007,2026-06-14 22:30:00,76.2,97.2,37.3,120.7,57.3,16.5
+PT1007,2026-06-14 22:45:00,76.8,97.0,36.5,119.5,56.5,16.9
+PT1007,2026-06-14 23:00:00,76.6,97.4,36.8,120.9,58.1,16.8
+PT1007,2026-06-14 23:15:00,76.6,97.2,37.6,125.4,57.8,17.1
+PT1007,2026-06-14 23:30:00,75.3,96.7,36.8,126.4,58.8,16.9
+PT1007,2026-06-14 23:45:00,75.7,96.7,37.3,127.0,57.1,17.1
+PT1007,2026-06-15 00:00:00,73.9,97.0,37.3,127.5,58.4,16.6
+PT1007,2026-06-15 00:15:00,71.9,96.8,37.7,128.0,58.0,16.6
+PT1007,2026-06-15 00:30:00,71.9,97.0,37.2,127.9,57.9,16.2
+PT1007,2026-06-15 00:45:00,75.0,97.0,37.2,127.4,59.6,16.6
+PT1007,2026-06-15 01:00:00,74.6,97.3,36.9,127.6,60.9,16.3
+PT1007,2026-06-15 01:15:00,74.7,97.0,37.8,126.9,59.0,15.6
+PT1007,2026-06-15 01:30:00,74.0,96.9,37.7,127.0,57.4,15.4
+PT1007,2026-06-15 01:45:00,74.4,97.1,36.7,130.2,57.7,15.4
+PT1007,2026-06-15 02:00:00,73.9,97.1,37.4,128.6,60.1,15.8
+PT1007,2026-06-15 02:15:00,73.8,96.8,37.3,131.2,60.6,16.1
+PT1007,2026-06-15 02:30:00,74.2,97.3,37.1,129.9,60.1,16.8
+PT1007,2026-06-15 02:45:00,74.0,97.3,37.3,131.3,59.8,16.6
+PT1007,2026-06-15 03:00:00,74.1,97.0,37.6,131.3,61.9,16.9
+PT1007,2026-06-15 03:15:00,73.3,97.3,37.1,130.0,60.0,16.6
+PT1007,2026-06-15 03:30:00,74.5,97.4,37.4,129.7,58.5,16.9
+PT1007,2026-06-15 03:45:00,74.8,97.1,37.0,131.3,60.3,17.5
+PT1007,2026-06-15 04:00:00,75.4,97.0,37.5,129.5,62.7,17.7
+PT1007,2026-06-15 04:15:00,73.9,97.1,37.0,130.5,61.4,18.3
+PT1007,2026-06-15 04:30:00,74.4,96.9,37.2,128.1,62.8,18.5
+PT1007,2026-06-15 04:45:00,74.1,97.0,37.2,130.7,61.8,18.7
+PT1007,2026-06-15 05:00:00,73.9,96.6,36.7,130.6,62.8,18.8
+PT1007,2026-06-15 05:15:00,75.4,97.0,36.7,130.4,66.2,18.5
+PT1007,2026-06-15 05:30:00,74.1,97.1,36.6,126.9,65.8,19.7
+PT1007,2026-06-15 05:45:00,73.5,96.8,37.1,126.3,65.3,19.4
+PT1007,2026-06-15 06:00:00,74.3,97.2,36.7,125.7,65.3,19.6
+PT1007,2026-06-15 06:15:00,74.1,97.1,37.5,127.6,67.9,19.3
+PT1007,2026-06-15 06:30:00,72.3,97.1,36.8,128.1,65.7,18.9
+PT1007,2026-06-15 06:45:00,70.8,96.5,37.3,127.7,65.5,18.9
+PT1007,2026-06-15 07:00:00,68.4,96.4,36.8,132.8,66.9,19.3
+PT1007,2026-06-15 07:15:00,68.2,95.8,36.8,134.0,69.0,18.7
+PT1007,2026-06-15 07:30:00,68.2,95.9,37.1,132.9,67.7,18.4
+PT1007,2026-06-15 07:45:00,69.0,95.9,37.1,132.6,65.1,18.7
+PT1007,2026-06-15 08:00:00,68.5,95.9,36.9,131.0,64.5,18.8
+PT1007,2026-06-15 08:15:00,66.5,95.5,36.8,131.9,64.4,18.7
+PT1007,2026-06-15 08:30:00,66.5,95.4,37.6,130.7,64.3,18.8
+PT1007,2026-06-15 08:45:00,67.2,95.6,36.8,132.9,63.2,18.7
+PT1007,2026-06-15 09:00:00,66.5,95.5,36.7,131.4,63.5,18.9
+PT1007,2026-06-15 09:15:00,66.1,95.5,37.4,128.5,62.4,19.2
+PT1007,2026-06-15 09:30:00,64.2,95.6,37.3,125.6,61.8,19.2
+PT1007,2026-06-15 09:45:00,64.0,95.3,37.0,123.2,62.0,18.9
+PT1007,2026-06-15 10:00:00,65.3,95.5,37.2,126.4,60.5,18.7
+PT1007,2026-06-15 10:15:00,67.5,95.3,37.4,126.4,62.5,18.7
+PT1007,2026-06-15 10:30:00,69.9,95.4,36.7,127.4,63.6,18.3
+PT1007,2026-06-15 10:45:00,70.1,95.2,36.7,129.5,64.0,18.7
+PT1007,2026-06-15 11:00:00,71.3,94.7,37.0,127.2,65.0,18.5
+PT1007,2026-06-15 11:15:00,71.4,95.0,36.9,123.4,66.9,19.1
+PT1007,2026-06-15 11:30:00,70.6,95.0,36.6,122.0,67.4,19.2
+PT1007,2026-06-15 11:45:00,69.5,94.7,37.4,122.4,68.7,18.8
+PT1007,2026-06-15 12:00:00,68.4,94.9,37.6,121.8,68.0,19.3
+PT1007,2026-06-15 12:15:00,66.1,95.1,36.8,122.2,69.0,18.7
+PT1007,2026-06-15 12:30:00,65.4,95.2,37.7,120.7,68.5,19.0
+PT1007,2026-06-15 12:45:00,66.3,95.4,37.1,120.3,67.2,18.9
+PT1007,2026-06-15 13:00:00,65.0,95.6,37.5,123.4,67.4,19.3
+PT1007,2026-06-15 13:15:00,63.8,95.2,37.5,122.4,67.5,18.9
+PT1007,2026-06-15 13:30:00,66.2,95.2,37.4,120.4,68.3,18.5
+PT1007,2026-06-15 13:45:00,65.9,95.4,37.2,122.2,69.1,19.2
+PT1007,2026-06-15 14:00:00,65.4,94.9,36.9,117.7,70.0,19.1
+PT1007,2026-06-15 14:15:00,64.1,95.1,36.8,115.7,72.5,20.0
+PT1007,2026-06-15 14:30:00,64.9,95.2,36.8,113.7,71.0,20.0
+PT1007,2026-06-15 14:45:00,66.3,95.2,36.9,111.5,70.9,20.2
+PT1007,2026-06-15 15:00:00,63.9,95.2,36.9,109.0,69.7,20.4
+PT1007,2026-06-15 15:15:00,63.8,95.6,36.8,108.3,72.7,20.7
+PT1007,2026-06-15 15:30:00,63.3,95.3,36.5,109.6,74.7,20.5
+PT1007,2026-06-15 15:45:00,63.8,95.1,37.3,108.2,75.2,21.0
+PT1007,2026-06-15 16:00:00,64.3,95.1,36.9,105.5,75.7,21.3
+PT1007,2026-06-15 16:15:00,63.9,95.4,37.3,104.8,75.3,21.3
+PT1007,2026-06-15 16:30:00,64.4,95.4,37.4,107.8,74.7,20.9
+PT1007,2026-06-15 16:45:00,64.7,95.3,36.7,107.1,72.8,21.0
+PT1007,2026-06-15 17:00:00,65.5,95.2,37.2,104.3,74.4,21.9
+PT1007,2026-06-15 17:15:00,65.2,95.0,37.4,104.8,75.4,21.9
+PT1007,2026-06-15 17:30:00,67.1,94.7,37.3,105.4,72.5,21.6
+PT1007,2026-06-15 17:45:00,67.1,94.3,37.3,107.5,71.7,21.9
+PT1007,2026-06-15 18:00:00,66.1,94.5,36.8,108.1,72.0,21.7
+PT1007,2026-06-15 18:15:00,65.7,94.4,37.6,109.8,69.5,22.3
+PT1007,2026-06-15 18:30:00,64.9,94.8,37.4,107.8,71.2,22.0
+PT1007,2026-06-15 18:45:00,63.2,95.1,37.4,110.4,69.0,22.7
+PT1007,2026-06-15 19:00:00,60.9,95.0,37.4,112.5,70.1,22.7
+PT1007,2026-06-15 19:15:00,59.9,95.0,37.3,110.8,70.3,23.1
+PT1007,2026-06-15 19:30:00,60.3,95.2,37.3,113.0,73.0,23.6
+PT1007,2026-06-15 19:45:00,61.4,95.3,37.2,112.4,74.3,23.9
+PT1007,2026-06-15 20:00:00,61.3,95.3,37.4,111.6,76.1,24.4
+PT1007,2026-06-15 20:15:00,60.1,95.2,37.2,111.1,75.2,25.1
+PT1007,2026-06-15 20:30:00,60.5,95.1,37.0,112.8,78.5,25.1
+PT1007,2026-06-15 20:45:00,60.5,95.0,37.1,112.8,77.6,24.8
+PT1007,2026-06-15 21:00:00,60.7,95.0,37.3,115.7,78.2,25.1
+PT1007,2026-06-15 21:15:00,60.9,95.0,36.9,114.0,79.2,24.9
+PT1007,2026-06-15 21:30:00,62.5,94.7,37.6,117.4,81.7,24.9
+PT1007,2026-06-15 21:45:00,61.5,95.0,37.0,117.5,79.0,24.6
+PT1007,2026-06-15 22:00:00,62.5,94.9,37.1,116.9,79.8,24.8
+PT1007,2026-06-15 22:15:00,62.2,95.1,37.3,116.3,78.0,24.6
+PT1007,2026-06-15 22:30:00,62.0,95.0,36.8,113.8,77.8,24.7
+PT1007,2026-06-15 22:45:00,61.9,94.8,36.6,113.5,80.4,24.8
+PT1007,2026-06-15 23:00:00,62.3,95.1,37.1,110.8,78.8,24.9
+PT1007,2026-06-15 23:15:00,63.8,95.1,37.3,112.4,81.1,24.6
+PT1007,2026-06-15 23:30:00,63.4,94.5,37.0,113.4,82.0,23.9
+PT1007,2026-06-15 23:45:00,62.7,94.7,37.2,110.3,82.1,23.0
+PT1007,2026-06-16 00:00:00,62.9,94.6,37.5,113.1,78.2,23.0
+PT1007,2026-06-16 00:15:00,63.1,95.0,37.4,112.2,78.0,23.5
+PT1007,2026-06-16 00:30:00,66.1,95.0,37.4,112.6,77.3,23.4
+PT1007,2026-06-16 00:45:00,66.1,94.8,37.0,111.9,77.1,23.1
+PT1007,2026-06-16 01:00:00,65.0,94.7,36.9,114.2,77.2,24.1
+PT1007,2026-06-16 01:15:00,65.6,94.8,37.2,115.5,76.3,23.9
+PT1007,2026-06-16 01:30:00,65.0,94.4,37.2,118.1,77.6,23.8
+PT1007,2026-06-16 01:45:00,66.3,94.7,37.1,118.3,76.7,24.4
+PT1007,2026-06-16 02:00:00,66.1,94.8,37.0,120.6,76.7,24.8
+PT1007,2026-06-16 02:15:00,66.9,94.6,36.7,122.8,75.7,24.9
+PT1007,2026-06-16 02:30:00,67.0,94.7,37.3,121.4,75.5,25.0
+PT1007,2026-06-16 02:45:00,67.1,95.0,37.0,123.7,75.5,24.5
+PT1007,2026-06-16 03:00:00,64.5,95.0,36.9,126.5,76.7,24.6
+PT1007,2026-06-16 03:15:00,64.7,95.5,37.8,129.5,76.4,24.0
+PT1007,2026-06-16 03:30:00,63.8,95.7,36.8,126.4,75.9,23.3
+PT1007,2026-06-16 03:45:00,62.8,95.8,37.4,126.2,80.0,23.8
+PT1007,2026-06-16 04:00:00,63.5,95.9,36.7,128.6,76.4,23.5
+PT1007,2026-06-16 04:15:00,61.2,95.7,36.5,126.3,78.2,23.6
+PT1007,2026-06-16 04:30:00,61.7,95.5,37.2,126.4,78.8,23.3
+PT1007,2026-06-16 04:45:00,62.2,95.4,37.2,125.0,78.8,23.2
+PT1007,2026-06-16 05:00:00,62.0,95.1,37.1,124.6,79.3,23.3
+PT1007,2026-06-16 05:15:00,61.4,95.0,37.1,123.8,80.9,22.9
+PT1007,2026-06-16 05:30:00,60.0,95.2,36.4,122.7,79.7,23.0
+PT1007,2026-06-16 05:45:00,58.5,95.3,37.8,124.7,80.4,23.1
+PT1007,2026-06-16 06:00:00,59.2,95.1,36.7,126.8,79.4,22.8
+PT1007,2026-06-16 06:15:00,58.8,94.8,37.1,127.9,79.2,22.2
+PT1007,2026-06-16 06:30:00,60.0,95.2,37.2,124.3,78.0,21.7
+PT1007,2026-06-16 06:45:00,58.4,95.5,36.9,126.7,79.3,21.4
+PT1007,2026-06-16 07:00:00,57.9,95.8,37.0,123.3,79.9,21.1
+PT1007,2026-06-16 07:15:00,58.9,95.4,37.1,122.8,79.7,21.0
+PT1007,2026-06-16 07:30:00,59.6,95.3,37.3,123.5,80.2,21.2
+PT1007,2026-06-16 07:45:00,60.1,95.3,37.0,121.0,82.2,21.8
+PT1007,2026-06-16 08:00:00,60.7,95.2,37.6,119.5,82.3,23.0
+PT1007,2026-06-16 08:15:00,62.5,95.3,37.2,117.7,83.8,21.8
+PT1007,2026-06-16 08:30:00,63.8,95.4,37.1,121.0,81.7,22.5
+PT1007,2026-06-16 08:45:00,65.6,95.6,37.5,124.0,83.2,22.7
+PT1007,2026-06-16 09:00:00,65.7,95.8,37.2,124.0,82.1,22.9
+PT1007,2026-06-16 09:15:00,67.3,95.8,36.9,122.5,84.0,23.0
+PT1007,2026-06-16 09:30:00,69.0,96.0,36.8,126.2,83.5,22.8
+PT1007,2026-06-16 09:45:00,68.3,95.9,37.6,127.6,82.1,22.5
+PT1007,2026-06-16 10:00:00,64.9,96.0,37.1,125.0,80.9,23.1
+PT1007,2026-06-16 10:15:00,68.1,96.2,37.3,123.3,81.7,23.5
+PT1007,2026-06-16 10:30:00,67.9,95.8,37.0,122.7,84.2,23.2
+PT1007,2026-06-16 10:45:00,69.1,96.0,37.1,120.1,84.1,23.8
+PT1007,2026-06-16 11:00:00,70.8,96.3,36.6,118.2,83.6,24.0
+PT1007,2026-06-16 11:15:00,70.6,96.5,36.9,117.0,84.5,23.8
+PT1007,2026-06-16 11:30:00,71.5,96.8,37.2,115.5,82.7,23.8
+PT1007,2026-06-16 11:45:00,70.6,97.2,37.5,115.2,81.6,24.6
+PT1007,2026-06-16 12:00:00,69.8,97.5,36.7,113.9,82.7,25.3
+PT1007,2026-06-16 12:15:00,69.1,97.4,36.6,114.5,83.4,25.2
+PT1007,2026-06-16 12:30:00,67.7,97.2,36.8,115.6,81.4,24.9
+PT1007,2026-06-16 12:45:00,68.1,97.5,37.1,115.9,84.3,24.9
+PT1007,2026-06-16 13:00:00,67.2,97.5,37.0,114.2,82.9,24.5
+PT1007,2026-06-16 13:15:00,66.7,98.2,38.0,114.7,83.2,24.3
+PT1007,2026-06-16 13:30:00,65.6,98.1,37.1,116.7,83.5,23.8
+PT1007,2026-06-16 13:45:00,66.4,98.2,37.3,118.0,86.7,23.9
+PT1007,2026-06-16 14:00:00,63.6,98.6,37.3,118.1,85.4,23.8
+PT1007,2026-06-16 14:15:00,64.9,98.6,37.2,119.3,85.0,24.0
+PT1007,2026-06-16 14:30:00,65.3,98.5,36.9,120.1,83.8,24.1
+PT1007,2026-06-16 14:45:00,64.1,98.4,37.1,119.7,83.0,24.3
+PT1007,2026-06-16 15:00:00,65.4,98.3,37.0,120.1,85.8,24.1
+PT1007,2026-06-16 15:15:00,66.9,98.1,37.4,122.7,85.5,23.7
+PT1007,2026-06-16 15:30:00,66.6,98.5,37.1,122.9,85.6,23.5
+PT1007,2026-06-16 15:45:00,66.3,98.9,37.0,123.4,86.6,23.6
+PT1007,2026-06-16 16:00:00,66.8,99.3,36.9,121.3,87.3,24.2
+PT1007,2026-06-16 16:15:00,67.9,99.5,37.2,118.7,88.9,23.9
+PT1007,2026-06-16 16:30:00,69.2,99.8,37.4,115.7,91.6,24.5
+PT1007,2026-06-16 16:45:00,69.7,99.7,37.4,113.5,89.2,24.7
+PT1007,2026-06-16 17:00:00,69.6,99.5,36.9,113.6,88.2,24.7
+PT1007,2026-06-16 17:15:00,70.3,99.8,37.1,114.7,88.1,25.1
+PT1007,2026-06-16 17:30:00,71.5,99.7,37.4,113.7,86.6,25.0
+PT1007,2026-06-16 17:45:00,70.5,99.1,37.7,112.8,84.8,24.8
+PT1007,2026-06-16 18:00:00,69.4,99.2,37.4,112.7,85.4,24.6
+PT1007,2026-06-16 18:15:00,70.0,99.3,37.2,112.9,87.3,24.8
+PT1007,2026-06-16 18:30:00,70.8,98.9,36.9,113.2,87.2,25.2
+PT1007,2026-06-16 18:45:00,71.0,99.4,36.9,113.2,85.2,26.1
+PT1007,2026-06-16 19:00:00,69.8,99.1,37.1,114.6,87.1,26.8
+PT1007,2026-06-16 19:15:00,68.6,99.0,36.7,114.7,87.1,27.3
+PT1007,2026-06-16 19:30:00,67.3,98.9,37.5,115.4,86.4,27.1
+PT1007,2026-06-16 19:45:00,67.9,98.6,37.3,114.4,87.2,26.6
+PT1007,2026-06-16 20:00:00,67.5,98.7,37.5,114.7,85.5,26.4
+PT1007,2026-06-16 20:15:00,70.4,98.3,36.9,116.8,86.0,27.2
+PT1007,2026-06-16 20:30:00,71.5,98.2,36.8,119.3,89.5,27.3
+PT1007,2026-06-16 20:45:00,73.2,98.3,36.9,120.1,91.8,26.8
+PT1007,2026-06-16 21:00:00,73.9,98.1,36.7,119.4,93.7,27.0
+PT1007,2026-06-16 21:15:00,74.4,98.5,37.2,119.8,95.1,26.8
+PT1007,2026-06-16 21:30:00,72.5,98.6,37.3,120.5,93.1,27.4
+PT1007,2026-06-16 21:45:00,71.7,98.8,36.8,118.5,91.8,27.0
+PT1007,2026-06-16 22:00:00,72.2,98.8,37.0,120.0,87.6,26.9
+PT1007,2026-06-16 22:15:00,72.3,98.8,37.0,120.5,87.7,26.7
+PT1007,2026-06-16 22:30:00,72.3,98.9,37.3,120.7,86.6,26.3
+PT1007,2026-06-16 22:45:00,73.2,99.2,36.9,119.7,83.8,26.5
+PT1007,2026-06-16 23:00:00,73.1,99.2,37.5,120.8,85.1,27.0
+PT1007,2026-06-16 23:15:00,73.2,98.8,37.8,119.6,87.2,27.0
+PT1007,2026-06-16 23:30:00,72.7,99.3,37.3,119.6,86.6,26.7
+PT1007,2026-06-16 23:45:00,71.0,99.2,37.6,119.5,83.2,26.7
+PT1008,2026-06-14 00:00:00,82.5,95.8,37.2,141.0,88.5,16.8
+PT1008,2026-06-14 00:15:00,81.9,95.6,37.0,143.4,89.6,16.0
+PT1008,2026-06-14 00:30:00,83.1,95.5,37.0,142.2,89.2,16.1
+PT1008,2026-06-14 00:45:00,83.0,95.5,37.1,140.3,87.7,15.6
+PT1008,2026-06-14 01:00:00,83.7,95.3,37.0,137.3,86.3,16.2
+PT1008,2026-06-14 01:15:00,83.4,95.1,36.8,138.4,86.2,15.9
+PT1008,2026-06-14 01:30:00,83.9,95.1,36.4,136.0,88.0,15.7
+PT1008,2026-06-14 01:45:00,85.7,95.1,37.2,136.8,90.5,15.3
+PT1008,2026-06-14 02:00:00,87.1,94.9,36.8,139.8,88.4,15.2
+PT1008,2026-06-14 02:15:00,87.9,94.7,36.9,138.5,87.1,14.7
+PT1008,2026-06-14 02:30:00,87.8,94.6,36.6,138.1,86.1,14.6
+PT1008,2026-06-14 02:45:00,87.0,94.6,37.2,138.7,86.3,14.1
+PT1008,2026-06-14 03:00:00,87.1,95.0,37.0,135.7,86.1,14.5
+PT1008,2026-06-14 03:15:00,86.0,94.8,36.8,137.3,83.8,14.4
+PT1008,2026-06-14 03:30:00,85.0,94.9,37.3,136.5,84.2,13.9
+PT1008,2026-06-14 03:45:00,85.2,95.2,37.2,135.7,84.8,14.2
+PT1008,2026-06-14 04:00:00,87.2,94.8,37.5,136.0,84.2,14.0
+PT1008,2026-06-14 04:15:00,86.5,95.0,37.0,133.9,85.8,14.0
+PT1008,2026-06-14 04:30:00,84.6,94.9,36.9,132.5,88.4,14.0
+PT1008,2026-06-14 04:45:00,83.8,94.6,37.8,135.6,90.3,14.0
+PT1008,2026-06-14 05:00:00,83.8,94.9,37.2,136.7,89.4,14.1
+PT1008,2026-06-14 05:15:00,82.2,95.0,36.8,139.0,88.4,14.0
+PT1008,2026-06-14 05:30:00,81.7,94.9,37.1,142.1,87.9,13.8
+PT1008,2026-06-14 05:45:00,79.6,94.3,37.4,139.4,88.4,13.8
+PT1008,2026-06-14 06:00:00,77.8,94.2,37.0,136.2,88.8,13.2
+PT1008,2026-06-14 06:15:00,78.1,94.1,36.6,131.7,91.3,13.0
+PT1008,2026-06-14 06:30:00,79.0,94.4,37.2,131.1,93.6,12.7
+PT1008,2026-06-14 06:45:00,79.6,94.7,37.2,127.2,97.0,13.2
+PT1008,2026-06-14 07:00:00,78.7,94.5,37.1,127.7,97.7,13.3
+PT1008,2026-06-14 07:15:00,79.2,94.0,37.5,127.2,95.7,13.3
+PT1008,2026-06-14 07:30:00,78.1,93.8,37.3,125.5,94.6,13.5
+PT1008,2026-06-14 07:45:00,79.9,93.6,36.8,126.9,95.9,14.2
+PT1008,2026-06-14 08:00:00,77.5,93.5,36.4,132.5,94.2,14.4
+PT1008,2026-06-14 08:15:00,79.7,93.1,37.5,127.7,94.4,14.5
+PT1008,2026-06-14 08:30:00,80.8,92.6,37.2,127.4,93.3,13.9
+PT1008,2026-06-14 08:45:00,82.0,92.4,37.0,126.7,92.9,13.7
+PT1008,2026-06-14 09:00:00,81.2,92.4,37.3,125.6,93.6,13.4
+PT1008,2026-06-14 09:15:00,80.5,92.6,37.1,123.9,94.9,12.7
+PT1008,2026-06-14 09:30:00,79.8,92.6,37.0,121.5,94.6,12.3
+PT1008,2026-06-14 09:45:00,79.4,92.7,37.1,121.6,97.4,12.1
+PT1008,2026-06-14 10:00:00,83.3,92.7,36.7,123.5,98.3,13.0
+PT1008,2026-06-14 10:15:00,81.4,92.4,36.8,123.9,96.8,12.1
+PT1008,2026-06-14 10:30:00,81.8,92.2,37.0,126.2,95.1,12.1
+PT1008,2026-06-14 10:45:00,82.1,92.3,37.3,129.3,96.1,12.0
+PT1008,2026-06-14 11:00:00,83.0,92.8,36.5,129.0,96.0,12.5
+PT1008,2026-06-14 11:15:00,82.7,93.0,36.4,131.1,92.7,12.0
+PT1008,2026-06-14 11:30:00,83.8,93.1,36.8,134.0,92.7,12.9
+PT1008,2026-06-14 11:45:00,83.3,93.2,37.0,132.5,93.4,12.8
+PT1008,2026-06-14 12:00:00,83.2,93.4,36.9,131.9,91.7,12.8
+PT1008,2026-06-14 12:15:00,82.0,93.0,37.1,133.7,92.7,13.4
+PT1008,2026-06-14 12:30:00,83.2,92.8,37.2,129.9,91.6,13.3
+PT1008,2026-06-14 12:45:00,84.8,92.9,37.2,134.4,91.7,13.4
+PT1008,2026-06-14 13:00:00,85.2,93.0,36.8,131.9,93.0,14.4
+PT1008,2026-06-14 13:15:00,85.2,92.6,36.7,133.5,94.1,13.8
+PT1008,2026-06-14 13:30:00,82.6,93.0,37.4,131.8,93.9,13.6
+PT1008,2026-06-14 13:45:00,83.4,93.2,37.3,130.2,95.0,14.0
+PT1008,2026-06-14 14:00:00,81.9,92.9,37.1,133.6,97.9,14.0
+PT1008,2026-06-14 14:15:00,82.1,93.1,37.1,130.7,98.2,13.6
+PT1008,2026-06-14 14:30:00,81.0,93.0,37.5,131.1,97.3,13.1
+PT1008,2026-06-14 14:45:00,79.7,92.4,37.1,132.2,96.9,13.1
+PT1008,2026-06-14 15:00:00,81.2,92.9,37.3,132.7,95.1,13.2
+PT1008,2026-06-14 15:15:00,82.5,92.9,36.6,131.6,93.7,13.1
+PT1008,2026-06-14 15:30:00,82.9,93.0,37.1,132.0,94.8,13.7
+PT1008,2026-06-14 15:45:00,83.0,92.9,37.4,133.1,94.8,14.2
+PT1008,2026-06-14 16:00:00,83.4,92.9,37.0,132.5,95.5,14.3
+PT1008,2026-06-14 16:15:00,83.7,92.7,37.0,133.4,94.5,14.7
+PT1008,2026-06-14 16:30:00,85.7,92.7,37.1,133.9,92.4,15.2
+PT1008,2026-06-14 16:45:00,87.8,92.8,37.3,133.5,91.6,15.5
+PT1008,2026-06-14 17:00:00,86.2,92.7,37.2,134.9,90.7,15.1
+PT1008,2026-06-14 17:15:00,86.2,92.6,36.6,138.5,90.4,14.6
+PT1008,2026-06-14 17:30:00,87.5,92.3,37.2,138.5,89.1,14.6
+PT1008,2026-06-14 17:45:00,85.8,92.2,36.9,137.2,87.7,14.5
+PT1008,2026-06-14 18:00:00,86.8,92.0,36.9,138.1,88.3,13.9
+PT1008,2026-06-14 18:15:00,86.7,92.1,37.2,137.6,89.9,13.9
+PT1008,2026-06-14 18:30:00,85.9,92.3,37.0,141.5,90.6,14.3
+PT1008,2026-06-14 18:45:00,87.0,92.5,37.1,142.0,90.5,13.7
+PT1008,2026-06-14 19:00:00,87.7,92.4,36.7,139.4,90.7,13.8
+PT1008,2026-06-14 19:15:00,87.7,92.4,37.1,142.1,90.0,14.7
+PT1008,2026-06-14 19:30:00,86.2,92.4,37.2,139.8,89.7,14.9
+PT1008,2026-06-14 19:45:00,84.8,92.1,36.3,140.7,90.7,14.7
+PT1008,2026-06-14 20:00:00,83.4,92.4,37.0,139.2,90.2,14.9
+PT1008,2026-06-14 20:15:00,85.1,92.3,36.8,137.5,91.9,14.9
+PT1008,2026-06-14 20:30:00,85.7,92.2,36.6,135.2,92.1,14.8
+PT1008,2026-06-14 20:45:00,84.4,92.7,37.5,135.4,94.1,15.0
+PT1008,2026-06-14 21:00:00,85.0,92.5,37.2,136.6,92.7,15.3
+PT1008,2026-06-14 21:15:00,85.0,92.4,36.6,138.2,92.4,14.6
+PT1008,2026-06-14 21:30:00,83.5,92.6,37.5,139.9,92.9,14.7
+PT1008,2026-06-14 21:45:00,83.9,92.8,37.7,139.9,92.2,14.6
+PT1008,2026-06-14 22:00:00,82.6,92.9,36.6,136.8,91.3,14.9
+PT1008,2026-06-14 22:15:00,83.7,93.4,37.3,137.6,93.2,15.0
+PT1008,2026-06-14 22:30:00,84.2,93.3,37.1,136.4,95.0,15.0
+PT1008,2026-06-14 22:45:00,84.0,93.4,36.7,134.0,94.7,15.1
+PT1008,2026-06-14 23:00:00,84.2,93.2,36.8,134.6,97.9,15.0
+PT1008,2026-06-14 23:15:00,84.5,93.3,37.1,132.7,95.4,14.7
+PT1008,2026-06-14 23:30:00,84.0,93.6,37.3,133.8,95.5,14.0
+PT1008,2026-06-14 23:45:00,86.3,93.8,37.5,132.5,95.3,14.2
+PT1008,2026-06-15 00:00:00,85.4,93.7,37.2,132.4,95.1,14.5
+PT1008,2026-06-15 00:15:00,83.8,93.6,37.1,131.1,91.8,14.8
+PT1008,2026-06-15 00:30:00,83.1,93.8,37.5,131.7,89.9,15.1
+PT1008,2026-06-15 00:45:00,82.9,93.8,36.8,131.9,88.0,15.1
+PT1008,2026-06-15 01:00:00,82.9,93.8,37.2,133.0,88.9,14.8
+PT1008,2026-06-15 01:15:00,84.1,93.6,36.8,136.5,87.4,15.4
+PT1008,2026-06-15 01:30:00,84.0,93.5,37.3,133.8,88.5,15.7
+PT1008,2026-06-15 01:45:00,83.7,93.4,37.2,136.0,88.8,15.4
+PT1008,2026-06-15 02:00:00,81.6,93.4,37.3,137.3,88.5,15.7
+PT1008,2026-06-15 02:15:00,82.0,93.9,37.0,140.0,89.5,15.8
+PT1008,2026-06-15 02:30:00,81.2,94.1,36.9,139.6,88.0,15.5
+PT1008,2026-06-15 02:45:00,83.3,94.3,36.8,139.6,88.6,15.7
+PT1008,2026-06-15 03:00:00,81.9,94.6,37.2,136.9,88.6,15.5
+PT1008,2026-06-15 03:15:00,81.6,94.7,37.4,132.3,90.2,15.7
+PT1008,2026-06-15 03:30:00,82.7,94.8,37.4,131.0,90.9,15.9
+PT1008,2026-06-15 03:45:00,83.4,94.8,37.6,131.9,91.7,16.3
+PT1008,2026-06-15 04:00:00,84.1,95.0,36.1,131.5,91.2,16.0
+PT1008,2026-06-15 04:15:00,83.1,94.9,36.9,130.8,91.8,15.7
+PT1008,2026-06-15 04:30:00,80.6,95.0,36.8,129.1,90.8,15.9
+PT1008,2026-06-15 04:45:00,81.0,94.7,37.6,129.0,89.9,15.8
+PT1008,2026-06-15 05:00:00,79.1,95.1,37.2,127.2,91.2,16.2
+PT1008,2026-06-15 05:15:00,77.6,95.2,37.0,132.3,91.2,16.2
+PT1008,2026-06-15 05:30:00,78.3,95.2,37.8,132.9,90.7,15.8
+PT1008,2026-06-15 05:45:00,78.2,96.0,36.9,133.7,91.6,15.7
+PT1008,2026-06-15 06:00:00,77.8,95.8,37.5,131.9,94.3,16.0
+PT1008,2026-06-15 06:15:00,79.2,95.6,37.4,128.8,93.6,16.0
+PT1008,2026-06-15 06:30:00,79.2,96.4,37.2,127.9,94.5,15.8
+PT1008,2026-06-15 06:45:00,79.0,96.3,36.8,126.7,94.7,16.1
+PT1008,2026-06-15 07:00:00,79.0,96.4,37.0,128.1,97.5,16.3
+PT1008,2026-06-15 07:15:00,78.3,96.3,37.3,126.8,97.8,16.5
+PT1008,2026-06-15 07:30:00,79.1,96.6,37.2,125.5,100.3,16.3
+PT1008,2026-06-15 07:45:00,78.9,96.6,37.3,126.8,98.1,15.9
+PT1008,2026-06-15 08:00:00,78.9,96.5,36.9,124.6,97.8,16.2
+PT1008,2026-06-15 08:15:00,80.6,96.8,36.8,123.9,96.9,15.1
+PT1008,2026-06-15 08:30:00,79.2,96.4,37.1,123.8,97.3,15.8
+PT1008,2026-06-15 08:45:00,76.8,96.2,36.9,125.0,97.2,16.2
+PT1008,2026-06-15 09:00:00,78.2,96.3,37.1,125.5,97.5,15.8
+PT1008,2026-06-15 09:15:00,78.6,95.9,37.5,125.7,99.3,16.0
+PT1008,2026-06-15 09:30:00,79.1,95.7,37.0,127.3,97.6,15.9
+PT1008,2026-06-15 09:45:00,78.3,96.3,36.9,127.1,100.3,16.1
+PT1008,2026-06-15 10:00:00,77.8,96.3,37.2,126.5,99.9,16.3
+PT1008,2026-06-15 10:15:00,78.7,96.7,37.5,125.5,101.5,16.9
+PT1008,2026-06-15 10:30:00,76.6,97.1,37.3,124.2,98.8,17.6
+PT1008,2026-06-15 10:45:00,77.3,97.0,37.1,124.6,98.6,17.3
+PT1008,2026-06-15 11:00:00,77.4,96.7,37.1,124.7,95.9,18.1
+PT1008,2026-06-15 11:15:00,76.2,96.8,36.8,123.2,95.8,18.3
+PT1008,2026-06-15 11:30:00,78.5,97.3,37.0,122.2,94.2,18.1
+PT1008,2026-06-15 11:45:00,79.9,97.2,37.4,119.9,94.3,17.5
+PT1008,2026-06-15 12:00:00,80.6,97.0,36.9,118.9,94.7,17.0
+PT1008,2026-06-15 12:15:00,80.3,96.7,37.0,118.0,93.1,17.6
+PT1008,2026-06-15 12:30:00,79.2,96.9,37.0,116.7,91.4,17.9
+PT1008,2026-06-15 12:45:00,80.2,96.9,36.9,117.0,92.3,17.7
+PT1008,2026-06-15 13:00:00,81.7,97.0,37.4,116.8,93.5,17.9
+PT1008,2026-06-15 13:15:00,80.3,97.0,37.1,119.1,96.0,17.7
+PT1008,2026-06-15 13:30:00,80.3,96.7,36.8,118.5,93.6,17.6
+PT1008,2026-06-15 13:45:00,80.6,96.6,37.7,117.9,95.9,17.7
+PT1008,2026-06-15 14:00:00,81.1,96.8,37.5,116.1,94.9,17.7
+PT1008,2026-06-15 14:15:00,80.7,96.4,37.0,116.9,95.0,17.4
+PT1008,2026-06-15 14:30:00,79.6,96.6,37.5,117.0,95.4,17.2
+PT1008,2026-06-15 14:45:00,79.9,96.1,37.4,117.9,95.0,17.1
+PT1008,2026-06-15 15:00:00,80.0,96.5,36.9,118.1,94.3,16.4
+PT1008,2026-06-15 15:15:00,79.6,96.9,36.9,117.2,96.7,16.0
+PT1008,2026-06-15 15:30:00,81.0,96.7,37.3,119.4,95.5,15.7
+PT1008,2026-06-15 15:45:00,80.0,96.7,36.7,120.2,95.1,15.4
+PT1008,2026-06-15 16:00:00,81.8,97.1,37.3,120.8,94.8,15.4
+PT1008,2026-06-15 16:15:00,83.0,96.9,36.6,123.0,95.7,15.8
+PT1008,2026-06-15 16:30:00,82.5,96.9,37.2,122.0,98.5,15.6
+PT1008,2026-06-15 16:45:00,82.7,96.8,37.4,120.6,101.6,15.5
+PT1008,2026-06-15 17:00:00,82.7,96.7,36.9,120.8,102.1,15.4
+PT1008,2026-06-15 17:15:00,83.3,96.7,36.5,119.5,100.7,15.5
+PT1008,2026-06-15 17:30:00,82.9,96.7,37.2,123.0,100.7,15.4
+PT1008,2026-06-15 17:45:00,82.1,96.7,37.1,123.1,101.6,15.1
+PT1008,2026-06-15 18:00:00,79.9,96.8,36.8,122.6,104.5,15.2
+PT1008,2026-06-15 18:15:00,78.6,97.0,37.2,126.2,106.7,14.8
+PT1008,2026-06-15 18:30:00,80.0,96.6,37.2,128.3,105.7,14.7
+PT1008,2026-06-15 18:45:00,81.3,97.0,37.3,127.6,104.9,14.5
+PT1008,2026-06-15 19:00:00,82.5,97.2,37.1,128.2,105.5,14.4
+PT1008,2026-06-15 19:15:00,83.5,97.3,37.1,127.2,107.1,14.1
+PT1008,2026-06-15 19:30:00,82.0,97.1,37.5,127.3,106.1,14.0
+PT1008,2026-06-15 19:45:00,81.9,97.3,37.0,125.7,106.9,13.6
+PT1008,2026-06-15 20:00:00,82.6,97.3,37.5,127.6,107.9,13.5
+PT1008,2026-06-15 20:15:00,83.1,97.2,37.1,127.9,108.1,13.6
+PT1008,2026-06-15 20:30:00,83.5,97.4,36.8,128.7,108.6,13.5
+PT1008,2026-06-15 20:45:00,82.2,97.2,36.9,127.9,111.1,14.0
+PT1008,2026-06-15 21:00:00,82.7,97.2,37.7,128.4,110.3,14.9
+PT1008,2026-06-15 21:15:00,82.3,97.0,37.1,130.2,108.5,15.3
+PT1008,2026-06-15 21:30:00,80.6,97.0,36.7,128.9,108.8,15.3
+PT1008,2026-06-15 21:45:00,80.2,97.1,37.2,130.4,108.2,15.5
+PT1008,2026-06-15 22:00:00,80.2,97.2,37.1,128.5,108.2,14.8
+PT1008,2026-06-15 22:15:00,81.9,97.1,37.3,131.2,107.8,14.4
+PT1008,2026-06-15 22:30:00,82.5,97.7,37.4,129.2,108.3,14.6
+PT1008,2026-06-15 22:45:00,83.1,97.6,37.3,127.1,108.8,14.7
+PT1008,2026-06-15 23:00:00,82.7,97.7,37.2,124.0,107.3,15.1
+PT1008,2026-06-15 23:15:00,83.3,97.5,37.3,122.5,106.6,15.2
+PT1008,2026-06-15 23:30:00,83.0,97.1,37.4,123.4,107.0,15.4
+PT1008,2026-06-15 23:45:00,83.9,97.5,37.4,123.4,106.4,15.8
+PT1008,2026-06-16 00:00:00,83.6,97.7,37.9,123.6,108.3,16.5
+PT1008,2026-06-16 00:15:00,83.7,98.1,37.4,125.3,109.7,16.7
+PT1008,2026-06-16 00:30:00,82.0,98.1,36.9,124.0,108.6,16.1
+PT1008,2026-06-16 00:45:00,81.8,98.1,36.5,123.9,110.2,15.7
+PT1008,2026-06-16 01:00:00,82.5,98.1,37.0,123.8,109.1,16.1
+PT1008,2026-06-16 01:15:00,81.4,98.5,37.0,125.2,109.1,15.1
+PT1008,2026-06-16 01:30:00,81.4,98.8,36.7,121.7,111.4,15.3
+PT1008,2026-06-16 01:45:00,82.5,98.8,37.1,118.4,110.7,15.4
+PT1008,2026-06-16 02:00:00,83.3,99.0,36.7,116.2,110.7,15.1
+PT1008,2026-06-16 02:15:00,83.2,99.1,36.9,117.1,110.1,14.7
+PT1008,2026-06-16 02:30:00,80.9,98.8,37.7,114.9,111.4,15.1
+PT1008,2026-06-16 02:45:00,81.2,98.7,37.2,115.0,111.1,14.8
+PT1008,2026-06-16 03:00:00,81.5,98.6,37.0,114.4,112.1,14.6
+PT1008,2026-06-16 03:15:00,82.0,98.9,37.0,116.2,111.7,14.1
+PT1008,2026-06-16 03:30:00,82.1,98.6,36.9,115.6,113.5,14.2
+PT1008,2026-06-16 03:45:00,82.2,98.6,37.2,114.8,114.7,13.4
+PT1008,2026-06-16 04:00:00,81.5,98.8,37.2,112.3,116.1,13.1
+PT1008,2026-06-16 04:15:00,80.9,99.1,37.0,111.9,115.0,13.7
+PT1008,2026-06-16 04:30:00,81.6,99.3,36.6,110.2,115.6,13.9
+PT1008,2026-06-16 04:45:00,81.9,99.2,36.5,113.4,116.9,14.1
+PT1008,2026-06-16 05:00:00,82.5,99.0,37.0,115.1,116.7,13.9
+PT1008,2026-06-16 05:15:00,82.0,98.7,37.3,112.7,116.2,14.5
+PT1008,2026-06-16 05:30:00,83.0,98.9,36.9,113.3,115.5,14.3
+PT1008,2026-06-16 05:45:00,84.0,98.7,37.5,117.5,114.1,14.8
+PT1008,2026-06-16 06:00:00,84.7,99.1,37.3,117.1,114.3,14.9
+PT1008,2026-06-16 06:15:00,82.5,99.0,37.1,118.8,113.8,15.7
+PT1008,2026-06-16 06:30:00,83.1,99.4,37.3,119.0,116.1,15.9
+PT1008,2026-06-16 06:45:00,82.0,99.7,37.0,117.8,115.8,16.4
+PT1008,2026-06-16 07:00:00,82.5,99.6,37.3,117.8,115.6,16.0
+PT1008,2026-06-16 07:15:00,83.2,99.5,37.1,116.9,116.9,15.9
+PT1008,2026-06-16 07:30:00,82.2,99.4,37.4,115.2,116.0,15.6
+PT1008,2026-06-16 07:45:00,80.6,99.5,36.7,114.7,118.1,15.9
+PT1008,2026-06-16 08:00:00,79.9,99.5,37.0,113.6,119.5,16.0
+PT1008,2026-06-16 08:15:00,81.1,99.2,36.2,113.1,119.9,15.9
+PT1008,2026-06-16 08:30:00,81.5,99.3,37.0,111.0,116.6,15.6
+PT1008,2026-06-16 08:45:00,81.4,98.8,37.5,111.4,118.1,16.0
+PT1008,2026-06-16 09:00:00,79.9,99.0,37.2,109.6,119.3,15.7
+PT1008,2026-06-16 09:15:00,81.8,99.2,37.5,107.7,117.6,16.0
+PT1008,2026-06-16 09:30:00,82.3,99.0,36.8,107.8,118.2,16.0
+PT1008,2026-06-16 09:45:00,83.6,99.5,37.3,110.7,115.0,16.5
+PT1008,2026-06-16 10:00:00,82.8,99.0,37.5,110.4,115.5,16.0
+PT1008,2026-06-16 10:15:00,84.2,99.1,37.3,107.7,115.1,16.3
+PT1008,2026-06-16 10:30:00,83.4,98.9,36.9,106.2,114.7,16.1
+PT1008,2026-06-16 10:45:00,83.2,98.9,36.9,108.4,112.0,16.6
+PT1008,2026-06-16 11:00:00,85.4,99.1,37.1,109.5,111.9,17.4
+PT1008,2026-06-16 11:15:00,87.2,98.9,37.2,110.9,114.7,17.1
+PT1008,2026-06-16 11:30:00,86.3,99.0,36.8,114.7,113.3,17.2
+PT1008,2026-06-16 11:45:00,86.2,99.2,36.7,114.1,115.7,17.3
+PT1008,2026-06-16 12:00:00,86.5,99.5,37.1,115.2,116.1,17.2
+PT1008,2026-06-16 12:15:00,86.5,98.9,37.2,116.1,117.6,16.9
+PT1008,2026-06-16 12:30:00,86.9,99.1,36.8,116.2,118.4,16.5
+PT1008,2026-06-16 12:45:00,87.4,99.0,37.9,113.0,118.9,16.0
+PT1008,2026-06-16 13:00:00,84.8,99.0,37.4,110.8,120.3,15.8
+PT1008,2026-06-16 13:15:00,85.7,98.7,37.0,109.3,119.8,15.8
+PT1008,2026-06-16 13:30:00,86.5,98.8,37.2,108.1,118.4,15.4
+PT1008,2026-06-16 13:45:00,86.3,99.3,36.7,108.1,118.7,14.7
+PT1008,2026-06-16 14:00:00,84.9,99.1,36.8,105.1,117.0,15.0
+PT1008,2026-06-16 14:15:00,84.8,99.2,37.4,107.0,117.4,15.1
+PT1008,2026-06-16 14:30:00,85.3,99.5,37.1,102.7,117.3,15.2
+PT1008,2026-06-16 14:45:00,85.5,99.4,37.5,104.3,116.5,15.1
+PT1008,2026-06-16 15:00:00,87.0,99.4,37.3,103.0,114.0,15.0
+PT1008,2026-06-16 15:15:00,86.1,99.4,37.2,102.3,111.4,15.1
+PT1008,2026-06-16 15:30:00,86.3,99.8,36.7,101.7,110.8,15.9
+PT1008,2026-06-16 15:45:00,85.5,99.8,37.6,103.9,112.2,15.5
+PT1008,2026-06-16 16:00:00,86.1,99.6,37.2,102.5,112.3,16.4
+PT1008,2026-06-16 16:15:00,88.6,99.8,36.9,100.0,114.4,16.0
+PT1008,2026-06-16 16:30:00,88.9,99.8,37.6,101.7,115.2,15.9
+PT1008,2026-06-16 16:45:00,88.3,99.5,37.3,102.7,115.2,16.0
+PT1008,2026-06-16 17:00:00,88.1,100.0,37.1,103.2,114.5,16.3
+PT1008,2026-06-16 17:15:00,88.2,99.7,37.1,101.2,116.1,15.8
+PT1008,2026-06-16 17:30:00,88.5,100.0,36.4,100.2,117.2,15.7
+PT1008,2026-06-16 17:45:00,88.5,100.0,37.5,101.1,116.3,15.5
+PT1008,2026-06-16 18:00:00,88.1,99.5,36.9,102.1,117.6,15.9
+PT1008,2026-06-16 18:15:00,88.1,99.6,36.9,104.0,118.3,16.2
+PT1008,2026-06-16 18:30:00,85.3,99.8,37.1,102.1,118.1,16.5
+PT1008,2026-06-16 18:45:00,86.1,100.0,37.3,103.2,117.0,15.9
+PT1008,2026-06-16 19:00:00,86.2,99.6,37.8,105.6,118.0,15.9
+PT1008,2026-06-16 19:15:00,87.4,99.4,37.4,107.9,118.4,16.7
+PT1008,2026-06-16 19:30:00,88.0,99.5,36.7,105.5,117.7,16.8
+PT1008,2026-06-16 19:45:00,88.5,99.3,37.2,104.8,118.7,16.5
+PT1008,2026-06-16 20:00:00,88.6,99.0,37.7,106.5,120.1,16.9
+PT1008,2026-06-16 20:15:00,88.1,98.5,36.7,105.2,121.6,16.9
+PT1008,2026-06-16 20:30:00,86.1,98.8,37.9,106.4,120.8,17.6
+PT1008,2026-06-16 20:45:00,87.3,99.0,36.8,107.5,122.1,18.4
+PT1008,2026-06-16 21:00:00,86.8,99.0,37.3,108.6,124.4,18.6
+PT1008,2026-06-16 21:15:00,87.6,99.0,36.9,107.8,124.6,18.3
+PT1008,2026-06-16 21:30:00,88.0,98.8,36.7,111.5,124.8,18.9
+PT1008,2026-06-16 21:45:00,86.6,98.8,37.4,113.4,124.0,18.8
+PT1008,2026-06-16 22:00:00,86.1,98.6,37.1,114.8,122.1,18.7
+PT1008,2026-06-16 22:15:00,86.7,98.8,37.3,116.7,121.6,19.1
+PT1008,2026-06-16 22:30:00,87.5,98.6,37.1,118.1,121.4,19.1
+PT1008,2026-06-16 22:45:00,90.0,98.4,36.9,120.4,123.6,19.4
+PT1008,2026-06-16 23:00:00,92.0,98.3,37.3,121.8,123.7,19.3
+PT1008,2026-06-16 23:15:00,94.2,98.3,36.7,125.8,123.5,19.3
+PT1008,2026-06-16 23:30:00,93.5,98.2,37.0,125.1,122.0,19.0
+PT1008,2026-06-16 23:45:00,94.9,97.9,37.3,121.0,119.4,18.7
diff --git a/medical-imaging-demo/pages/__init__.py b/medical-imaging-demo/pages/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/medical-imaging-demo/pages/cohort.py b/medical-imaging-demo/pages/cohort.py
new file mode 100644
index 0000000..d8ee78f
--- /dev/null
+++ b/medical-imaging-demo/pages/cohort.py
@@ -0,0 +1,214 @@
+import dash_mantine_components as dmc
+from dash import dcc, html
+from dash_iconify import DashIconify
+import numpy as np
+
+from components.charts import (create_crossfilter_scatter, create_diagnosis_donut,
+ create_age_sex_chart, create_risk_strat_chart,
+ create_vitals_chart)
+from components.tables import create_patient_table
+from utils.data_loader import get_cohort, get_vitals, df_patients
+
+df_cohort = get_cohort()
+
+VITALS_ALL = ["HR", "SpO2", "Temp", "SysBP", "DiaBP", "RR"]
+PATIENT_OPTIONS = [
+ {"value": row["patient_id"], "label": f"{row['patient_id']} — {row['name']}"}
+ for _, row in df_patients.head(8).iterrows()
+]
+_default_patient = PATIENT_OPTIONS[0]["value"]
+_df_vitals0 = get_vitals(_default_patient, "24h")
+
+_cf1 = create_crossfilter_scatter(df_cohort, "age", "bmi")
+_cf2 = create_crossfilter_scatter(df_cohort, "systolic_bp","ldl")
+_cf3 = create_crossfilter_scatter(df_cohort, "hba1c", "egfr")
+
+SCATTER_CONFIG = {
+ "displayModeBar": True,
+ "modeBarButtonsToRemove": [
+ "zoom2d", "pan2d", "zoomIn2d", "zoomOut2d",
+ "autoScale2d", "toImage", "hoverClosestCartesian",
+ "hoverCompareCartesian", "toggleSpikelines",
+ ],
+ "displaylogo": False,
+}
+
+crossfilter_view = html.Div([
+ dmc.Alert(
+ "Lasso or box-select points on any chart — the selection propagates across all three plots.",
+ color="navy", variant="light",
+ icon=DashIconify(icon="tabler:filter"),
+ mb="md",
+ ),
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dcc.Graph(id="cf-scatter1", figure=_cf1,
+ config=SCATTER_CONFIG,
+ style={"height": "320px"}),
+ p=0, radius="md", withBorder=True,
+ style={"overflow": "hidden"},
+ ),
+ ], span={"base": 12, "md": 4}),
+ dmc.GridCol([
+ dmc.Paper(
+ dcc.Graph(id="cf-scatter2", figure=_cf2,
+ config=SCATTER_CONFIG,
+ style={"height": "320px"}),
+ p=0, radius="md", withBorder=True,
+ style={"overflow": "hidden"},
+ ),
+ ], span={"base": 12, "md": 4}),
+ dmc.GridCol([
+ dmc.Paper(
+ dcc.Graph(id="cf-scatter3", figure=_cf3,
+ config=SCATTER_CONFIG,
+ style={"height": "320px"}),
+ p=0, radius="md", withBorder=True,
+ style={"overflow": "hidden"},
+ ),
+ ], span={"base": 12, "md": 4}),
+ ], gutter="md"),
+
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Cohort Summary", fw=600, size="lg"),
+ dmc.Divider(),
+ dmc.SimpleGrid(id="cf-summary-grid", cols=3, spacing="sm"),
+ ], gap="sm"),
+ p="md", radius="md", withBorder=True,
+ ),
+ ], span={"base": 12, "md": 4}),
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Filtered Patients", fw=600, size="lg"),
+ html.Div(id="cf-patient-table"),
+ ], gap="sm"),
+ p="md", radius="md", withBorder=True,
+ ),
+ ], span={"base": 12, "md": 8}),
+ ], gutter="md", mt="md"),
+
+ # ── Vital Signs Trend (per-patient) ──────────────────────────────────────
+ dmc.Divider(mt="xl", mb="md"),
+ dmc.Group([
+ DashIconify(icon="tabler:activity-heartbeat", width=20, color="#1e3a8a"),
+ dmc.Text("Vital Signs Trend", fw=600, size="lg"),
+ dmc.Text("per selected patient", c="dimmed", size="sm"),
+ ], gap=8, align="center", mb="md"),
+ dmc.Paper(
+ dmc.Group([
+ dmc.Group([
+ dmc.Text("Patient", size="xs", fw=500, c="dimmed"),
+ dmc.Select(
+ id="cohort-vitals-patient",
+ data=PATIENT_OPTIONS,
+ value=_default_patient,
+ w=260, size="xs",
+ ),
+ ], gap=6),
+ dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}),
+ dmc.Group([
+ dmc.Text("Period", size="xs", fw=500, c="dimmed"),
+ dmc.SegmentedControl(
+ id="cohort-vitals-period",
+ data=["6h", "12h", "24h", "48h", "72h"],
+ value="24h", size="xs", color="navy",
+ ),
+ ], gap=6),
+ dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}),
+ dmc.Group([
+ dmc.Text("Vitals", size="xs", fw=500, c="dimmed"),
+ dmc.MultiSelect(
+ id="cohort-vitals-select",
+ data=[{"value": v, "label": v} for v in VITALS_ALL],
+ value=["HR", "SpO2"],
+ w=260, size="xs", clearable=True,
+ ),
+ ], gap=6),
+ dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}),
+ dmc.Group([
+ dmc.Text("Display", size="xs", fw=500, c="dimmed"),
+ dmc.Switch(id="cohort-vitals-ref-toggle", label="Reference bands",
+ checked=True, size="xs", color="navy"),
+ dmc.Select(
+ id="cohort-vitals-ma",
+ data=[{"value": "none", "label": "No smoothing"},
+ {"value": "20", "label": "20-pt MA"},
+ {"value": "50", "label": "50-pt MA"}],
+ value="none", w=130, size="xs",
+ ),
+ ], gap=8),
+ ], gap="md", align="center"),
+ p="sm", radius="md", withBorder=True, mb="md",
+ ),
+ dmc.Paper(
+ dcc.Graph(
+ id="cohort-vitals-trend-chart",
+ figure=create_vitals_chart(_df_vitals0, ["HR", "SpO2"]),
+ config={"displayModeBar": False},
+ style={"height": "420px"},
+ ),
+ p="md", radius="md", withBorder=True,
+ ),
+], id="crossfilter-view")
+
+
+# ── Combined Demographics & Risk view ────────────────────────────────────────
+overview_view = html.Div([
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dcc.Graph(id="demo-donut",
+ figure=create_diagnosis_donut(df_cohort),
+ config={"displayModeBar": False},
+ style={"height": "380px"}),
+ p="md", radius="md", withBorder=True,
+ ),
+ ], span={"base": 12, "md": 6}),
+ dmc.GridCol([
+ dmc.Paper(
+ dcc.Graph(id="demo-agesex",
+ figure=create_age_sex_chart(df_cohort),
+ config={"displayModeBar": False},
+ style={"height": "380px"}),
+ p="md", radius="md", withBorder=True,
+ ),
+ ], span={"base": 12, "md": 6}),
+ ], gutter="md"),
+ dmc.Paper(
+ dcc.Graph(id="risk-strat-chart",
+ figure=create_risk_strat_chart(df_cohort),
+ config={"displayModeBar": False},
+ style={"height": "420px"}),
+ p="md", radius="md", withBorder=True, mt="md",
+ ),
+], id="overview-view", style={"display": "none"})
+
+
+layout = dmc.Box(
+ dmc.Stack([
+ dmc.Group([
+ dmc.Stack([
+ dmc.Title("Cohort Explorer", order=2),
+ dmc.Text("200-patient biomarker cohort — linked crossfilter brushing",
+ c="dimmed"),
+ ], gap=4),
+ dmc.SegmentedControl(
+ id="cohort-view",
+ data=[
+ {"value": "crossfilter", "label": "Crossfilter"},
+ {"value": "overview", "label": "Demographics & Risk"},
+ ],
+ value="crossfilter", color="navy", size="sm", radius="md",
+ ),
+ ], justify="space-between", mb="lg"),
+
+ crossfilter_view,
+ overview_view,
+ ], gap="md"),
+ p="md",
+)
diff --git a/medical-imaging-demo/pages/dashboard.py b/medical-imaging-demo/pages/dashboard.py
new file mode 100644
index 0000000..b1f75c7
--- /dev/null
+++ b/medical-imaging-demo/pages/dashboard.py
@@ -0,0 +1,286 @@
+import dash_mantine_components as dmc
+from dash import dcc, html
+from dash_iconify import DashIconify
+
+from components.charts import create_admissions_chart, create_ecg_sparkline
+from components.kpi_cards import create_kpi_card, create_risk_row
+from utils.data_loader import get_census_metrics, get_risk_overview, get_admissions_data
+
+metrics = get_census_metrics()
+risk = get_risk_overview()
+adm_df = get_admissions_data()
+
+# ── 5 hardcoded ICU patients that the websocket callback streams ──────────────
+ICU_PATIENTS = [
+ {"id": "PT1001", "name": "J. Smith", "dx": "Sepsis"},
+ {"id": "PT1002", "name": "M. Johnson", "dx": "Heart Failure"},
+ {"id": "PT1003", "name": "R. Williams", "dx": "COPD Exacerbation"},
+ {"id": "PT1004", "name": "P. Brown", "dx": "Hypertensive Crisis"},
+ {"id": "PT1005", "name": "J. Garcia", "dx": "Pneumonia"},
+]
+
+# ── Alert thresholds ──────────────────────────────────────────────────────────
+ICU_BASE = {
+ "PT1001": {"hr": 72, "spo2": 98.5, "sbp": 118, "dbp": 76, "rr": 14},
+ "PT1002": {"hr": 92, "spo2": 96.8, "sbp": 148, "dbp": 90, "rr": 18},
+ "PT1003": {"hr": 88, "spo2": 93.5, "sbp": 108, "dbp": 68, "rr": 21},
+ "PT1004": {"hr": 78, "spo2": 99.1, "sbp": 168, "dbp": 97, "rr": 16},
+ "PT1005": {"hr": 66, "spo2": 98.9, "sbp": 125, "dbp": 80, "rr": 13},
+}
+
+
+def _vital_badge(value_str: str, pid: str, vital: str) -> html.Span:
+ return html.Span(value_str, id=f"live-{vital}-{pid}",
+ style={"fontFamily": "monospace", "fontWeight": 700})
+
+
+def _icu_row(p: dict) -> dmc.Paper:
+ pid = p["id"]
+ base = ICU_BASE[pid]
+ return dmc.Paper(
+ dmc.Group([
+ dmc.Stack([
+ dmc.Text(p["name"], size="sm", fw=600),
+ dmc.Text(p["dx"], size="xs", c="dimmed"),
+ ], gap=2, w=120),
+ dmc.Divider(orientation="vertical"),
+ dmc.Stack([
+ dmc.Text("HR", size="xs", c="dimmed"),
+ _vital_badge(str(base["hr"]), pid, "hr"),
+ dmc.Text("bpm", size="xs", c="dimmed"),
+ ], gap=1, align="center"),
+ dmc.Stack([
+ dmc.Text("SpO₂", size="xs", c="dimmed"),
+ _vital_badge(f"{base['spo2']}%", pid, "spo2"),
+ ], gap=1, align="center"),
+ dmc.Stack([
+ dmc.Text("BP", size="xs", c="dimmed"),
+ _vital_badge(f"{base['sbp']}/{base['dbp']}", pid, "bp"),
+ dmc.Text("mmHg", size="xs", c="dimmed"),
+ ], gap=1, align="center"),
+ dmc.Stack([
+ dmc.Text("RR", size="xs", c="dimmed"),
+ _vital_badge(str(base["rr"]), pid, "rr"),
+ dmc.Text("/min", size="xs", c="dimmed"),
+ ], gap=1, align="center"),
+ ], gap="lg", align="center"),
+ p="xs",
+ radius="sm",
+ withBorder=True,
+ style={"backgroundColor": "rgba(0,0,0,0.01)"},
+ )
+
+
+layout = dmc.Stack([
+ # ── Header ────────────────────────────────────────────────────────────────
+ dmc.Group([
+ dmc.Stack([
+ dmc.Title("Clinical Dashboard", order=2),
+ dmc.Text("Real-time census, ICU vitals, and risk overview", c="dimmed"),
+ ], gap=4),
+ dmc.Group([
+ dmc.SegmentedControl(
+ id="dashboard-period",
+ data=[{"value": v, "label": v}
+ for v in ["7d","14d","30d"]],
+ value="30d",
+ size="sm",
+ ),
+ dmc.Select(
+ id="dashboard-dept",
+ data=[{"value": "All", "label": "All Departments"}] +
+ [{"value": d, "label": d} for d in
+ ["Cardiology","Pulmonology","Neurology",
+ "General Medicine","Surgery","Nephrology","Oncology"]],
+ value="All",
+ w=200,
+ size="sm",
+ ),
+ ], gap="sm"),
+ ], justify="space-between", mb="lg"),
+
+ # ── KPI Cards ─────────────────────────────────────────────────────────────
+ dmc.SimpleGrid([
+ create_kpi_card("kpi-total", "Total Patients",
+ str(metrics["total_patients"]),
+ icon="tabler:users"),
+ create_kpi_card("kpi-icu", "ICU Occupancy",
+ f"{metrics['icu_occupancy']:.1f}%",
+ trend="25 beds",
+ trend_positive=True,
+ icon="tabler:activity"),
+ create_kpi_card("kpi-los", "Avg Length of Stay",
+ f"{metrics['avg_los']} days",
+ icon="tabler:clock"),
+ create_kpi_card("kpi-alerts", "Critical Alerts",
+ str(metrics["critical_alerts"]),
+ trend="Risk score > 70",
+ trend_positive=False,
+ icon="tabler:alert-triangle",
+ alert_color="red"),
+ ], cols={"base": 1, "sm": 2, "lg": 4}, spacing="md"),
+
+ # ── Main Row: Live Vitals + Admissions chart ───────────────────────────────
+ dmc.Grid([
+ # Live ICU vitals panel
+ dmc.GridCol([
+ dcc.Store(id="live-streaming", data=True),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Group([
+ dmc.Group([
+ dmc.Text("Live ICU Monitor", fw=600, size="lg"),
+ html.Div(
+ style={
+ "width": 8, "height": 8,
+ "borderRadius": "50%",
+ "backgroundColor": "#22c55e",
+ "animation": "pulse 1.5s ease-in-out infinite",
+ },
+ id="live-indicator",
+ ),
+ dmc.Badge("LIVE", color="green", size="sm", variant="light"),
+ ], gap="xs"),
+ dmc.Switch(id="icu-live-toggle", label="Stream",
+ checked=True, size="sm"),
+ ], justify="space-between"),
+ dmc.Divider(),
+
+ dmc.Stack([_icu_row(p) for p in ICU_PATIENTS], gap="xs"),
+
+ dmc.Divider(),
+ dmc.Group([
+ dmc.Text("ECG — ", size="xs", c="dimmed"),
+ dmc.Select(
+ id="ecg-patient-select",
+ data=[{"value": p["id"], "label": p["name"]}
+ for p in ICU_PATIENTS],
+ value="PT1001",
+ size="xs", w=150,
+ ),
+ ], gap=4),
+ dcc.Graph(
+ id="ecg-sparkline-chart",
+ figure=create_ecg_sparkline([72], "PT1001"),
+ config={"displayModeBar": False},
+ style={"height": "100px"},
+ ),
+ ], gap="sm"),
+ p="md", radius="md", withBorder=True,
+ ),
+ ], span={"base": 12, "md": 6}),
+
+ # Admissions chart
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dcc.Graph(
+ id="admissions-chart",
+ figure=create_admissions_chart(adm_df),
+ config={"displayModeBar": False},
+ style={"height": "360px"},
+ ),
+ ]),
+ p="md", radius="md", withBorder=True,
+ ),
+ ], span={"base": 12, "md": 6}),
+ ], gutter="md"),
+
+ # ── Bottom Row: Risk Overview + Quick Stats ────────────────────────────────
+ dmc.Grid([
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Population Risk Overview", fw=600, size="lg"),
+ dmc.Text("Average risk scores across all admitted patients",
+ size="xs", c="dimmed"),
+ dmc.Divider(my="sm"),
+ dmc.Stack([
+ create_risk_row("risk-sepsis", "Sepsis Risk",
+ f"{risk['sepsis']:.1f}%",
+ risk["sepsis"], "red"),
+ create_risk_row("risk-fall", "Fall Risk",
+ f"{risk['fall']:.1f}%",
+ risk["fall"], "orange"),
+ create_risk_row("risk-readmit", "Readmission",
+ f"{risk['readmit']:.1f}%",
+ risk["readmit"], "yellow"),
+ create_risk_row("risk-deterioration", "Deterioration",
+ f"{risk['deterioration']:.1f}%",
+ risk["deterioration"], "grape"),
+ ], gap="md", mt="sm"),
+ ], gap="sm"),
+ p="md", radius="md", withBorder=True, h="100%",
+ ),
+ ], span={"base": 12, "md": 4}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Department Snapshot", fw=600, size="lg"),
+ dmc.SimpleGrid([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text(dept, size="xs", c="dimmed", fw=600),
+ dmc.Text(str(count), size="lg", fw=700),
+ dmc.Text("admitted today", size="xs", c="dimmed"),
+ ], gap=4),
+ p="sm", radius="sm", withBorder=True,
+ )
+ for dept, count in [
+ ("Cardiology", 12), ("Pulmonology", 8),
+ ("Neurology", 6), ("Surgery", 10),
+ ("Nephrology", 5), ("Oncology", 4),
+ ]
+ ], cols=2, spacing="sm"),
+ ], gap="sm"),
+ p="md", radius="md", withBorder=True,
+ ),
+ ], span={"base": 12, "md": 4}),
+
+ dmc.GridCol([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("System Status", fw=600, size="lg"),
+ dmc.Stack([
+ dmc.Group([
+ DashIconify(icon="tabler:circle-filled",
+ width=10, color="#22c55e"),
+ dmc.Text("EMR System", size="sm"),
+ dmc.Text("Online", size="sm", c="teal", fw=500,
+ style={"marginLeft": "auto"}),
+ ]),
+ dmc.Group([
+ DashIconify(icon="tabler:circle-filled",
+ width=10, color="#22c55e"),
+ dmc.Text("PACS Imaging", size="sm"),
+ dmc.Text("Online", size="sm", c="teal", fw=500,
+ style={"marginLeft": "auto"}),
+ ]),
+ dmc.Group([
+ DashIconify(icon="tabler:circle-filled",
+ width=10, color="#22c55e"),
+ dmc.Text("Lab Interface", size="sm"),
+ dmc.Text("Online", size="sm", c="teal", fw=500,
+ style={"marginLeft": "auto"}),
+ ]),
+ dmc.Group([
+ DashIconify(icon="tabler:circle-filled",
+ width=10, color="#f59e0b"),
+ dmc.Text("ICU Monitoring", size="sm"),
+ dmc.Text("Degraded", size="sm", c="yellow", fw=500,
+ style={"marginLeft": "auto"}),
+ ]),
+ ], gap="md", mt="sm"),
+ dmc.Divider(my="sm"),
+ dmc.Alert(
+ "All patient data is synthetic and for demonstration only.",
+ color="blue", variant="light", icon=DashIconify(icon="tabler:info-circle"),
+ ),
+ ], gap="sm"),
+ p="md", radius="md", withBorder=True, h="100%",
+ ),
+ ], span={"base": 12, "md": 4}),
+ ], gutter="md"),
+
+], gap="md")
diff --git a/medical-imaging-demo/pages/imaging.py b/medical-imaging-demo/pages/imaging.py
new file mode 100644
index 0000000..da76c9e
--- /dev/null
+++ b/medical-imaging-demo/pages/imaging.py
@@ -0,0 +1,557 @@
+import dash_mantine_components as dmc
+from dash import dcc, html
+from dash_iconify import DashIconify
+
+from components.imaging import (load_xray_b64, create_xray_figure, XRAY_DIR,
+ SEVERITY_COLORS, severity_color, newshape_for)
+from components.charts import create_ecg_sparkline
+from utils.data_loader import (get_studies, get_patient, get_labs,
+ get_vitals, get_vitals_stats)
+
+df_studies = get_studies()
+STUDIES = df_studies.to_dict("records")
+
+# ── Palette (scoped to this page) — light cream + deep navy ─────────────────────
+BG_DEEP = "#f4f3ef" # off-white, faint cream wash (page backdrop — minimal cream)
+BG_SURFACE = "#fcfcfb" # clean near-white (panels / Paper)
+BG_INSET = "#eef0f2" # very light cool grey (cards, toolbars, insets)
+BORDER = "#e1e3e7" # neutral grey border
+TEXT_HI = "#1e2433" # charcoal (primary text)
+TEXT_DIM = "#6b7280" # cool slate (secondary text)
+ACCENT = "#1e3a8a" # deep navy highlight
+ACCENT_DK = "#172554" # deepest navy (top accent borders)
+
+# Custom Mantine "navy" color ramp (shade 9 = ACCENT)
+NAVY_RAMP = ["#eef2fb", "#d9e1f4", "#b3c2e8", "#8aa1db", "#6886d0",
+ "#5274c9", "#456bc6", "#37539e", "#27407f", "#1e3a8a"]
+
+# Active study-card tint (replaces the old cyan glow)
+CARD_ACTIVE_BG = "#e6eaf5" # pale navy
+CARD_ACTIVE_SHADOW = "0 0 0 1px rgba(30,58,138,0.2)"
+# Neutral light grey behind the X-ray canvas (light viewport)
+VIEWPORT_BG = "#e7e9ec"
+# DICOM corner overlays render ON TOP of the (inherently dark) X-ray image,
+# so they keep light text regardless of the light chrome around them.
+OVERLAY_HI = "#eef2f8" # near-white
+OVERLAY_DIM = "#aab4c5" # light slate
+OVERLAY_ACCENT = "#7da2e8" # light navy (legible on the dark X-ray)
+
+
+# Key labs → one-line clinical interpretation when flagged abnormal
+_LAB_INTERPRETATION = {
+ "WBC": "infection / pneumonia",
+ "Troponin": "cardiac injury",
+ "Lactate": "sepsis / hypoperfusion",
+ "Creatinine": "renal function",
+ "BUN": "renal function",
+ "Hemoglobin": "anemia / bleeding",
+ "Glucose": "glycemic control",
+ "Potassium": "electrolyte imbalance",
+ "Sodium": "electrolyte imbalance",
+}
+
+
+def _risk_badge(patient: dict):
+ """Coloured risk badge from a patient's risk_score."""
+ score = patient.get("risk_score")
+ if score is None:
+ return None
+ color = "red" if score > 70 else "yellow" if score > 40 else "teal"
+ return dmc.Badge(f"Risk {score:.0f}", color=color, variant="light", size="sm")
+
+
+# ── Premium PACS chrome: patient banner, image overlays, status bar ───────────
+_MONO = "ui-monospace, SFMono-Regular, Menlo, monospace"
+
+_DRAW_LABELS = {
+ "drawrect": "Rectangle", "drawline": "Line",
+ "drawcircle": "Circle", "drawopenpath": "Freehand",
+}
+
+
+def _meta_chip(label: str, value, mono: bool = False):
+ """A compact label/value pair for the banner identity row."""
+ return dmc.Group([
+ dmc.Text(label, size="9px", c=TEXT_DIM, tt="uppercase",
+ style={"letterSpacing": "0.6px", "fontWeight": 700}),
+ dmc.Text(str(value), size="xs", fw=600, c=TEXT_HI,
+ style={"fontFamily": _MONO} if mono else None),
+ ], gap=5, wrap="nowrap")
+
+
+def _vitals_tile(pid: str):
+ """HR/SpO₂ readout + HR sparkline for the banner."""
+ df_vit = get_vitals(pid, "24h")
+ if df_vit.empty:
+ return dmc.Text("No vitals", size="xs", c=TEXT_DIM)
+ hr = get_vitals_stats(pid, "HR", "24h")
+ spo2 = get_vitals_stats(pid, "SpO2", "24h")
+ spark = create_ecg_sparkline(df_vit["HR"].tolist())
+ return dmc.Group([
+ dmc.Stack([
+ dmc.Text(f"HR {hr.get('current', '—')}", size="sm", fw=700, c="#22c55e"),
+ dmc.Text(f"SpO₂ {spo2.get('current', '—')}%", size="xs", fw=600, c=ACCENT),
+ ], gap=2),
+ html.Div(
+ dcc.Graph(figure=spark, config={"displayModeBar": False},
+ style={"height": "34px", "width": "96px"}),
+ style={"width": "96px"},
+ ),
+ ], gap=8, wrap="nowrap", align="center")
+
+
+def _lab_chip(test: str, value, unit: str, flag: str):
+ up = flag == "H"
+ color = "#dc2626" if up else ACCENT
+ return dmc.Tooltip(
+ label=f"{test} {value:.1f} {unit} — {_LAB_INTERPRETATION.get(test, 'abnormal')}",
+ withArrow=True, position="bottom", color="dark",
+ children=dmc.Group([
+ dmc.Text(test, size="xs", fw=700, c=TEXT_HI),
+ DashIconify(icon="tabler:arrow-up" if up else "tabler:arrow-down",
+ width=13, color=color),
+ ], gap=3, wrap="nowrap",
+ style={"padding": "3px 9px", "borderRadius": "6px",
+ "backgroundColor": BG_INSET,
+ "border": f"1px solid {color}55"}),
+ )
+
+
+def _patient_banner_content(study: dict):
+ """Full-width PACS banner: identity (left) + clinical signal (right)."""
+ if not study:
+ return dmc.Text("No study selected.", size="sm", c=TEXT_DIM)
+ pid = study.get("patient_id")
+ patient = get_patient(pid) if pid else {}
+
+ # Identity ────────────────────────────────────────────────────────────────
+ identity = dmc.Stack([
+ dmc.Group([
+ dmc.Text(study.get("patient_name", "—"), size="lg", fw=700, c=TEXT_HI),
+ (_risk_badge(patient) or html.Span()),
+ (dmc.Text(patient.get("diagnosis", ""), size="xs", c=TEXT_DIM)
+ if patient.get("diagnosis") else html.Span()),
+ ], gap=10, align="center", wrap="nowrap"),
+ dmc.Group([
+ _meta_chip("MRN", pid or "—", mono=True),
+ _meta_chip("Age/Sex", f"{study.get('age', '—')}/{study.get('gender', '—')}"),
+ _meta_chip("Modality", f"CXR {study.get('view_position', '')}".strip()),
+ _meta_chip("Acc", study.get("accession", "—"), mono=True),
+ _meta_chip("Date", study.get("study_date", "—"), mono=True),
+ ], gap=18, wrap="nowrap"),
+ ], gap=8)
+
+ # Clinical signal ───────────────────────────────────────────────────────────
+ df_labs = get_labs(pid) if pid else None
+ abnormal = (df_labs[df_labs["flag"] != "N"]
+ if df_labs is not None and not df_labs.empty else None)
+ if abnormal is None or abnormal.empty:
+ lab_block = dmc.Text("Labs WNL", size="xs", c="#22c55e", fw=600)
+ else:
+ lab_block = dmc.Group(
+ [_lab_chip(r["test"], r["value"], r["unit"], r["flag"])
+ for _, r in abnormal.iterrows()],
+ gap=8, wrap="nowrap",
+ )
+
+ clinical = dmc.Group([
+ dmc.Stack([
+ dmc.Text("ABNORMAL LABS", size="9px", c=TEXT_DIM, tt="uppercase",
+ style={"letterSpacing": "0.6px", "fontWeight": 700}),
+ lab_block,
+ ], gap=4),
+ dmc.Divider(orientation="vertical", color=BORDER),
+ dmc.Stack([
+ dmc.Text("VITALS · 24H", size="9px", c=TEXT_DIM, tt="uppercase",
+ style={"letterSpacing": "0.6px", "fontWeight": 700}),
+ _vitals_tile(pid) if pid else dmc.Text("—", size="xs", c=TEXT_DIM),
+ ], gap=4),
+ ], gap=16, wrap="nowrap", align="center")
+
+ return dmc.Group(
+ [identity, clinical],
+ justify="space-between", align="center", wrap="nowrap",
+ style={"flex": 1},
+ )
+
+
+def _corner(children, vertical: str, horizontal: str, align: str):
+ # A subtle dark "scrim" chip keeps the light DICOM text legible whether it
+ # falls over the dark X-ray or the light letterbox margins.
+ style = {"position": "absolute", vertical: "10px", horizontal: "12px",
+ "pointerEvents": "none", "textAlign": align,
+ "fontFamily": _MONO, "fontSize": "10px", "lineHeight": "1.5",
+ "color": OVERLAY_DIM,
+ "backgroundColor": "rgba(15,23,42,0.62)",
+ "padding": "5px 9px", "borderRadius": "6px",
+ "backdropFilter": "blur(1.5px)"}
+ return html.Div(children, style=style)
+
+
+def _image_overlays(study: dict, window, level, invert: bool):
+ """DICOM-style text overlaid in the four corners of the image."""
+ study = study or {}
+ tl = [html.Div(study.get("patient_name", "—"),
+ style={"color": OVERLAY_HI, "fontWeight": 700}),
+ html.Div(f"MRN {study.get('patient_id', '—')}"),
+ html.Div(f"{study.get('age', '—')}/{study.get('gender', '—')}")]
+ tr = [html.Div(f"ACC {study.get('accession', '—')}",
+ style={"color": OVERLAY_HI, "fontWeight": 700}),
+ html.Div(f"{study.get('view_position', '—')} · {study.get('study_date', '—')}")]
+ bl = [html.Div(f"W: {int(window or 0)} L: {int(level or 0)}",
+ style={"color": OVERLAY_ACCENT}),
+ html.Div(f"Invert: {'ON' if invert else 'OFF'}")]
+ br = [html.Div("CXR", style={"color": OVERLAY_HI, "fontWeight": 700}),
+ html.Div("General Hospital"),
+ html.Div(study.get("referrer", ""))]
+ return [
+ _corner(tl, "top", "left", "left"),
+ _corner(tr, "top", "right", "right"),
+ _corner(bl, "bottom", "left", "left"),
+ _corner(br, "bottom", "right", "right"),
+ ]
+
+
+def _status_bar(draw_mode, window, level, invert: bool):
+ """Thin professional readout strip under the image."""
+ def seg(label, value, accent=False):
+ return dmc.Group([
+ dmc.Text(label, size="10px", c=TEXT_DIM, tt="uppercase",
+ style={"letterSpacing": "0.5px"}),
+ dmc.Text(str(value), size="11px", fw=600,
+ c=ACCENT if accent else TEXT_HI,
+ style={"fontFamily": _MONO}),
+ ], gap=5, wrap="nowrap")
+
+ return dmc.Group([
+ dmc.Group([
+ DashIconify(icon="tabler:pencil", width=13, color=TEXT_DIM),
+ seg("Tool", _DRAW_LABELS.get(draw_mode, "Rectangle")),
+ ], gap=6, wrap="nowrap"),
+ seg("Window", int(window or 0), accent=True),
+ seg("Level", int(level or 0), accent=True),
+ seg("Invert", "On" if invert else "Off"),
+ seg("Matrix", "512×512"),
+ ], gap=20, wrap="nowrap",
+ style={"padding": "6px 14px", "backgroundColor": BG_DEEP,
+ "borderTop": f"1px solid {BORDER}"})
+
+
+def _study_card(study: dict) -> dmc.UnstyledButton:
+ sid = study["study_id"]
+ name = study.get("patient_name", sid)
+ age_sex = f"{study.get('age', '—')} / {study.get('gender', '—')}"
+ view = study.get("view_position", "")
+ finding = study.get("finding_labels", "").split("|")[0]
+ is_normal = finding.lower() in ("no finding", "")
+ badge_color = "gray" if is_normal else "navy"
+
+ return dmc.UnstyledButton(
+ dmc.Stack([
+ dmc.Group([
+ dmc.Text(sid, size="xs", c=TEXT_DIM, ff="monospace", fw=600),
+ dmc.Badge(view, size="xs", variant="outline",
+ color="gray", radius="sm"),
+ ], justify="space-between", wrap="nowrap"),
+ dmc.Text(name, size="sm", fw=600, c=TEXT_HI, truncate=True),
+ dmc.Group([
+ dmc.Text(age_sex, size="xs", c=TEXT_DIM),
+ dmc.Badge(finding or "—", size="xs", variant="light",
+ color=badge_color, radius="sm"),
+ ], justify="space-between", wrap="nowrap"),
+ ], gap=6),
+ id={"type": "study-thumb", "index": sid},
+ className="study-card",
+ style={
+ "width": "100%",
+ "padding": "10px 12px",
+ "backgroundColor": BG_INSET,
+ "border": f"1px solid {BORDER}",
+ "borderRadius": "8px",
+ "textAlign": "left",
+ "transition": "border-color 0.15s ease, background-color 0.15s ease",
+ },
+ )
+
+
+# ── Defaults ───────────────────────────────────────────────────────────────────
+_default = STUDIES[0]
+_img_path = XRAY_DIR / _default["image_file"]
+_img_b64 = load_xray_b64(_img_path)
+_fig0 = create_xray_figure(_img_b64)
+_fig0.update_layout(newshape=newshape_for("Medium")) # match default severity
+
+DRAW_TOOLS = [
+ {"value": "drawrect", "label": "Rect"},
+ {"value": "drawline", "label": "Line"},
+ {"value": "drawcircle", "label": "Circle"},
+ {"value": "drawopenpath", "label": "Path"},
+]
+
+FINDING_OPTIONS = [{"value": v, "label": v} for v in [
+ "Nodule", "Mass", "Effusion", "Cardiomegaly", "Pneumothorax",
+ "Atelectasis", "Consolidation", "Pneumonia", "Infiltration",
+ "Fibrosis", "Fracture", "Foreign Body", "Unspecified",
+]]
+
+
+_panel_style = {
+ "backgroundColor": BG_SURFACE,
+ "border": f"1px solid {BORDER}",
+}
+
+_section_label = lambda text: dmc.Text(
+ text, size="xs", fw=700, c=TEXT_DIM, tt="uppercase",
+ style={"letterSpacing": "0.6px"},
+)
+
+
+# ── Studies panel ──────────────────────────────────────────────────────────────
+studies_panel = dmc.Paper(
+ dmc.Stack([
+ dmc.Group([
+ _section_label("Studies"),
+ dmc.Badge(str(len(STUDIES)), size="sm", color="navy",
+ variant="light"),
+ ], justify="space-between"),
+ dmc.Divider(color=BORDER),
+ dmc.ScrollArea(
+ dmc.Stack([_study_card(s) for s in STUDIES], gap="xs"),
+ type="auto", offsetScrollbars=True,
+ style={"height": "calc(100vh - 200px)"},
+ ),
+ ], gap="sm"),
+ p="md", radius="md",
+ style={**_panel_style, "height": "100%"},
+)
+
+
+# ── Viewport toolbar ───────────────────────────────────────────────────────────
+def _slider_control(label, slider_id, mn, mx, val, step=5):
+ return dmc.Group([
+ dmc.Text(label, size="xs", fw=600, c=TEXT_DIM, w=52),
+ html.Div(
+ dmc.Slider(
+ id=slider_id, min=mn, max=mx, step=step, value=val,
+ color="navy", size="sm",
+ label=None,
+ showLabelOnHover=False,
+ marks=[],
+ ),
+ style={"width": "150px"},
+ ),
+ ], gap=8, wrap="nowrap")
+
+
+viewport_toolbar = dmc.Group([
+ dmc.Group([
+ _slider_control("Window", "window-slider", 30, 255, 220),
+ _slider_control("Level", "level-slider", 10, 245, 128),
+ dmc.Switch(
+ id="invert-toggle",
+ label="Invert",
+ checked=False,
+ size="sm", color="navy",
+ styles={"label": {"color": TEXT_HI, "fontSize": "12px"}},
+ ),
+ ], gap="lg", wrap="nowrap"),
+ dmc.Group([
+ dmc.SegmentedControl(
+ id="draw-mode-select",
+ data=DRAW_TOOLS,
+ value="drawrect",
+ size="xs", color="navy",
+ styles={
+ "root": {"backgroundColor": BG_INSET,
+ "border": f"1px solid {BORDER}"},
+ },
+ ),
+ dmc.Button(
+ "Reset",
+ id="reset-annotations-btn",
+ size="xs", variant="subtle", color="gray",
+ leftSection=DashIconify(icon="tabler:rotate-clockwise", width=14),
+ ),
+ ], gap="sm", wrap="nowrap"),
+], justify="space-between", align="center", wrap="wrap",
+ style={"padding": "10px 14px",
+ "backgroundColor": BG_INSET,
+ "borderBottom": f"1px solid {BORDER}",
+ "borderRadius": "8px 8px 0 0"})
+
+
+def _severity_dot(level: str):
+ return dmc.Group([
+ html.Div(style={"width": 8, "height": 8, "borderRadius": "50%",
+ "backgroundColor": SEVERITY_COLORS[level]}),
+ dmc.Text(level, size="xs", c=TEXT_DIM),
+ ], gap=4, wrap="nowrap")
+
+
+def _pending_tag(finding="Nodule", severity="Medium", note=""):
+ """Live badge showing how the next-drawn shape will be tagged."""
+ children = [
+ DashIconify(icon="tabler:pencil-plus", width=13,
+ color=severity_color(severity)),
+ dmc.Text("Next:", size="xs", c=TEXT_DIM),
+ dmc.Text(f"{finding or 'Unspecified'} · {severity or 'Medium'}",
+ size="xs", fw=700, c=severity_color(severity)),
+ ]
+ if note:
+ children.append(dmc.Text(f"“{note}”", size="xs", c=TEXT_DIM,
+ style={"fontStyle": "italic"}, truncate=True))
+ return dmc.Group(children, gap=6, wrap="nowrap")
+
+
+severity_legend = dmc.Group(
+ [dmc.Text("Severity", size="xs", fw=600, c=TEXT_DIM)]
+ + [_severity_dot(l) for l in ("Low", "Medium", "High")],
+ gap=10, wrap="nowrap",
+)
+
+
+annotation_bar = dmc.Stack([
+ dmc.Group([
+ dmc.Select(
+ id="finding-label-select",
+ data=FINDING_OPTIONS,
+ value="Nodule",
+ placeholder="Finding",
+ size="xs", w=150,
+ leftSection=DashIconify(icon="tabler:tag", width=14),
+ ),
+ dmc.Select(
+ id="severity-select",
+ data=[{"value": v, "label": v} for v in ["Low", "Medium", "High"]],
+ value="Medium", size="xs", w=100,
+ ),
+ dmc.TextInput(
+ id="annotation-note",
+ placeholder="Note (optional)",
+ size="xs",
+ style={"flex": 1, "minWidth": "80px"},
+ leftSection=DashIconify(icon="tabler:note", width=14),
+ ),
+ ], gap="sm", wrap="wrap"),
+ dmc.Group([
+ html.Div(id="pending-annotation", children=_pending_tag()),
+ severity_legend,
+ ], justify="space-between", align="center", wrap="nowrap"),
+], gap=8,
+ style={"padding": "10px 14px",
+ "backgroundColor": BG_INSET,
+ "borderTop": f"1px solid {BORDER}",
+ "borderRadius": "0 0 8px 8px"})
+
+
+viewport_panel = dmc.Paper(
+ dmc.Stack([
+ dcc.Store(id="xray-annotations", data=[]),
+ dcc.Store(id="annotations-store", data={}), # {study_id: [annotations]}
+ dcc.Store(id="current-study-id", data=_default["study_id"]),
+ viewport_toolbar,
+ html.Div([
+ dcc.Graph(
+ id="xray-graph",
+ figure=_fig0,
+ config={
+ "displayModeBar": "hover",
+ "modeBarButtonsToAdd": [
+ "drawrect", "drawline",
+ "drawcircle", "drawopenpath", "eraseshape",
+ ],
+ "modeBarButtonsToRemove": ["toImage"],
+ "scrollZoom": True,
+ "displaylogo": False,
+ },
+ style={"height": "520px",
+ "backgroundColor": VIEWPORT_BG},
+ ),
+ html.Div(
+ id="image-overlays",
+ children=_image_overlays(_default, 220, 128, False),
+ style={"position": "absolute", "inset": 0,
+ "pointerEvents": "none"},
+ ),
+ ], style={"position": "relative", "backgroundColor": VIEWPORT_BG}),
+ html.Div(id="image-status-bar",
+ children=_status_bar("drawrect", 220, 128, False)),
+ annotation_bar,
+ ], gap=0),
+ p=0, radius="md",
+ style={**_panel_style, "overflow": "hidden"},
+)
+
+
+# ── Right detail panel — Findings (primary focus) ─────────────────────────────
+detail_panel = dmc.Paper(
+ dmc.Stack([
+ dmc.Group([
+ dmc.Group([
+ DashIconify(icon="tabler:list-search", width=16, color=ACCENT),
+ _section_label("Findings"),
+ ], gap=8),
+ dmc.Badge(id="findings-count", children="0",
+ color="navy", variant="light", size="sm"),
+ ], justify="space-between"),
+ dmc.Divider(color=BORDER),
+ html.Div(
+ id="findings-table-container",
+ children=dmc.Text(
+ "No annotations yet. Draw on the X-ray to add findings.",
+ size="sm", c=TEXT_DIM, ta="center", py="md",
+ ),
+ ),
+ ], gap="sm"),
+ p="md", radius="md",
+ style={**_panel_style, "height": "100%",
+ "borderTop": f"2px solid {ACCENT_DK}"},
+)
+
+
+# ── Full layout (scoped dark provider, full-bleed) ────────────────────────────
+layout = dmc.MantineProvider(
+ forceColorScheme="light",
+ theme={
+ "primaryColor": "navy",
+ "primaryShade": 9,
+ "colors": {"navy": NAVY_RAMP},
+ "fontFamily": "Inter, -apple-system, BlinkMacSystemFont, sans-serif",
+ "components": {
+ "Paper": {"defaultProps": {"shadow": "none"}},
+ },
+ },
+ children=dmc.Box(
+ dmc.Stack([
+ dcc.Download(id="download-radiology-pdf"),
+
+ # ── PACS patient banner ──────────────────────────────────────────
+ dmc.Paper(
+ dmc.Group([
+ html.Div(id="patient-banner",
+ children=_patient_banner_content(_default),
+ style={"flex": 1, "minWidth": 0}),
+ dmc.Button(
+ "Export",
+ id="export-radiology-btn",
+ size="xs", variant="subtle", color="navy",
+ leftSection=DashIconify(icon="tabler:file-type-pdf", width=15),
+ ),
+ ], gap="md", wrap="nowrap", align="center"),
+ px="lg", py="sm", radius="md",
+ style={**_panel_style, "borderTop": f"2px solid {ACCENT_DK}"},
+ ),
+
+ dmc.Grid([
+ dmc.GridCol(studies_panel, span={"base": 12, "md": 2}),
+ dmc.GridCol(viewport_panel, span={"base": 12, "md": 6}),
+ dmc.GridCol(detail_panel, span={"base": 12, "md": 4}),
+ ], gutter="md", align="stretch"),
+ ], gap="md", p="md"),
+ style={
+ "backgroundColor": BG_DEEP,
+ "minHeight": "calc(100vh - 64px)",
+ "color": TEXT_HI,
+ },
+ ),
+)
diff --git a/medical-imaging-demo/pages/vitals.py b/medical-imaging-demo/pages/vitals.py
new file mode 100644
index 0000000..ec5d337
--- /dev/null
+++ b/medical-imaging-demo/pages/vitals.py
@@ -0,0 +1,176 @@
+import dash_mantine_components as dmc
+from dash import dcc
+from dash_iconify import DashIconify
+
+from components.charts import create_vitals_chart, create_vitals_variability
+from utils.data_loader import get_vitals, df_patients
+
+VITALS_ALL = ["HR", "SpO2", "Temp", "SysBP", "DiaBP", "RR"]
+UNITS = {"HR": "bpm", "SpO2": "%", "Temp": "°C",
+ "SysBP": "mmHg", "DiaBP": "mmHg", "RR": "/min"}
+
+PATIENT_OPTIONS = [
+ {"value": row["patient_id"], "label": f"{row['patient_id']} — {row['name']}"}
+ for _, row in df_patients.head(8).iterrows()
+]
+
+DEFAULT_PATIENT = PATIENT_OPTIONS[0]["value"]
+DEFAULT_VITALS = ["HR", "SpO2"]
+DEFAULT_PERIOD = "24h"
+
+_df0 = get_vitals(DEFAULT_PATIENT, DEFAULT_PERIOD)
+
+layout = dmc.Stack([
+ # ── Page Header ────────────────────────────────────────────────────────────
+ dmc.Group([
+ dmc.Stack([
+ dmc.Title("Patient Vitals", order=2),
+ dmc.Text("Vital-sign trends with normal-range reference bands",
+ c="dimmed"),
+ ], gap=4),
+ ], justify="space-between", mb="md"),
+
+ # ── Filter bar ─────────────────────────────────────────────────────────────
+ dmc.Paper(
+ dmc.Group([
+ dmc.Group([
+ dmc.Text("Patient", size="xs", fw=500, c="dimmed"),
+ dmc.Select(
+ id="vitals-patient-select",
+ data=PATIENT_OPTIONS,
+ value=DEFAULT_PATIENT,
+ w=260, size="xs",
+ ),
+ ], gap=6),
+ dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}),
+ dmc.Group([
+ dmc.Text("Period", size="xs", fw=500, c="dimmed"),
+ dmc.SegmentedControl(
+ id="vitals-period",
+ data=["6h", "12h", "24h", "48h", "72h"],
+ value=DEFAULT_PERIOD, size="xs",
+ ),
+ ], gap=6),
+ dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}),
+ dmc.Group([
+ dmc.Text("Vitals", size="xs", fw=500, c="dimmed"),
+ dmc.MultiSelect(
+ id="vitals-select",
+ data=[{"value": v, "label": v} for v in VITALS_ALL],
+ value=DEFAULT_VITALS,
+ w=260, size="xs", clearable=True,
+ ),
+ ], gap=6),
+ dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}),
+ dmc.Group([
+ dmc.Text("Display", size="xs", fw=500, c="dimmed"),
+ dmc.Switch(id="vitals-ref-toggle", label="Reference bands",
+ checked=True, size="xs"),
+ dmc.Select(
+ id="vitals-ma-select",
+ data=[{"value": "none", "label": "No smoothing"},
+ {"value": "20", "label": "20-pt MA"},
+ {"value": "50", "label": "50-pt MA"}],
+ value="none", w=130, size="xs",
+ ),
+ ], gap=8),
+ ], gap="md", align="center"),
+ p="sm", radius="md", withBorder=True,
+ ),
+
+ # ── Stat Cards ─────────────────────────────────────────────────────────────
+ dmc.SimpleGrid([
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Current HR", size="sm", c="dimmed"),
+ dmc.Text(
+ f"{_df0['HR'].iloc[-1]:.0f} bpm" if not _df0.empty else "—",
+ size="xl", fw=700, id="stat-current-hr",
+ ),
+ dmc.Text("Latest reading", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md", radius="md", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Period High / Low", size="sm", c="dimmed"),
+ dmc.Group([
+ dmc.Text(
+ f"{_df0['HR'].max():.0f}" if not _df0.empty else "—",
+ size="xl", fw=700, c="red", id="stat-high-hr",
+ ),
+ dmc.Text("/", size="xl", c="dimmed"),
+ dmc.Text(
+ f"{_df0['HR'].min():.0f}" if not _df0.empty else "—",
+ size="xl", fw=700, c="blue", id="stat-low-hr",
+ ),
+ ], gap=4),
+ dmc.Text("bpm", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md", radius="md", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Current SpO₂", size="sm", c="dimmed"),
+ dmc.Text(
+ f"{_df0['SpO2'].iloc[-1]:.1f}%" if not _df0.empty else "—",
+ size="xl", fw=700, id="stat-current-spo2",
+ ),
+ dmc.Text("Latest reading", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md", radius="md", withBorder=True,
+ ),
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Abnormal Readings", size="sm", c="dimmed"),
+ dmc.Text("—", size="xl", fw=700, c="red", id="stat-abnormal"),
+ dmc.Text("Outside reference range", size="xs", c="dimmed"),
+ ], gap=4),
+ p="md", radius="md", withBorder=True,
+ ),
+ ], cols={"base": 2, "md": 4}, spacing="md"),
+
+ # ── Charts with tabs ───────────────────────────────────────────────────────
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Tabs([
+ dmc.TabsList([
+ dmc.TabsTab("Trend", value="trend"),
+ dmc.TabsTab("Variability", value="var"),
+ ]),
+ dmc.TabsPanel(
+ dcc.Graph(
+ id="vitals-trend-chart",
+ figure=create_vitals_chart(_df0, DEFAULT_VITALS),
+ config={"displayModeBar": False},
+ style={"height": "400px"},
+ ),
+ value="trend", pt="md",
+ ),
+ dmc.TabsPanel(
+ dcc.Graph(
+ id="vitals-var-chart",
+ figure=create_vitals_variability(_df0, DEFAULT_VITALS),
+ config={"displayModeBar": False},
+ style={"height": "400px"},
+ ),
+ value="var", pt="md",
+ ),
+ ], value="trend"),
+ ], gap="sm"),
+ p="md", radius="md", withBorder=True,
+ ),
+
+ # ── Vitals Summary Table ───────────────────────────────────────────────────
+ dmc.Paper(
+ dmc.Stack([
+ dmc.Text("Vitals Summary", fw=600, size="lg"),
+ dmc.Text("Min / Mean / Max for the selected period",
+ size="xs", c="dimmed"),
+ dmc.Divider(my="xs"),
+ dmc.SimpleGrid(id="vitals-summary-grid", cols=3, spacing="sm"),
+ ], gap="sm"),
+ p="md", radius="md", withBorder=True,
+ ),
+
+], gap="md")
diff --git a/medical-imaging-demo/requirements.txt b/medical-imaging-demo/requirements.txt
new file mode 100644
index 0000000..54a2459
--- /dev/null
+++ b/medical-imaging-demo/requirements.txt
@@ -0,0 +1,13 @@
+dash[fastapi]==4.2.0rc3
+dash-mantine-components>=0.14.0
+dash-iconify>=0.1.2
+pandas>=2.0.0
+plotly>=5.18.0
+numpy>=1.24.0
+uvicorn[standard]
+reportlab>=4.0.0
+kaleido==0.2.1
+PyPDF2>=3.0.0
+Pillow>=10.0.0
+requests>=2.31.0
+scipy>=1.11.0
diff --git a/medical-imaging-demo/scripts/generate_data.py b/medical-imaging-demo/scripts/generate_data.py
new file mode 100644
index 0000000..4c204e5
--- /dev/null
+++ b/medical-imaging-demo/scripts/generate_data.py
@@ -0,0 +1,216 @@
+"""Generate all synthetic clinical CSVs for the demo."""
+import numpy as np
+import pandas as pd
+from pathlib import Path
+from datetime import datetime, timedelta
+
+np.random.seed(42)
+ROOT = Path(__file__).parent.parent
+DATA = ROOT / "data"
+DATA.mkdir(exist_ok=True)
+
+# ── Names ────────────────────────────────────────────────────────────────────
+FIRST = ["James","Mary","Robert","Patricia","John","Jennifer","Michael","Linda",
+ "David","Barbara","William","Elizabeth","Richard","Susan","Joseph",
+ "Jessica","Thomas","Sarah","Charles","Karen","Christopher","Lisa",
+ "Daniel","Nancy","Matthew","Betty","Anthony","Margaret","Mark","Sandra"]
+LAST = ["Smith","Johnson","Williams","Brown","Jones","Garcia","Miller","Davis",
+ "Wilson","Moore","Taylor","Anderson","Thomas","Jackson","White","Harris",
+ "Martin","Thompson","Young","Lewis","Walker","Hall","Allen","King",
+ "Wright","Scott","Green","Baker","Adams","Nelson"]
+
+DIAGNOSES = ["Pneumonia","Sepsis","COPD Exacerbation","Heart Failure","Acute MI",
+ "Stroke","Trauma","UTI","GI Bleed","Pulmonary Embolism",
+ "Hypertensive Crisis","Diabetic Ketoacidosis","Cellulitis",
+ "Atrial Fibrillation","Respiratory Failure"]
+WARDS = ["ICU","MICU","CCU","Step-Down","General Med","ED Obs"]
+DEPARTMENTS = ["Cardiology","Pulmonology","Neurology","General Medicine",
+ "Surgery","Nephrology","Oncology"]
+
+# ── Patient roster ────────────────────────────────────────────────────────────
+N = 60
+rows = []
+for i in range(N):
+ ward = np.random.choice(WARDS, p=[0.10,0.08,0.07,0.15,0.45,0.15])
+ rows.append({
+ "patient_id": f"PT{i+1001}",
+ "name": f"{np.random.choice(FIRST)} {np.random.choice(LAST)}",
+ "age": int(np.random.randint(22, 91)),
+ "gender": np.random.choice(["M","F"]),
+ "diagnosis": np.random.choice(DIAGNOSES),
+ "ward": ward,
+ "department": np.random.choice(DEPARTMENTS),
+ "admitted_date": (datetime(2026,6,1) + timedelta(days=int(np.random.randint(0,15)))).strftime("%Y-%m-%d"),
+ "los_days": int(np.random.randint(1,15)),
+ "risk_score": round(float(np.random.beta(2,5)*100), 1),
+ "sepsis_risk": round(float(np.random.beta(1.5,8)*100), 1),
+ "fall_risk": round(float(np.random.beta(2,6)*100), 1),
+ "readmit_risk": round(float(np.random.beta(2,5)*100), 1),
+ "deterioration_risk": round(float(np.random.beta(1.5,7)*100), 1),
+ "is_icu": ward in ("ICU","MICU","CCU"),
+ })
+
+df_patients = pd.DataFrame(rows)
+# Ensure first 5 are ICU patients for the live panel
+for i in range(5):
+ df_patients.at[i, "ward"] = ["ICU","MICU","CCU","ICU","MICU"][i]
+ df_patients.at[i, "is_icu"] = True
+df_patients.to_csv(DATA / "patients.csv", index=False)
+print(f"patients.csv — {len(df_patients)} rows")
+
+# ── Vitals time series (72 h, 15-min intervals, 8 ICU patients) ───────────────
+ICU_BASES = [
+ {"patient_id":"PT1001","base_hr":72,"base_spo2":98.5,"base_sbp":118,"base_dbp":76,"base_rr":14},
+ {"patient_id":"PT1002","base_hr":92,"base_spo2":96.8,"base_sbp":148,"base_dbp":90,"base_rr":18},
+ {"patient_id":"PT1003","base_hr":88,"base_spo2":93.5,"base_sbp":108,"base_dbp":68,"base_rr":21},
+ {"patient_id":"PT1004","base_hr":78,"base_spo2":99.1,"base_sbp":168,"base_dbp":97,"base_rr":16},
+ {"patient_id":"PT1005","base_hr":66,"base_spo2":98.9,"base_sbp":125,"base_dbp":80,"base_rr":13},
+ {"patient_id":"PT1006","base_hr":95,"base_spo2":95.2,"base_sbp":135,"base_dbp":82,"base_rr":20},
+ {"patient_id":"PT1007","base_hr":74,"base_spo2":97.8,"base_sbp":120,"base_dbp":75,"base_rr":15},
+ {"patient_id":"PT1008","base_hr":82,"base_spo2":96.0,"base_sbp":142,"base_dbp":88,"base_rr":17},
+]
+
+base_time = datetime(2026, 6, 14, 0, 0, 0)
+vitals_rows = []
+for p in ICU_BASES:
+ pid = p["patient_id"]
+ hr = float(p["base_hr"])
+ spo = float(p["base_spo2"])
+ sbp = float(p["base_sbp"])
+ dbp = float(p["base_dbp"])
+ rr = float(p["base_rr"])
+ for i in range(72 * 4):
+ t = base_time + timedelta(minutes=15*i)
+ hour = t.hour
+ # Gentle circadian drift
+ hr = float(np.clip(hr + np.random.normal(-0.05*(hr-p["base_hr"])*0.1, 1.2), 40, 200))
+ spo = float(np.clip(spo + np.random.normal(-0.05*(spo-p["base_spo2"])*0.1, 0.25), 85, 100))
+ sbp = float(np.clip(sbp + np.random.normal(0, 2.0), 70, 220))
+ dbp = float(np.clip(dbp + np.random.normal(0, 1.5), 40, 130))
+ rr = float(np.clip(rr + np.random.normal(0, 0.4), 8, 40))
+ vitals_rows.append({
+ "patient_id": pid,
+ "timestamp": t.strftime("%Y-%m-%d %H:%M:%S"),
+ "HR": round(hr, 1),
+ "SpO2": round(spo, 1),
+ "Temp": round(np.random.normal(37.1, 0.3), 1),
+ "SysBP": round(sbp, 1),
+ "DiaBP": round(dbp, 1),
+ "RR": round(rr, 1),
+ })
+
+df_vitals = pd.DataFrame(vitals_rows)
+df_vitals.to_csv(DATA / "vitals.csv", index=False)
+print(f"vitals.csv — {len(df_vitals)} rows")
+
+# ── Cohort biomarkers (200 patients) ─────────────────────────────────────────
+COH_DIAG = ["Type 2 Diabetes","Hypertension","COPD","Heart Failure","CKD",
+ "Obesity","CAD","Asthma","Hyperlipidemia","Atrial Fibrillation"]
+cohort = []
+for i in range(200):
+ age = int(np.random.randint(20, 85))
+ bmi = float(np.clip(np.random.normal(28, 6), 16, 55))
+ sbp = float(np.clip(np.random.normal(130, 22), 80, 220))
+ ldl = float(np.clip(np.random.normal(115, 38), 40, 260))
+ hba1c= float(np.clip(np.random.normal(6.8, 1.6), 4.5, 14))
+ egfr = float(np.clip(np.random.normal(68, 26), 5, 130))
+
+ score = (int(sbp>160)*2 + int(ldl>160) + int(hba1c>8)*2 +
+ int(egfr<45)*2 + int(bmi>35))
+ risk = "High" if score >= 4 else "Medium" if score >= 2 else "Low"
+ cohort.append({
+ "patient_id": f"CO{i+2001}",
+ "age": age,
+ "gender": np.random.choice(["M","F"]),
+ "bmi": round(bmi, 1),
+ "systolic_bp": round(sbp, 0),
+ "ldl": round(ldl, 1),
+ "hba1c": round(hba1c, 1),
+ "egfr": round(egfr, 1),
+ "diagnosis": np.random.choice(COH_DIAG),
+ "risk_level": risk,
+ })
+
+df_cohort = pd.DataFrame(cohort)
+df_cohort.to_csv(DATA / "cohort.csv", index=False)
+print(f"cohort.csv — {len(df_cohort)} rows")
+
+# ── Admissions time series (30 days) ─────────────────────────────────────────
+BASE_COUNT = {"Cardiology":12,"Pulmonology":8,"Neurology":6,
+ "General Medicine":20,"Surgery":10,"Nephrology":5,"Oncology":4}
+adm_rows = []
+for d in range(30):
+ dt = datetime(2026,5,17) + timedelta(days=d)
+ for dept, base in BASE_COUNT.items():
+ # Weekend dip
+ weekend = dt.weekday() >= 5
+ count = max(0, int(np.random.normal(base * (0.75 if weekend else 1.0), 2)))
+ adm_rows.append({"date": dt.strftime("%Y-%m-%d"), "department": dept, "admissions": count})
+
+pd.DataFrame(adm_rows).to_csv(DATA / "admissions.csv", index=False)
+print(f"admissions.csv — {len(adm_rows)} rows")
+
+# ── Labs (20 patients) ────────────────────────────────────────────────────────
+LAB_TESTS = {
+ "WBC": (4.5, 11.0, "10³/µL"),
+ "Hemoglobin": (12.0, 17.5, "g/dL"),
+ "Platelets": (150, 400, "10³/µL"),
+ "Sodium": (136, 145, "mEq/L"),
+ "Potassium": (3.5, 5.0, "mEq/L"),
+ "Creatinine": (0.7, 1.3, "mg/dL"),
+ "BUN": (7, 25, "mg/dL"),
+ "Glucose": (70, 100, "mg/dL"),
+ "Lactate": (0.5, 2.0, "mmol/L"),
+ "Troponin": (0.0, 0.04, "ng/mL"),
+}
+lab_rows = []
+for _, pat in df_patients.head(20).iterrows():
+ for test, (lo, hi, unit) in LAB_TESTS.items():
+ mid = (lo + hi) / 2
+ val = round(float(np.clip(np.random.normal(mid, (hi-lo)*0.3), lo*0.5, hi*2)), 3)
+ flag = "H" if val > hi else "L" if val < lo else "N"
+ lab_rows.append({
+ "patient_id": pat["patient_id"],
+ "date": "2026-06-15",
+ "test": test,
+ "value": val,
+ "unit": unit,
+ "reference_low": lo,
+ "reference_high": hi,
+ "flag": flag,
+ })
+
+pd.DataFrame(lab_rows).to_csv(DATA / "labs.csv", index=False)
+print(f"labs.csv — {len(lab_rows)} rows")
+
+# ── Imaging studies metadata ──────────────────────────────────────────────────
+STUDIES = [
+ {"study_id":"ST0001","findings":"No Finding", "age":45,"gender":"M","view":"PA"},
+ {"study_id":"ST0002","findings":"Cardiomegaly", "age":67,"gender":"F","view":"PA"},
+ {"study_id":"ST0003","findings":"Pleural Effusion|Cardiomegaly","age":72,"gender":"M","view":"AP"},
+ {"study_id":"ST0004","findings":"Pneumonia|Consolidation", "age":58,"gender":"F","view":"PA"},
+ {"study_id":"ST0005","findings":"Atelectasis", "age":81,"gender":"M","view":"AP"},
+ {"study_id":"ST0006","findings":"Nodule", "age":63,"gender":"F","view":"PA"},
+ {"study_id":"ST0007","findings":"Pneumothorax", "age":34,"gender":"M","view":"AP"},
+ {"study_id":"ST0008","findings":"Mass", "age":69,"gender":"F","view":"PA"},
+]
+pat_names = df_patients["name"].tolist()
+study_rows = []
+for i, s in enumerate(STUDIES):
+ study_rows.append({
+ "study_id": s["study_id"],
+ "patient_id": f"PT{i+1001}",
+ "patient_name": pat_names[i],
+ "age": s["age"],
+ "gender": s["gender"],
+ "view_position":s["view"],
+ "finding_labels":s["findings"],
+ "study_date": "2026-06-15",
+ "accession": f"ACC{np.random.randint(100000,999999)}",
+ "image_file": f"xray_{i+1:02d}.png",
+ "referrer": "Dr. " + np.random.choice(LAST),
+ })
+
+pd.DataFrame(study_rows).to_csv(DATA / "studies.csv", index=False)
+print(f"studies.csv — {len(study_rows)} rows")
+print("\nAll data generated.")
diff --git a/medical-imaging-demo/scripts/generate_xrays.py b/medical-imaging-demo/scripts/generate_xrays.py
new file mode 100644
index 0000000..16fd90a
--- /dev/null
+++ b/medical-imaging-demo/scripts/generate_xrays.py
@@ -0,0 +1,164 @@
+"""Generate synthetic chest X-ray-like grayscale PNG images for the demo."""
+import numpy as np
+from PIL import Image, ImageFilter
+from pathlib import Path
+
+ROOT = Path(__file__).parent.parent
+OUTDIR = ROOT / "assets" / "xrays"
+OUTDIR.mkdir(parents=True, exist_ok=True)
+
+STUDIES = [
+ ("xray_01.png", [], 42),
+ ("xray_02.png", ["Cardiomegaly"], 43),
+ ("xray_03.png", ["Pleural Effusion","Cardiomegaly"], 44),
+ ("xray_04.png", ["Pneumonia","Consolidation"], 45),
+ ("xray_05.png", ["Atelectasis"], 46),
+ ("xray_06.png", ["Nodule"], 47),
+ ("xray_07.png", ["Pneumothorax"], 48),
+ ("xray_08.png", ["Mass"], 49),
+]
+
+
+def generate_xray(width: int = 512, height: int = 512,
+ findings: list = None, seed: int = 42) -> Image.Image:
+ """Return a PIL grayscale image resembling a chest X-ray PA view."""
+ np.random.seed(seed)
+ if findings is None:
+ findings = []
+
+ W, H = width, height
+ cx, cy = W / 2, H / 2
+ img = np.zeros((H, W), dtype=np.float32)
+
+ yy, xx = np.mgrid[0:H, 0:W]
+
+ # ── Chest outline ─────────────────────────────────────────────────────────
+ chest = ((xx - cx) ** 2 / (cx * 0.88) ** 2 +
+ (yy - cy * 0.96) ** 2 / (cy * 0.92) ** 2) < 1
+ img[chest] = 35
+
+ # ── Lung fields (darker — air) ────────────────────────────────────────────
+ lL = ((xx - cx * 0.57) ** 2 / (cx * 0.26) ** 2 +
+ (yy - cy * 0.84) ** 2 / (cy * 0.36) ** 2) < 1
+ rL = ((xx - cx * 1.43) ** 2 / (cx * 0.26) ** 2 +
+ (yy - cy * 0.84) ** 2 / (cy * 0.36) ** 2) < 1
+ img[lL] = 14
+ img[rL] = 14
+
+ # ── Mediastinum / heart ───────────────────────────────────────────────────
+ heart = ((xx - cx * 0.91) ** 2 / (cx * 0.19) ** 2 +
+ (yy - cy * 1.06) ** 2 / (cy * 0.22) ** 2) < 1
+ img[heart] = 125
+
+ # ── Aortic knob ───────────────────────────────────────────────────────────
+ aorta = ((xx - cx * 0.84) ** 2 + (yy - cy * 0.60) ** 2) < (W * 0.05) ** 2
+ img[aorta] = 145
+
+ # ── Trachea ───────────────────────────────────────────────────────────────
+ trachea = (np.abs(xx - cx) < W * 0.025) & (yy < cy * 0.58)
+ img[trachea] = 8
+
+ # ── Spine ─────────────────────────────────────────────────────────────────
+ spine = (np.abs(xx - cx) < W * 0.025) & (yy > cy * 0.38) & (yy < cy * 1.65)
+ img[spine] = np.maximum(img[spine], 195)
+
+ # ── Clavicles ─────────────────────────────────────────────────────────────
+ for x in range(int(cx * 0.20), int(cx)):
+ cy_clav = int(cy * 0.27 - cy * 0.09 * (x - cx * 0.20) / (cx * 0.80))
+ if 0 <= cy_clav < H:
+ img[max(0, cy_clav - 2):cy_clav + 3, x] = 210
+ for x in range(int(cx), int(cx * 1.80)):
+ cy_clav = int(cy * 0.27 + cy * 0.09 * (x - cx) / (cx * 0.80))
+ if 0 <= cy_clav < H:
+ img[max(0, cy_clav - 2):cy_clav + 3, x] = 210
+
+ # ── Ribs ──────────────────────────────────────────────────────────────────
+ for i in range(12):
+ rib_y0 = cy * 0.24 + i * cy * 0.12
+ rw = 2
+ for side, x0, x1, xref, sign in [
+ ("L", int(cx*0.22), int(cx*0.88), cx*0.22, 1),
+ ("R", int(cx*1.12), int(cx*1.78), cx*1.78, -1),
+ ]:
+ span = abs(x1 - x0)
+ for x in range(x0, x1):
+ arc = int(rib_y0 + cy * 0.07 * np.sin(np.pi * abs(x - xref) / span))
+ if 0 <= arc - rw and arc + rw < H:
+ img[arc - rw:arc + rw + 1, x] = np.maximum(
+ img[arc - rw:arc + rw + 1, x], 195)
+
+ # ── Diaphragm ─────────────────────────────────────────────────────────────
+ for x in range(int(cx * 0.22), int(cx * 0.90)):
+ d = int(cy * 1.36 - cy * 0.10 * np.sin(np.pi * (x - cx*0.22) / (cx*0.68)))
+ if 0 <= d < H:
+ img[d:min(H, d+3), x] = 190
+ for x in range(int(cx * 1.10), int(cx * 1.78)):
+ d = int(cy * 1.42 - cy * 0.09 * np.sin(np.pi * (cx*1.78 - x) / (cx*0.68)))
+ if 0 <= d < H:
+ img[d:min(H, d+3), x] = 190
+
+ # ── Pulmonary vascular markings ───────────────────────────────────────────
+ for lung_mask, x_base in [(lL, cx * 0.40), (rL, cx * 1.30)]:
+ for _ in range(18):
+ vx = int(np.random.uniform(x_base * 0.8, x_base * 1.2))
+ vy = int(np.random.uniform(cy * 0.28, cy * 0.65))
+ ln = int(np.random.uniform(25, 90))
+ ang = np.random.uniform(-0.5, 0.5)
+ intens = float(np.random.uniform(28, 65))
+ for j in range(ln):
+ px_ = int(vx + j * np.sin(ang))
+ py_ = int(vy + j * np.cos(ang))
+ if (0 <= px_ < W and 0 <= py_ < H and lung_mask[py_, px_]):
+ img[py_, px_] = min(255, img[py_, px_] + intens * (1 - j / ln))
+
+ # ── Findings ──────────────────────────────────────────────────────────────
+ for f in findings:
+ if f == "Cardiomegaly":
+ hc = ((xx - cx * 0.88) ** 2 / (cx * 0.28) ** 2 +
+ (yy - cy * 1.03) ** 2 / (cy * 0.26) ** 2) < 1
+ img[hc] = np.maximum(img[hc], 118)
+
+ elif f == "Pleural Effusion":
+ eff = (yy > cy * 1.22) & rL
+ img[eff] = 155
+
+ elif f == "Pneumothorax":
+ ptx = (xx < cx * 0.38) & lL
+ img[ptx] = 5
+ line_x = int(cx * 0.39)
+ img[int(cy*0.22):int(cy*0.88), line_x:line_x+3] = 205
+
+ elif f in ("Nodule", "Mass"):
+ sz = 11 if f == "Nodule" else 32
+ nx, ny = int(cx * 1.50), int(cy * 0.57)
+ nod = ((xx - nx) ** 2 + (yy - ny) ** 2) < sz ** 2
+ img[nod] = 170
+
+ elif f == "Atelectasis":
+ atel_y0 = int(cy * 1.20)
+ atel_y1 = int(cy * 1.27)
+ img[atel_y0:atel_y1, int(cx*0.35):int(cx*0.82)] = 145
+
+ elif f in ("Pneumonia", "Consolidation"):
+ con = ((xx - cx * 1.42) ** 2 / (cx * 0.24) ** 2 +
+ (yy - cy * 1.12) ** 2 / (cy * 0.20) ** 2) < 1
+ img[con] = np.where(img[con] < 132, 132, img[con])
+
+ elif f == "Infiltration":
+ inf = ((xx - cx * 0.60) ** 2 / (cx * 0.20) ** 2 +
+ (yy - cy * 1.05) ** 2 / (cy * 0.18) ** 2) < 1
+ img[inf] = np.where(img[inf] < 120, 120, img[inf])
+
+ # ── Noise + blur ──────────────────────────────────────────────────────────
+ img = np.clip(img + np.random.normal(0, 5.5, img.shape), 0, 255).astype(np.uint8)
+ pil = Image.fromarray(img, mode="L").filter(ImageFilter.GaussianBlur(radius=1.2))
+ return pil
+
+
+if __name__ == "__main__":
+ for fname, findings, seed in STUDIES:
+ out = OUTDIR / fname
+ img = generate_xray(512, 512, findings=findings, seed=seed)
+ img.save(out)
+ print(f" {fname} findings={findings or ['No Finding']}")
+ print(f"\n{len(STUDIES)} X-ray images written to {OUTDIR}")
diff --git a/medical-imaging-demo/utils/__init__.py b/medical-imaging-demo/utils/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/medical-imaging-demo/utils/data_loader.py b/medical-imaging-demo/utils/data_loader.py
new file mode 100644
index 0000000..93993af
--- /dev/null
+++ b/medical-imaging-demo/utils/data_loader.py
@@ -0,0 +1,104 @@
+import pandas as pd
+import pathlib
+
+ROOT = pathlib.Path(__file__).parent.parent
+DATA_PATH = ROOT / "data"
+
+def _csv(name: str) -> pd.DataFrame:
+ return pd.read_csv(DATA_PATH / name)
+
+# Cached loads
+df_patients = _csv("patients.csv")
+df_vitals = _csv("vitals.csv")
+df_cohort = _csv("cohort.csv")
+df_admissions = _csv("admissions.csv")
+df_labs = _csv("labs.csv")
+df_studies = _csv("studies.csv")
+
+
+# ── Census / dashboard metrics ────────────────────────────────────────────────
+def get_census_metrics() -> dict:
+ total = len(df_patients)
+ icu_total = df_patients["is_icu"].sum()
+ icu_cap = 25 # beds
+ avg_los = round(float(df_patients["los_days"].mean()), 1)
+ critical = int((df_patients["risk_score"] > 70).sum())
+ return {
+ "total_patients": total,
+ "icu_occupancy": round(icu_total / icu_cap * 100, 1),
+ "avg_los": avg_los,
+ "critical_alerts":critical,
+ }
+
+def get_risk_overview() -> dict:
+ return {
+ "sepsis": round(float(df_patients["sepsis_risk"].mean()), 1),
+ "fall": round(float(df_patients["fall_risk"].mean()), 1),
+ "readmit": round(float(df_patients["readmit_risk"].mean()), 1),
+ "deterioration":round(float(df_patients["deterioration_risk"].mean()), 1),
+ }
+
+
+# ── Admissions ────────────────────────────────────────────────────────────────
+def get_admissions_data(department: str = "All", period: str = "30d") -> pd.DataFrame:
+ df = df_admissions.copy()
+ df["date"] = pd.to_datetime(df["date"])
+ days = {"7d": 7, "14d": 14, "30d": 30}.get(period, 30)
+ df = df[df["date"] >= df["date"].max() - pd.Timedelta(days=days-1)]
+ if department != "All":
+ df = df[df["department"] == department]
+ return df
+
+
+# ── Vitals ────────────────────────────────────────────────────────────────────
+PERIOD_HOURS = {"6h": 6, "12h": 12, "24h": 24, "48h": 48, "72h": 72}
+
+def get_vitals(patient_id: str, period: str = "24h") -> pd.DataFrame:
+ df = df_vitals[df_vitals["patient_id"] == patient_id].copy()
+ df["timestamp"] = pd.to_datetime(df["timestamp"])
+ df = df.sort_values("timestamp")
+ hours = PERIOD_HOURS.get(period, 24)
+ cutoff = df["timestamp"].max() - pd.Timedelta(hours=hours)
+ return df[df["timestamp"] >= cutoff].reset_index(drop=True)
+
+def get_vitals_stats(patient_id: str, vital: str, period: str = "24h") -> dict:
+ df = get_vitals(patient_id, period)
+ if df.empty or vital not in df.columns:
+ return {}
+ col = df[vital]
+ return {
+ "current": round(float(col.iloc[-1]), 1),
+ "min": round(float(col.min()), 1),
+ "max": round(float(col.max()), 1),
+ "mean": round(float(col.mean()), 1),
+ }
+
+
+# ── Cohort ────────────────────────────────────────────────────────────────────
+def get_cohort() -> pd.DataFrame:
+ return df_cohort.copy()
+
+
+# ── Labs ──────────────────────────────────────────────────────────────────────
+def get_labs(patient_id: str) -> pd.DataFrame:
+ return df_labs[df_labs["patient_id"] == patient_id].copy()
+
+
+# ── Studies ───────────────────────────────────────────────────────────────────
+def get_studies() -> pd.DataFrame:
+ return df_studies.copy()
+
+def get_study(study_id: str) -> dict:
+ row = df_studies[df_studies["study_id"] == study_id]
+ if row.empty:
+ return {}
+ return row.iloc[0].to_dict()
+
+
+# ── Patient helpers ───────────────────────────────────────────────────────────
+def get_patient(patient_id: str) -> dict:
+ row = df_patients[df_patients["patient_id"] == patient_id]
+ return row.iloc[0].to_dict() if not row.empty else {}
+
+def get_icu_patients() -> pd.DataFrame:
+ return df_patients[df_patients["is_icu"]].head(5).copy()
diff --git a/medical-imaging-demo/utils/pdf_export.py b/medical-imaging-demo/utils/pdf_export.py
new file mode 100644
index 0000000..9e99c10
--- /dev/null
+++ b/medical-imaging-demo/utils/pdf_export.py
@@ -0,0 +1,214 @@
+import copy
+import io
+from datetime import datetime
+
+import plotly.io as pio
+from PIL import Image as PILImage, ImageDraw, ImageFont
+from reportlab.lib import colors
+from reportlab.lib.pagesizes import A4, landscape, portrait
+from reportlab.lib.units import inch
+from reportlab.lib.utils import ImageReader
+from reportlab.pdfgen import canvas as rl_canvas
+from PyPDF2 import PdfWriter, PdfReader
+
+
+def figure_to_image_bytes(figure, width: int = 1100, height: int = 650) -> bytes:
+ try:
+ fig = copy.deepcopy(figure)
+ if isinstance(fig, dict):
+ fig.setdefault("layout", {})
+ fig["layout"]["paper_bgcolor"] = "white"
+ fig["layout"]["plot_bgcolor"] = "white"
+ return pio.to_image(fig, format="png", width=width, height=height)
+ except Exception as e:
+ img = PILImage.new("RGB", (width, height), color=(220, 220, 220))
+ ImageDraw.Draw(img).text((20, height // 2), f"Render error: {e}", fill="black")
+ buf = io.BytesIO()
+ img.save(buf, format="PNG")
+ return buf.getvalue()
+
+
+def create_radiology_report(
+ xray_figure,
+ findings: list,
+ patient_info: dict,
+ study_info: dict,
+) -> bytes:
+ """
+ Build a PDF radiology report with:
+ - Title page (patient + study info)
+ - Full-page annotated X-ray image
+ - Findings table
+ """
+ port_w, port_h = portrait(A4)
+ land_w, land_h = landscape(A4)
+
+ out = io.BytesIO()
+ writer = PdfWriter()
+
+ # ── Title page ─────────────────────────────────────────────────────────────
+ tp = io.BytesIO()
+ cp = rl_canvas.Canvas(tp, pagesize=portrait(A4))
+
+ # Header band
+ cp.setFillColor(colors.HexColor("#0d9488"))
+ cp.rect(0, port_h - 2.2 * inch, port_w, 2.2 * inch, fill=1, stroke=0)
+
+ cp.setFillColor(colors.white)
+ cp.setFont("Helvetica-Bold", 26)
+ cp.drawCentredString(port_w / 2, port_h - 1.0 * inch, "VitalSight Radiology Report")
+ cp.setFont("Helvetica", 13)
+ cp.drawCentredString(port_w / 2, port_h - 1.65 * inch,
+ f"Generated: {datetime.now().strftime('%B %d, %Y %H:%M')}")
+
+ # Patient / study info table
+ info_y = port_h - 3.2 * inch
+ items = [
+ ("Patient Name", patient_info.get("name", "—")),
+ ("Patient ID", patient_info.get("patient_id", "—")),
+ ("Age / Gender", f"{patient_info.get('age','—')} / {patient_info.get('gender','—')}"),
+ ("Study ID", study_info.get("study_id", "—")),
+ ("Accession", study_info.get("accession", "—")),
+ ("Study Date", study_info.get("study_date", "—")),
+ ("View", study_info.get("view_position", "—")),
+ ("Referring Physician", study_info.get("referrer", "—")),
+ ]
+ cp.setFont("Helvetica-Bold", 10)
+ cp.setFillColor(colors.HexColor("#1e293b"))
+ for label, value in items:
+ cp.setFont("Helvetica-Bold", 10)
+ cp.setFillColor(colors.HexColor("#475569"))
+ cp.drawString(1.0 * inch, info_y, f"{label}:")
+ cp.setFont("Helvetica", 10)
+ cp.setFillColor(colors.HexColor("#1e293b"))
+ cp.drawString(3.0 * inch, info_y, str(value))
+ info_y -= 0.32 * inch
+
+ # Disclaimer
+ cp.setFont("Helvetica-Oblique", 8)
+ cp.setFillColor(colors.HexColor("#94a3b8"))
+ cp.drawCentredString(port_w / 2, 0.6 * inch,
+ "SYNTHETIC DATA — FOR DEMONSTRATION PURPOSES ONLY")
+ cp.save()
+ tp.seek(0)
+ writer.add_page(PdfReader(tp).pages[0])
+
+ # ── Annotated X-ray page ───────────────────────────────────────────────────
+ xr = io.BytesIO()
+ cl = rl_canvas.Canvas(xr, pagesize=landscape(A4))
+
+ cl.setFillColor(colors.HexColor("#0d9488"))
+ cl.setFont("Helvetica-Bold", 16)
+ cl.drawString(0.8 * inch, land_h - 0.7 * inch, "Imaging Study")
+
+ xray_bytes = figure_to_image_bytes(xray_figure, width=1100, height=750)
+ reader = ImageReader(io.BytesIO(xray_bytes))
+ img_w, img_h = 10 * inch, 6.8 * inch
+ x_off = (land_w - img_w) / 2
+ y_off = (land_h - img_h) / 2 - 0.3 * inch
+ cl.drawImage(reader, x_off, y_off, width=img_w, height=img_h)
+
+ cl.setFont("Helvetica", 7)
+ cl.setFillColor(colors.HexColor("#94a3b8"))
+ cl.drawCentredString(land_w / 2, 0.35 * inch,
+ "SYNTHETIC — NOT FOR CLINICAL USE")
+ cl.save()
+ xr.seek(0)
+ writer.add_page(PdfReader(xr).pages[0])
+
+ # ── Findings table page ────────────────────────────────────────────────────
+ if findings:
+ ft = io.BytesIO()
+ fp = rl_canvas.Canvas(ft, pagesize=portrait(A4))
+
+ fp.setFillColor(colors.HexColor("#0d9488"))
+ fp.rect(0, port_h - 1.2 * inch, port_w, 1.2 * inch, fill=1, stroke=0)
+ fp.setFillColor(colors.white)
+ fp.setFont("Helvetica-Bold", 18)
+ fp.drawCentredString(port_w / 2, port_h - 0.75 * inch, "Findings")
+
+ headers = ["#", "Finding", "Location (px)", "Type", "Severity", "Note"]
+ col_w = [0.3, 2.0, 2.2, 1.0, 1.0, 1.5]
+ col_x = [1.0 * inch]
+ for w in col_w[:-1]:
+ col_x.append(col_x[-1] + w * inch)
+
+ row_y = port_h - 1.7 * inch
+ fp.setFont("Helvetica-Bold", 9)
+ fp.setFillColor(colors.HexColor("#1e293b"))
+ for i, h in enumerate(headers):
+ fp.drawString(col_x[i], row_y, h)
+ row_y -= 0.05 * inch
+ fp.setStrokeColor(colors.HexColor("#e2e8f0"))
+ fp.line(0.8 * inch, row_y, port_w - 0.8 * inch, row_y)
+ row_y -= 0.28 * inch
+
+ fp.setFont("Helvetica", 9)
+ for idx, finding in enumerate(findings, 1):
+ if row_y < 1.5 * inch:
+ break
+ fp.setFillColor(colors.HexColor("#1e293b") if idx % 2 else colors.HexColor("#f8fafc"))
+ fp.rect(0.8*inch, row_y-0.05*inch, port_w-1.6*inch, 0.28*inch, fill=1, stroke=0)
+ fp.setFillColor(colors.HexColor("#1e293b"))
+ cells = [
+ str(idx),
+ finding.get("label", "Unspecified"),
+ finding.get("location", "—"),
+ finding.get("shape_type", "rect"),
+ finding.get("severity", "—"),
+ finding.get("note", ""),
+ ]
+ for i, cell in enumerate(cells):
+ fp.drawString(col_x[i], row_y, str(cell)[:28])
+ row_y -= 0.28 * inch
+
+ fp.setFont("Helvetica-Oblique", 7)
+ fp.setFillColor(colors.HexColor("#94a3b8"))
+ fp.drawCentredString(port_w / 2, 0.5 * inch, "SYNTHETIC — NOT FOR CLINICAL USE")
+ fp.save()
+ ft.seek(0)
+ writer.add_page(PdfReader(ft).pages[0])
+
+ writer.write(out)
+ out.seek(0)
+ return out.getvalue()
+
+
+def create_summary_pdf(figures: list, titles: list, report_title: str = "Clinical Report") -> bytes:
+ """Multi-figure PDF (for future use)."""
+ port_w, port_h = portrait(A4)
+ land_w, land_h = landscape(A4)
+ out = io.BytesIO()
+ writer = PdfWriter()
+
+ tp = io.BytesIO()
+ cp = rl_canvas.Canvas(tp, pagesize=portrait(A4))
+ cp.setFillColor(colors.HexColor("#0d9488"))
+ cp.rect(0, port_h - 2*inch, port_w, 2*inch, fill=1, stroke=0)
+ cp.setFillColor(colors.white)
+ cp.setFont("Helvetica-Bold", 26)
+ cp.drawCentredString(port_w/2, port_h - 1.1*inch, report_title)
+ cp.setFont("Helvetica", 12)
+ cp.drawCentredString(port_w/2, port_h - 1.7*inch,
+ datetime.now().strftime("%B %d, %Y"))
+ cp.save()
+ tp.seek(0)
+ writer.add_page(PdfReader(tp).pages[0])
+
+ for fig, title in zip(figures, titles):
+ pb = io.BytesIO()
+ cl = rl_canvas.Canvas(pb, pagesize=landscape(A4))
+ cl.setFillColor(colors.HexColor("#0d9488"))
+ cl.setFont("Helvetica-Bold", 18)
+ cl.drawString(1*inch, land_h - 0.75*inch, title)
+ img_bytes = figure_to_image_bytes(fig)
+ reader = ImageReader(io.BytesIO(img_bytes))
+ iw, ih = 10*inch, 6*inch
+ cl.drawImage(reader, (land_w-iw)/2, (land_h-ih)/2-0.4*inch, width=iw, height=ih)
+ cl.save()
+ pb.seek(0)
+ writer.add_page(PdfReader(pb).pages[0])
+
+ writer.write(out)
+ out.seek(0)
+ return out.getvalue()